diff --git a/Include/dxwnd.h b/Include/dxwnd.h
index a479495..9cc4aca 100644
--- a/Include/dxwnd.h
+++ b/Include/dxwnd.h
@@ -139,6 +139,9 @@
#define SUPPORTHDTV 0x00800000 // Supports HDTV standard resolutions
#define RELEASEMOUSE 0x01000000 // GetCursorPos returns centered coordinates when the mouse cursor is moved outside the window
#define FRAMECOMPENSATION 0x02000000 // Compensate for frame border adding x,y displacement of (x) left border and (y) window title bar
+#define HOTPATCH 0x04000000 // Use hot patching technique to handle obfuscated IAT
+#define ENABLEHOTKEYS 0x08000000 // Enables hot keys
+#define HOTPATCHALWAYS 0x10000000 // Force hot patching to every call
// logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index 3065a8c..c94aabe 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2402376ce446d1f0d06c36f3d7cfdda81e9052c03dde6bdcb0532bf9b5fc67ef
-size 475648
+oid sha256:5b7f9b28cc1d19e29759f70cf2f5187a21319a31a0d8bd24d36c3314161d958c
+size 483328
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index 3a9a89f..e470991 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e351b8cb36d1cfc02f5a113555e75bc72da15b5054595777b85b4fac2d993b6d
+oid sha256:d705eb95e5834c95b4be2e8639c08df2c027df4edec2b0e3f2247e9f05da5d67
size 539136
diff --git a/build/dxwnd.ini b/build/dxwnd.ini
index 56f6475..b74c8f2 100644
--- a/build/dxwnd.ini
+++ b/build/dxwnd.ini
@@ -1,5 +1,11 @@
+[keymapping]
+timetoggle=0x72
+altf4=0x73
+timeslow=0x74
+timefast=0x75
+
[window]
-posx=930
-posy=192
+posx=50
+posy=50
sizx=320
sizy=200
diff --git a/build/exports/Age of Empires II.dxw b/build/exports/Age of Empires II.dxw
new file mode 100644
index 0000000..13d078c
--- /dev/null
+++ b/build/exports/Age of Empires II.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Age of Empires II
+path0=D:\Games\Age of Empires 2\empires2.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134218272
+flagg0=1207959552
+flagh0=20
+flagi0=4
+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/Age of Empires.dxw b/build/exports/Age of Empires.dxw
new file mode 100644
index 0000000..7eb4bf9
--- /dev/null
+++ b/build/exports/Age of Empires.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Age of Empires
+path0=D:\Games\Age of Empires\Empires.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134218272
+flagg0=1207959552
+flagh0=20
+flagi0=4
+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/Doom 3.dxw b/build/exports/Doom 3.dxw
new file mode 100644
index 0000000..9147f33
--- /dev/null
+++ b/build/exports/Doom 3.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Doom 3
+path0=D:\Games\Doom 3\Doom3.exe
+launchpath0=
+module0=
+opengllib0=OpenGL32.dll
+ver0=9
+coord0=0
+flag0=134217760
+flagg0=1207959552
+flagh0=65557
+flagi0=69206020
+tflag0=6211
+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/Little Big Adventure 2 (Windows patch).dxw b/build/exports/Little Big Adventure 2 (Windows patch).dxw
new file mode 100644
index 0000000..0ef3bac
--- /dev/null
+++ b/build/exports/Little Big Adventure 2 (Windows patch).dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Little Big Adventure 2 (Windows patch)
+path0=C:\LBA2\TWINSEN.EXE
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134218336
+flagg0=1480654848
+flagh0=84
+flagi0=4718592
+tflag0=6211
+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=1
+maxres0=-1
diff --git a/build/exports/Star Wars Episode I Racer.dxw b/build/exports/Star Wars Episode I Racer.dxw
index b1a9c5a..edc9f2c 100644
--- a/build/exports/Star Wars Episode I Racer.dxw
+++ b/build/exports/Star Wars Episode I Racer.dxw
@@ -8,7 +8,7 @@ coord0=0
flag0=679493669
flagg0=1210056720
flagh0=8212
-flagi0=20
+flagi0=2097172
tflag0=0
initx0=0
inity0=0
@@ -24,3 +24,4 @@ maxfps0=0
initts0=0
winver0=0
maxres0=0
+launchpath0=
diff --git a/build/exports/Tails Gear.dxw b/build/exports/Tails Gear.dxw
new file mode 100644
index 0000000..a22cad6
--- /dev/null
+++ b/build/exports/Tails Gear.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Tails Gear
+path0=D:\Games\TailsGear078\DT_MAIN.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134217760
+flagg0=1207959552
+flagh0=20
+flagi0=4194308
+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/Wacky Races.dxw b/build/exports/Wacky Races.dxw
new file mode 100644
index 0000000..ad47700
--- /dev/null
+++ b/build/exports/Wacky Races.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Wacky Races
+path0=D:\Games\Wacky Races\WPC.EXE
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134217760
+flagg0=134217728
+flagh0=20
+flagi0=4194308
+tflag0=64
+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/Wind Fantasy SP.dxw b/build/exports/Wind Fantasy SP.dxw
new file mode 100644
index 0000000..434beba
--- /dev/null
+++ b/build/exports/Wind Fantasy SP.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Wind Fantasy SP
+path0=D:\Games\Wind Fantasy SP\WF_SP.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134480416
+flagg0=1207959552
+flagh0=20
+flagi0=4194308
+tflag0=64
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=1280
+sizy0=960
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini
new file mode 100644
index 0000000..c739d0d
--- /dev/null
+++ b/build/exports/dxwnd.ini
@@ -0,0 +1,5 @@
+[window]
+posx=1289
+posy=149
+sizx=465
+sizy=382
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index 2b8f111..91e0e53 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -474,4 +474,22 @@ fix: fixed Launch field used with "Use DLL injection" flag
fix: somehow improved "Use DLL injection" to avoid blocked tasks and allow exception handling
v2.02.73
-to be written ....
\ No newline at end of file
+Add: preliminary support for (unchecked) "Run in window" flag. Now if the flag is unchecked, DxWnd does NOT force the program to run in a window. Still, some rendering modes are not working perfectly.
+add: support for Unicode DefWindowProcW API call
+fixed some differences in D3D CreateDevice vs. CreateDeviceEx handling
+added "Window frame compensation" input flag to set the cursor position properly in "Sub Commando"
+fix: properly handled the case of NULL WindowProc routine in CreateDialog/Indirect API calls. Makes "LEGO Stunt Rally" working.
+added support for Unicode SystemParametersInfoW API call
+
+v2.02.74
+Add: API hot patching, thank to aqrit precious support. Now Doom 3 is played in window.
+hooked GetCursorInfo call
+fix: recalculate vsync timers in case of time stretching
+fix: log failure for CreateWindowExW wchar api
+Add: configurable keyboard commands
+Add: timestretch toggle command
+Add: "Enable hotkeys" flag to enable/disable hotkeys
+fix: eliminated dialogs with timer warning messages (to be investigated...)
+fix: moved "no banner" flag to main tab again
+fix: potential string violation, possible cause for flash crash?
+
diff --git a/dll/advapi.cpp b/dll/advapi.cpp
index 3ea6f4b..4937dec 100644
--- a/dll/advapi.cpp
+++ b/dll/advapi.cpp
@@ -8,13 +8,13 @@
#include "dxhelper.h"
static HookEntry_Type Hooks[]={
- {"RegOpenKeyExA", NULL, (FARPROC *)&pRegOpenKeyEx, (FARPROC)extRegOpenKeyEx},
- {"RegCloseKey", NULL, (FARPROC *)&pRegCloseKey, (FARPROC)extRegCloseKey},
- {"RegQueryValueExA", NULL, (FARPROC *)&pRegQueryValueEx, (FARPROC)extRegQueryValueEx},
- {"RegCreateKeyA", NULL, (FARPROC *)&pRegCreateKey, (FARPROC)extRegCreateKey},
- {"RegCreateKeyExA", NULL, (FARPROC *)&pRegCreateKeyEx, (FARPROC)extRegCreateKeyEx},
- {"RegSetValueExA", NULL, (FARPROC *)&pRegSetValueEx, (FARPROC)extRegSetValueEx},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "RegOpenKeyExA", NULL, (FARPROC *)&pRegOpenKeyEx, (FARPROC)extRegOpenKeyEx},
+ {HOOK_IAT_CANDIDATE, "RegCloseKey", NULL, (FARPROC *)&pRegCloseKey, (FARPROC)extRegCloseKey},
+ {HOOK_IAT_CANDIDATE, "RegQueryValueExA", NULL, (FARPROC *)&pRegQueryValueEx, (FARPROC)extRegQueryValueEx},
+ {HOOK_IAT_CANDIDATE, "RegCreateKeyA", NULL, (FARPROC *)&pRegCreateKey, (FARPROC)extRegCreateKey},
+ {HOOK_IAT_CANDIDATE, "RegCreateKeyExA", NULL, (FARPROC *)&pRegCreateKeyEx, (FARPROC)extRegCreateKeyEx},
+ {HOOK_IAT_CANDIDATE, "RegSetValueExA", NULL, (FARPROC *)&pRegSetValueEx, (FARPROC)extRegSetValueEx},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
void HookAdvApi32(HMODULE module)
diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp
index 8db12d4..1015ead 100644
--- a/dll/ddraw.cpp
+++ b/dll/ddraw.cpp
@@ -16,6 +16,8 @@
#include "dxhelper.h"
#include "syslibs.h"
+extern BOOL IsChangeDisplaySettingsHotPatched;
+
// DirectDraw API
HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *);
HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *, LPDIRECTDRAW FAR *, REFIID, IUnknown FAR *);
@@ -263,13 +265,13 @@ static void SetPixFmt(LPDDSURFACEDESC2);
static void GetPixFmt(LPDDSURFACEDESC2);
static HookEntry_Type ddHooks[]={
- {"DirectDrawCreate", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreate, (FARPROC)extDirectDrawCreate},
- {"DirectDrawCreateEx", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateEx, (FARPROC)extDirectDrawCreateEx},
- {"DirectDrawEnumerateA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerate, (FARPROC)extDirectDrawEnumerate},
- {"DirectDrawEnumerateExA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateEx, (FARPROC)extDirectDrawEnumerateEx},
- //{"DirectDrawEnumerateW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateW, (FARPROC)extDirectDrawCreate},
- //{"DirectDrawEnumerateExW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateExW, (FARPROC)extDirectDrawCreate},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "DirectDrawCreate", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreate, (FARPROC)extDirectDrawCreate},
+ {HOOK_IAT_CANDIDATE, "DirectDrawCreateEx", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateEx, (FARPROC)extDirectDrawCreateEx},
+ {HOOK_IAT_CANDIDATE, "DirectDrawEnumerateA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerate, (FARPROC)extDirectDrawEnumerate},
+ {HOOK_IAT_CANDIDATE, "DirectDrawEnumerateExA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateEx, (FARPROC)extDirectDrawEnumerateEx},
+ //{HOOK_IAT_CANDIDATE, "DirectDrawEnumerateW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateW, (FARPROC)extDirectDrawCreate},
+ //{HOOK_IAT_CANDIDATE, "DirectDrawEnumerateExW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateExW, (FARPROC)extDirectDrawCreate},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
FARPROC Remap_ddraw_ProcAddress(LPCSTR proc, HMODULE hModule)
@@ -1871,8 +1873,10 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd,
(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd);
if(dxw.Windowize){
- dwwidth = ddsd.dwWidth;
- dwheight = ddsd.dwHeight;
+ if(!IsChangeDisplaySettingsHotPatched){
+ dwwidth = ddsd.dwWidth;
+ dwheight = ddsd.dwHeight;
+ }
OutTraceDW("SetDisplayMode: fixing colordepth current=%d required=%d size=(%dx%d)\n",
ddsd.ddpfPixelFormat.dwRGBBitCount, dwbpp, dwwidth, dwheight);
}
diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp
index abfe26e..300b1ce 100644
--- a/dll/dxhelper.cpp
+++ b/dll/dxhelper.cpp
@@ -1679,4 +1679,18 @@ char *ExplainRenderstateValue(DWORD Value)
default : p="???"; break;
}
return p;
-}
\ No newline at end of file
+}
+
+char *ExplainWfPFlags(DWORD c)
+{
+ static char eb[128];
+ unsigned int l;
+ strcpy(eb,"CWP_");
+ if(c & CWP_SKIPDISABLED) strcat(eb, "SKIPDISABLED+");
+ if(c & CWP_SKIPINVISIBLE) strcat(eb, "SKIPINVISIBLE+");
+ if(c & CWP_SKIPTRANSPARENT) strcat(eb, "SKIPTRANSPARENT+");
+ l=strlen(eb);
+ if (l>strlen("CWP_")) eb[l-1]=0; // delete last '+' if any
+ else strcpy(eb,"CWP_ALL");
+ return(eb);
+}
diff --git a/dll/dxhelper.h b/dll/dxhelper.h
index a9a3e8d..75917ea 100644
--- a/dll/dxhelper.h
+++ b/dll/dxhelper.h
@@ -48,3 +48,4 @@ extern char *ExplainPaletteUse(UINT);
extern char *ExplainRasterCaps(DWORD);
extern char *ExplainD3DRenderState(DWORD);
extern char *ExplainRenderstateValue(DWORD);
+extern char *ExplainWfPFlags(DWORD);
diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp
index 4d7619d..0528e20 100644
--- a/dll/dxhook.cpp
+++ b/dll/dxhook.cpp
@@ -34,6 +34,8 @@ Finishdisasm_Type pFinishdisasm;
Disasm_Type pDisasm;
extern void InitScreenParameters();
+extern void *HotPatch(void *, const char *, void *);
+extern void *IATPatch(HMODULE, char *, void *, const char *, void *);
void HookModule(HMODULE, int);
static void RecoverScreenMode();
static void LockScreenMode(DWORD, DWORD, DWORD);
@@ -84,8 +86,8 @@ static char *Flag4Names[32]={
"LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP",
"STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF",
"FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV",
- "RELEASEMOUSE", "", "", "",
- "", "", "", "",
+ "RELEASEMOUSE", "FRAMECOMPENSATION", "HOTPATCH", "ENABLEHOTKEYS",
+ "HOTPATCHALWAYS", "", "", "",
};
static char *TFlagNames[32]={
@@ -354,16 +356,6 @@ void SetHook(void *target, void *hookproc, void **hookedproc, char *hookname)
void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, void *hookproc)
{
- PIMAGE_NT_HEADERS pnth;
- PIMAGE_IMPORT_DESCRIPTOR pidesc;
- DWORD base, rva;
- PSTR impmodule;
- PIMAGE_THUNK_DATA ptaddr;
- PIMAGE_THUNK_DATA ptname;
- PIMAGE_IMPORT_BY_NAME piname;
- DWORD oldprotect;
- void *org;
-
if(dxw.dwTFlags & OUTIMPORTTABLE) OutTrace("HookAPI: module=%x dll=%s apiproc=%x apiname=%s hookproc=%x\n",
module, dll, apiproc, apiname, hookproc);
@@ -374,87 +366,13 @@ void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, voi
return 0;
}
- base = (DWORD)module;
- org = 0; // by default, ret = 0 => API not found
-
- __try{
- pnth = PIMAGE_NT_HEADERS(PBYTE(base) + PIMAGE_DOS_HEADER(base)->e_lfanew);
- if(!pnth) {
- OutTraceH("HookAPI: ERROR no PNTH at %d\n", __LINE__);
- return 0;
- }
- rva = pnth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
- if(!rva) {
- OutTraceH("HookAPI: ERROR no RVA at %d\n", __LINE__);
- return 0;
- }
- pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva);
-
- while(pidesc->FirstThunk){
- impmodule = (PSTR)(base + pidesc->Name);
- if(!lstrcmpi(dll, impmodule)) {
- //OutTraceH("HookAPI: dll=%s found at %x\n", dll, impmodule);
-
- ptaddr = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->FirstThunk);
- ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL;
-
- //if((apiproc==NULL) && (ptname==NULL)){
- // OutTraceH("HookAPI: unreacheable api=%s dll=%s\n", apiname, dll);
- // return 0;
- //}
-
- while(ptaddr->u1.Function){
- if (ptname){
- if(!IMAGE_SNAP_BY_ORDINAL(ptname->u1.Ordinal)){
- piname = (PIMAGE_IMPORT_BY_NAME)(base + (DWORD)ptname->u1.AddressOfData);
- //OutTrace("examining by ptname name=%s\n", (char *)piname->Name);
- if(!lstrcmpi(apiname, (char *)piname->Name)) break;
- }
- }
- if (apiproc){
- // log not working !!!
- //piname = (PIMAGE_IMPORT_BY_NAME)(base + (DWORD)ptaddr->u1.AddressOfData);
- //OutTrace("examining by addr name=%s\n", (char *)piname->Name);
- if(ptaddr->u1.Function == (DWORD)apiproc) break;
- }
- ptaddr ++;
- if (ptname) ptname ++;
- }
-
- if(ptaddr->u1.Function) {
- org = (void *)ptaddr->u1.Function;
- if(org == hookproc) return 0; // already hooked
-
- if(!VirtualProtect(&ptaddr->u1.Function, 4, PAGE_EXECUTE_READWRITE, &oldprotect)) {
- OutTraceDW("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__);
- return 0;
- }
- ptaddr->u1.Function = (DWORD)hookproc;
- if(!VirtualProtect(&ptaddr->u1.Function, 4, oldprotect, &oldprotect)) {
- OutTraceDW("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__);
- return 0;
- }
- if (!FlushInstructionCache(GetCurrentProcess(), &ptaddr->u1.Function, 4)) {
- OutTraceDW("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__);
- return 0;
- }
- OutTraceH("HookAPI hook=%s address=%x->%x\n", apiname, org, hookproc);
-
- return org;
- }
- }
- pidesc ++;
- }
- if(!pidesc->FirstThunk) {
- OutTraceH("HookAPI: PE unreferenced function %s:%s\n", dll, apiname);
- return 0;
- }
+ if(dxw.dwFlags4 & HOTPATCHALWAYS) {
+ void *orig;
+ orig=HotPatch(apiproc, apiname, hookproc);
+ if(orig) return orig;
}
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- OutTraceDW("HookAPI: EXCEPTION hook=%s:%s Hook Failed.\n", dll, apiname);
- }
- return org;
+
+ return IATPatch(module, dll, apiproc, apiname, hookproc);
}
// v.2.1.80: unified positioning logic into CalculateWindowPos routine
@@ -751,11 +669,13 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
static BOOL DoOnce = TRUE;
static BOOL IsToBeLocked;
static int LastTimeShift;
+ static int SaveTimeShift;
+ static BOOL TimeShiftToggle=TRUE;
if(DoOnce){
DoOnce=FALSE;
IsToBeLocked=(dxw.dwFlags1 & LOCKWINPOS);
- LastTimeShift=dxw.TimeShift;
+ LastTimeShift=SaveTimeShift=dxw.TimeShift;
}
// v2.1.93: adjust clipping region
@@ -799,8 +719,11 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
}
}
- if(dxw.dwFlags4 & STRETCHTIMERS){
- if(LastTimeShift != dxw.TimeShift) dxw.RenewTimers();
+ if(LastTimeShift != dxw.TimeShift){
+ extern void SetVSyncDelays(LPDIRECTDRAW);
+ extern LPDIRECTDRAW lpPrimaryDD;
+ if(dxw.dwFlags4 & STRETCHTIMERS) dxw.RenewTimers();
+ SetVSyncDelays(lpPrimaryDD);
LastTimeShift=dxw.TimeShift;
}
@@ -987,39 +910,54 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
// TerminateProcess(GetCurrentProcess(),0);
// break;
case WM_SYSKEYDOWN:
- OutTraceW("event WM_SYSKEYDOWN wparam=%x lparam=%x\n", wparam, lparam);
- switch (wparam){
- case VK_F12:
+ case WM_KEYDOWN:
+ if(!(dxw.dwFlags4 & ENABLEHOTKEYS)) break;
+ OutTraceW("event %s wparam=%x lparam=%x\n", (message==WM_SYSKEYDOWN)?"WM_SYSKEYDOWN":"WM_KEYDOWN", wparam, lparam);
+ UINT DxWndKey;
+ DxWndKey=dxw.MapKeysConfig(message, lparam, wparam);
+ switch (DxWndKey){
+ case DXVK_CLIPTOGGLE:
if(dxw.dwFlags1 & CLIPCURSOR){
OutTraceDW("WindowProc: WM_SYSKEYDOWN key=%x ToggleState=%x\n",wparam,ClipCursorToggleState);
ClipCursorToggleState = !ClipCursorToggleState;
ClipCursorToggleState ? dxw.SetClipCursor() : dxw.EraseClipCursor();
}
- case VK_F11:
+ break;
+ case DXVK_REFRESH:
dxw.ScreenRefresh();
break;
- case VK_F10:
+ case DXVK_LOGTOGGLE:
dx_ToggleLogging();
break;
- case VK_F9:
+ case DXVK_PLOCKTOGGLE:
dx_TogglePositionLock(hwnd);
break;
- //case VK_F8:
- // dx_ToggleDC();
- // break;
- case VK_F7:
+ case DXVK_FPSTOGGLE:
dx_ToggleFPS();
break;
- case VK_F6:
- case VK_F5:
+ case DXVK_TIMEFAST:
+ case DXVK_TIMESLOW:
if (dxw.dwFlags2 & TIMESTRETCH) {
- if (wparam == VK_F5 && (dxw.TimeShift < 8)) dxw.TimeShift++;
- if (wparam == VK_F6 && (dxw.TimeShift > -8)) dxw.TimeShift--;
- OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption());
+ if (DxWndKey == DXVK_TIMESLOW && (dxw.TimeShift < 8)) dxw.TimeShift++;
+ if (DxWndKey == DXVK_TIMEFAST && (dxw.TimeShift > -8)) dxw.TimeShift--;
GetHookInfo()->TimeShift=dxw.TimeShift;
+ OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption());
}
break;
- case VK_F4:
+ case DXVK_TIMETOGGLE:
+ if (dxw.dwFlags2 & TIMESTRETCH) {
+ if(TimeShiftToggle){
+ SaveTimeShift=dxw.TimeShift;
+ dxw.TimeShift=0;
+ }
+ else{
+ dxw.TimeShift=SaveTimeShift;
+ }
+ TimeShiftToggle = !TimeShiftToggle;
+ GetHookInfo()->TimeShift=dxw.TimeShift;
+ }
+ break;
+ case DXVK_ALTF4:
if (dxw.dwFlags1 & HANDLEALTF4) {
OutTraceDW("WindowProc: WM_SYSKEYDOWN(ALT-F4) - terminating process\n");
TerminateProcess(GetCurrentProcess(),0);
@@ -1105,7 +1043,7 @@ static void RecoverScreenMode()
CurrentDevMode.dmPelsWidth, CurrentDevMode.dmPelsHeight, CurrentDevMode.dmBitsPerPel,
InitDevMode.dmPelsWidth, InitDevMode.dmPelsHeight, InitDevMode.dmBitsPerPel);
InitDevMode.dmFields = (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT);
- res=(*pChangeDisplaySettingsA)(&InitDevMode, 0);
+ res=(*pChangeDisplaySettingsExA)(NULL, &InitDevMode, NULL, 0, NULL);
if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__);
}
@@ -1118,7 +1056,7 @@ void SwitchTo16BPP()
CurrentDevMode.dmPelsWidth, CurrentDevMode.dmPelsHeight, CurrentDevMode.dmBitsPerPel);
CurrentDevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
CurrentDevMode.dmBitsPerPel = 16;
- res=(*pChangeDisplaySettingsA)(&CurrentDevMode, CDS_UPDATEREGISTRY);
+ res=(*pChangeDisplaySettingsExA)(NULL, &CurrentDevMode, NULL, CDS_UPDATEREGISTRY, NULL);
if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__);
}
@@ -1132,7 +1070,7 @@ static void LockScreenMode(DWORD dmPelsWidth, DWORD dmPelsHeight, DWORD dmBitsPe
if( (dmPelsWidth != InitDevMode.dmPelsWidth) ||
(dmPelsHeight !=InitDevMode.dmPelsHeight) ||
(dmBitsPerPel != InitDevMode.dmBitsPerPel)){
- res=(*pChangeDisplaySettingsA)(&InitDevMode, 0);
+ res=(*pChangeDisplaySettingsExA)(NULL, &InitDevMode, NULL, 0, NULL);
if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__);
}
}
@@ -1615,13 +1553,57 @@ FARPROC RemapLibrary(LPCSTR proc, HMODULE hModule, HookEntry_Type *Hooks)
void HookLibrary(HMODULE hModule, HookEntry_Type *Hooks, char *DLLName)
{
- void *tmp;
for(; Hooks->APIName; Hooks++){
- tmp = HookAPI(hModule, DLLName, Hooks->OriginalAddress, Hooks->APIName, Hooks->HookerAddress);
- if(tmp && Hooks->StoreAddress) *(Hooks->StoreAddress) = (FARPROC)tmp;
+ //tmp = HookAPI(hModule, DLLName, Hooks->HookStatus, Hooks->OriginalAddress, Hooks->APIName, Hooks->HookerAddress);
+ //if(tmp && Hooks->StoreAddress) *(Hooks->StoreAddress) = (FARPROC)tmp;
+
+ void *remapped_addr;
+
+ if(Hooks->HookStatus == HOOK_HOT_LINKED) continue; // skip any hot-linked entry
+
+ //if(dxw.dwTFlags & OUTIMPORTTABLE) OutTrace("HookAPI: module=%x dll=%s apiproc=%x apiname=%s hookproc=%x\n",
+ // module, dll, apiproc, apiname, hookproc);
+
+ //if(!*apiname) { // check
+ // char *sMsg="HookAPI: NULL api name\n";
+ // OutTraceE(sMsg);
+ // if (IsAssertEnabled) MessageBox(0, sMsg, "HookAPI", MB_OK | MB_ICONEXCLAMATION);
+ // continue;
+ //}
+
+ if((((dxw.dwFlags4 & HOTPATCH) && (Hooks->HookStatus == HOOK_HOT_CANDIDATE)) || // hot patch candidate still to process - or
+ ((dxw.dwFlags4 & HOTPATCHALWAYS) && (Hooks->HookStatus != HOOK_HOT_LINKED))) // force hot patch and not already hooked
+ &&
+ (Hooks->OriginalAddress && Hooks->StoreAddress)){ // API address and save ptr available
+ // Hot Patch
+ remapped_addr = HotPatch(Hooks->OriginalAddress, Hooks->APIName, Hooks->HookerAddress);
+ if(remapped_addr == (void *)1) { // should never go here ...
+ Hooks->HookStatus = HOOK_HOT_LINKED;
+ continue; // already hooked
+ }
+ if(remapped_addr) {
+ Hooks->HookStatus = HOOK_HOT_LINKED;
+ *(Hooks->StoreAddress) = (FARPROC)remapped_addr;
+ continue;
+ }
+ }
+
+ remapped_addr = IATPatch(hModule, DLLName, Hooks->OriginalAddress, Hooks->APIName, Hooks->HookerAddress);
+ if(remapped_addr) {
+ Hooks->HookStatus = HOOK_IAT_LINKED;
+ if (Hooks->StoreAddress) *(Hooks->StoreAddress) = (FARPROC)remapped_addr;
+ }
}
}
+BOOL IsHotPatched(HookEntry_Type *Hooks, char *ApiName)
+{
+ for(; Hooks->APIName; Hooks++){
+ if(!strcmp(Hooks->APIName, ApiName)) return (Hooks->HookStatus == HOOK_HOT_LINKED);
+ }
+ return FALSE;
+}
+
void HookLibInit(HookEntry_Type *Hooks)
{
for(; Hooks->APIName; Hooks++)
diff --git a/dll/dxhook.h b/dll/dxhook.h
index 2e776ee..75df21e 100644
--- a/dll/dxhook.h
+++ b/dll/dxhook.h
@@ -35,7 +35,16 @@ extern FARPROC Remap_vfw_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_AdvApi32_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_Glide_ProcAddress(LPCSTR, HMODULE);
+typedef enum {
+ HOOK_IAT_CANDIDATE = 0,
+ HOOK_HOT_CANDIDATE,
+ HOOK_IAT_LINKED,
+ HOOK_HOT_LINKED
+} HookEntry_Status;
+
+
typedef struct {
+ HookEntry_Status HookStatus;
char *APIName;
FARPROC OriginalAddress;
FARPROC *StoreAddress;
@@ -45,3 +54,4 @@ typedef struct {
extern FARPROC RemapLibrary(LPCSTR, HMODULE, HookEntry_Type *);
extern void HookLibrary(HMODULE, HookEntry_Type *, char *);
extern void HookLibInit(HookEntry_Type *);
+extern BOOL IsHotPatched(HookEntry_Type *, char *);
diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp
index 827c689..fa756bd 100644
--- a/dll/dxwcore.cpp
+++ b/dll/dxwcore.cpp
@@ -100,6 +100,7 @@ void dxwCore::InitTarget(TARGETMAP *target)
pTimeShifter = TimeShifterCoarse;
pTimeShifter64 = TimeShifter64Coarse;
}
+ if(dwFlags4 & ENABLEHOTKEYS) MapKeysInit();
}
void dxwCore::SetScreenSize(void)
@@ -1531,14 +1532,16 @@ void dxwCore::PopTimer(UINT uTimerId)
// this should never happen, unless there are more than 1 timer!
char msg[256];
sprintf(msg,"PopTimer: TimerType=%x last=%x\n", TIMER_TYPE_WINMM, TimerEvent.dwTimerType);
- MessageBox(0, msg, "PopTimer", MB_OK | MB_ICONEXCLAMATION);
+ //MessageBox(0, msg, "PopTimer", MB_OK | MB_ICONEXCLAMATION);
+ OutTraceE(msg);
return;
}
if(uTimerId != TimerEvent.t.uTimerId){
// this should never happen, unless there are more than 1 timer!
char msg[256];
sprintf(msg,"PopTimer: TimerId=%x last=%x\n", uTimerId, TimerEvent.t.uTimerId);
- MessageBox(0, msg, "PopTimer", MB_OK | MB_ICONEXCLAMATION);
+ //MessageBox(0, msg, "PopTimer", MB_OK | MB_ICONEXCLAMATION);
+ OutTraceE(msg);
return;
}
TimerEvent.dwTimerType = TIMER_TYPE_NONE;
@@ -1551,14 +1554,16 @@ void dxwCore::PopTimer(HWND hWnd, UINT_PTR nIDEvent)
// this should never happen, unless there are more than 1 timer!
char msg[256];
sprintf(msg,"PopTimer: TimerType=%x last=%x\n", TIMER_TYPE_WINMM, TimerEvent.dwTimerType);
- MessageBox(0, msg, "PopTimer", MB_OK | MB_ICONEXCLAMATION);
+ //MessageBox(0, msg, "PopTimer", MB_OK | MB_ICONEXCLAMATION);
+ OutTraceE(msg);
return;
}
if(nIDEvent != TimerEvent.t.nIDEvent){
// this should never happen, unless there are more than 1 timer!
char msg[256];
sprintf(msg,"PopTimer: TimerId=%x last=%x\n", nIDEvent, TimerEvent.t.nIDEvent);
- MessageBox(0, msg, "PopTimer", MB_OK | MB_ICONEXCLAMATION);
+ //MessageBox(0, msg, "PopTimer", MB_OK | MB_ICONEXCLAMATION);
+ OutTraceE(msg);
return;
}
TimerEvent.dwTimerType = TIMER_TYPE_NONE;
@@ -1645,3 +1650,69 @@ BOOL dxwCore::CheckScreenResolution(unsigned int w, unsigned int h)
}
return TRUE;
}
+
+#ifdef COMPATIBLEMODE
+void dxwCore::MapKeysInit(){}
+
+UINT dxwCore::MapKeysConfig(UINT message, LPARAM lparam, WPARAM wparam)
+{
+ int vkey;
+ char *caption;
+ if(message!=WM_SYSKEYDOWN) return DXVK_NONE;
+ switch(wparam){
+ case VK_F12: vkey=DXVK_CLIPTOGGLE; caption="CLIPCURSORTOGGLE"; break;
+ case VK_F11: vkey=DXVK_REFRESH; caption="REFRESH"; break;
+ case VK_F10: vkey=DXVK_LOGTOGGLE; caption="LOGTOGGLE"; break;
+ case VK_F9: vkey=DXVK_PLOCKTOGGLE; caption="POSITIONLOCKTOGGLE"; break;
+ case VK_F7: vkey=DXVK_FPSTOGGLE; caption="FPSTOGGLE"; break;
+ case VK_F6: vkey=DXVK_TIMEFAST; caption="TIMESTRETCHFAST"; break;
+ case VK_F5: vkey=DXVK_TIMESLOW; caption="TIMESTRETCHSLOW"; break;
+ case VK_F4: vkey=DXVK_ALTF4; caption="ALTF4"; break;
+ default: vkey=DXVK_NONE; break;
+ }
+ if(vkey) OutTraceDW("MapKeysConfig: ret=%x(%s)\n", vkey);
+ return vkey;
+}
+#else
+UINT VKeyConfig[DXVK_SIZE];
+
+void dxwCore::MapKeysInit()
+
+{
+ char InitPath[MAX_PATH];
+ char *p;
+ DWORD dwAttrib;
+
+ dwAttrib = GetFileAttributes("dxwnd.dll");
+ if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) return;
+ GetModuleFileName(GetModuleHandle("dxwnd"), InitPath, MAX_PATH);
+ p=&InitPath[strlen(InitPath)-strlen("dxwnd.dll")];
+ strcpy(p, "dxwnd.ini");
+ VKeyConfig[DXVK_NONE]=DXVK_NONE;
+ VKeyConfig[DXVK_CLIPTOGGLE]= GetPrivateProfileInt("keymapping", "cliptoggle", 0, InitPath);
+ VKeyConfig[DXVK_REFRESH]= GetPrivateProfileInt("keymapping", "refresh", 0, InitPath);
+ VKeyConfig[DXVK_LOGTOGGLE]= GetPrivateProfileInt("keymapping", "logtoggle", 0, InitPath);
+ VKeyConfig[DXVK_PLOCKTOGGLE]= GetPrivateProfileInt("keymapping", "plocktoggle", 0, InitPath);
+ VKeyConfig[DXVK_FPSTOGGLE]= GetPrivateProfileInt("keymapping", "fpstoggle", 0, InitPath);
+ VKeyConfig[DXVK_TIMEFAST]= GetPrivateProfileInt("keymapping", "timefast", 0, InitPath);
+ VKeyConfig[DXVK_TIMESLOW]= GetPrivateProfileInt("keymapping", "timeslow", 0, InitPath);
+ VKeyConfig[DXVK_TIMETOGGLE]= GetPrivateProfileInt("keymapping", "timetoggle", 0, InitPath);
+ VKeyConfig[DXVK_ALTF4]= GetPrivateProfileInt("keymapping", "altf4", 0x73, InitPath);
+
+ int idx;
+ for(idx=1; idx.
#include "dxwnd.h"
#include "dxwcore.hpp"
-#define VERSION "2.02.73"
+#define VERSION "2.02.74"
#define DDTHREADLOCK 1
@@ -212,9 +212,10 @@ LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam)
void InjectHook()
{
- char name[MAX_PATH];
+ char name[MAX_PATH+1];
int i;
GetModuleFileName(0, name, MAX_PATH);
+ name[MAX_PATH]=0; // terminator
for(i = 0; name[i]; i ++) name[i] = tolower(name[i]);
for(i = 0; pMapping[i].path[0]; i ++){
if(!strncmp(name, pMapping[i].path, strlen(name))){
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index ce9e133..547d9d9 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj
index 9a558d4..5a775f6 100644
--- a/dll/dxwnd.vs2008.vcproj
+++ b/dll/dxwnd.vs2008.vcproj
@@ -364,6 +364,14 @@
RelativePath=".\hd3d7.cpp"
>
+
+
+
+
diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp
index 705a153..1117be6 100644
--- a/dll/gdi32.cpp
+++ b/dll/gdi32.cpp
@@ -37,118 +37,118 @@ ExtTextOutA_Type pExtTextOutA = NULL;
static HookEntry_Type Hooks[]={
- {"GetDeviceCaps", (FARPROC)GetDeviceCaps, (FARPROC *)&pGDIGetDeviceCaps, (FARPROC)extGetDeviceCaps},
- {"ScaleWindowExtEx", (FARPROC)ScaleWindowExtEx, (FARPROC *)&pGDIScaleWindowExtEx, (FARPROC)extScaleWindowExtEx},
- {"SaveDC", (FARPROC)SaveDC, (FARPROC *)&pGDISaveDC, (FARPROC)extGDISaveDC},
- {"RestoreDC", (FARPROC)RestoreDC, (FARPROC *)&pGDIRestoreDC, (FARPROC)extGDIRestoreDC},
- {"AnimatePalette", (FARPROC)AnimatePalette, (FARPROC *)&pAnimatePalette, (FARPROC)extAnimatePalette},
- {"CreatePalette", (FARPROC)CreatePalette, (FARPROC *)&pGDICreatePalette, (FARPROC)extGDICreatePalette},
- {"SelectPalette", (FARPROC)SelectPalette, (FARPROC *)&pGDISelectPalette, (FARPROC)extSelectPalette},
- {"RealizePalette", (FARPROC)RealizePalette, (FARPROC *)&pGDIRealizePalette, (FARPROC)extRealizePalette},
- {"GetSystemPaletteEntries", (FARPROC)GetSystemPaletteEntries, (FARPROC *)&pGDIGetSystemPaletteEntries, (FARPROC)extGetSystemPaletteEntries},
- {"SetSystemPaletteUse", (FARPROC)SetSystemPaletteUse, (FARPROC *)&pSetSystemPaletteUse, (FARPROC)extSetSystemPaletteUse},
- {"StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits},
- //{"SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice},
- //{"CreateCompatibleBitmap", (FARPROC)NULL, (FARPROC *)&pCreateCompatibleBitmap, (FARPROC)extCreateCompatibleBitmap},
- //{"SetMapMode", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extSetMapMode},
- {"SetPixelFormat", (FARPROC)NULL, (FARPROC *)&pGDISetPixelFormat, (FARPROC)extGDISetPixelFormat},
- {"GetPixelFormat", (FARPROC)NULL, (FARPROC *)&pGDIGetPixelFormat, (FARPROC)extGDIGetPixelFormat},
- {"ChoosePixelFormat", (FARPROC)NULL, (FARPROC *)&pChoosePixelFormat, (FARPROC)extChoosePixelFormat},
- {"DescribePixelFormat", (FARPROC)NULL, (FARPROC *)&pDescribePixelFormat, (FARPROC)extDescribePixelFormat},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "GetDeviceCaps", (FARPROC)GetDeviceCaps, (FARPROC *)&pGDIGetDeviceCaps, (FARPROC)extGetDeviceCaps},
+ {HOOK_IAT_CANDIDATE, "ScaleWindowExtEx", (FARPROC)ScaleWindowExtEx, (FARPROC *)&pGDIScaleWindowExtEx, (FARPROC)extScaleWindowExtEx},
+ {HOOK_IAT_CANDIDATE, "SaveDC", (FARPROC)SaveDC, (FARPROC *)&pGDISaveDC, (FARPROC)extGDISaveDC},
+ {HOOK_IAT_CANDIDATE, "RestoreDC", (FARPROC)RestoreDC, (FARPROC *)&pGDIRestoreDC, (FARPROC)extGDIRestoreDC},
+ {HOOK_IAT_CANDIDATE, "AnimatePalette", (FARPROC)AnimatePalette, (FARPROC *)&pAnimatePalette, (FARPROC)extAnimatePalette},
+ {HOOK_IAT_CANDIDATE, "CreatePalette", (FARPROC)CreatePalette, (FARPROC *)&pGDICreatePalette, (FARPROC)extGDICreatePalette},
+ {HOOK_IAT_CANDIDATE, "SelectPalette", (FARPROC)SelectPalette, (FARPROC *)&pGDISelectPalette, (FARPROC)extSelectPalette},
+ {HOOK_IAT_CANDIDATE, "RealizePalette", (FARPROC)RealizePalette, (FARPROC *)&pGDIRealizePalette, (FARPROC)extRealizePalette},
+ {HOOK_IAT_CANDIDATE, "GetSystemPaletteEntries", (FARPROC)GetSystemPaletteEntries, (FARPROC *)&pGDIGetSystemPaletteEntries, (FARPROC)extGetSystemPaletteEntries},
+ {HOOK_IAT_CANDIDATE, "SetSystemPaletteUse", (FARPROC)SetSystemPaletteUse, (FARPROC *)&pSetSystemPaletteUse, (FARPROC)extSetSystemPaletteUse},
+ {HOOK_IAT_CANDIDATE, "StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits},
+ //{HOOK_IAT_CANDIDATE, "SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice},
+ //{HOOK_IAT_CANDIDATE, "CreateCompatibleBitmap", (FARPROC)NULL, (FARPROC *)&pCreateCompatibleBitmap, (FARPROC)extCreateCompatibleBitmap},
+ //{HOOK_IAT_CANDIDATE, "SetMapMode", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extSetMapMode},
+ {HOOK_IAT_CANDIDATE, "SetPixelFormat", (FARPROC)NULL, (FARPROC *)&pGDISetPixelFormat, (FARPROC)extGDISetPixelFormat},
+ {HOOK_IAT_CANDIDATE, "GetPixelFormat", (FARPROC)NULL, (FARPROC *)&pGDIGetPixelFormat, (FARPROC)extGDIGetPixelFormat},
+ {HOOK_IAT_CANDIDATE, "ChoosePixelFormat", (FARPROC)NULL, (FARPROC *)&pChoosePixelFormat, (FARPROC)extChoosePixelFormat},
+ {HOOK_IAT_CANDIDATE, "DescribePixelFormat", (FARPROC)NULL, (FARPROC *)&pDescribePixelFormat, (FARPROC)extDescribePixelFormat},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type RemapHooks[]={
- {"SetViewportOrgEx", (FARPROC)SetViewportOrgEx, (FARPROC *)&pSetViewportOrgEx, (FARPROC)extSetViewportOrgEx}, // needed in ShowBanner
- {"SetViewportExtEx", (FARPROC)NULL, (FARPROC *)&pSetViewportExtEx, (FARPROC)extSetViewportExtEx},
- {"GetViewportOrgEx", (FARPROC)NULL, (FARPROC *)&pGetViewportOrgEx, (FARPROC)extGetViewportOrgEx},
- {"GetWindowOrgEx", (FARPROC)NULL, (FARPROC *)&pGetWindowOrgEx, (FARPROC)extGetWindowOrgEx},
- {"SetWindowOrgEx", (FARPROC)NULL, (FARPROC *)&pSetWindowOrgEx, (FARPROC)extSetWindowOrgEx},
- {"GetCurrentPositionEx", (FARPROC)NULL, (FARPROC *)&pGetCurrentPositionEx, (FARPROC)extGetCurrentPositionEx},
- {"SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice}, // does the stretching
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "SetViewportOrgEx", (FARPROC)SetViewportOrgEx, (FARPROC *)&pSetViewportOrgEx, (FARPROC)extSetViewportOrgEx}, // needed in ShowBanner
+ {HOOK_IAT_CANDIDATE, "SetViewportExtEx", (FARPROC)NULL, (FARPROC *)&pSetViewportExtEx, (FARPROC)extSetViewportExtEx},
+ {HOOK_IAT_CANDIDATE, "GetViewportOrgEx", (FARPROC)NULL, (FARPROC *)&pGetViewportOrgEx, (FARPROC)extGetViewportOrgEx},
+ {HOOK_IAT_CANDIDATE, "GetWindowOrgEx", (FARPROC)NULL, (FARPROC *)&pGetWindowOrgEx, (FARPROC)extGetWindowOrgEx},
+ {HOOK_IAT_CANDIDATE, "SetWindowOrgEx", (FARPROC)NULL, (FARPROC *)&pSetWindowOrgEx, (FARPROC)extSetWindowOrgEx},
+ {HOOK_IAT_CANDIDATE, "GetCurrentPositionEx", (FARPROC)NULL, (FARPROC *)&pGetCurrentPositionEx, (FARPROC)extGetCurrentPositionEx},
+ {HOOK_IAT_CANDIDATE, "SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice}, // does the stretching
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type ScaledHooks[]={
- {"Rectangle", (FARPROC)Rectangle, (FARPROC *)&pGDIRectangle, (FARPROC)extRectangle},
- {"TextOutA", (FARPROC)TextOutA, (FARPROC *)&pGDITextOutA, (FARPROC)extTextOutA},
- {"GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox},
- {"GetRegionBox", (FARPROC)NULL, (FARPROC *)&pGDIGetRegionBox, (FARPROC)extGetRegionBox},
- {"Polyline", (FARPROC)NULL, (FARPROC *)&pPolyline, (FARPROC)extPolyline},
- {"PolyBezierTo", (FARPROC)NULL, (FARPROC *)&pPolyBezierTo, (FARPROC)extPolyBezierTo},
- {"PolylineTo", (FARPROC)NULL, (FARPROC *)&pPolylineTo, (FARPROC)extPolylineTo},
- {"PolyDraw", (FARPROC)NULL, (FARPROC *)&pPolyDraw, (FARPROC)extPolyDraw},
- {"MoveToEx", (FARPROC)NULL, (FARPROC *)&pMoveToEx, (FARPROC)extMoveToEx},
- {"ArcTo", (FARPROC)NULL, (FARPROC *)&pArcTo, (FARPROC)extArcTo},
- {"LineTo", (FARPROC)NULL, (FARPROC *)&pLineTo, (FARPROC)extLineTo},
- {"SetPixel", (FARPROC)NULL, (FARPROC *)&pSetPixel, (FARPROC)extSetPixel},
- {"Ellipse", (FARPROC)NULL, (FARPROC *)&pEllipse, (FARPROC)extEllipse},
- {"Polygon", (FARPROC)NULL, (FARPROC *)&pPolygon, (FARPROC)extPolygon},
- {"Arc", (FARPROC)NULL, (FARPROC *)&pArc, (FARPROC)extArc},
+ {HOOK_IAT_CANDIDATE, "Rectangle", (FARPROC)Rectangle, (FARPROC *)&pGDIRectangle, (FARPROC)extRectangle},
+ {HOOK_IAT_CANDIDATE, "TextOutA", (FARPROC)TextOutA, (FARPROC *)&pGDITextOutA, (FARPROC)extTextOutA},
+ {HOOK_IAT_CANDIDATE, "GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox},
+ {HOOK_IAT_CANDIDATE, "GetRegionBox", (FARPROC)NULL, (FARPROC *)&pGDIGetRegionBox, (FARPROC)extGetRegionBox},
+ {HOOK_IAT_CANDIDATE, "Polyline", (FARPROC)NULL, (FARPROC *)&pPolyline, (FARPROC)extPolyline},
+ {HOOK_IAT_CANDIDATE, "PolyBezierTo", (FARPROC)NULL, (FARPROC *)&pPolyBezierTo, (FARPROC)extPolyBezierTo},
+ {HOOK_IAT_CANDIDATE, "PolylineTo", (FARPROC)NULL, (FARPROC *)&pPolylineTo, (FARPROC)extPolylineTo},
+ {HOOK_IAT_CANDIDATE, "PolyDraw", (FARPROC)NULL, (FARPROC *)&pPolyDraw, (FARPROC)extPolyDraw},
+ {HOOK_IAT_CANDIDATE, "MoveToEx", (FARPROC)NULL, (FARPROC *)&pMoveToEx, (FARPROC)extMoveToEx},
+ {HOOK_IAT_CANDIDATE, "ArcTo", (FARPROC)NULL, (FARPROC *)&pArcTo, (FARPROC)extArcTo},
+ {HOOK_IAT_CANDIDATE, "LineTo", (FARPROC)NULL, (FARPROC *)&pLineTo, (FARPROC)extLineTo},
+ {HOOK_IAT_CANDIDATE, "SetPixel", (FARPROC)NULL, (FARPROC *)&pSetPixel, (FARPROC)extSetPixel},
+ {HOOK_IAT_CANDIDATE, "Ellipse", (FARPROC)NULL, (FARPROC *)&pEllipse, (FARPROC)extEllipse},
+ {HOOK_IAT_CANDIDATE, "Polygon", (FARPROC)NULL, (FARPROC *)&pPolygon, (FARPROC)extPolygon},
+ {HOOK_IAT_CANDIDATE, "Arc", (FARPROC)NULL, (FARPROC *)&pArc, (FARPROC)extArc},
// commented out since they alter text on screen...... (see Imperialism II difficulty level menu)
- //{"CreateEllipticRgn", (FARPROC)NULL, (FARPROC *)&pCreateEllipticRgn, (FARPROC)extCreateEllipticRgn},
- //{"CreateEllipticRgnIndirect", (FARPROC)NULL, (FARPROC *)&pCreateEllipticRgnIndirect, (FARPROC)extCreateEllipticRgnIndirect},
- //{"CreateRectRgn", (FARPROC)NULL, (FARPROC *)&pCreateRectRgn, (FARPROC)extCreateRectRgn},
- //{"CreateRectRgnIndirect", (FARPROC)NULL, (FARPROC *)&pCreateRectRgnIndirect, (FARPROC)extCreateRectRgnIndirect},
- //{"CreatePolygonRgn", (FARPROC)NULL, (FARPROC *)&pCreatePolygonRgn, (FARPROC)extCreatePolygonRgn},
+ //{HOOK_IAT_CANDIDATE, "CreateEllipticRgn", (FARPROC)NULL, (FARPROC *)&pCreateEllipticRgn, (FARPROC)extCreateEllipticRgn},
+ //{HOOK_IAT_CANDIDATE, "CreateEllipticRgnIndirect", (FARPROC)NULL, (FARPROC *)&pCreateEllipticRgnIndirect, (FARPROC)extCreateEllipticRgnIndirect},
+ //{HOOK_IAT_CANDIDATE, "CreateRectRgn", (FARPROC)NULL, (FARPROC *)&pCreateRectRgn, (FARPROC)extCreateRectRgn},
+ //{HOOK_IAT_CANDIDATE, "CreateRectRgnIndirect", (FARPROC)NULL, (FARPROC *)&pCreateRectRgnIndirect, (FARPROC)extCreateRectRgnIndirect},
+ //{HOOK_IAT_CANDIDATE, "CreatePolygonRgn", (FARPROC)NULL, (FARPROC *)&pCreatePolygonRgn, (FARPROC)extCreatePolygonRgn},
// same as emulated GDI ...
- {"CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extGDICreateCompatibleDC},
- {"DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extGDIDeleteDC},
- {"CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extGDICreateDC},
+ {HOOK_IAT_CANDIDATE, "CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extGDICreateCompatibleDC},
+ {HOOK_IAT_CANDIDATE, "DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extGDIDeleteDC},
+ {HOOK_IAT_CANDIDATE, "CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extGDICreateDC},
// CreateDCW .....
- {"BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extGDIBitBlt},
- {"StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extGDIStretchBlt},
- {"PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extGDIPatBlt},
- {"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extMaskBlt},
- {"ExtTextOutA", (FARPROC)ExtTextOutA, (FARPROC *)&pExtTextOutA, (FARPROC)extExtTextOutA},
- {"ExtTextOutW", (FARPROC)ExtTextOutW, (FARPROC *)&pExtTextOutW, (FARPROC)extExtTextOutW},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extGDIBitBlt},
+ {HOOK_IAT_CANDIDATE, "StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extGDIStretchBlt},
+ {HOOK_IAT_CANDIDATE, "PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extGDIPatBlt},
+ {HOOK_IAT_CANDIDATE, "MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extMaskBlt},
+ {HOOK_IAT_CANDIDATE, "ExtTextOutA", (FARPROC)ExtTextOutA, (FARPROC *)&pExtTextOutA, (FARPROC)extExtTextOutA},
+ {HOOK_IAT_CANDIDATE, "ExtTextOutW", (FARPROC)ExtTextOutW, (FARPROC *)&pExtTextOutW, (FARPROC)extExtTextOutW},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type EmulateHooks[]={
// useless CreateCompatibleDC: it maps VirtualHDC on top of VirtualHDC, then does nothing, unless when asked to operate on 0!....
- //{"CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extEMUCreateCompatibleDC},
+ //{HOOK_IAT_CANDIDATE, "CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extEMUCreateCompatibleDC},
// useless DeleteDC: it's just a proxy
- //{"DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extGDIDeleteDC},
- {"CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extGDICreateDC},
+ //{HOOK_IAT_CANDIDATE, "DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extGDIDeleteDC},
+ {HOOK_IAT_CANDIDATE, "CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extGDICreateDC},
// CreateDCW .....
- {"GetObjectType", (FARPROC)GetObjectType, (FARPROC *)&pGetObjectType, (FARPROC)extGetObjectType},
- {"GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "GetObjectType", (FARPROC)GetObjectType, (FARPROC *)&pGetObjectType, (FARPROC)extGetObjectType},
+ {HOOK_IAT_CANDIDATE, "GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type DDHooks[]={
- {"CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extDDCreateCompatibleDC},
- {"DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extDDDeleteDC},
- {"CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extDDCreateDC},
- {"BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extDDBitBlt},
- {"StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extDDStretchBlt},
- {"GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox},
+ {HOOK_IAT_CANDIDATE, "CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extDDCreateCompatibleDC},
+ {HOOK_IAT_CANDIDATE, "DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extDDDeleteDC},
+ {HOOK_IAT_CANDIDATE, "CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extDDCreateDC},
+ {HOOK_IAT_CANDIDATE, "BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extDDBitBlt},
+ {HOOK_IAT_CANDIDATE, "StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extDDStretchBlt},
+ {HOOK_IAT_CANDIDATE, "GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox},
- // {"PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extDDPatBlt}, // missing one ...
- // {"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extDDMaskBlt}, // missing one ...
- {0, NULL, 0, 0} // terminator
+ // {HOOK_IAT_CANDIDATE, "PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extDDPatBlt}, // missing one ...
+ // {HOOK_IAT_CANDIDATE, "MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extDDMaskBlt}, // missing one ...
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type TextHooks[]={
- {"CreateFontA", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont},
- {"CreateFontIndirectA", (FARPROC)CreateFontIndirectA, (FARPROC *)&pGDICreateFontIndirect, (FARPROC)extCreateFontIndirect},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "CreateFontA", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont},
+ {HOOK_IAT_CANDIDATE, "CreateFontIndirectA", (FARPROC)CreateFontIndirectA, (FARPROC *)&pGDICreateFontIndirect, (FARPROC)extCreateFontIndirect},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type GammaHooks[]={
- {"SetDeviceGammaRamp", (FARPROC)SetDeviceGammaRamp, (FARPROC *)&pGDISetDeviceGammaRamp, (FARPROC)extSetDeviceGammaRamp},
- {"GetDeviceGammaRamp", (FARPROC)GetDeviceGammaRamp, (FARPROC *)&pGDIGetDeviceGammaRamp, (FARPROC)extGetDeviceGammaRamp},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "SetDeviceGammaRamp", (FARPROC)SetDeviceGammaRamp, (FARPROC *)&pGDISetDeviceGammaRamp, (FARPROC)extSetDeviceGammaRamp},
+ {HOOK_IAT_CANDIDATE, "GetDeviceGammaRamp", (FARPROC)GetDeviceGammaRamp, (FARPROC *)&pGDIGetDeviceGammaRamp, (FARPROC)extGetDeviceGammaRamp},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type FontHooks[]={
- {"CreateScalableFontResourceA", (FARPROC)NULL, (FARPROC *)&pCreateScalableFontResourceA, (FARPROC)extCreateScalableFontResourceA},
- {"CreateScalableFontResourceW", (FARPROC)NULL, (FARPROC *)&pCreateScalableFontResourceW, (FARPROC)extCreateScalableFontResourceW},
- {"AddFontResourceA", (FARPROC)NULL, (FARPROC *)&pAddFontResourceA, (FARPROC)extAddFontResourceA},
- {"AddFontResourceW", (FARPROC)NULL, (FARPROC *)&pAddFontResourceW, (FARPROC)extAddFontResourceW},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "CreateScalableFontResourceA", (FARPROC)NULL, (FARPROC *)&pCreateScalableFontResourceA, (FARPROC)extCreateScalableFontResourceA},
+ {HOOK_IAT_CANDIDATE, "CreateScalableFontResourceW", (FARPROC)NULL, (FARPROC *)&pCreateScalableFontResourceW, (FARPROC)extCreateScalableFontResourceW},
+ {HOOK_IAT_CANDIDATE, "AddFontResourceA", (FARPROC)NULL, (FARPROC *)&pAddFontResourceA, (FARPROC)extAddFontResourceA},
+ {HOOK_IAT_CANDIDATE, "AddFontResourceW", (FARPROC)NULL, (FARPROC *)&pAddFontResourceW, (FARPROC)extAddFontResourceW},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
extern HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *);
diff --git a/dll/glide.cpp b/dll/glide.cpp
index 91e69b5..8d168d7 100644
--- a/dll/glide.cpp
+++ b/dll/glide.cpp
@@ -22,12 +22,12 @@ grSstWinOpen_Type pgrSstWinOpen = 0;
grQueryResolutions_Type pgrQueryResolutions = 0;
static HookEntry_Type Hooks[]={
- {"_grGlideInit@0", (FARPROC)NULL, (FARPROC *)&pgrGlideInit, (FARPROC)extgrGlideInit},
- {"_grGlideShutdown@0", (FARPROC)NULL, (FARPROC *)&pgrGlideShutdown, (FARPROC)extgrGlideShutdown},
- {"_grClipWindow@16", (FARPROC)NULL, (FARPROC *)&pgrClipWindow, (FARPROC)extgrClipWindow},
- {"_grSstWinOpen@28", (FARPROC)NULL, (FARPROC *)&pgrSstWinOpen, (FARPROC)extgrSstWinOpen},
- {"_grQueryResolutions@8", (FARPROC)NULL, (FARPROC *)&pgrQueryResolutions, (FARPROC)extgrQueryResolutions},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "_grGlideInit@0", (FARPROC)NULL, (FARPROC *)&pgrGlideInit, (FARPROC)extgrGlideInit},
+ {HOOK_IAT_CANDIDATE, "_grGlideShutdown@0", (FARPROC)NULL, (FARPROC *)&pgrGlideShutdown, (FARPROC)extgrGlideShutdown},
+ {HOOK_IAT_CANDIDATE, "_grClipWindow@16", (FARPROC)NULL, (FARPROC *)&pgrClipWindow, (FARPROC)extgrClipWindow},
+ {HOOK_IAT_CANDIDATE, "_grSstWinOpen@28", (FARPROC)NULL, (FARPROC *)&pgrSstWinOpen, (FARPROC)extgrSstWinOpen},
+ {HOOK_IAT_CANDIDATE, "_grQueryResolutions@8", (FARPROC)NULL, (FARPROC *)&pgrQueryResolutions, (FARPROC)extgrQueryResolutions},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
FARPROC Remap_Glide_ProcAddress(LPCSTR proc, HMODULE hModule)
diff --git a/dll/hotpatch.cpp b/dll/hotpatch.cpp
new file mode 100644
index 0000000..914c7a7
--- /dev/null
+++ b/dll/hotpatch.cpp
@@ -0,0 +1,54 @@
+// hotpatch compiled system dlls come with Windows XP SP2 or later
+
+// return:
+// 0 = patch failed
+// 1 = already patched
+// addr = address of the original function
+
+#include
+#include "dxwnd.h"
+#include "dxwcore.hpp"
+
+void *HotPatch(void *apiproc, const char *apiname, void *hookproc)
+{
+ DWORD dwPrevProtect;
+ BYTE* patch_address;
+ void *orig_address;
+
+ OutTraceH("HotPatch: api=%s addr=%x hook=%x\n", apiname, apiproc, hookproc);
+
+ if(!strcmp(apiname, "GetProcAddress")) return 0; // do not mess with this one!
+
+ patch_address = ((BYTE *)apiproc) - 5;
+ orig_address = (BYTE *)apiproc + 2;
+
+ // entry point could be at the top of a page? so VirtualProtect first to make sure patch_address is readable
+ //if(!VirtualProtect(patch_address, 7, PAGE_EXECUTE_READWRITE, &dwPrevProtect)){
+ if(!VirtualProtect(patch_address, 7, PAGE_EXECUTE_WRITECOPY, &dwPrevProtect)){
+ OutTraceH("HotPatch: access denied. err=%x\n", GetLastError());
+ return (void *)0; // access denied
+ }
+
+ // make sure it is a hotpatchable image... check for 5 nops followed by mov edi,edi
+ if(memcmp( "\x90\x90\x90\x90\x90\x8B\xFF", patch_address, 7) && memcmp( "\x90\x90\x90\x90\x90\x89\xFF", patch_address, 7)){
+ VirtualProtect( patch_address, 7, dwPrevProtect, &dwPrevProtect ); // restore protection
+ // check it wasn't patched already
+ if((*patch_address==0xE9) && (*(WORD *)apiproc == 0xF9EB)){
+ // should never go through here ...
+ OutTraceH("HotPatch: patched already\n");
+ return (void *)1;
+ }
+ else{
+ OutTraceH("HotPatch: not patch aware.\n");
+ return (void *)0; // not hot patch "aware"
+ }
+ }
+
+ *patch_address = 0xE9; // jmp (4-byte relative)
+ *((DWORD *)(patch_address + 1)) = (DWORD)hookproc - (DWORD)patch_address - 5; // relative address
+ *((WORD *)apiproc) = 0xF9EB; // should be atomic write (jmp $-5)
+
+ VirtualProtect( patch_address, 7, dwPrevProtect, &dwPrevProtect ); // restore protection
+ OutTrace("HotPatch: api=%s addr=%x->%x hook=%x\n", apiname, apiproc, orig_address, hookproc);
+ return orig_address;
+}
\ No newline at end of file
diff --git a/dll/iatpatch.cpp b/dll/iatpatch.cpp
new file mode 100644
index 0000000..f922ce7
--- /dev/null
+++ b/dll/iatpatch.cpp
@@ -0,0 +1,91 @@
+#include
+#include "dxwnd.h"
+#include "dxwcore.hpp"
+
+void *IATPatch(HMODULE module, char *dll, void *apiproc, const char *apiname, void *hookproc)
+{
+ PIMAGE_NT_HEADERS pnth;
+ PIMAGE_IMPORT_DESCRIPTOR pidesc;
+ DWORD base, rva;
+ PSTR impmodule;
+ PIMAGE_THUNK_DATA ptaddr;
+ PIMAGE_THUNK_DATA ptname;
+ PIMAGE_IMPORT_BY_NAME piname;
+ DWORD oldprotect;
+ void *org;
+
+ base = (DWORD)module;
+ org = 0; // by default, ret = 0 => API not found
+
+ __try{
+ pnth = PIMAGE_NT_HEADERS(PBYTE(base) + PIMAGE_DOS_HEADER(base)->e_lfanew);
+ if(!pnth) {
+ OutTraceH("IATPatch: ERROR no PNTH at %d\n", __LINE__);
+ return 0;
+ }
+ rva = pnth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
+ if(!rva) {
+ OutTraceH("IATPatch: ERROR no RVA at %d\n", __LINE__);
+ return 0;
+ }
+ pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva);
+
+ while(pidesc->FirstThunk){
+ impmodule = (PSTR)(base + pidesc->Name);
+ if(!lstrcmpi(dll, impmodule)) {
+ //OutTraceH("IATPatch: dll=%s found at %x\n", dll, impmodule);
+
+ ptaddr = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->FirstThunk);
+ ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL;
+
+ while(ptaddr->u1.Function){
+ if (ptname){
+ // examining by function name
+ if(!IMAGE_SNAP_BY_ORDINAL(ptname->u1.Ordinal)){
+ piname = (PIMAGE_IMPORT_BY_NAME)(base + (DWORD)ptname->u1.AddressOfData);
+ if(!lstrcmpi(apiname, (char *)piname->Name)) break;
+ }
+ }
+ if (apiproc){
+ // examining by function addr
+ if(ptaddr->u1.Function == (DWORD)apiproc) break;
+ }
+ ptaddr ++;
+ if (ptname) ptname ++;
+ }
+
+ if(ptaddr->u1.Function) {
+ org = (void *)ptaddr->u1.Function;
+ if(org == hookproc) return 0; // already hooked
+
+ if(!VirtualProtect(&ptaddr->u1.Function, 4, PAGE_EXECUTE_READWRITE, &oldprotect)) {
+ OutTraceDW("IATPatch: VirtualProtect error %d at %d\n", GetLastError(), __LINE__);
+ return 0;
+ }
+ ptaddr->u1.Function = (DWORD)hookproc;
+ if(!VirtualProtect(&ptaddr->u1.Function, 4, oldprotect, &oldprotect)) {
+ OutTraceDW("IATPatch: VirtualProtect error %d at %d\n", GetLastError(), __LINE__);
+ return 0;
+ }
+ if (!FlushInstructionCache(GetCurrentProcess(), &ptaddr->u1.Function, 4)) {
+ OutTraceDW("IATPatch: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__);
+ return 0;
+ }
+ OutTraceH("IATPatch hook=%s address=%x->%x\n", apiname, org, hookproc);
+
+ return org;
+ }
+ }
+ pidesc ++;
+ }
+ if(!pidesc->FirstThunk) {
+ OutTraceH("IATPatch: PE unreferenced function %s:%s\n", dll, apiname);
+ return 0;
+ }
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ OutTraceDW("IATPatch: EXCEPTION hook=%s:%s Hook Failed.\n", dll, apiname);
+ }
+ return org;
+}
diff --git a/dll/imelib.cpp b/dll/imelib.cpp
index ee89cdc..9de5931 100644
--- a/dll/imelib.cpp
+++ b/dll/imelib.cpp
@@ -10,15 +10,15 @@
#include "dxhelper.h"
static HookEntry_Type Hooks[]={
- {"ImmNotifyIME", NULL, (FARPROC *)&pImmNotifyIME, (FARPROC)extImmNotifyIME},
- {"ImmCreateContext", NULL, (FARPROC *)&pImmCreateContext, (FARPROC)extImmCreateContext},
- {"ImmDestroyContext", NULL, (FARPROC *)&pImmDestroyContext, (FARPROC)extImmDestroyContext},
- {"ImmSetOpenStatus", NULL, (FARPROC *)&pImmSetOpenStatus, (FARPROC)extImmSetOpenStatus},
- {"ImmAssociateContext", NULL, (FARPROC *)&pImmAssociateContext, (FARPROC)extImmAssociateContext},
- {"ImmSetCompositionWindow", NULL, (FARPROC *)&pImmSetCompositionWindow, (FARPROC)extImmSetCompositionWindow},
- {"ImmSetCompositionStringA", NULL, (FARPROC *)&pImmSetCompositionString, (FARPROC)extImmSetCompositionString},
- {"ImmGetOpenStatus", NULL, (FARPROC *)&pImmGetOpenStatus, (FARPROC)extImmGetOpenStatus},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "ImmNotifyIME", NULL, (FARPROC *)&pImmNotifyIME, (FARPROC)extImmNotifyIME},
+ {HOOK_IAT_CANDIDATE, "ImmCreateContext", NULL, (FARPROC *)&pImmCreateContext, (FARPROC)extImmCreateContext},
+ {HOOK_IAT_CANDIDATE, "ImmDestroyContext", NULL, (FARPROC *)&pImmDestroyContext, (FARPROC)extImmDestroyContext},
+ {HOOK_IAT_CANDIDATE, "ImmSetOpenStatus", NULL, (FARPROC *)&pImmSetOpenStatus, (FARPROC)extImmSetOpenStatus},
+ {HOOK_IAT_CANDIDATE, "ImmAssociateContext", NULL, (FARPROC *)&pImmAssociateContext, (FARPROC)extImmAssociateContext},
+ {HOOK_IAT_CANDIDATE, "ImmSetCompositionWindow", NULL, (FARPROC *)&pImmSetCompositionWindow, (FARPROC)extImmSetCompositionWindow},
+ {HOOK_IAT_CANDIDATE, "ImmSetCompositionStringA", NULL, (FARPROC *)&pImmSetCompositionString, (FARPROC)extImmSetCompositionString},
+ {HOOK_IAT_CANDIDATE, "ImmGetOpenStatus", NULL, (FARPROC *)&pImmGetOpenStatus, (FARPROC)extImmGetOpenStatus},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
void HookImeLib(HMODULE module)
diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp
index 358b53b..9a2c292 100644
--- a/dll/kernel32.cpp
+++ b/dll/kernel32.cpp
@@ -10,52 +10,52 @@
//#define IsTraceDW TRUE
static HookEntry_Type Hooks[]={
- {"IsDebuggerPresent", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extIsDebuggerPresent},
- {"GetProcAddress", (FARPROC)GetProcAddress, (FARPROC *)&pGetProcAddress, (FARPROC)extGetProcAddress},
- {"LoadLibraryA", (FARPROC)LoadLibraryA, (FARPROC *)&pLoadLibraryA, (FARPROC)extLoadLibraryA},
- {"LoadLibraryExA", (FARPROC)LoadLibraryExA, (FARPROC *)&pLoadLibraryExA, (FARPROC)extLoadLibraryExA},
- {"LoadLibraryW", (FARPROC)LoadLibraryW, (FARPROC *)&pLoadLibraryW, (FARPROC)extLoadLibraryW},
- {"LoadLibraryExW", (FARPROC)LoadLibraryExW, (FARPROC *)&pLoadLibraryExW, (FARPROC)extLoadLibraryExW},
- {"GetDriveTypeA", (FARPROC)NULL, (FARPROC *)&pGetDriveType, (FARPROC)extGetDriveType},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "IsDebuggerPresent", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extIsDebuggerPresent},
+ {HOOK_IAT_CANDIDATE, "GetProcAddress", (FARPROC)GetProcAddress, (FARPROC *)&pGetProcAddress, (FARPROC)extGetProcAddress},
+ {HOOK_IAT_CANDIDATE, "LoadLibraryA", (FARPROC)LoadLibraryA, (FARPROC *)&pLoadLibraryA, (FARPROC)extLoadLibraryA},
+ {HOOK_IAT_CANDIDATE, "LoadLibraryExA", (FARPROC)LoadLibraryExA, (FARPROC *)&pLoadLibraryExA, (FARPROC)extLoadLibraryExA},
+ {HOOK_IAT_CANDIDATE, "LoadLibraryW", (FARPROC)LoadLibraryW, (FARPROC *)&pLoadLibraryW, (FARPROC)extLoadLibraryW},
+ {HOOK_IAT_CANDIDATE, "LoadLibraryExW", (FARPROC)LoadLibraryExW, (FARPROC *)&pLoadLibraryExW, (FARPROC)extLoadLibraryExW},
+ {HOOK_IAT_CANDIDATE, "GetDriveTypeA", (FARPROC)NULL, (FARPROC *)&pGetDriveType, (FARPROC)extGetDriveType},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type FixIOHooks[]={
- {"ReadFile", (FARPROC)NULL, (FARPROC *)&pReadFile, (FARPROC)extReadFile},
- {"CreateFileA", (FARPROC)NULL, (FARPROC *)&pCreateFile, (FARPROC)extCreateFile},
- {"SetFilePointer", (FARPROC)NULL, (FARPROC *)&pSetFilePointer, (FARPROC)extSetFilePointer},
- {"CloseHandle", (FARPROC)NULL, (FARPROC *)&pCloseHandle, (FARPROC)extCloseHandle},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "ReadFile", (FARPROC)NULL, (FARPROC *)&pReadFile, (FARPROC)extReadFile},
+ {HOOK_IAT_CANDIDATE, "CreateFileA", (FARPROC)NULL, (FARPROC *)&pCreateFile, (FARPROC)extCreateFile},
+ {HOOK_IAT_CANDIDATE, "SetFilePointer", (FARPROC)NULL, (FARPROC *)&pSetFilePointer, (FARPROC)extSetFilePointer},
+ {HOOK_IAT_CANDIDATE, "CloseHandle", (FARPROC)NULL, (FARPROC *)&pCloseHandle, (FARPROC)extCloseHandle},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type LimitHooks[]={
- {"GetDiskFreeSpaceA", (FARPROC)GetDiskFreeSpaceA, (FARPROC *)&pGetDiskFreeSpaceA, (FARPROC)extGetDiskFreeSpaceA},
- {"GlobalMemoryStatus", (FARPROC)GlobalMemoryStatus, (FARPROC *)&pGlobalMemoryStatus, (FARPROC)extGlobalMemoryStatus},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "GetDiskFreeSpaceA", (FARPROC)GetDiskFreeSpaceA, (FARPROC *)&pGetDiskFreeSpaceA, (FARPROC)extGetDiskFreeSpaceA},
+ {HOOK_IAT_CANDIDATE, "GlobalMemoryStatus", (FARPROC)GlobalMemoryStatus, (FARPROC *)&pGlobalMemoryStatus, (FARPROC)extGlobalMemoryStatus},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type TimeHooks[]={
- {"GetTickCount", (FARPROC)GetTickCount, (FARPROC *)&pGetTickCount, (FARPROC)extGetTickCount},
- {"GetLocalTime", (FARPROC)GetLocalTime, (FARPROC *)&pGetLocalTime, (FARPROC)extGetLocalTime},
- {"GetSystemTime", (FARPROC)GetSystemTime, (FARPROC *)&pGetSystemTime, (FARPROC)extGetSystemTime},
- {"GetSystemTimeAsFileTime", (FARPROC)GetSystemTimeAsFileTime, (FARPROC *)&pGetSystemTimeAsFileTime, (FARPROC)extGetSystemTimeAsFileTime},
- {"Sleep", (FARPROC)Sleep, (FARPROC *)&pSleep, (FARPROC)extSleep},
- {"SleepEx", (FARPROC)SleepEx, (FARPROC *)&pSleepEx, (FARPROC)extSleepEx},
- {"QueryPerformanceCounter", (FARPROC)QueryPerformanceCounter, (FARPROC *)&pQueryPerformanceCounter, (FARPROC)extQueryPerformanceCounter},
- {"QueryPerformanceFrequency", (FARPROC)QueryPerformanceFrequency, (FARPROC *)&pQueryPerformanceFrequency, (FARPROC)extQueryPerformanceFrequency},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "GetTickCount", (FARPROC)GetTickCount, (FARPROC *)&pGetTickCount, (FARPROC)extGetTickCount},
+ {HOOK_IAT_CANDIDATE, "GetLocalTime", (FARPROC)GetLocalTime, (FARPROC *)&pGetLocalTime, (FARPROC)extGetLocalTime},
+ {HOOK_IAT_CANDIDATE, "GetSystemTime", (FARPROC)GetSystemTime, (FARPROC *)&pGetSystemTime, (FARPROC)extGetSystemTime},
+ {HOOK_IAT_CANDIDATE, "GetSystemTimeAsFileTime", (FARPROC)GetSystemTimeAsFileTime, (FARPROC *)&pGetSystemTimeAsFileTime, (FARPROC)extGetSystemTimeAsFileTime},
+ {HOOK_IAT_CANDIDATE, "Sleep", (FARPROC)Sleep, (FARPROC *)&pSleep, (FARPROC)extSleep},
+ {HOOK_IAT_CANDIDATE, "SleepEx", (FARPROC)SleepEx, (FARPROC *)&pSleepEx, (FARPROC)extSleepEx},
+ {HOOK_IAT_CANDIDATE, "QueryPerformanceCounter", (FARPROC)QueryPerformanceCounter, (FARPROC *)&pQueryPerformanceCounter, (FARPROC)extQueryPerformanceCounter},
+ {HOOK_IAT_CANDIDATE, "QueryPerformanceFrequency", (FARPROC)QueryPerformanceFrequency, (FARPROC *)&pQueryPerformanceFrequency, (FARPROC)extQueryPerformanceFrequency},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type VersionHooks[]={
- {"GetVersion", (FARPROC)GetVersion, (FARPROC *)&pGetVersion, (FARPROC)extGetVersion},
- {"GetVersionExA", (FARPROC)GetVersionExA, (FARPROC *)&pGetVersionExA, (FARPROC)extGetVersionExA},
- {"GetVersionExW", (FARPROC)GetVersionExW, (FARPROC *)&pGetVersionExW, (FARPROC)extGetVersionExW},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "GetVersion", (FARPROC)GetVersion, (FARPROC *)&pGetVersion, (FARPROC)extGetVersion},
+ {HOOK_IAT_CANDIDATE, "GetVersionExA", (FARPROC)GetVersionExA, (FARPROC *)&pGetVersionExA, (FARPROC)extGetVersionExA},
+ {HOOK_IAT_CANDIDATE, "GetVersionExW", (FARPROC)GetVersionExW, (FARPROC *)&pGetVersionExW, (FARPROC)extGetVersionExW},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type SuppressChildHooks[]={
- {"CreateProcessA", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extCreateProcessA},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "CreateProcessA", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extCreateProcessA},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static char *libname = "kernel32.dll";
@@ -574,7 +574,7 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc)
break;
case SYSLIBIDX_USER32:
if ((DWORD)proc == 0x0020){ // ChangeDisplaySettingsA
- pChangeDisplaySettingsA=(ChangeDisplaySettingsA_Type)(*pGetProcAddress)(hModule, proc);
+ /* if (!pChangeDisplaySettingsA) */ pChangeDisplaySettingsA=(ChangeDisplaySettingsA_Type)(*pGetProcAddress)(hModule, proc);
OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pChangeDisplaySettingsA);
return (FARPROC)extChangeDisplaySettingsA;
}
diff --git a/dll/msvfw.cpp b/dll/msvfw.cpp
index bc33d64..b439cc9 100644
--- a/dll/msvfw.cpp
+++ b/dll/msvfw.cpp
@@ -11,7 +11,7 @@
static HookEntry_Type Hooks[]={
//{"ICSendMessage", (FARPROC)NULL, (FARPROC *)&pICSendMessage, (FARPROC)extICSendMessage},
//{"ICOpen", (FARPROC)NULL, (FARPROC *)&pICOpen, (FARPROC)extICOpen},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
FARPROC Remap_vfw_ProcAddress(LPCSTR proc, HMODULE hModule)
diff --git a/dll/ole32.cpp b/dll/ole32.cpp
index d37fb1e..624795a 100644
--- a/dll/ole32.cpp
+++ b/dll/ole32.cpp
@@ -8,10 +8,10 @@
extern void HookModule(HMODULE, int);
static HookEntry_Type Hooks[]={
- {"CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance},
- {"CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx},
- {"CoInitialize", NULL, (FARPROC *)&pCoInitialize, (FARPROC)extCoInitialize},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance},
+ {HOOK_IAT_CANDIDATE, "CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx},
+ {HOOK_IAT_CANDIDATE, "CoInitialize", NULL, (FARPROC *)&pCoInitialize, (FARPROC)extCoInitialize},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
extern HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *);
diff --git a/dll/opengl.cpp b/dll/opengl.cpp
index 9688381..31898a3 100644
--- a/dll/opengl.cpp
+++ b/dll/opengl.cpp
@@ -8,28 +8,28 @@
#undef DXWDECLARATIONS
static HookEntry_Type Hooks[]={
- {"glViewport", NULL, (FARPROC *)&pglViewport, (FARPROC)extglViewport},
- {"glScissor", NULL, (FARPROC *)&pglScissor, (FARPROC)extglScissor},
- {"glGetIntegerv", NULL, (FARPROC *)&pglGetIntegerv, (FARPROC)&extglGetIntegerv},
- {"glDrawBuffer", NULL, (FARPROC *)&pglDrawBuffer, (FARPROC)extglDrawBuffer},
- {"glPolygonMode", NULL, (FARPROC *)&pglPolygonMode, (FARPROC)extglPolygonMode},
- {"glGetFloatv", NULL, (FARPROC *)&pglGetFloatv, (FARPROC)extglGetFloatv},
- {"glClear", NULL, (FARPROC *)&pglClear, (FARPROC)extglClear},
- {"wglCreateContext", NULL, (FARPROC *)&pwglCreateContext, (FARPROC)extwglCreateContext},
- {"wglMakeCurrent", NULL, (FARPROC *)&pwglMakeCurrent, (FARPROC)extwglMakeCurrent},
- {"wglGetProcAddress", NULL, (FARPROC *)&pwglGetProcAddress, (FARPROC)extwglGetProcAddress},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "glViewport", NULL, (FARPROC *)&pglViewport, (FARPROC)extglViewport},
+ {HOOK_IAT_CANDIDATE, "glScissor", NULL, (FARPROC *)&pglScissor, (FARPROC)extglScissor},
+ {HOOK_IAT_CANDIDATE, "glGetIntegerv", NULL, (FARPROC *)&pglGetIntegerv, (FARPROC)&extglGetIntegerv},
+ {HOOK_IAT_CANDIDATE, "glDrawBuffer", NULL, (FARPROC *)&pglDrawBuffer, (FARPROC)extglDrawBuffer},
+ {HOOK_IAT_CANDIDATE, "glPolygonMode", NULL, (FARPROC *)&pglPolygonMode, (FARPROC)extglPolygonMode},
+ {HOOK_IAT_CANDIDATE, "glGetFloatv", NULL, (FARPROC *)&pglGetFloatv, (FARPROC)extglGetFloatv},
+ {HOOK_IAT_CANDIDATE, "glClear", NULL, (FARPROC *)&pglClear, (FARPROC)extglClear},
+ {HOOK_IAT_CANDIDATE, "wglCreateContext", NULL, (FARPROC *)&pwglCreateContext, (FARPROC)extwglCreateContext},
+ {HOOK_IAT_CANDIDATE, "wglMakeCurrent", NULL, (FARPROC *)&pwglMakeCurrent, (FARPROC)extwglMakeCurrent},
+ {HOOK_IAT_CANDIDATE, "wglGetProcAddress", NULL, (FARPROC *)&pwglGetProcAddress, (FARPROC)extwglGetProcAddress},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type wglHooks[]={
- {"glViewport", NULL, (FARPROC *)&pglViewport, (FARPROC)extglViewport},
- {"glScissor", NULL, (FARPROC *)&pglScissor, (FARPROC)extglScissor},
- {"glGetIntegerv", NULL, (FARPROC *)&pglGetIntegerv, (FARPROC)&extglGetIntegerv},
- {"glDrawBuffer", NULL, (FARPROC *)&pglDrawBuffer, (FARPROC)extglDrawBuffer},
- {"glPolygonMode", NULL, (FARPROC *)&pglPolygonMode, (FARPROC)extglPolygonMode},
- {"glGetFloatv", NULL, (FARPROC *)&pglGetFloatv, (FARPROC)extglGetFloatv},
- {"glClear", NULL, (FARPROC *)&pglClear, (FARPROC)extglClear},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "glViewport", NULL, (FARPROC *)&pglViewport, (FARPROC)extglViewport},
+ {HOOK_IAT_CANDIDATE, "glScissor", NULL, (FARPROC *)&pglScissor, (FARPROC)extglScissor},
+ {HOOK_IAT_CANDIDATE, "glGetIntegerv", NULL, (FARPROC *)&pglGetIntegerv, (FARPROC)&extglGetIntegerv},
+ {HOOK_IAT_CANDIDATE, "glDrawBuffer", NULL, (FARPROC *)&pglDrawBuffer, (FARPROC)extglDrawBuffer},
+ {HOOK_IAT_CANDIDATE, "glPolygonMode", NULL, (FARPROC *)&pglPolygonMode, (FARPROC)extglPolygonMode},
+ {HOOK_IAT_CANDIDATE, "glGetFloatv", NULL, (FARPROC *)&pglGetFloatv, (FARPROC)extglGetFloatv},
+ {HOOK_IAT_CANDIDATE, "glClear", NULL, (FARPROC *)&pglClear, (FARPROC)extglClear},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
FARPROC Remap_gl_ProcAddress(LPCSTR proc, HMODULE hModule)
diff --git a/dll/syslibs.h b/dll/syslibs.h
index a524f5d..6850b30 100644
--- a/dll/syslibs.h
+++ b/dll/syslibs.h
@@ -194,6 +194,10 @@ typedef BOOL (WINAPI *IsWindowVisible_Type)(HWND);
typedef BOOL (WINAPI *SystemParametersInfo_Type)(UINT, UINT, PVOID, UINT);
typedef BOOL (WINAPI *KillTimer_Type)(HWND, UINT_PTR);
typedef BOOL (WINAPI *GetUpdateRect_Type)(HWND, LPRECT, BOOL);
+typedef BOOL (WINAPI *GetCursorInfo_Type)(PCURSORINFO);
+typedef HWND (WINAPI *WindowFromPoint_Type)(POINT);
+typedef HWND (WINAPI *ChildWindowFromPoint_Type)(HWND, POINT);
+typedef HWND (WINAPI *ChildWindowFromPointEx_Type)(HWND, POINT, UINT);
// Winmm.dll:
typedef MCIERROR(WINAPI *mciSendCommand_Type)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR);
@@ -398,6 +402,10 @@ DXWEXTERN SystemParametersInfo_Type pSystemParametersInfoA DXWINITIALIZED;
DXWEXTERN SystemParametersInfo_Type pSystemParametersInfoW DXWINITIALIZED;
DXWEXTERN KillTimer_Type pKillTimer DXWINITIALIZED;
DXWEXTERN GetUpdateRect_Type pGetUpdateRect DXWINITIALIZED;
+DXWEXTERN GetCursorInfo_Type pGetCursorInfo DXWINITIALIZED;
+DXWEXTERN WindowFromPoint_Type pWindowFromPoint DXWINITIALIZED;
+DXWEXTERN ChildWindowFromPoint_Type pChildWindowFromPoint DXWINITIALIZED;
+DXWEXTERN ChildWindowFromPointEx_Type pChildWindowFromPointEx DXWINITIALIZED;
// Winmm.dll:
DXWEXTERN mciSendCommand_Type pmciSendCommand DXWINITIALIZED;
@@ -609,6 +617,11 @@ extern BOOL WINAPI extSystemParametersInfoA(UINT, UINT, PVOID, UINT);
extern BOOL WINAPI extSystemParametersInfoW(UINT, UINT, PVOID, UINT);
extern BOOL WINAPI extKillTimer(HWND, UINT_PTR);
extern BOOL WINAPI extGetUpdateRect(HWND, LPRECT, BOOL);
+extern BOOL WINAPI extGetCursorInfo(PCURSORINFO);
+extern HWND WINAPI extWindowFromPoint(POINT);
+extern HWND WINAPI extChildWindowFromPoint(HWND, POINT);
+extern HWND WINAPI extChildWindowFromPointEx(HWND, POINT, UINT);
+
// Winmm.dll:
extern MCIERROR WINAPI extmciSendCommand(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR);
diff --git a/dll/user32.cpp b/dll/user32.cpp
index 848dc56..7f984fc 100644
--- a/dll/user32.cpp
+++ b/dll/user32.cpp
@@ -1,6 +1,7 @@
#define _WIN32_WINNT 0x0600
#define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_WARNINGS
+#define _CRT_NON_CONFORMING_SWPRINTFS
#include
#include
@@ -11,132 +12,135 @@
#include "hddraw.h"
#include "dxhelper.h"
-static HookEntry_Type Hooks[]={
- {"UpdateWindow", (FARPROC)NULL, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow},
- //{"GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement},
- //{"SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement},
- {"ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsA, (FARPROC)extChangeDisplaySettingsA},
- {"ChangeDisplaySettingsExA", (FARPROC)ChangeDisplaySettingsExA, (FARPROC *)&pChangeDisplaySettingsExA, (FARPROC)extChangeDisplaySettingsExA},
- {"ChangeDisplaySettingsW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsW, (FARPROC)extChangeDisplaySettingsW}, // ref. by Knights of Honor
- {"ChangeDisplaySettingsExW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsExW, (FARPROC)extChangeDisplaySettingsExW},
- {"ShowCursor", (FARPROC)ShowCursor, (FARPROC *)&pShowCursor, (FARPROC)extShowCursor},
- {"CreateDialogIndirectParamA", (FARPROC)CreateDialogIndirectParamA, (FARPROC *)&pCreateDialogIndirectParam, (FARPROC)extCreateDialogIndirectParam},
- {"CreateDialogParamA", (FARPROC)CreateDialogParamA, (FARPROC *)&pCreateDialogParam, (FARPROC)extCreateDialogParam},
- {"MoveWindow", (FARPROC)MoveWindow, (FARPROC *)&pMoveWindow, (FARPROC)extMoveWindow},
- {"EnumDisplaySettingsA", (FARPROC)EnumDisplaySettingsA, (FARPROC *)&pEnumDisplaySettings, (FARPROC)extEnumDisplaySettings},
- {"GetClipCursor", (FARPROC)GetClipCursor, (FARPROC*)&pGetClipCursor, (FARPROC)extGetClipCursor},
- {"ClipCursor", (FARPROC)ClipCursor, (FARPROC *)&pClipCursor, (FARPROC)extClipCursor},
- {"DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProcA, (FARPROC)extDefWindowProcA},
- {"DefWindowProcW", (FARPROC)DefWindowProcW, (FARPROC *)&pDefWindowProcW, (FARPROC)extDefWindowProcW},
- {"CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA},
- {"CreateWindowExW", (FARPROC)CreateWindowExW, (FARPROC *)&pCreateWindowExW, (FARPROC)extCreateWindowExW},
- {"RegisterClassExA", (FARPROC)RegisterClassExA, (FARPROC *)&pRegisterClassExA, (FARPROC)extRegisterClassExA},
- {"RegisterClassA", (FARPROC)RegisterClassA, (FARPROC *)&pRegisterClassA, (FARPROC)extRegisterClassA},
- {"GetSystemMetrics", (FARPROC)GetSystemMetrics, (FARPROC *)&pGetSystemMetrics, (FARPROC)extGetSystemMetrics},
- {"GetDesktopWindow", (FARPROC)GetDesktopWindow, (FARPROC *)&pGetDesktopWindow, (FARPROC)extGetDesktopWindow},
- {"CloseWindow", (FARPROC)NULL, (FARPROC *)&pCloseWindow, (FARPROC)extCloseWindow},
- {"DestroyWindow", (FARPROC)NULL, (FARPROC *)&pDestroyWindow, (FARPROC)extDestroyWindow},
- {"SetSysColors", (FARPROC)NULL, (FARPROC *)&pSetSysColors, (FARPROC)extSetSysColors},
- {"SetCapture", (FARPROC)NULL, (FARPROC *)&pSetCapture, (FARPROC)extSetCapture},
- {"SetWindowLongA", (FARPROC)SetWindowLongA, (FARPROC *)&pSetWindowLongA, (FARPROC)extSetWindowLongA},
- {"GetWindowLongA", (FARPROC)GetWindowLongA, (FARPROC *)&pGetWindowLongA, (FARPROC)extGetWindowLongA},
- {"SetWindowLongW", (FARPROC)SetWindowLongW, (FARPROC *)&pSetWindowLongW, (FARPROC)extSetWindowLongW},
- {"GetWindowLongW", (FARPROC)GetWindowLongW, (FARPROC *)&pGetWindowLongW, (FARPROC)extGetWindowLongW},
+BOOL IsChangeDisplaySettingsHotPatched = FALSE;
- //{"GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow},
- //{"GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow},
- {"IsWindowVisible", (FARPROC)NULL, (FARPROC *)&pIsWindowVisible, (FARPROC)extIsWindowVisible},
- {"SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA},
- {"SystemParametersInfoW", (FARPROC)SystemParametersInfoW, (FARPROC *)&pSystemParametersInfoW, (FARPROC)extSystemParametersInfoW},
- {0, NULL, 0, 0} // terminator
+static HookEntry_Type Hooks[]={
+ {HOOK_IAT_CANDIDATE, "UpdateWindow", (FARPROC)NULL, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow},
+ //{HOOK_IAT_CANDIDATE, "GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement},
+ //{HOOK_IAT_CANDIDATE, "SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement},
+ {HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsA, (FARPROC)extChangeDisplaySettingsA},
+ {HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsExA", (FARPROC)ChangeDisplaySettingsExA, (FARPROC *)&pChangeDisplaySettingsExA, (FARPROC)extChangeDisplaySettingsExA},
+ {HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsW, (FARPROC)extChangeDisplaySettingsW}, // ref. by Knights of Honor
+ {HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsExW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsExW, (FARPROC)extChangeDisplaySettingsExW},
+ {HOOK_IAT_CANDIDATE, "ShowCursor", (FARPROC)ShowCursor, (FARPROC *)&pShowCursor, (FARPROC)extShowCursor},
+ {HOOK_IAT_CANDIDATE, "CreateDialogIndirectParamA", (FARPROC)CreateDialogIndirectParamA, (FARPROC *)&pCreateDialogIndirectParam, (FARPROC)extCreateDialogIndirectParam},
+ {HOOK_IAT_CANDIDATE, "CreateDialogParamA", (FARPROC)CreateDialogParamA, (FARPROC *)&pCreateDialogParam, (FARPROC)extCreateDialogParam},
+ {HOOK_IAT_CANDIDATE, "MoveWindow", (FARPROC)MoveWindow, (FARPROC *)&pMoveWindow, (FARPROC)extMoveWindow},
+ {HOOK_IAT_CANDIDATE, "EnumDisplaySettingsA", (FARPROC)EnumDisplaySettingsA, (FARPROC *)&pEnumDisplaySettings, (FARPROC)extEnumDisplaySettings},
+ {HOOK_IAT_CANDIDATE, "GetClipCursor", (FARPROC)GetClipCursor, (FARPROC*)&pGetClipCursor, (FARPROC)extGetClipCursor},
+ {HOOK_IAT_CANDIDATE, "ClipCursor", (FARPROC)ClipCursor, (FARPROC *)&pClipCursor, (FARPROC)extClipCursor},
+ {HOOK_IAT_CANDIDATE, "DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProcA, (FARPROC)extDefWindowProcA},
+ {HOOK_IAT_CANDIDATE, "DefWindowProcW", (FARPROC)DefWindowProcW, (FARPROC *)&pDefWindowProcW, (FARPROC)extDefWindowProcW},
+ {HOOK_HOT_CANDIDATE, "CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA},
+ {HOOK_HOT_CANDIDATE, "CreateWindowExW", (FARPROC)CreateWindowExW, (FARPROC *)&pCreateWindowExW, (FARPROC)extCreateWindowExW},
+ {HOOK_IAT_CANDIDATE, "RegisterClassExA", (FARPROC)RegisterClassExA, (FARPROC *)&pRegisterClassExA, (FARPROC)extRegisterClassExA},
+ {HOOK_IAT_CANDIDATE, "RegisterClassA", (FARPROC)RegisterClassA, (FARPROC *)&pRegisterClassA, (FARPROC)extRegisterClassA},
+ {HOOK_IAT_CANDIDATE, "GetSystemMetrics", (FARPROC)GetSystemMetrics, (FARPROC *)&pGetSystemMetrics, (FARPROC)extGetSystemMetrics},
+ {HOOK_IAT_CANDIDATE, "GetDesktopWindow", (FARPROC)GetDesktopWindow, (FARPROC *)&pGetDesktopWindow, (FARPROC)extGetDesktopWindow},
+ {HOOK_IAT_CANDIDATE, "CloseWindow", (FARPROC)NULL, (FARPROC *)&pCloseWindow, (FARPROC)extCloseWindow},
+ {HOOK_IAT_CANDIDATE, "DestroyWindow", (FARPROC)NULL, (FARPROC *)&pDestroyWindow, (FARPROC)extDestroyWindow},
+ {HOOK_IAT_CANDIDATE, "SetSysColors", (FARPROC)NULL, (FARPROC *)&pSetSysColors, (FARPROC)extSetSysColors},
+ {HOOK_IAT_CANDIDATE, "SetCapture", (FARPROC)NULL, (FARPROC *)&pSetCapture, (FARPROC)extSetCapture},
+ {HOOK_IAT_CANDIDATE, "SetWindowLongA", (FARPROC)SetWindowLongA, (FARPROC *)&pSetWindowLongA, (FARPROC)extSetWindowLongA},
+ {HOOK_IAT_CANDIDATE, "GetWindowLongA", (FARPROC)GetWindowLongA, (FARPROC *)&pGetWindowLongA, (FARPROC)extGetWindowLongA},
+ {HOOK_IAT_CANDIDATE, "SetWindowLongW", (FARPROC)SetWindowLongW, (FARPROC *)&pSetWindowLongW, (FARPROC)extSetWindowLongW},
+ {HOOK_IAT_CANDIDATE, "GetWindowLongW", (FARPROC)GetWindowLongW, (FARPROC *)&pGetWindowLongW, (FARPROC)extGetWindowLongW},
+
+ //{HOOK_IAT_CANDIDATE, "GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow},
+ //{HOOK_IAT_CANDIDATE, "GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow},
+ {HOOK_IAT_CANDIDATE, "IsWindowVisible", (FARPROC)NULL, (FARPROC *)&pIsWindowVisible, (FARPROC)extIsWindowVisible},
+ {HOOK_IAT_CANDIDATE, "SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA},
+ {HOOK_IAT_CANDIDATE, "SystemParametersInfoW", (FARPROC)SystemParametersInfoW, (FARPROC *)&pSystemParametersInfoW, (FARPROC)extSystemParametersInfoW},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type NoGDIHooks[]={
- {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint},
- {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint},
+ {HOOK_IAT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type EmulateHooks[]={
- {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extEMUBeginPaint},
- {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEMUEndPaint},
- {"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extEMUGetDC},
- {"GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extEMUGetDCEx},
- {"GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extEMUGetWindowDC},
- {"ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extEMUReleaseDC},
- //{"InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extEMUBeginPaint},
+ {HOOK_IAT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEMUEndPaint},
+ {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extEMUGetDC},
+ {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extEMUGetDCEx},
+ {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extEMUGetWindowDC},
+ {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extEMUReleaseDC},
+ //{HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type DDHooks[]={
- {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extDDBeginPaint},
- {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extDDEndPaint},
- {"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extDDGetDC},
- {"GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extDDGetDCEx},
- {"GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extDDGetDC},
- {"ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extDDReleaseDC},
- {"InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extDDBeginPaint},
+ {HOOK_IAT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extDDEndPaint},
+ {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extDDGetDC},
+ {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extDDGetDCEx},
+ {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extDDGetDC},
+ {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extDDReleaseDC},
+ {HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type ScaledHooks[]={
- {"FrameRect", (FARPROC)NULL, (FARPROC *)&pFrameRect, (FARPROC)extFrameRect},
- {"TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA},
- {"DrawTextA", (FARPROC)DrawTextA, (FARPROC *)&pDrawText, (FARPROC)extDrawTextA},
- {"DrawTextExA", (FARPROC)DrawTextExA, (FARPROC *)&pDrawTextEx, (FARPROC)extDrawTextExA},
- {"FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect},
- {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint},
- {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint},
- {"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC},
- {"GetDCEx", (FARPROC)NULL, (FARPROC *)&pGDIGetDCEx, (FARPROC)extGDIGetDCEx},
- {"GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extGDIGetWindowDC},
- {"ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extGDIReleaseDC},
- {"InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "FrameRect", (FARPROC)NULL, (FARPROC *)&pFrameRect, (FARPROC)extFrameRect},
+ {HOOK_IAT_CANDIDATE, "TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA},
+ {HOOK_IAT_CANDIDATE, "DrawTextA", (FARPROC)DrawTextA, (FARPROC *)&pDrawText, (FARPROC)extDrawTextA},
+ {HOOK_IAT_CANDIDATE, "DrawTextExA", (FARPROC)DrawTextExA, (FARPROC *)&pDrawTextEx, (FARPROC)extDrawTextExA},
+ {HOOK_IAT_CANDIDATE, "FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect},
+ {HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint},
+ {HOOK_IAT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint},
+ {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC},
+ {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)NULL, (FARPROC *)&pGDIGetDCEx, (FARPROC)extGDIGetDCEx},
+ {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extGDIGetWindowDC},
+ {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extGDIReleaseDC},
+ {HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type RemapHooks[]={
- {"ScreenToClient", (FARPROC)ScreenToClient, (FARPROC *)&pScreenToClient, (FARPROC)extScreenToClient},
- {"ClientToScreen", (FARPROC)ClientToScreen, (FARPROC *)&pClientToScreen, (FARPROC)extClientToScreen},
- {"GetClientRect", (FARPROC)GetClientRect, (FARPROC *)&pGetClientRect, (FARPROC)extGetClientRect},
- {"GetWindowRect", (FARPROC)GetWindowRect, (FARPROC *)&pGetWindowRect, (FARPROC)extGetWindowRect},
- {"MapWindowPoints", (FARPROC)MapWindowPoints, (FARPROC *)&pMapWindowPoints, (FARPROC)extMapWindowPoints},
- //{"GetUpdateRect", (FARPROC)GetUpdateRect, (FARPROC *)&pGetUpdateRect, (FARPROC)extGetUpdateRect},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "ScreenToClient", (FARPROC)ScreenToClient, (FARPROC *)&pScreenToClient, (FARPROC)extScreenToClient},
+ {HOOK_IAT_CANDIDATE, "ClientToScreen", (FARPROC)ClientToScreen, (FARPROC *)&pClientToScreen, (FARPROC)extClientToScreen},
+ {HOOK_IAT_CANDIDATE, "GetClientRect", (FARPROC)GetClientRect, (FARPROC *)&pGetClientRect, (FARPROC)extGetClientRect},
+ {HOOK_IAT_CANDIDATE, "GetWindowRect", (FARPROC)GetWindowRect, (FARPROC *)&pGetWindowRect, (FARPROC)extGetWindowRect},
+ {HOOK_IAT_CANDIDATE, "MapWindowPoints", (FARPROC)MapWindowPoints, (FARPROC *)&pMapWindowPoints, (FARPROC)extMapWindowPoints},
+ //{HOOK_IAT_CANDIDATE, "GetUpdateRect", (FARPROC)GetUpdateRect, (FARPROC *)&pGetUpdateRect, (FARPROC)extGetUpdateRect},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type PeekAllHooks[]={
- {"PeekMessageA", (FARPROC)NULL, (FARPROC *)&pPeekMessage, (FARPROC)extPeekMessage},
- {"PeekMessageW", (FARPROC)NULL, (FARPROC *)&pPeekMessage, (FARPROC)extPeekMessage},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "PeekMessageA", (FARPROC)NULL, (FARPROC *)&pPeekMessage, (FARPROC)extPeekMessage},
+ {HOOK_IAT_CANDIDATE, "PeekMessageW", (FARPROC)NULL, (FARPROC *)&pPeekMessage, (FARPROC)extPeekMessage},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type MouseHooks[]={
- {"GetCursorPos", (FARPROC)GetCursorPos, (FARPROC *)&pGetCursorPos, (FARPROC)extGetCursorPos},
- {"SetCursor", (FARPROC)SetCursor, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor},
- {"SendMessageA", (FARPROC)SendMessageA, (FARPROC *)&pSendMessageA, (FARPROC)extSendMessageA},
- {"SendMessageW", (FARPROC)SendMessageW, (FARPROC *)&pSendMessageW, (FARPROC)extSendMessageW},
- //{"SetPhysicalCursorPos", NULL, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, // ???
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "GetCursorPos", (FARPROC)GetCursorPos, (FARPROC *)&pGetCursorPos, (FARPROC)extGetCursorPos},
+ {HOOK_IAT_CANDIDATE, "GetCursorInfo", (FARPROC)GetCursorInfo, (FARPROC *)&pGetCursorInfo, (FARPROC)extGetCursorInfo},
+ {HOOK_IAT_CANDIDATE, "SetCursor", (FARPROC)SetCursor, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor},
+ {HOOK_IAT_CANDIDATE, "SendMessageA", (FARPROC)SendMessageA, (FARPROC *)&pSendMessageA, (FARPROC)extSendMessageA},
+ {HOOK_IAT_CANDIDATE, "SendMessageW", (FARPROC)SendMessageW, (FARPROC *)&pSendMessageW, (FARPROC)extSendMessageW},
+ //{HOOK_IAT_CANDIDATE, "SetPhysicalCursorPos", NULL, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, // ???
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type WinHooks[]={
- {"ShowWindow", (FARPROC)ShowWindow, (FARPROC *)&pShowWindow, (FARPROC)extShowWindow},
- {"SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos},
- {"DeferWindowPos", (FARPROC)DeferWindowPos, (FARPROC *)&pGDIDeferWindowPos, (FARPROC)extDeferWindowPos},
- {"CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProc, (FARPROC)extCallWindowProc},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "ShowWindow", (FARPROC)ShowWindow, (FARPROC *)&pShowWindow, (FARPROC)extShowWindow},
+ {HOOK_IAT_CANDIDATE, "SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos},
+ {HOOK_IAT_CANDIDATE, "DeferWindowPos", (FARPROC)DeferWindowPos, (FARPROC *)&pGDIDeferWindowPos, (FARPROC)extDeferWindowPos},
+ {HOOK_IAT_CANDIDATE, "CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProc, (FARPROC)extCallWindowProc},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type MouseHooks2[]={
- {"SetCursorPos", (FARPROC)SetCursorPos, (FARPROC *)&pSetCursorPos, (FARPROC)extSetCursorPos},
- {0, NULL, 0, 0} // terminator
+ {HOOK_HOT_CANDIDATE, "SetCursorPos", (FARPROC)SetCursorPos, (FARPROC *)&pSetCursorPos, (FARPROC)extSetCursorPos},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type TimeHooks[]={
- {"SetTimer", (FARPROC)SetTimer, (FARPROC *)&pSetTimer, (FARPROC)extSetTimer},
- {"KillTimer", (FARPROC)KillTimer, (FARPROC *)&pKillTimer, (FARPROC)extKillTimer},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "SetTimer", (FARPROC)SetTimer, (FARPROC *)&pSetTimer, (FARPROC)extSetTimer},
+ {HOOK_IAT_CANDIDATE, "KillTimer", (FARPROC)KillTimer, (FARPROC *)&pKillTimer, (FARPROC)extKillTimer},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule)
@@ -182,6 +186,7 @@ void HookUser32(HMODULE hModule)
if (dxw.dwFlags3 & PEEKALLMESSAGES) HookLibrary(hModule, PeekAllHooks, libname);
if (dxw.dwFlags2 & TIMESTRETCH) HookLibrary(hModule, TimeHooks, libname);
+ IsChangeDisplaySettingsHotPatched = IsHotPatched(Hooks, "ChangeDisplaySettingsExA") || IsHotPatched(Hooks, "ChangeDisplaySettingsExW");
return;
}
@@ -286,7 +291,7 @@ LONG WINAPI MyChangeDisplaySettings(char *fname, BOOL WideChar, void *lpDevMode,
NewMode.dmPelsWidth, NewMode.dmPelsHeight, NewMode.dmBitsPerPel, dmBitsPerPel);
NewMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
NewMode.dmBitsPerPel = dmBitsPerPel;
- res=(*pChangeDisplaySettingsA)(&NewMode, 0);
+ res=(*pChangeDisplaySettingsExA)(NULL, &NewMode, NULL, 0, NULL);
if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__);
return res;
}
@@ -295,7 +300,7 @@ LONG WINAPI MyChangeDisplaySettings(char *fname, BOOL WideChar, void *lpDevMode,
if(WideChar)
return (*pChangeDisplaySettingsW)((LPDEVMODEW)lpDevMode, dwflags);
else
- return (*pChangeDisplaySettingsA)((LPDEVMODEA)lpDevMode, dwflags);
+ return (*pChangeDisplaySettingsExA)(NULL, (LPDEVMODEA)lpDevMode, NULL, dwflags, NULL);
}
}
@@ -1337,12 +1342,21 @@ static LPCSTR ClassToStr(LPCSTR Class)
{
static char AtomBuf[20+1];
if(((DWORD)Class & 0xFFFF0000) == 0){
- sprintf(AtomBuf, "ATOM(%X)", Class);
+ sprintf(AtomBuf, "ATOM(%X)", (DWORD)Class);
return AtomBuf;
}
return Class;
}
+static LPCWSTR ClassToWStr(LPCWSTR Class)
+{
+ static WCHAR AtomBuf[20+1];
+ if(((DWORD)Class & 0xFFFF0000) == 0){
+ swprintf(AtomBuf, L"ATOM(%X)", (DWORD)Class);
+ return AtomBuf;
+ }
+ return Class;
+}
// to do: implement and use ClassToWStr() for widechar call
HWND WINAPI extCreateWindowExW(
@@ -1370,7 +1384,7 @@ HWND WINAPI extCreateWindowExW(
if (nHeight==CW_USEDEFAULT) strcpy(hString,"CW_USEDEFAULT");
else sprintf(hString,"%d", nHeight);
OutTrace("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s)\n",
- lpClassName, lpWindowName, xString, yString, wString, hString,
+ ClassToWStr(lpClassName), lpWindowName, xString, yString, wString, hString,
dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle));
}
if(IsDebug) OutTrace("CreateWindowExW: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight());
@@ -1645,7 +1659,7 @@ LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *lpDevMode, DWORD dwflags)
if(dxw.Windowize)
return MyChangeDisplaySettings("ChangeDisplaySettingsA", FALSE, lpDevMode, dwflags);
else
- return (*pChangeDisplaySettingsA)(lpDevMode, dwflags);
+ return (*pChangeDisplaySettingsExA)(NULL, lpDevMode, NULL, dwflags, NULL);
}
LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags)
@@ -2532,4 +2546,63 @@ BOOL WINAPI extGetUpdateRect(HWND hWnd, LPRECT lpRect, BOOL bErase)
else
OutTraceE("GetUpdateRect ERROR: err=%d\n", GetLastError());
return ret;
-}
\ No newline at end of file
+}
+
+BOOL WINAPI extGetCursorInfo(PCURSORINFO pci)
+{
+ BOOL ret;
+ OutTraceDW("GetCursorInfo\n");
+ ret = (*pGetCursorInfo)(pci);
+ if(ret){
+ OutTraceDW("GetCursorInfo: flags=%x hcursor=%x pos=(%d,%d)\n", pci->flags, pci->hCursor, pci->ptScreenPos.x, pci->ptScreenPos.y);
+ if(dxw.IsFullScreen()){
+ dxw.UnmapClient(&(pci->ptScreenPos));
+ OutTraceDW("GetCursorInfo: FIXED pos=(%d,%d)\n", pci->ptScreenPos.x, pci->ptScreenPos.y);
+ }
+ }
+ else
+ OutTraceE("GetCursorInfo ERROR: err=%d\n", GetLastError());
+ return ret;
+}
+
+// --- to be hooked ....
+
+HWND WINAPI extWindowFromPoint(POINT Point)
+{
+ HWND ret;
+ OutTraceDW("WindowFromPoint: point=(%d,%d)\n", Point.x, Point.y);
+ if(dxw.IsFullScreen()){
+ dxw.UnmapClient(&Point);
+ OutTraceDW("WindowFromPoint: FIXED point=(%d,%d)\n", Point.x, Point.y);
+ }
+ ret = (*pWindowFromPoint)(Point);
+ OutTraceDW("WindowFromPoint: hwnd=%x\n", ret);
+ return ret;
+}
+
+HWND WINAPI extChildWindowFromPoint(HWND hWndParent, POINT Point)
+{
+ HWND ret;
+ OutTraceDW("ChildWindowFromPoint: hWndParent=%x point=(%d,%d)\n", hWndParent, Point.x, Point.y);
+ if(dxw.IsDesktop(hWndParent) && dxw.IsFullScreen()){
+ dxw.UnmapClient(&Point);
+ OutTraceDW("ChildWindowFromPoint: FIXED point=(%d,%d)\n", Point.x, Point.y);
+ }
+ ret = (*pChildWindowFromPoint)(hWndParent, Point);
+ OutTraceDW("ChildWindowFromPoint: hwnd=%x\n", ret);
+ return ret;
+}
+
+HWND WINAPI extChildWindowFromPointEx(HWND hWndParent, POINT Point, UINT uFlags)
+{
+ HWND ret;
+ OutTraceDW("ChildWindowFromPoint: hWndParent=%x point=(%d,%d) flags=%x\n", hWndParent, Point.x, Point.y, uFlags);
+ if(dxw.IsDesktop(hWndParent) && dxw.IsFullScreen()){
+ dxw.UnmapClient(&Point);
+ OutTraceDW("ChildWindowFromPointEx: FIXED point=(%d,%d)\n", Point.x, Point.y);
+ }
+ ret = (*pChildWindowFromPointEx)(hWndParent, Point, uFlags);
+ OutTraceDW("ChildWindowFromPointEx: hwnd=%x\n", ret);
+ return ret;
+}
+
diff --git a/dll/winmm.cpp b/dll/winmm.cpp
index c573f76..e594511 100644
--- a/dll/winmm.cpp
+++ b/dll/winmm.cpp
@@ -10,15 +10,15 @@
//#define OutTraceDW OutTrace
static HookEntry_Type Hooks[]={
- {"mciSendCommandA", NULL, (FARPROC *)&pmciSendCommand, (FARPROC)extmciSendCommand},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "mciSendCommandA", NULL, (FARPROC *)&pmciSendCommand, (FARPROC)extmciSendCommand},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static HookEntry_Type TimeHooks[]={
- {"timeGetTime", NULL, (FARPROC *)&ptimeGetTime, (FARPROC)exttimeGetTime},
- {"timeKillEvent", NULL, (FARPROC *)&ptimeKillEvent, (FARPROC)exttimeKillEvent},
- {"timeSetEvent", NULL, (FARPROC *)&ptimeSetEvent, (FARPROC)exttimeSetEvent},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "timeGetTime", NULL, (FARPROC *)&ptimeGetTime, (FARPROC)exttimeGetTime},
+ {HOOK_IAT_CANDIDATE, "timeKillEvent", NULL, (FARPROC *)&ptimeKillEvent, (FARPROC)exttimeKillEvent},
+ {HOOK_IAT_CANDIDATE, "timeSetEvent", NULL, (FARPROC *)&ptimeSetEvent, (FARPROC)exttimeSetEvent},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
void HookWinMM(HMODULE module)
diff --git a/dll/wintrust.cpp b/dll/wintrust.cpp
index d2c1406..5ac19e9 100644
--- a/dll/wintrust.cpp
+++ b/dll/wintrust.cpp
@@ -10,8 +10,8 @@ WinVerifyTrust_Type pWinVerifyTrust;
extern LONG WINAPI extWinVerifyTrust(HWND, GUID *, LPVOID);
static HookEntry_Type Hooks[]={
- {"WinVerifyTrust", NULL, (FARPROC *)&pWinVerifyTrust, (FARPROC)extWinVerifyTrust},
- {0, NULL, 0, 0} // terminator
+ {HOOK_IAT_CANDIDATE, "WinVerifyTrust", NULL, (FARPROC *)&pWinVerifyTrust, (FARPROC)extWinVerifyTrust},
+ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
void HookTrust(HMODULE module)
diff --git a/host/Resource.h b/host/Resource.h
index ae52826..4333196 100644
--- a/host/Resource.h
+++ b/host/Resource.h
@@ -213,8 +213,10 @@
#define IDC_DISABLEFOGGING 1175
#define IDC_RELEASEMOUSE 1176
#define IDC_HOOKGLIDE 1177
-#define IDC_RELEASEMOUSE2 1177
-#define IDC_FRAMECOMPENSATION 1177
+#define IDC_FRAMECOMPENSATION 1178
+#define IDC_HOTPATCH 1179
+#define IDC_ENABLEHOTKEYS 1180
+#define IDC_HOTPATCHALWAYS 1181
#define ID_MODIFY 32771
#define ID_DELETE 32772
#define ID_ADD 32773
diff --git a/host/TabDebug.cpp b/host/TabDebug.cpp
index ea57c1d..4c6ece2 100644
--- a/host/TabDebug.cpp
+++ b/host/TabDebug.cpp
@@ -42,6 +42,7 @@ void CTabDebug::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_NOFILLRECT, cTarget->m_NoFillRect);
DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry);
DDX_Check(pDX, IDC_ZBUFFERALWAYS, cTarget->m_ZBufferAlways);
+ DDX_Check(pDX, IDC_HOTPATCHALWAYS, cTarget->m_HotPatchAlways);
}
BEGIN_MESSAGE_MAP(CTabDebug, CDialog)
diff --git a/host/TabInput.cpp b/host/TabInput.cpp
index 473d65c..d455299 100644
--- a/host/TabInput.cpp
+++ b/host/TabInput.cpp
@@ -50,6 +50,9 @@ void CTabInput::DoDataExchange(CDataExchange* pDX)
// Message processing
DDX_Check(pDX, IDC_FILTERMESSAGES, cTarget->m_FilterMessages);
DDX_Check(pDX, IDC_PEEKALLMESSAGES, cTarget->m_PeekAllMessages);
+ // Keyboard handling
+ DDX_Check(pDX, IDC_ENABLEHOTKEYS, cTarget->m_EnableHotKeys);
+ DDX_Check(pDX, IDC_HANDLEALTF4, cTarget->m_HandleAltF4);
}
BEGIN_MESSAGE_MAP(CTabInput, CDialog)
diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp
index 31cffe5..4de2383 100644
--- a/host/TabProgram.cpp
+++ b/host/TabProgram.cpp
@@ -35,6 +35,7 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX)
DDX_Text(pDX, IDC_MODULE, cTarget->m_Module);
DDX_Check(pDX, IDC_UNNOTIFY, cTarget->m_UnNotify);
DDX_Check(pDX, IDC_WINDOWIZE, cTarget->m_Windowize);
+ DDX_Check(pDX, IDC_HOTPATCH, cTarget->m_HotPatch);
DDX_Check(pDX, IDC_HOOKDLLS, cTarget->m_HookDLLs);
DDX_Check(pDX, IDC_FULLSCREENONLY, cTarget->m_FullScreenOnly);
DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin);
@@ -42,9 +43,9 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_STARTDEBUG, cTarget->m_StartDebug);
DDX_Check(pDX, IDC_CLIENTREMAPPING, cTarget->m_ClientRemapping);
DDX_Check(pDX, IDC_SAVELOAD, cTarget->m_SaveLoad);
- DDX_Check(pDX, IDC_HANDLEALTF4, cTarget->m_HandleAltF4);
DDX_Check(pDX, IDC_KEEPASPECTRATIO, cTarget->m_KeepAspectRatio);
DDX_Check(pDX, IDC_HOOKOPENGL, cTarget->m_HookOpenGL); // duplicated
+ DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner);
DDX_Text(pDX, IDC_POSX, cTarget->m_PosX);
DDX_Text(pDX, IDC_POSY, cTarget->m_PosY);
DDX_Text(pDX, IDC_SIZX, cTarget->m_SizX);
diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp
index 7c95213..813f0ae 100644
--- a/host/TabWindow.cpp
+++ b/host/TabWindow.cpp
@@ -45,7 +45,6 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_NOWINDOWMOVE, cTarget->m_NoWindowMove);
DDX_Check(pDX, IDC_SUPPRESSCHILD, cTarget->m_SuppressChild);
DDX_Check(pDX, IDC_HIDEDESKTOP, cTarget->m_HideDesktop);
- DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner);
// color management
DDX_Check(pDX, IDC_INIT8BPP, cTarget->m_Init8BPP);
diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp
index 63b4ca7..6288195 100644
--- a/host/TargetDlg.cpp
+++ b/host/TargetDlg.cpp
@@ -61,11 +61,13 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_ZBufferClean = FALSE;
m_ZBuffer0Clean = FALSE;
m_ZBufferAlways = FALSE;
+ m_HotPatchAlways = FALSE;
m_DisableFogging = FALSE;
m_NoPower2Fix = FALSE;
m_NoPerfCounter = FALSE;
m_UnNotify = FALSE;
m_Windowize = TRUE; // default true !!
+ m_HotPatch = FALSE;
m_HookDLLs = TRUE; // default true !!
m_HookEnabled = TRUE; // default true !!
m_EmulateRegistry = FALSE;
@@ -128,6 +130,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_FineTiming = FALSE;
m_ReleaseMouse = FALSE;
m_FrameCompensation = FALSE;
+ m_EnableHotKeys = TRUE; // default true !!
m_InterceptRDTSC = FALSE;
m_HookOpenGL = FALSE;
m_ForceHookOpenGL = FALSE;
@@ -144,6 +147,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_WireFrame = FALSE;
m_NoTextures = FALSE;
m_BlackWhite = FALSE;
+ m_AssertDialog = FALSE;
m_InitX = 0;
m_InitY = 0;
m_MaxX = 0;
diff --git a/host/TargetDlg.h b/host/TargetDlg.h
index 23a6cae..cf3b960 100644
--- a/host/TargetDlg.h
+++ b/host/TargetDlg.h
@@ -46,6 +46,7 @@ public:
//BOOL m_HandleDC;
BOOL m_UnNotify;
BOOL m_Windowize;
+ BOOL m_HotPatch;
BOOL m_HookDLLs;
BOOL m_EmulateRegistry;
BOOL m_FullScreenOnly;
@@ -111,6 +112,7 @@ public:
BOOL m_FineTiming;
BOOL m_ReleaseMouse;
BOOL m_FrameCompensation;
+ BOOL m_EnableHotKeys;
BOOL m_InterceptRDTSC;
BOOL m_HookOpenGL;
BOOL m_ForceHookOpenGL;
@@ -131,6 +133,7 @@ public:
BOOL m_ZBufferClean;
BOOL m_ZBuffer0Clean;
BOOL m_ZBufferAlways;
+ BOOL m_HotPatchAlways;
BOOL m_NoPower2Fix;
BOOL m_NoPerfCounter;
BOOL m_DisableFogging;
diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps
index 1030255..0cb5c3d 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index a22a4ad..ce02451 100644
--- a/host/dxwndhost.rc
+++ b/host/dxwndhost.rc
@@ -199,7 +199,7 @@ END
// Dialog
//
-IDD_ABOUTBOX DIALOGEX 0, 0, 235, 78
+IDD_ABOUTBOX DIALOGEX 0, 0, 235, 88
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "DXWnd Version Information"
FONT 9, "Arial", 400, 0, 0x0
@@ -211,6 +211,7 @@ BEGIN
LTEXT "thank you also to:",IDC_STATIC,40,40,119,8
LTEXT "Olly (www.ollydbg.de) for disasm lib",IDC_STATIC,40,50,119,8
LTEXT "Michael Koch for d3d9 proxy dll",IDC_STATIC,40,60,181,8
+ LTEXT "Aqrit for hot patching schema",IDC_STATIC,40,70,181,8
END
IDD_TARGET DIALOGEX 0, 0, 273, 248
@@ -272,7 +273,6 @@ BEGIN
EDITTEXT IDC_SIZY,113,210,19,14,ES_AUTOHSCROLL,WS_EX_RIGHT
CONTROL "Do not notify on task switch",IDC_UNNOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,105,124,10
CONTROL "Optimize CPU (DirectX1 - 7)",IDC_SAVELOAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,141,109,10
- CONTROL "Intercept Alt-F4 key",IDC_HANDLEALTF4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,117,109,10
CONTROL "Run in Window",IDC_WINDOWIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,129,124,10
GROUPBOX "Generic",IDC_STATIC,7,82,286,89
CONTROL "use DLL Injection",IDC_STARTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,117,100,10
@@ -291,6 +291,8 @@ BEGIN
EDITTEXT IDC_LAUNCH,39,48,162,14,ES_AUTOHSCROLL
LTEXT "Launch:",IDC_STATIC,11,51,28,9
PUSHBUTTON "...",IDC_OPENLAUNCH,207,48,12,14
+ CONTROL "Hot patch (obfuscated IAT)",IDC_HOTPATCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,105,116,10
+ CONTROL "No banner",IDC_NOBANNER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,117,108,10
END
IDD_TAB_LOG DIALOGEX 0, 0, 300, 240
@@ -357,17 +359,17 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
CONTROL "Correct mouse position",IDC_MODIFYMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,38,107,12
- CONTROL "Hide Cursor",IDC_HIDEHWCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,15,100,10
+ CONTROL "Hide Cursor",IDC_HIDEHWCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,14,100,12
CONTROL "Intercept GDI Cursor Clipping",IDC_ENABLECLIPPING,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,97,109,10
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,98,109,12
GROUPBOX "Cursor handling",IDC_STATIC,7,3,129,162
- CONTROL "Keep cursor within window",IDC_KEEPCURSORWITHIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,73,108,10
- CONTROL "Force cursor clipping",IDC_CLIPCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,62,108,10
- CONTROL "Message processing",IDC_MESSAGEPROC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,108,103,10
- CONTROL "Keep cursor fixed",IDC_KEEPCURSORFIXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,85,107,10
- CONTROL "fix WM_NCHITTEST",IDC_FIXNCHITTEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,119,103,10
- CONTROL "Show Cursor",IDC_SHOWHWCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,27,104,10
- CONTROL "Slow down mouse polling",IDC_SLOW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,130,103,12
+ CONTROL "Keep cursor within window",IDC_KEEPCURSORWITHIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,74,108,12
+ CONTROL "Force cursor clipping",IDC_CLIPCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,62,108,12
+ CONTROL "Message processing",IDC_MESSAGEPROC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,110,103,12
+ CONTROL "Keep cursor fixed",IDC_KEEPCURSORFIXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,86,107,12
+ CONTROL "fix WM_NCHITTEST",IDC_FIXNCHITTEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,122,103,12
+ CONTROL "Show Cursor",IDC_SHOWHWCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,26,104,12
+ CONTROL "Slow down mouse polling",IDC_SLOW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,134,103,12
LTEXT "Initial coord.",IDC_STATIC,148,33,46,9
LTEXT "X",IDC_STATIC,234,34,9,9
LTEXT "Y",IDC_STATIC,261,34,9,9
@@ -388,8 +390,11 @@ BEGIN
CONTROL "Filter offending messages",IDC_FILTERMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,96,114,10
CONTROL "Peek all messages in queue",IDC_PEEKALLMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,108,114,10
GROUPBOX "Message handling",IDC_STATIC,142,79,151,72
- CONTROL "Release mouse outside window",IDC_RELEASEMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,142,114,12
+ CONTROL "Release mouse outside window",IDC_RELEASEMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,146,114,12
CONTROL "Window frame compensation",IDC_FRAMECOMPENSATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,50,114,12
+ GROUPBOX "Keyboard handling",IDC_STATIC,7,167,130,66
+ CONTROL "Enable hot keys",IDC_ENABLEHOTKEYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,180,114,12
+ CONTROL "Intercept Alt-F4 key",IDC_HANDLEALTF4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,192,109,12
END
IDD_TAB_TIMING DIALOGEX 0, 0, 300, 240
@@ -448,7 +453,6 @@ BEGIN
CONTROL "SVGA modes",IDC_SUPPORTSVGA,"Button",BS_AUTORADIOBUTTON | WS_GROUP,160,136,124,10
CONTROL "HDMI modes",IDC_SUPPORTHDMI,"Button",BS_AUTORADIOBUTTON,160,148,124,10
CONTROL "Monitor native modes",IDC_NATIVERES,"Button",BS_AUTORADIOBUTTON,160,160,124,10
- CONTROL "No banner",IDC_NOBANNER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,196,108,10
END
IDD_TAB_EMPTY DIALOGEX 0, 0, 300, 240
@@ -524,6 +528,7 @@ BEGIN
CONTROL "Emulate Registry",IDC_EMULATEREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,84,124,10
CONTROL "Force D3DCMP_ALWAYS setting ",IDC_ZBUFFERALWAYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,164,127,10
CONTROL "Suppress FillRect",IDC_NOFILLRECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,60,127,10
+ CONTROL "Force hot patching",IDC_HOTPATCHALWAYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,176,127,10
END
IDD_PALETTE DIALOGEX 0, 0, 169, 167
@@ -586,7 +591,7 @@ BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 228
TOPMARGIN, 7
- BOTTOMMARGIN, 71
+ BOTTOMMARGIN, 81
END
IDD_TARGET, DIALOG
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index f8013af..bfbcff9 100644
Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ
diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp
index b7a58c6..bd2ef69 100644
--- a/host/dxwndhostView.cpp
+++ b/host/dxwndhostView.cpp
@@ -119,6 +119,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_HookEnabled) t->flags3 |= HOOKENABLED;
if(dlg->m_NoBanner) t->flags2 |= NOBANNER;
if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG;
+ if(dlg->m_HotPatch) t->flags4 |= HOTPATCH;
if(dlg->m_FullScreenOnly) t->flags3 |= FULLSCREENONLY;
if(dlg->m_FilterMessages) t->flags3 |= FILTERMESSAGES;
if(dlg->m_PeekAllMessages) t->flags3 |= PEEKALLMESSAGES;
@@ -169,6 +170,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_ZBufferClean) t->flags4 |= ZBUFFERCLEAN;
if(dlg->m_ZBuffer0Clean) t->flags4 |= ZBUFFER0CLEAN;
if(dlg->m_ZBufferAlways) t->flags4 |= ZBUFFERALWAYS;
+ if(dlg->m_HotPatchAlways) t->flags4 |= HOTPATCHALWAYS;
if(dlg->m_NoPower2Fix) t->flags4 |= NOPOWER2FIX;
if(dlg->m_NoPerfCounter) t->flags4 |= NOPERFCOUNTER;
if(dlg->m_DisableFogging) t->flags4 |= DISABLEFOGGING;
@@ -242,6 +244,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_FineTiming) t->flags4 |= FINETIMING;
if(dlg->m_ReleaseMouse) t->flags4 |= RELEASEMOUSE;
if(dlg->m_FrameCompensation) t->flags4 |= FRAMECOMPENSATION;
+ if(dlg->m_EnableHotKeys) t->flags4 |= ENABLEHOTKEYS;
if(dlg->m_InterceptRDTSC) t->flags4 |= INTERCEPTRDTSC;
if(dlg->m_HookOpenGL) t->flags2 |= HOOKOPENGL;
if(dlg->m_ForceHookOpenGL) t->flags3 |= FORCEHOOKOPENGL;
@@ -286,6 +289,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_OpenGLLib = t->OpenGLLib;
dlg->m_UnNotify = t->flags & UNNOTIFY ? 1 : 0;
dlg->m_Windowize = t->flags2 & WINDOWIZE ? 1 : 0;
+ dlg->m_HotPatch = t->flags4 & HOTPATCH ? 1 : 0;
dlg->m_HookDLLs = t->flags3 & HOOKDLLS ? 1 : 0;
dlg->m_EmulateRegistry = t->flags3 & EMULATEREGISTRY ? 1 : 0;
dlg->m_HookEnabled = t->flags3 & HOOKENABLED ? 1 : 0;
@@ -353,6 +357,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_ZBufferClean = t->flags4 & ZBUFFERCLEAN ? 1 : 0;
dlg->m_ZBuffer0Clean = t->flags4 & ZBUFFER0CLEAN ? 1 : 0;
dlg->m_ZBufferAlways = t->flags4 & ZBUFFERALWAYS ? 1 : 0;
+ dlg->m_HotPatchAlways = t->flags4 & HOTPATCHALWAYS ? 1 : 0;
dlg->m_NoPower2Fix = t->flags4 & NOPOWER2FIX ? 1 : 0;
dlg->m_NoPerfCounter = t->flags4 & NOPERFCOUNTER ? 1 : 0;
dlg->m_DisableFogging = t->flags4 & DISABLEFOGGING ? 1 : 0;
@@ -408,6 +413,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_FineTiming = t->flags4 & FINETIMING ? 1 : 0;
dlg->m_ReleaseMouse = t->flags4 & RELEASEMOUSE ? 1 : 0;
dlg->m_FrameCompensation = t->flags4 & FRAMECOMPENSATION ? 1 : 0;
+ dlg->m_EnableHotKeys = t->flags4 & ENABLEHOTKEYS ? 1 : 0;
dlg->m_InterceptRDTSC = t->flags4 & INTERCEPTRDTSC ? 1 : 0;
dlg->m_HookOpenGL = t->flags2 & HOOKOPENGL ? 1 : 0;
dlg->m_ForceHookOpenGL = t->flags3 & FORCEHOOKOPENGL ? 1 : 0;