From afbcaf5324f91e15cdac7cb71688ae53a898f90a Mon Sep 17 00:00:00 2001 From: gho tik Date: Sat, 14 Jun 2014 12:39:22 -0400 Subject: [PATCH] v2_02_79_src Former-commit-id: 60203413bf00a880af7de48467fe44a4341a4ac3 --- build/dxwnd.dll | 4 +- build/exports/Actua Soccer 3.dxw | 9 +- build/exports/Battle Realms.dxw | 27 +++++ build/exports/Darkened Skye.dxw | 3 +- build/exports/Diablo.dxw | 7 +- build/exports/Dungeon Keeper II.dxw | 7 +- build/exports/Hollywood Monsters.dxw | 3 +- build/exports/International Football 2000.dxw | 5 +- build/exports/Kohan II Kings of War.dxw | 7 +- build/exports/Magic & Mayhem.dxw | 9 +- build/exports/O.R.B. Offword Rescue Base.dxw | 7 +- build/exports/Railroad Tycoon II.dxw | 9 +- build/exports/Rollcage 2 (D3D).dxw | 2 +- build/exports/Total Annihilation Kingdoms.dxw | 9 +- build/exports/dxwnd.ini | 8 +- build/readme-relnotes.txt | 5 +- dll/ddraw.cpp | 97 +++++++----------- dll/dinput.cpp | 79 +++++++++----- dll/dxhook.cpp | 13 +++ dll/dxhook.h | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 132096 -> 132096 bytes dll/hd3d.cpp | 45 ++++++++ host/dxwndhost.vs2008.suo | Bin 175104 -> 175104 bytes 24 files changed, 239 insertions(+), 119 deletions(-) create mode 100644 build/exports/Battle Realms.dxw diff --git a/build/dxwnd.dll b/build/dxwnd.dll index eedd809..c15b3e3 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3bb7913ecbd4bf5117c4858a94e0f9e1d5606d8dc8165258118f0a2b4e05c6ef -size 485888 +oid sha256:0552e42ae11b81672959e1b316db09614269737d6e12393f0bd473b140ce6d50 +size 487424 diff --git a/build/exports/Actua Soccer 3.dxw b/build/exports/Actua Soccer 3.dxw index d912d17..ba11b10 100644 --- a/build/exports/Actua Soccer 3.dxw +++ b/build/exports/Actua Soccer 3.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=671088674 +flag0=939524146 flagg0=1207959552 -flagh0=20 -flagi0=4 +flagh0=16 +flagi0=138412036 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,6 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +winver0=0 +maxres0=0 diff --git a/build/exports/Battle Realms.dxw b/build/exports/Battle Realms.dxw new file mode 100644 index 0000000..2ab1589 --- /dev/null +++ b/build/exports/Battle Realms.dxw @@ -0,0 +1,27 @@ +[target] +title0=Battle Realms +path0=D:\Games\Battle Realms\Battle_Realms_F.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=150994976 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Darkened Skye.dxw b/build/exports/Darkened Skye.dxw index 8aa2c65..ac9f547 100644 --- a/build/exports/Darkened Skye.dxw +++ b/build/exports/Darkened Skye.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=679493664 flagg0=1207959552 flagh0=65556 -flagi0=4 +flagi0=69206020 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,4 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= diff --git a/build/exports/Diablo.dxw b/build/exports/Diablo.dxw index 63c7691..0878981 100644 --- a/build/exports/Diablo.dxw +++ b/build/exports/Diablo.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=1 coord0=0 flag0=138428450 -flagg0=1108344848 +flagg0=1242562576 flagh0=20 -flagi0=0 +flagi0=4194304 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,6 @@ sizx0=640 sizy0=480 maxfps0=0 initts0=0 +launchpath0= +winver0=0 +maxres0=0 diff --git a/build/exports/Dungeon Keeper II.dxw b/build/exports/Dungeon Keeper II.dxw index 3b5d517..8f1b938 100644 --- a/build/exports/Dungeon Keeper II.dxw +++ b/build/exports/Dungeon Keeper II.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=0 coord0=0 flag0=16418 -flagg0=574619648 +flagg0=708837376 flagh0=20 -flagi0=0 +flagi0=4194304 tflag0=263 initx0=0 inity0=0 @@ -22,3 +22,6 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +winver0=0 +maxres0=0 diff --git a/build/exports/Hollywood Monsters.dxw b/build/exports/Hollywood Monsters.dxw index 797fac0..0b4df23 100644 --- a/build/exports/Hollywood Monsters.dxw +++ b/build/exports/Hollywood Monsters.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=134217762 flagg0=1209008384 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=64 initx0=0 inity0=0 @@ -24,3 +24,4 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= diff --git a/build/exports/International Football 2000.dxw b/build/exports/International Football 2000.dxw index e3b9a31..38f1700 100644 --- a/build/exports/International Football 2000.dxw +++ b/build/exports/International Football 2000.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=150994976 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=259 initx0=0 inity0=0 @@ -22,3 +22,6 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0=D:\Games\International Football 2000\MSIF2000.EXE +winver0=0 +maxres0=0 diff --git a/build/exports/Kohan II Kings of War.dxw b/build/exports/Kohan II Kings of War.dxw index ce7caaa..5fbec8c 100644 --- a/build/exports/Kohan II Kings of War.dxw +++ b/build/exports/Kohan II Kings of War.dxw @@ -8,8 +8,8 @@ coord0=0 flag0=134217762 flagg0=1207959552 flagh0=20 -flagi0=1028 -tflag0=6163 +flagi0=4194308 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -22,3 +22,6 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +winver0=0 +maxres0=0 diff --git a/build/exports/Magic & Mayhem.dxw b/build/exports/Magic & Mayhem.dxw index 8e8066e..e07a544 100644 --- a/build/exports/Magic & Mayhem.dxw +++ b/build/exports/Magic & Mayhem.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=0 coord0=0 flag0=138428450 -flagg0=1275068416 -flagh0=8388628 -flagi0=0 +flagg0=201326592 +flagh0=20 +flagi0=4194304 tflag0=259 initx0=0 inity0=0 @@ -22,3 +22,6 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +winver0=0 +maxres0=0 diff --git a/build/exports/O.R.B. Offword Rescue Base.dxw b/build/exports/O.R.B. Offword Rescue Base.dxw index 245e8c7..62d09dd 100644 --- a/build/exports/O.R.B. Offword Rescue Base.dxw +++ b/build/exports/O.R.B. Offword Rescue Base.dxw @@ -4,11 +4,11 @@ path0=D:\Games\O.R.B\orb.exe module0= opengllib0= ver0=0 -coord0=2 +coord0=0 flag0=134234144 -flagg0=1207959568 +flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=6163 initx0=0 inity0=0 @@ -24,3 +24,4 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= diff --git a/build/exports/Railroad Tycoon II.dxw b/build/exports/Railroad Tycoon II.dxw index c3cb149..6269c50 100644 --- a/build/exports/Railroad Tycoon II.dxw +++ b/build/exports/Railroad Tycoon II.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=2082 -flagg0=143654912 +flag0=134219810 +flagg0=135266304 flagh0=16 -flagi0=0 +flagi0=4194304 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,6 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +winver0=0 +maxres0=0 diff --git a/build/exports/Rollcage 2 (D3D).dxw b/build/exports/Rollcage 2 (D3D).dxw index 62cb48f..040fa26 100644 --- a/build/exports/Rollcage 2 (D3D).dxw +++ b/build/exports/Rollcage 2 (D3D).dxw @@ -10,7 +10,7 @@ flag0=134217760 flagg0=134217728 flagh0=20 flagi0=138412036 -tflag0=6147 +tflag0=0 initx0=0 inity0=0 minx0=0 diff --git a/build/exports/Total Annihilation Kingdoms.dxw b/build/exports/Total Annihilation Kingdoms.dxw index bf596e7..05427b2 100644 --- a/build/exports/Total Annihilation Kingdoms.dxw +++ b/build/exports/Total Annihilation Kingdoms.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134234146 -flagg0=1073741840 +flag0=671105058 +flagg0=1207959568 flagh0=16 -flagi0=0 +flagi0=4194304 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,6 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +winver0=0 +maxres0=0 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index c739d0d..52a2141 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1289 -posy=149 -sizx=465 -sizy=382 +posx=1393 +posy=159 +sizx=455 +sizy=708 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index f878460..c475179 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -521,4 +521,7 @@ fix: hot patch handling of loaded modules log: fixed some messages with no line ending for GetObjectType() d3d begin of code reorganization and cleaning ole32, user32 API hot patched -handling of DWL_DLGPROC message \ No newline at end of file +handling of DWL_DLGPROC message + +v2.02.79 +fix: recovered capability to "pin" ddraw and d3d calls \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 7de1e2f..4180c8e 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -662,23 +662,19 @@ int HookDirectDraw(HMODULE module, int version) { if(dxw.dwFlags2 & SETCOMPATIBILITY) ddSetCompatibility(); + if(dxw.dwFlags4 & HOTPATCH) { + // hot-patch all APIs and that's all folks! + HookLibrary(module, ddHooks, "ddraw.dll"); + return TRUE; + } -#if 0 - //void *tmp; - //const GUID dd7 = {0x15e65ec0,0x3b9c,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b}; + const GUID dd7 = {0x15e65ec0,0x3b9c,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b}; + HMODULE hinst; OutTraceB("HookDirectDraw version=%d\n", version); //GHO switch(version){ case 0: // automatic HookLibrary(module, ddHooks, "ddraw.dll"); - //tmp = HookAPI(module, "ddraw.dll", NULL, "DirectDrawCreate", extDirectDrawCreate); - //if(tmp) pDirectDrawCreate = (DirectDrawCreate_Type)tmp; - //tmp = HookAPI(module, "ddraw.dll", NULL, "DirectDrawCreateEx", extDirectDrawCreateEx); - //if(tmp) pDirectDrawCreateEx = (DirectDrawCreateEx_Type)tmp; - //tmp = HookAPI(module, "ddraw.dll", NULL, "DirectDrawEnumerateA", extDirectDrawEnumerate); - //if(tmp) pDirectDrawEnumerate = (DirectDrawEnumerate_Type)tmp; - //tmp = HookAPI(module, "ddraw.dll", NULL, "DirectDrawEnumerateExA", extDirectDrawEnumerateEx); - //if(tmp) pDirectDrawEnumerateEx = (DirectDrawEnumerateEx_Type)tmp; break; case 1: case 2: @@ -686,55 +682,43 @@ int HookDirectDraw(HMODULE module, int version) case 5: case 6: HookLibrary(module, ddHooks, "ddraw.dll"); - //hinst = LoadLibrary("ddraw.dll"); - //pDirectDrawEnumerate = - // (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); - //pDirectDrawCreate = - // (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); - //if(dxw.dwFlags4 & HOTPATCH){ - // extern void *HotPatch(void *, const char *, void *); - // pDirectDrawEnumerate = (DirectDrawEnumerate_Type)HotPatch(pDirectDrawEnumerate, "DirectDrawEnumerate", extDirectDrawEnumerate); - // pDirectDrawCreate = (DirectDrawCreate_Type)HotPatch(pDirectDrawCreate, "DirectDrawCreate", extDirectDrawCreate); - //} - //else { - // if(pDirectDrawCreate){ - // LPDIRECTDRAW lpdd; - // BOOL res; - // HookAPI(module, "ddraw.dll", pDirectDrawCreate, "DirectDrawCreate", extDirectDrawCreate); - // HookAPI(module, "ddraw.dll", pDirectDrawEnumerate, "DirectDrawEnumerateA", extDirectDrawEnumerate); - // res=extDirectDrawCreate(0, &lpdd, 0); - // if (res){ - // OutTraceE("DirectDrawCreate: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - // } - // lpdd->Release(); - // } - //} - //break; + if(!pDirectDrawCreate){ // required for IAT patching + hinst = LoadLibrary("ddraw.dll"); + pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); + pDirectDrawEnumerate = (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); + } + if(pDirectDrawCreate){ + LPDIRECTDRAW lpdd; + BOOL res; + HookLibrary(module, ddHooks, "ddraw.dll"); + res=extDirectDrawCreate(0, &lpdd, 0); + if (res){ + OutTraceE("DirectDrawCreate: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + } + lpdd->Release(); + } + break; case 7: - HookLibrary(module, ddHooks, "ddraw.dll"); //hinst = LoadLibrary("ddraw.dll"); - //pDirectDrawEnumerate = - // (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); - //pDirectDrawEnumerateEx = - // (DirectDrawEnumerateEx_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA"); - //pDirectDrawCreate = - // (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); - //if(pDirectDrawCreate){ - // LPDIRECTDRAW lpdd; - // BOOL res; - // HookAPI(module, "ddraw.dll", pDirectDrawCreate, "DirectDrawCreate", extDirectDrawCreate); - // HookAPI(module, "ddraw.dll", pDirectDrawEnumerate, "DirectDrawEnumerateA", extDirectDrawEnumerate); - // HookAPI(module, "ddraw.dll", pDirectDrawEnumerateEx, "DirectDrawEnumerateExA", extDirectDrawEnumerateEx); - // res=extDirectDrawCreate(0, &lpdd, 0); - // if (res) OutTraceE("DirectDrawCreate: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - // lpdd->Release(); - //} - //pDirectDrawCreateEx = - // (DirectDrawCreateEx_Type)GetProcAddress(hinst, "DirectDrawCreateEx"); + HookLibrary(module, ddHooks, "ddraw.dll"); + if(!pDirectDrawCreate){ // required for IAT patching in "Crimson skies" + hinst = LoadLibrary("ddraw.dll"); + pDirectDrawEnumerate = (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); + pDirectDrawEnumerateEx = (DirectDrawEnumerateEx_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA"); + pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); + pDirectDrawCreateEx = (DirectDrawCreateEx_Type)GetProcAddress(hinst, "DirectDrawCreateEx"); + } + if(pDirectDrawCreate){ + LPDIRECTDRAW lpdd; + BOOL res; + res=extDirectDrawCreate(0, &lpdd, 0); + if (res) OutTraceE("DirectDrawCreate: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + lpdd->Release(); + } //if(pDirectDrawCreateEx){ // LPDIRECTDRAW lpdd; // BOOL res; - // HookAPI(module, "ddraw.dll", pDirectDrawCreateEx, "DirectDrawCreateEx", extDirectDrawCreateEx); + // HookLibrary(module, ddHooks, "ddraw.dll"); // res=extDirectDrawCreateEx(0, &lpdd, dd7, 0); // if (res) OutTraceE("DirectDrawCreateEx: ERROR res=%x(%s)\n", res, ExplainDDError(res)); // lpdd->Release(); @@ -743,9 +727,6 @@ int HookDirectDraw(HMODULE module, int version) } if(pDirectDrawCreate || pDirectDrawCreateEx) return 1; -#else - HookLibrary(module, ddHooks, "ddraw.dll"); -#endif return 0; } diff --git a/dll/dinput.cpp b/dll/dinput.cpp index 4f0d3da..b2d70db 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -4,6 +4,7 @@ #include #include #include "dxwnd.h" +#include "dxhook.h" #include "dxwcore.hpp" #include "syslibs.h" #include "dxhelper.h" @@ -19,7 +20,8 @@ typedef HRESULT (WINAPI *DISetCooperativeLevel_Type)(LPDIRECTINPUTDEVICE, HWND, typedef HRESULT (WINAPI *SetDataFormat_Type)(LPDIRECTINPUTDEVICE, LPCDIDATAFORMAT); typedef HRESULT (WINAPI *DIEnumDevices_Type)(void *, DWORD, LPDIENUMDEVICESCALLBACK, LPVOID, DWORD); -HRESULT WINAPI extDirectInputCreate(HINSTANCE, DWORD, LPDIRECTINPUT *, LPUNKNOWN); +HRESULT WINAPI extDirectInputCreateA(HINSTANCE, DWORD, LPDIRECTINPUT *, LPUNKNOWN); +HRESULT WINAPI extDirectInputCreateW(HINSTANCE, DWORD, LPDIRECTINPUT *, LPUNKNOWN); HRESULT WINAPI extDirectInputCreateEx(HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN); HRESULT WINAPI extDirectInput8Create(HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN); HRESULT WINAPI extDICreateDevice(LPDIRECTINPUT, REFGUID, LPDIRECTINPUTDEVICE *, LPUNKNOWN); @@ -28,21 +30,32 @@ HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE, DWORD, LPVOID, LPDWORD, DWO HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE, DWORD, LPDIMOUSESTATE); HRESULT WINAPI extDISetCooperativeLevel(LPDIRECTINPUTDEVICE, HWND, DWORD); HRESULT WINAPI extSetDataFormat(LPDIRECTINPUTDEVICE, LPCDIDATAFORMAT); -HRESULT WINAPI extQueryInterfaceI(void *, REFIID, LPVOID *); +HRESULT WINAPI extDIQueryInterface(void *, REFIID, LPVOID *); HRESULT WINAPI extDIEnumDevices(void *, DWORD, LPDIENUMDEVICESCALLBACK, LPVOID, DWORD); -void GetMousePosition(int *, int *); -void InitPosition(int, int, int, int, int, int); - -DirectInputCreate_Type pDirectInputCreate = 0; + +DirectInputCreate_Type pDirectInputCreateA = 0; +DirectInputCreate_Type pDirectInputCreateW = 0; DirectInputCreateEx_Type pDirectInputCreateEx = 0; DICreateDevice_Type pDICreateDevice = 0; DICreateDeviceEx_Type pDICreateDeviceEx = 0; -GetDeviceData_Type pGetDeviceData; -GetDeviceState_Type pGetDeviceState; -DISetCooperativeLevel_Type pDISetCooperativeLevel; -SetDataFormat_Type pSetDataFormat; -QueryInterface_Type pQueryInterfaceI; -DIEnumDevices_Type pDIEnumDevices; +GetDeviceData_Type pGetDeviceData = 0; +GetDeviceState_Type pGetDeviceState = 0; +DISetCooperativeLevel_Type pDISetCooperativeLevel = 0; +SetDataFormat_Type pSetDataFormat = 0; +QueryInterface_Type pDIQueryInterface = 0; +DIEnumDevices_Type pDIEnumDevices = 0; + +//static HookEntry_Type diHooks[]={ +// {HOOK_HOT_CANDIDATE, "DirectInputCreateA", (FARPROC)NULL, (FARPROC *)&pDirectInputCreateA, (FARPROC)extDirectInputCreateA}, +// {HOOK_HOT_CANDIDATE, "DirectInputCreateW", (FARPROC)NULL, (FARPROC *)&pDirectInputCreateW, (FARPROC)extDirectInputCreateW}, +// {HOOK_HOT_CANDIDATE, "DirectInputCreateEx", (FARPROC)NULL, (FARPROC *)&pDirectInputCreateEx, (FARPROC)extDirectInputCreateEx}, +// {HOOK_HOT_CANDIDATE, "DirectInput8Create", (FARPROC)NULL, (FARPROC *)&pDirectInput8Create, (FARPROC)extDirectInput8Create}, +// {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator +//}; + +void GetMousePosition(int *, int *); +void InitPosition(int, int, int, int, int, int); + int iCursorX; int iCursorY; @@ -61,21 +74,21 @@ int HookDirectInput(HMODULE module, int version) const GUID di7 = {0x9A4CB684,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE}; const GUID di8 = {0xBF798030,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00}; - tmp = HookAPI(module, "dinput.dll", NULL, "DirectInputCreateA", extDirectInputCreate); - if(tmp) pDirectInputCreate = (DirectInputCreate_Type)tmp; - tmp = HookAPI(module, "dinput.dll", NULL, "DirectInputCreateW", extDirectInputCreate); - if(tmp) pDirectInputCreate = (DirectInputCreate_Type)tmp; + tmp = HookAPI(module, "dinput.dll", NULL, "DirectInputCreateA", extDirectInputCreateA); + if(tmp) pDirectInputCreateA = (DirectInputCreate_Type)tmp; + tmp = HookAPI(module, "dinput.dll", NULL, "DirectInputCreateW", extDirectInputCreateW); + if(tmp) pDirectInputCreateW = (DirectInputCreate_Type)tmp; tmp = HookAPI(module, "dinput.dll", NULL, "DirectInputCreateEx", extDirectInputCreateEx); if(tmp) pDirectInputCreateEx = (DirectInputCreateEx_Type)tmp; tmp = HookAPI(module, "dinput8.dll", NULL, "DirectInput8Create", extDirectInput8Create); if(tmp) pDirectInputCreateEx = (DirectInputCreateEx_Type)tmp; - if(!pDirectInputCreate && !pDirectInputCreateEx){ + if(!pDirectInputCreateA && !pDirectInputCreateW && !pDirectInputCreateEx){ if(version < 8){ hinst = LoadLibrary("dinput.dll"); - pDirectInputCreate = + pDirectInputCreateA = (DirectInputCreate_Type)GetProcAddress(hinst, "DirectInputCreateA"); - if(pDirectInputCreate) - if(!extDirectInputCreate(GetModuleHandle(0), DIRECTINPUT_VERSION, + if(pDirectInputCreateA) + if(!extDirectInputCreateA(GetModuleHandle(0), DIRECTINPUT_VERSION, &lpdi, 0)) lpdi->Release(); pDirectInputCreateEx = (DirectInputCreateEx_Type)GetProcAddress(hinst, "DirectInputCreateEx"); @@ -92,29 +105,38 @@ int HookDirectInput(HMODULE module, int version) di8, (void **)&lpdi, 0)) lpdi->Release(); } } - if(pDirectInputCreate || pDirectInputCreateEx) return 1; + if(pDirectInputCreateA || pDirectInputCreateW || pDirectInputCreateEx) return 1; return 0; } HRESULT WINAPI extDirectInputCreate(HINSTANCE hinst, - DWORD dwversion, LPDIRECTINPUT *lplpdi, LPUNKNOWN pu) + DWORD dwversion, LPDIRECTINPUT *lplpdi, LPUNKNOWN pu, DirectInputCreate_Type pDirectInputCreate, char *apiname) { HRESULT res; - OutTraceDW("DirectInputCreate: dwVersion=%x\n", - dwversion); + OutTraceDW("%s: dwVersion=%x\n", apiname, dwversion); res = (*pDirectInputCreate)(hinst, dwversion, lplpdi, pu); if(res) { - OutTraceE("DirectInputCreate: ERROR err=%x(%s)\n", res, ExplainDDError(res)); + OutTraceE("%s: ERROR err=%x(%s)\n", apiname, res, ExplainDDError(res)); return res; } - SetHook((void *)(**(DWORD **)lplpdi), extQueryInterfaceI, (void **)&pQueryInterfaceI, "QueryInterface(I)"); + SetHook((void *)(**(DWORD **)lplpdi), extDIQueryInterface, (void **)&pDIQueryInterface, "QueryInterface(I)"); SetHook((void *)(**(DWORD **)lplpdi + 12), extDICreateDevice, (void **)&pDICreateDevice, "CreateDevice(I)"); SetHook((void *)(**(DWORD **)lplpdi + 16), extDIEnumDevices, (void **)&pDIEnumDevices, "EnumDevices(I)"); return 0; } +HRESULT WINAPI extDirectInputCreateA(HINSTANCE hinst, DWORD dwversion, LPDIRECTINPUT *lplpdi, LPUNKNOWN pu) +{ + return extDirectInputCreate(hinst, dwversion, lplpdi, pu, pDirectInputCreateA, "DirectInputCreateA"); +} + +HRESULT WINAPI extDirectInputCreateW(HINSTANCE hinst, DWORD dwversion, LPDIRECTINPUT *lplpdi, LPUNKNOWN pu) +{ + return extDirectInputCreate(hinst, dwversion, lplpdi, pu, pDirectInputCreateW, "DirectInputCreateW"); +} + HRESULT WINAPI extDirectInputCreateEx(HINSTANCE hinst, DWORD dwversion, REFIID riidltf, LPVOID *ppvout, LPUNKNOWN pu) { @@ -135,14 +157,14 @@ HRESULT WINAPI extDirectInputCreateEx(HINSTANCE hinst, return 0; } -HRESULT WINAPI extQueryInterfaceI(void * lpdi, REFIID riid, LPVOID *obp) +HRESULT WINAPI extDIQueryInterface(void * lpdi, REFIID riid, LPVOID *obp) { HRESULT res; OutTraceDW("QueryInterface(I): REFIID=%x\n", riid.Data1); - res = (*pQueryInterfaceI)(lpdi, riid, obp); + res = (*pDIQueryInterface)(lpdi, riid, obp); if(res) return res; switch(riid.Data1){ @@ -380,6 +402,7 @@ HRESULT WINAPI extDIEnumDevices(void *lpdi, DWORD dwDevType, LPDIENUMDEVICESCALL Arg.cb= lpCallback; Arg.arg=pvRef; res=(*pDIEnumDevices)( lpdi, dwDevType, (LPDIENUMDEVICESCALLBACK)extDeviceProxy, pvRef, dwFlags); + //res=(*pDIEnumDevices)( lpdi, dwDevType, lpCallback, pvRef, dwFlags); OutTraceDW("EnumDevices(I): res=%x\n", res); return res; } diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 826c521..7dcffc1 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -1642,6 +1642,19 @@ void HookLibrary(HMODULE hModule, HookEntry_Type *Hooks, char *DLLName) } } +void PinLibrary(HookEntry_Type *Hooks, char *DLLName) +{ + HMODULE hModule = NULL; + hModule = (*pLoadLibraryA)(DLLName); + if(!hModule) { + OutTrace("PinLibrary: LoadLibrary failed on DLL=%s err=%x\n", DLLName, GetLastError()); + return; + } + for(; Hooks->APIName; Hooks++){ + if (Hooks->StoreAddress) *(Hooks->StoreAddress) = (*pGetProcAddress)(hModule, Hooks->APIName); + } +} + BOOL IsHotPatched(HookEntry_Type *Hooks, char *ApiName) { for(; Hooks->APIName; Hooks++){ diff --git a/dll/dxhook.h b/dll/dxhook.h index 75df21e..840458a 100644 --- a/dll/dxhook.h +++ b/dll/dxhook.h @@ -53,5 +53,6 @@ typedef struct { extern FARPROC RemapLibrary(LPCSTR, HMODULE, HookEntry_Type *); extern void HookLibrary(HMODULE, HookEntry_Type *, char *); +extern void PinLibrary(HookEntry_Type *, char *); extern void HookLibInit(HookEntry_Type *); extern BOOL IsHotPatched(HookEntry_Type *, char *); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index ed006fe..38b7dad 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.78" +#define VERSION "2.02.79" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 5099f4bc0bfbaf8f15e4a3b5fc235a82ed783172..2d53de358aa3bc4b7d8fc0451f5122d1129bf2ab 100644 GIT binary patch delta 13873 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 Ph?pNMs`kBUh9vzjP&%0h delta 15173 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 Vd1BOUp;>VI3#|OfBfekr{{*Obnyvr< diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index 4964b65..6995efb 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -326,6 +326,12 @@ FARPROC Remap_d3d11_ProcAddress(LPCSTR proc, HMODULE hModule) } int HookDirect3D(HMODULE module, int version){ + LPDIRECT3D9 lpd3d; + ID3D10Device *lpd3d10; + ID3D11Device *lpd3d11; + HRESULT res; + + OutTrace("HookDirect3D: module=%x version=%d\n", module, version); switch(version){ case 0: HookLibrary(module, d3d8Hooks, "d3d8.dll"); @@ -337,18 +343,57 @@ int HookDirect3D(HMODULE module, int version){ #endif break; case 8: + PinLibrary(d3d8Hooks, "d3d8.dll"); // pin for "Port Royale 2" HookLibrary(module, d3d8Hooks, "d3d8.dll"); + if(pDirect3DCreate8){ + lpd3d = (LPDIRECT3D9)extDirect3DCreate8(220); + if(lpd3d) lpd3d->Release(); + } break; case 9: + PinLibrary(d3d9Hooks, "d3d9.dll");// pin for "Affari tuoi" HookLibrary(module, d3d9Hooks, "d3d9.dll"); + if(pDirect3DCreate9){ + lpd3d = (LPDIRECT3D9)extDirect3DCreate9(31); + if(lpd3d) lpd3d->Release(); + } break; #ifdef HOOKD3D10ANDLATER case 10: + PinLibrary(d3d10Hooks, "d3d10.dll"); + PinLibrary(d3d10_1Hooks, "d3d10_1.dll"); HookLibrary(module, d3d10Hooks, "d3d10.dll"); HookLibrary(module, d3d10_1Hooks, "d3d10_1.dll"); + if(pD3D10CreateDevice){ + res = extD3D10CreateDevice( + NULL, + D3D10_DRIVER_TYPE_HARDWARE, + NULL, + 0, + D3D10_SDK_VERSION, + &lpd3d10); + if(res==DD_OK) lpd3d10->Release(); + } break; case 11: + PinLibrary(d3d11Hooks, "d3d11.dll"); HookLibrary(module, d3d11Hooks, "d3d11.dll"); + if(pD3D11CreateDevice){ + D3D_FEATURE_LEVEL FeatureLevel; + ID3D11DeviceContext *pImmediateContext; + res = extD3D11CreateDevice( + NULL, + D3D_DRIVER_TYPE_HARDWARE, + NULL, + 0, // flags + NULL, // FeatureLevels + 0, + D3D11_SDK_VERSION, + &lpd3d11, + &FeatureLevel, + &pImmediateContext); + if(res==DD_OK) lpd3d11->Release(); + } #endif } if(pDirect3DCreate8 || pDirect3DCreate9) return 1; diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 2bf8032e36bd912da198c53fb82a6e2b999a6cb6..22c6a2a5a042accbe5cb34fd007b033eca6297cb 100644 GIT binary patch delta 10692 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