119 lines
2.1 KiB
C++
119 lines
2.1 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
PetzForceCritSecRelease.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This DLL takes care of a Thread that is exiting without performing a
|
||
|
LeaveCriticalSection on a critical section it owns.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is a application specific shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
04/00/2000 a-chcoff Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(Petz)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(_endthread)
|
||
|
APIHOOK_ENUM_ENTRY(ShellExecuteA)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
LPCRITICAL_SECTION g_pCritSectToRelease;
|
||
|
|
||
|
HINSTANCE
|
||
|
APIHOOK(ShellExecuteA)(
|
||
|
HWND hwnd,
|
||
|
LPCSTR lpVerb,
|
||
|
LPCSTR lpFile,
|
||
|
LPCSTR lpParameters,
|
||
|
LPCSTR lpDirectory,
|
||
|
INT nShowCmd)
|
||
|
{
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
CString csFile(lpFile);
|
||
|
csFile.Replace(L"SYSTEM\\PETZ", L"SYSTEM32\\PETZ");
|
||
|
|
||
|
return ORIGINAL_API(ShellExecuteA)(
|
||
|
hwnd,
|
||
|
lpVerb,
|
||
|
csFile.GetAnsi(),
|
||
|
lpParameters,
|
||
|
lpDirectory,
|
||
|
nShowCmd);
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
// Do nothing
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(ShellExecuteA)(
|
||
|
hwnd,
|
||
|
lpVerb,
|
||
|
lpFile,
|
||
|
lpParameters,
|
||
|
lpDirectory,
|
||
|
nShowCmd);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
APIHOOK(_endthread)(void)
|
||
|
{
|
||
|
//Don't let the thread orphan a critical section.
|
||
|
LeaveCriticalSection(g_pCritSectToRelease);
|
||
|
ORIGINAL_API(_endthread)();
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
NOTIFY_FUNCTION(
|
||
|
DWORD fdwReason)
|
||
|
{
|
||
|
if (fdwReason == DLL_PROCESS_ATTACH)
|
||
|
{
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
CString csCl(COMMAND_LINE);
|
||
|
|
||
|
WCHAR *unused;
|
||
|
g_pCritSectToRelease = (LPCRITICAL_SECTION) wcstol(csCl, &unused, 10);
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
CALL_NOTIFY_FUNCTION
|
||
|
|
||
|
APIHOOK_ENTRY(MSVCRT.DLL, _endthread)
|
||
|
APIHOOK_ENTRY(SHELL32.DLL, ShellExecuteA)
|
||
|
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|