106 lines
2.4 KiB
C++
106 lines
2.4 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
WinG32SysToSys32.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
During its dllmain WinG32 checks its install location. It does this by parsing the path returned from
|
||
|
GetModuleFileName. If it finds that it was installed in the system directory, it will post a message box
|
||
|
and fail. This is fixed by checking and tweaking the string returned from the API call.
|
||
|
|
||
|
History:
|
||
|
|
||
|
03/21/2001 alexsm Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(WinG32SysToSys32)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(GetModuleFileNameA)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
APIHOOK(GetModuleFileNameA)(HMODULE hModule, LPSTR lpFileName, DWORD nSize)
|
||
|
{
|
||
|
DWORD nReturn = 0;
|
||
|
int nFound = -1;
|
||
|
char * lpNewFileName = NULL;
|
||
|
WCHAR * lpSystemCheck = L"SYSTEM\\WING32.DLL";
|
||
|
WCHAR * lpWinG32 = L"WING32.dll";
|
||
|
CString csOldFileName;
|
||
|
CString csNewFileName;
|
||
|
|
||
|
nReturn = ORIGINAL_API(GetModuleFileNameA)(hModule, lpFileName, nSize);
|
||
|
|
||
|
// Do nothing on failure.
|
||
|
if( 0 == nReturn || nReturn >= nSize )
|
||
|
{
|
||
|
return nReturn;
|
||
|
}
|
||
|
|
||
|
// Check the string. If the string is not pointing to system32, we need to redirect.
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
csOldFileName = lpFileName;
|
||
|
csOldFileName.MakeUpper();
|
||
|
nFound = csOldFileName.Find(lpSystemCheck);
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
// Do Nothing
|
||
|
}
|
||
|
|
||
|
if(nFound >= 0)
|
||
|
{
|
||
|
DPFN(
|
||
|
eDbgLevelInfo,
|
||
|
"[WinG32SysToSys32] Changing system\\wing32.dll to system32\\wing32.dll");
|
||
|
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
csNewFileName.GetSystemDirectoryW();
|
||
|
csNewFileName.AppendPath(lpWinG32);
|
||
|
lpNewFileName = csNewFileName.GetAnsiNIE();
|
||
|
if(lpNewFileName && nSize > (unsigned int)csNewFileName.GetLength())
|
||
|
{
|
||
|
nReturn = csNewFileName.GetLength();
|
||
|
memcpy(lpFileName, lpNewFileName, sizeof(char) * (nReturn + 1));
|
||
|
}
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
DPFN(
|
||
|
eDbgLevelInfo,
|
||
|
"[WinG32SysToSys32] Error parsing new string");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, GetModuleFileNameA)
|
||
|
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|