Fix D3D9 hook patches for windows 8.1

This also changes the way that the patches are used as well in the code,
instead of relying on constant patch sizes, now allows for variable
patch sizes instead
master
jp9000 2014-11-19 06:32:17 -08:00
parent b73c3949c2
commit 92318d5af9
1 changed files with 53 additions and 32 deletions

View File

@ -102,11 +102,18 @@ bool CompareMemory(const LPVOID lpVal1, const LPVOID lpVal2, UINT nBytes)
return false;
}
struct PatchInfo {
size_t patchSize;
const BYTE *patchData;
};
#define NewPatch(x) {sizeof(x), (x)}
#ifdef _WIN64
#define NUM_KNOWN_PATCHES 9
#define NUM_KNOWN_PATCHES 10
#define PATCH_COMPARE_SIZE 13
UPARAM patch_offsets[NUM_KNOWN_PATCHES] = {/*0x4B55F,*/ 0x54FE6, 0x55095, 0x550C5, 0x8BDB5, 0x90352, 0x9038A, 0x93AFA, 0x93B8A, 0x1841E5};
UPARAM patch_offsets[NUM_KNOWN_PATCHES] = {/*0x4B55F,*/ 0x54FE6, 0x55095, 0x550C5, 0x8BDB5, 0x8E635, 0x90352, 0x9038A, 0x93AFA, 0x93B8A, 0x1841E5};
BYTE patch_compare[NUM_KNOWN_PATCHES][PATCH_COMPARE_SIZE] =
{
//{0x48, 0x8b, 0x81, 0xc8, 0x38, 0x00, 0x00, 0x39, 0x98, 0x68, 0x50, 0x00, 0x00}, //winvis - 6.0.6002.18005
@ -114,6 +121,7 @@ BYTE patch_compare[NUM_KNOWN_PATCHES][PATCH_COMPARE_SIZE] =
{0x48, 0x8b, 0x81, 0xb8, 0x3d, 0x00, 0x00, 0x39, 0x98, 0x68, 0x50, 0x00, 0x00}, //win7 - 6.1.7601.16562
{0x48, 0x8b, 0x81, 0xb8, 0x3d, 0x00, 0x00, 0x39, 0x98, 0x68, 0x50, 0x00, 0x00}, //win7 - 6.1.7601.17514
{0x48, 0x8b, 0x81, 0xb8, 0x3d, 0x00, 0x00, 0x39, 0xB0, 0x28, 0x51, 0x00, 0x00}, //win8.1 - 6.3.9431.00000
{0x48, 0x8b, 0x81, 0xb8, 0x3d, 0x00, 0x00, 0x39, 0xA8, 0x28, 0x51, 0x00, 0x00}, //win8.1 - 6.3.9600.17415
{0x8b, 0x81, 0xb8, 0x3d, 0x00, 0x00, 0x44, 0x39, 0xA0, 0x28, 0x51, 0x00, 0x00}, //win8.1 - 6.3.9600.17085
{0x8b, 0x81, 0xb8, 0x3d, 0x00, 0x00, 0x44, 0x39, 0xA0, 0x28, 0x51, 0x00, 0x00}, //win8.1 - 6.3.9600.17095
{0x8b, 0x81, 0xb8, 0x3d, 0x00, 0x00, 0x44, 0x39, 0xA0, 0x28, 0x51, 0x00, 0x00}, //win8.1 - 6.3.9600.16384
@ -121,26 +129,29 @@ BYTE patch_compare[NUM_KNOWN_PATCHES][PATCH_COMPARE_SIZE] =
{0x49, 0x8b, 0x85, 0xb8, 0x3d, 0x00, 0x00, 0x39, 0x88, 0xc8, 0x50, 0x00, 0x00}, //win8 - 6.2.9200.16384
};
#define PATCH_SIZE 2
BYTE patch[NUM_KNOWN_PATCHES][PATCH_SIZE] =
static const BYTE forceJump[] = {0xEB};
static const BYTE ignoreJump[] = {0x90, 0x90};
PatchInfo patch[NUM_KNOWN_PATCHES] =
{
//{0xEB, 0x12},
{0xEB, 0x12},
{0xEB, 0x12},
{0xEB, 0x12},
{0x90, 0x90},
{0x90, 0x90},
{0x90, 0x90},
{0x90, 0x90},
{0x90, 0x90},
{0x90, 0x90},
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(ignoreJump),
NewPatch(ignoreJump),
NewPatch(ignoreJump),
NewPatch(ignoreJump),
NewPatch(ignoreJump),
NewPatch(ignoreJump),
NewPatch(ignoreJump),
};
#else
#define NUM_KNOWN_PATCHES 9
#define NUM_KNOWN_PATCHES 10
#define PATCH_COMPARE_SIZE 12
UPARAM patch_offsets[NUM_KNOWN_PATCHES] = {/*0x4BDA1,*/ 0x79AA6, 0x79C9E, 0x79D96, 0x7F9BD, 0x8A3F4, 0x8E9F7, 0x8F00F, 0x8FBB1, 0x166A08};
UPARAM patch_offsets[NUM_KNOWN_PATCHES] = {/*0x4BDA1,*/ 0x79AA6, 0x79C9E, 0x79D96, 0x7F9BD, 0x8A3F4, 0x8E9F7, 0x8F00F, 0x8FBB1, 0x90264, 0x166A08};
BYTE patch_compare[NUM_KNOWN_PATCHES][PATCH_COMPARE_SIZE] =
{
//{0x8b, 0x89, 0x6c, 0x27, 0x00, 0x00, 0x39, 0xb9, 0x80, 0x4b, 0x00, 0x00}, //winvis - 6.0.6002.18005
@ -152,22 +163,26 @@ BYTE patch_compare[NUM_KNOWN_PATCHES][PATCH_COMPARE_SIZE] =
{0x80, 0xe8, 0x29, 0x00, 0x00, 0x83, 0xb8, 0x40, 0x4c, 0x00, 0x00, 0x00}, //win8.1 - 6.3.9600.17095
{0x80, 0xe8, 0x29, 0x00, 0x00, 0x83, 0xb8, 0x40, 0x4c, 0x00, 0x00, 0x00}, //win8.1 - 6.3.9600.17085
{0x80, 0xe8, 0x29, 0x00, 0x00, 0x83, 0xb8, 0x40, 0x4c, 0x00, 0x00, 0x00}, //win8.1 - 6.3.9600.16384
{0x87, 0xe8, 0x29, 0x00, 0x00, 0x83, 0xb8, 0x40, 0x4c, 0x00, 0x00, 0x00}, //win8.1 - 6.3.9600.17415
{0x8b, 0x80, 0xe8, 0x29, 0x00, 0x00, 0x39, 0x90, 0xb0, 0x4b, 0x00, 0x00}, //win8 - 6.2.9200.16384
};
#define PATCH_SIZE 1
BYTE patch[NUM_KNOWN_PATCHES][PATCH_SIZE] =
static const BYTE forceJump[] = {0xEB};
static const BYTE ignoreJump[] = {0x90, 0x90};
PatchInfo patch[NUM_KNOWN_PATCHES] =
{
//{0xEB, 0x02},
{0xEB},
{0xEB},
{0xEB},
{0xEB},
{0xEB},
{0xEB},
{0xEB},
{0xEB},
{0xEB},
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(forceJump),
NewPatch(ignoreJump),
NewPatch(forceJump),
};
#endif
@ -297,6 +312,7 @@ typedef HRESULT (WINAPI *CREATEDXGIFACTORY1PROC)(REFIID riid, void **ppFactory);
void DoD3D9GPUHook(IDirect3DDevice9 *device)
{
BYTE *savedData = nullptr;
BOOL bSuccess = false;
bDXGIHooked = true;
@ -411,15 +427,17 @@ void DoD3D9GPUHook(IDirect3DDevice9 *device)
//------------------------------------------------
LPBYTE patchAddress = (patchType != 0) ? GetD3D9PatchAddress() : NULL;
BYTE savedData[PATCH_SIZE];
DWORD dwOldProtect;
size_t patch_size;
if(patchAddress)
{
if(VirtualProtect(patchAddress, PATCH_SIZE, PAGE_EXECUTE_READWRITE, &dwOldProtect))
patch_size = patch[patchType-1].patchSize;
savedData = (BYTE*)malloc(patch_size);
if(VirtualProtect(patchAddress, patch_size, PAGE_EXECUTE_READWRITE, &dwOldProtect))
{
memcpy(savedData, patchAddress, PATCH_SIZE);
memcpy(patchAddress, patch[patchType-1], PATCH_SIZE);
memcpy(savedData, patchAddress, patch_size);
memcpy(patchAddress, patch[patchType-1].patchData, patch_size);
}
else
{
@ -437,8 +455,8 @@ void DoD3D9GPUHook(IDirect3DDevice9 *device)
if(patchAddress)
{
memcpy(patchAddress, savedData, PATCH_SIZE);
VirtualProtect(patchAddress, PATCH_SIZE, dwOldProtect, &dwOldProtect);
memcpy(patchAddress, savedData, patch_size);
VirtualProtect(patchAddress, patch_size, dwOldProtect, &dwOldProtect);
}
if(FAILED(hErr = d3d9Tex->GetSurfaceLevel(0, &copyD3D9TextureGame)))
@ -461,6 +479,9 @@ void DoD3D9GPUHook(IDirect3DDevice9 *device)
finishGPUHook:
if (savedData)
free(savedData);
if(bSuccess)
{
bHasTextures = true;