100 lines
1.8 KiB
C++
100 lines
1.8 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
SierraCartRacing.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
A hack for Cart Racing (Sierra). They call InitializeSecurityDescriptor
|
||
|
which trashes an old stack pointer which is later needed. They call
|
||
|
CreateSemaphore with an invalid security descriptor:
|
||
|
|
||
|
lpSemaphoreAttributes->lpSecurityDescriptor == 1
|
||
|
|
||
|
This looks like a semaphore they use to prevent getting executed twice,
|
||
|
Note, although it doesn't matter if the Semaphore doesn't get created,
|
||
|
I thought it better if this worked.
|
||
|
|
||
|
Fix:
|
||
|
|
||
|
CreateSemaphore: set the security attributes to NULL (default)
|
||
|
InitializeSecurityDescriptor: do nothing, since it's not needed anymore
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is an app specific shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
11/03/1999 linstev Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(SierraCartRacing)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(CreateSemaphoreA)
|
||
|
APIHOOK_ENUM_ENTRY(InitializeSecurityDescriptor)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Use the default security descriptor.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HANDLE
|
||
|
APIHOOK(CreateSemaphoreA)(
|
||
|
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
|
||
|
LONG lInitialCount,
|
||
|
LONG lMaximumCount,
|
||
|
LPCSTR lpName
|
||
|
)
|
||
|
{
|
||
|
// Use default security descriptor
|
||
|
|
||
|
return ORIGINAL_API(CreateSemaphoreA)(
|
||
|
NULL,
|
||
|
lInitialCount,
|
||
|
lMaximumCount,
|
||
|
lpName);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Returns false for InitializeSecurityDescriptor. i.e. do nothing so we don't
|
||
|
touch the stack.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(InitializeSecurityDescriptor)(
|
||
|
PSECURITY_DESCRIPTOR pSecurityDescriptor,
|
||
|
DWORD dwRevision
|
||
|
)
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, CreateSemaphoreA)
|
||
|
APIHOOK_ENTRY(ADVAPI32.DLL, InitializeSecurityDescriptor)
|
||
|
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|