diff --git a/Include/dxwnd.h b/Include/dxwnd.h
index f1018cc..97fa17b 100644
--- a/Include/dxwnd.h
+++ b/Include/dxwnd.h
@@ -203,6 +203,8 @@
#define WOW32REGISTRY 0x00080000 // Sets KEY_WOW32_64KEY registry flag
#define STRETCHMOVIES 0x00100000 // Stretches ActiveMovie Windows to the whole window size
#define BYPASSMCI 0x00200000 // bypass all MCI calls returning OK.
+#define FIXPIXELZOOM 0x00400000
+#define REUSEEMULATEDDC 0x00800000
// logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index e70f813..dc7b14b 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:870503d6ed66355803bffaf4e2a6faeaae7aef2ddab2b21a5ebe07aeb276eceb
-size 587776
+oid sha256:4bc660ee000849fc12e93d97f058cd62e641538ffd39a9e145889a8f71d72091
+size 588800
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index 6cf634c..1482c7d 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b3af6279bc2e830fe03fb38ba567676000fc17486c763e711fee3539605cf3c0
-size 544768
+oid sha256:1224f1ef28770a40f73036db53a6f6f0b810c026d2d3cf57a5b5006197f4e0b0
+size 545280
diff --git a/build/exports/Battlezone (1998).dxw b/build/exports/Battlezone (1998).dxw
new file mode 100644
index 0000000..562c98d
--- /dev/null
+++ b/build/exports/Battlezone (1998).dxw
@@ -0,0 +1,32 @@
+[target]
+title0=Battlezone (1998)
+path0=D:\Games\Battlezone\bzone.exe
+launchpath0=
+module0=
+opengllib0=
+notes0=
+registry0=
+ver0=0
+coord0=0
+flag0=-1608515533
+flagg0=1241513984
+flagh0=98320
+flagi0=138412036
+flagj0=4224
+flagk0=0
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=150
+posy0=150
+sizx0=880
+sizy0=660
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
+swapeffect0=0
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index c85d789..a2175d2 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -915,3 +915,8 @@ v2.03.38
fix: handling of WM_ACTIVATE and WM_NCACTIVATE messages, should bring the window to HWND_NOTOPMOST z-order position only when activation is on, not off!
fix: in "Share GDI and draw DC" mode, check if the primary surface really has a DC and switch to another one if the DC is missing.
fix: eliminated some redundant code in GDI ReleaseDC in DC emulated mode
+
+v2.03.39
+add: "Fix glPixelZoom args" flag to scale images rendered by OpenGL through GDI. It is needed for "Strength and Honor".
+add: "Reuse emulated DC" flag to optimize GDI emulation. experimental.
+
diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp
index 63c40c9..b2877cc 100644
--- a/dll/dxhook.cpp
+++ b/dll/dxhook.cpp
@@ -110,7 +110,7 @@ static char *Flag6Names[32]={
"FIXPITCH", "POWER2WIDTH", "HIDETASKBAR", "ACTIVATEAPP",
"NOSYSMEMPRIMARY", "NOSYSMEMBACKBUF", "CONFIRMONCLOSE", "TERMINATEONCLOSE",
"FLIPEMULATION", "SETZBUFFERBITDEPTHS", "SHAREDDC", "WOW32REGISTRY",
- "STRETCHMOVIES", "BYPASSMCI", "", "",
+ "STRETCHMOVIES", "BYPASSMCI", "FIXPIXELZOOM", "REUSEEMULATEDDC",
"", "", "", "",
"", "", "", "",
};
diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp
index 5a60ffe..b33a912 100644
--- a/dll/dxwcore.cpp
+++ b/dll/dxwcore.cpp
@@ -7,7 +7,10 @@
#include "syslibs.h"
#include "dxhelper.h"
#include "resource.h"
+#include "hddraw.h"
#include "d3d9.h"
+extern GetDC_Type pGetDC;
+extern ReleaseDC_Type pReleaseDC;
/* ------------------------------------------------------------------ */
// Internal function pointers
@@ -796,6 +799,8 @@ POINT dxwCore::ClientOffset(HWND hwnd)
desk0 = upleft;
if (desktop.right) ret.x = (((win0.x - desk0.x) * (LONG)dwScreenWidth) + (desktop.right >> 1)) / desktop.right;
if (desktop.bottom) ret.y = (((win0.y - desk0.y) * (LONG)dwScreenHeight) + (desktop.bottom >> 1)) / desktop.bottom;
+ if(ret.x < 0) ret.x = 0;
+ if(ret.y < 0) ret.y = 0;
OutTraceB("ClientOffset: hwnd=%x offset=(%d,%d)\n", hwnd, ret.x, ret.y);
return ret;
}
@@ -1524,94 +1529,79 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam)
HDC dxwCore::AcquireEmulatedDC(HWND hwnd)
{
HDC wdc;
+ RECT WinRect;
+
if(!(wdc=(*pGDIGetDC)(hwnd))){
OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
return NULL;
}
- return AcquireEmulatedDC(wdc);
-}
-
-HDC dxwCore::AcquireEmulatedDC(LPDIRECTDRAWSURFACE lpdds)
-{
- HDC ddc;
- typedef HRESULT (WINAPI *GetDC_Type) (LPDIRECTDRAWSURFACE, HDC FAR *);
- extern GetDC_Type pGetDC;
- if((*pGetDC)(lpdds, &ddc))
- OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
- return AcquireEmulatedDC(ddc);
-}
-
-HDC dxwCore::AcquireEmulatedDC(HDC wdc)
-{
RealHDC=wdc;
- HWND hwnd;
- RECT WinRect;
+
+ RECT LastVRect;
+ LastVRect = VirtualPicRect;
+
if(!(hwnd=WindowFromDC(wdc)))
OutTraceE("WindowFromDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
(*pGetClientRect)(hwnd, &WinRect);
if(dxw.IsDesktop(hwnd)){
- dxw.VirtualPicRect = dxw.GetScreenRect();
+ // when screen resolution changes, better renew service resources
+ VirtualPicRect = dxw.GetScreenRect();
+ if((LastVRect.right != VirtualPicRect.right) || (LastVRect.bottom != VirtualPicRect.bottom)) {
+ DeleteObject(VirtualHDC);
+ VirtualHDC = NULL;
+ DeleteObject(VirtualPic);
+ VirtualPic = NULL;
+ }
}
else {
VirtualPicRect = WinRect;
dxw.UnmapClient(&VirtualPicRect);
}
- if(!(VirtualHDC=CreateCompatibleDC(wdc)))
- OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
- if(!(VirtualPic=CreateCompatibleBitmap(wdc, VirtualPicRect.right, VirtualPicRect.bottom)))
- OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
- if(!SelectObject(VirtualHDC, VirtualPic)){
- if(!DeleteObject(VirtualPic))
- OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
+
+ OutTraceB("AcquireEmulatedDC: hwnd=%x Desktop=%x WinRect=(%d,%d)(%d,%d) VirtRect=(%d,%d)(%d,%d)\n",
+ hwnd, dxw.IsDesktop(hwnd),
+ WinRect.left, WinRect.top, WinRect.right, WinRect.bottom,
+ VirtualPicRect.left, VirtualPicRect.top, VirtualPicRect.right, VirtualPicRect.bottom);
+
+ if (!VirtualHDC){
+ OutTraceB("AcquireEmulatedDC: INITIALIZE\n");
+ if(!(VirtualHDC=CreateCompatibleDC(wdc)))
+ OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
+
if(!(VirtualPic=CreateCompatibleBitmap(wdc, dxw.GetScreenWidth(), dxw.GetScreenHeight())))
OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
+
if(!SelectObject(VirtualHDC, VirtualPic))
OutTraceE("SelectObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
+
+ if(!(*pGDIStretchBlt)(VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, wdc, 0, 0, WinRect.right, WinRect.bottom, SRCCOPY))
+ OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
}
- if(!(*pGDIStretchBlt)(VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, wdc, 0, 0, WinRect.right, WinRect.bottom, SRCCOPY))
- OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
+
return VirtualHDC;
}
BOOL dxwCore::ReleaseEmulatedDC(HWND hwnd)
{
- BOOL ret;
HDC wdc;
- RECT client;
- (*pGetClientRect)(hwnd, &client);
+ RECT WinRect;
+
+ (*pGetClientRect)(hwnd, &WinRect);
+
+ OutTraceB("ReleaseEmulatedDC: hwnd=%x Desktop=%x WinRect=(%d,%d)(%d,%d) VirtRect=(%d,%d)(%d,%d)\n",
+ hwnd, dxw.IsDesktop(hwnd),
+ WinRect.left, WinRect.top, WinRect.right, WinRect.bottom,
+ VirtualPicRect.left, VirtualPicRect.top, VirtualPicRect.right, VirtualPicRect.bottom);
+
if(!(wdc=(*pGDIGetDC)(hwnd)))
OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
- //OutTrace("StretchBlt: destdc=%x destrect=(0,0)-(%d,%d) srcdc=%x srcrect=(0,0)-(%d,%d)\n", wdc, client.right, client.bottom, VirtualHDC, VirtualPicRect.right, VirtualPicRect.bottom);
- // v2.02.94: set HALFTONE stretching. But causes problems with Imperialism II
- // SetStretchBltMode(wdc,HALFTONE);
-#if 1
- if(!(*pGDIStretchBlt)(wdc, 0, 0, client.right, client.bottom, VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, SRCCOPY))
+ SetStretchBltMode(wdc, HALFTONE);
+ if(!(*pGDIStretchBlt)(wdc, 0, 0, WinRect.right, WinRect.bottom, VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, SRCCOPY))
OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
-#else
- int w, h, bx, by; // width, height and x,y borders
- RECT RetRect;
- bx = by = 0;
- RetRect=client;
- if (dwFlags2 & KEEPASPECTRATIO){
- w = RetRect.right - RetRect.left;
- h = RetRect.bottom - RetRect.top;
- if ((w * iRatioY) > (h * iRatioX)){
- bx = (w - (h * iRatioX / iRatioY))/2;
- }
- else {
- by = (h - (w * iRatioY / iRatioX))/2;
- }
- }
- if(!(*pGDIStretchBlt)(wdc, bx, by, client.right-bx, client.bottom-by, VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, SRCCOPY))
- OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
-#endif
//(*pInvalidateRect)(hwnd, NULL, 0);
- if(!DeleteObject(VirtualPic))
- OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
- if(!DeleteObject(VirtualHDC))
- OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
- ret=TRUE;
- return ret;
+
+ (*pGDIReleaseDC)(hwnd, VirtualHDC);
+ return TRUE;
}
void dxwCore::ResetEmulatedDC()
@@ -1627,6 +1617,75 @@ BOOL dxwCore::IsVirtual(HDC hdc)
return (hdc==VirtualHDC) && (dwFlags3 & GDIEMULATEDC);
}
+HDC dxwCore::AcquireSharedDC(HWND hwnd)
+{
+ extern HDC hFlippedDC;
+ LPDIRECTDRAWSURFACE lpDDSPrim;
+ lpDDSPrim = dxwss.GetPrimarySurface();
+ if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC);
+ while((hFlippedDC == NULL) && lpDDSPrim) {
+ OutTraceDW("AcquireSharedDC: found primary surface with no DC, unref lpdds=%x\n", lpDDSPrim);
+ dxwss.UnrefSurface(lpDDSPrim);
+ lpDDSPrim = dxwss.GetPrimarySurface();
+ if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC);
+ }
+ if (!(hwnd == dxw.GethWnd())) {
+ POINT father, child, offset;
+ father.x = father.y = 0;
+ child.x = child.y = 0;
+ (*pClientToScreen)(dxw.GethWnd(),&father);
+ (*pClientToScreen)(hwnd,&child);
+ offset.x = child.x - father.x;
+ offset.y = child.y - father.y;
+ dxw.UnmapClient(&offset);
+ OutTraceDW("AcquireSharedDC: child window hwnd=%x offset=(%d,%d)\n", hwnd, offset.x, offset.y);
+ (*pSetViewportOrgEx)(hFlippedDC, offset.x, offset.y, NULL);
+ }
+ else
+ (*pSetViewportOrgEx)(VirtualHDC, 0, 0, NULL);
+
+ OutTraceDW("AcquireSharedDC: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", lpDDSPrim, hFlippedDC);
+ return hFlippedDC;
+}
+
+BOOL dxwCore::ReleaseSharedDC(HWND hwnd, HDC hDC)
+{
+ HRESULT ret;
+ LPDIRECTDRAWSURFACE lpDDSPrim;
+ lpDDSPrim = dxwss.GetPrimarySurface();
+ if(!lpDDSPrim) return(TRUE);
+ OutTraceDW("GDI.ReleaseDC: releasing flipped GDI hdc=%x\n", hDC);
+ ret=(*pReleaseDC)(dxwss.GetPrimarySurface(), hDC);
+ if (!(hwnd == dxw.GethWnd())) {
+ POINT father, child, offset;
+ RECT rect;
+ HDC hdc;
+ father.x = father.y = 0;
+ child.x = child.y = 0;
+ (*pClientToScreen)(dxw.GethWnd(),&father);
+ (*pClientToScreen)(hwnd,&child);
+ offset.x = child.x - father.x;
+ offset.y = child.y - father.y;
+ if(offset.x || offset.y){
+ // if the graphis was blitted to primary but below a modal child window,
+ // bring that up to the window surface to make it visible.
+ BOOL ret2;
+ (*pGetClientRect)(hwnd, &rect);
+ hdc=(*pGDIGetDC)(hwnd);
+ if(!hdc) OutTrace("GDI.ReleaseDC: GetDC ERROR=%d at %d\n", GetLastError(), __LINE__);
+ ret2=(*pGDIBitBlt)(hdc, rect.left, rect.top, rect.right, rect.bottom, hDC, offset.x, offset.y, SRCCOPY);
+ if(!ret2) OutTrace("GDI.ReleaseDC: BitBlt ERROR=%d at %d\n", GetLastError(), __LINE__);
+ ret2=(*pGDIReleaseDC)(hwnd, hdc);
+ if(!ret2)OutTrace("GDI.ReleaseDC: ReleaseDC ERROR=%d at %d\n", GetLastError(), __LINE__);
+ // this may flicker ....
+ (*pInvalidateRect)(hwnd, NULL, FALSE);
+ }
+ }
+ if (ret) OutTraceE("GDI.ReleaseDC ERROR: err=%x(%s) at %d\n", ret, ExplainDDError(ret), __LINE__);
+ else dxw.ScreenRefresh();
+ return (ret == DD_OK);
+}
+
void dxwCore::PushTimer(UINT uTimerId, UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent)
{
// save current timer
diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp
index 9a01f44..c297a71 100644
--- a/dll/dxwcore.hpp
+++ b/dll/dxwcore.hpp
@@ -110,9 +110,9 @@ public: // methods
void FixStyle(char *, HWND, WPARAM, LPARAM);
void FixWindowFrame(HWND);
HDC AcquireEmulatedDC(HWND);
- HDC AcquireEmulatedDC(HDC);
- HDC AcquireEmulatedDC(LPDIRECTDRAWSURFACE);
BOOL ReleaseEmulatedDC(HWND);
+ HDC AcquireSharedDC(HWND);
+ BOOL ReleaseSharedDC(HWND, HDC);
BOOL IsVirtual(HDC);
void ResetEmulatedDC();
int VirtualOffsetX, VirtualOffsetY;
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index ffd06be..61acf34 100644
--- a/dll/dxwnd.cpp
+++ b/dll/dxwnd.cpp
@@ -27,7 +27,7 @@ along with this program. If not, see .
#include "TlHelp32.h"
-#define VERSION "2.03.38"
+#define VERSION "2.03.39"
#define DDTHREADLOCK 1
//#define LOCKTHREADS
diff --git a/dll/dxwnd.sln b/dll/dxwnd.sln
new file mode 100644
index 0000000..7be8845
--- /dev/null
+++ b/dll/dxwnd.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwnd", "dxwnd.vcproj", "{579E7FE7-2745-4100-A802-23511711FCDE}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.ActiveCfg = Debug|Win32
+ {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.Build.0 = Debug|Win32
+ {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.ActiveCfg = Release|Win32
+ {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/dll/dxwnd.vs2008.sln b/dll/dxwnd.vs2008.sln
new file mode 100644
index 0000000..0d2e531
--- /dev/null
+++ b/dll/dxwnd.vs2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwnd", "dxwnd.vs2008.vcproj", "{579E7FE7-2745-4100-A802-23511711FCDE}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.ActiveCfg = Debug|Win32
+ {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.Build.0 = Debug|Win32
+ {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.ActiveCfg = Release|Win32
+ {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
deleted file mode 100644
index cc7bc5b..0000000
Binary files a/dll/dxwnd.vs2008.suo and /dev/null differ
diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj
index ccc6767..02498cd 100644
--- a/dll/dxwnd.vs2008.vcproj
+++ b/dll/dxwnd.vs2008.vcproj
@@ -77,7 +77,7 @@
/>
-#include
-#include "dxwnd.h"
-#include "dxwcore.hpp"
-#include "syslibs.h"
-#include "dxhook.h"
-#include "hddraw.h"
-#include "dxhelper.h"
-
-#define FIXCHILDSIZE FALSE
-
-BOOL IsChangeDisplaySettingsHotPatched = FALSE;
-#define GDIMODE_STRETCHED 0
-#define GDIMODE_EMULATED 1
-int GDIEmulationMode = 0;
-extern BOOL bFlippedDC;
-extern HDC hFlippedDC;
-
-//typedef BOOL (WINAPI *ValidateRect_Type)(HWND, const RECT *);
-//BOOL WINAPI extValidateRect(HWND, const RECT *);
-//ValidateRect_Type pValidateRect = NULL;
-
-//typedef BOOL (WINAPI *EnumDisplayMonitors_Type)(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
-//EnumDisplayMonitors_Type pEnumDisplayMonitors = NULL;
-//BOOL WINAPI extEnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
-
-typedef BOOL (WINAPI *BringWindowToTop_Type)(HWND);
-BringWindowToTop_Type pBringWindowToTop = NULL;
-BOOL WINAPI extBringWindowToTop(HWND);
-typedef BOOL (WINAPI *SetForegroundWindow_Type)(HWND);
-SetForegroundWindow_Type pSetForegroundWindow = NULL;
-BOOL WINAPI extSetForegroundWindow(HWND);
-typedef HHOOK (WINAPI *SetWindowsHookEx_Type)(int, HOOKPROC, HINSTANCE, DWORD);
-SetWindowsHookEx_Type pSetWindowsHookEx = NULL;
-HHOOK WINAPI extSetWindowsHookEx(int, HOOKPROC, HINSTANCE, DWORD);
-typedef BOOL (WINAPI *PostMessageA_Type)(HWND, UINT, WPARAM, LPARAM);
-PostMessageA_Type pPostMessageA = NULL;
-BOOL WINAPI extPostMessageA(HWND, UINT, WPARAM, LPARAM);
-typedef HRESULT (WINAPI *MessageBoxTimeoutA_Type)(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD);
-MessageBoxTimeoutA_Type pMessageBoxTimeoutA = NULL;
-HRESULT WINAPI extMessageBoxTimeoutA(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD);
-typedef HRESULT (WINAPI *MessageBoxTimeoutW_Type)(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD);
-MessageBoxTimeoutW_Type pMessageBoxTimeoutW = NULL;
-HRESULT WINAPI extMessageBoxTimeoutW(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD);
-typedef BOOL (WINAPI *IsIconic_Type)(HWND);
-IsIconic_Type pIsIconic = NULL;
-BOOL WINAPI extIsIconic(HWND);
-typedef BOOL (WINAPI *IsZoomed_Type)(HWND);
-IsZoomed_Type pIsZoomed = NULL;
-BOOL WINAPI extIsZoomed(HWND);
-typedef HDESK (WINAPI *CreateDesktop_Type)(LPCTSTR, LPCTSTR, DEVMODE *, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES);
-CreateDesktop_Type pCreateDesktop = NULL;
-HDESK WINAPI extCreateDesktop(LPCTSTR, LPCTSTR, DEVMODE *, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES);
-typedef BOOL (WINAPI *SwitchDesktop_Type)(HDESK);
-SwitchDesktop_Type pSwitchDesktop = NULL;
-BOOL WINAPI extSwitchDesktop(HDESK);
-typedef HDESK (WINAPI *OpenDesktop_Type)(LPTSTR, DWORD, BOOL, ACCESS_MASK);
-OpenDesktop_Type pOpenDesktop = NULL;
-HDESK WINAPI extOpenDesktop(LPTSTR, DWORD, BOOL, ACCESS_MASK);
-typedef BOOL (WINAPI *CloseDesktop_Type)(HDESK);
-CloseDesktop_Type pCloseDesktop = NULL;
-BOOL WINAPI extCloseDesktop(HDESK);
-
-typedef INT_PTR (WINAPI *DialogBoxParamA_Type)(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM);
-DialogBoxParamA_Type pDialogBoxParamA = NULL;
-INT_PTR WINAPI extDialogBoxParamA(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM);
-
-#ifdef TRACEPALETTE
-typedef UINT (WINAPI *GetDIBColorTable_Type)(HDC, UINT, UINT, RGBQUAD *);
-GetDIBColorTable_Type pGetDIBColorTable = NULL;
-UINT WINAPI extGetDIBColorTable(HDC, UINT, UINT, RGBQUAD *);
-typedef UINT (WINAPI *SetDIBColorTable_Type)(HDC, UINT, UINT, const RGBQUAD *);
-SetDIBColorTable_Type pSetDIBColorTable = NULL;
-UINT WINAPI extSetDIBColorTable(HDC, UINT, UINT, const RGBQUAD *);
-#endif
-
-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_HOT_CANDIDATE, "GetMonitorInfoA", (FARPROC)GetMonitorInfoA, (FARPROC *)&pGetMonitorInfoA, (FARPROC)extGetMonitorInfoA},
- {HOOK_HOT_CANDIDATE, "GetMonitorInfoW", (FARPROC)GetMonitorInfoW, (FARPROC *)&pGetMonitorInfoW, (FARPROC)extGetMonitorInfoW},
- {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_HOT_CANDIDATE, "GetSystemMetrics", (FARPROC)GetSystemMetrics, (FARPROC *)&pGetSystemMetrics, (FARPROC)extGetSystemMetrics},
- {HOOK_HOT_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_HOT_CANDIDATE, "SetWindowLongA", (FARPROC)SetWindowLongA, (FARPROC *)&pSetWindowLongA, (FARPROC)extSetWindowLongA},
- {HOOK_HOT_CANDIDATE, "GetWindowLongA", (FARPROC)GetWindowLongA, (FARPROC *)&pGetWindowLongA, (FARPROC)extGetWindowLongA},
- {HOOK_HOT_CANDIDATE, "SetWindowLongW", (FARPROC)SetWindowLongW, (FARPROC *)&pSetWindowLongW, (FARPROC)extSetWindowLongW},
- {HOOK_HOT_CANDIDATE, "GetWindowLongW", (FARPROC)GetWindowLongW, (FARPROC *)&pGetWindowLongW, (FARPROC)extGetWindowLongW},
- {HOOK_IAT_CANDIDATE, "IsWindowVisible", (FARPROC)NULL, (FARPROC *)&pIsWindowVisible, (FARPROC)extIsWindowVisible},
- // hot by MinHook since v2.03.07
- {HOOK_HOT_CANDIDATE, "SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA},
- {HOOK_HOT_CANDIDATE, "SystemParametersInfoW", (FARPROC)SystemParametersInfoW, (FARPROC *)&pSystemParametersInfoW, (FARPROC)extSystemParametersInfoW},
- //{HOOK_HOT_CANDIDATE, "GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow},
- //{HOOK_HOT_CANDIDATE, "GetForegroundWindow", (FARPROC)GetForegroundWindow, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow},
- //{HOOK_IAT_CANDIDATE, "GetWindowTextA", (FARPROC)GetWindowTextA, (FARPROC *)&pGetWindowTextA, (FARPROC)extGetWindowTextA},
- //{HOOK_HOT_CANDIDATE, "EnumDisplayMonitors", (FARPROC)EnumDisplayMonitors, (FARPROC *)&pEnumDisplayMonitors, (FARPROC)extEnumDisplayMonitors},
-#ifdef TRACEPALETTE
- {HOOK_HOT_CANDIDATE, "GetDIBColorTable", (FARPROC)GetDIBColorTable, (FARPROC *)&pGetDIBColorTable, (FARPROC)extGetDIBColorTable},
- {HOOK_HOT_CANDIDATE, "SetDIBColorTable", (FARPROC)SetDIBColorTable, (FARPROC *)&pSetDIBColorTable, (FARPROC)extSetDIBColorTable},
-#endif
-
- {HOOK_HOT_CANDIDATE, "BringWindowToTop", (FARPROC)BringWindowToTop, (FARPROC *)&pBringWindowToTop, (FARPROC)extBringWindowToTop},
- {HOOK_HOT_CANDIDATE, "SetForegroundWindow", (FARPROC)SetForegroundWindow, (FARPROC *)&pSetForegroundWindow, (FARPROC)extSetForegroundWindow},
- {HOOK_HOT_CANDIDATE, "ChildWindowFromPoint", (FARPROC)ChildWindowFromPoint, (FARPROC *)&pChildWindowFromPoint, (FARPROC)extChildWindowFromPoint},
- {HOOK_HOT_CANDIDATE, "ChildWindowFromPointEx", (FARPROC)ChildWindowFromPointEx, (FARPROC *)&pChildWindowFromPointEx, (FARPROC)extChildWindowFromPointEx},
- {HOOK_HOT_CANDIDATE, "WindowFromPoint", (FARPROC)WindowFromPoint, (FARPROC *)&pWindowFromPoint, (FARPROC)extWindowFromPoint},
- {HOOK_HOT_CANDIDATE, "SetWindowsHookExA", (FARPROC)SetWindowsHookExA, (FARPROC *)&pSetWindowsHookEx, (FARPROC)extSetWindowsHookEx},
-
- //{HOOK_HOT_CANDIDATE, "MessageBoxTimeoutA", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutA, (FARPROC)extMessageBoxTimeoutA},
- //{HOOK_HOT_CANDIDATE, "MessageBoxTimeoutW", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutW, (FARPROC)extMessageBoxTimeoutW},
-
- {HOOK_IAT_CANDIDATE, "CreateDesktopA", (FARPROC)CreateDesktopA, (FARPROC *)&pCreateDesktop, (FARPROC)extCreateDesktop},
- {HOOK_IAT_CANDIDATE, "SwitchDesktop", (FARPROC)SwitchDesktop, (FARPROC *)&pSwitchDesktop, (FARPROC)extSwitchDesktop},
- {HOOK_IAT_CANDIDATE, "OpenDesktopA", (FARPROC)OpenDesktopA, (FARPROC *)&pOpenDesktop, (FARPROC)extOpenDesktop},
- {HOOK_IAT_CANDIDATE, "CloseDesktop", (FARPROC)CloseDesktop, (FARPROC *)&pCloseDesktop, (FARPROC)extCloseDesktop},
-
- {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC},
- {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (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_HOT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint},
- {HOOK_HOT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint},
-
- {HOOK_IAT_CANDIDATE, "DialogBoxParamA", (FARPROC)NULL, (FARPROC *)&pDialogBoxParamA, (FARPROC)extDialogBoxParamA},
-
- //{HOOK_IAT_CANDIDATE, "IsZoomed", (FARPROC)NULL, (FARPROC *)&pIsZoomed, (FARPROC)extIsZoomed},
- //{HOOK_HOT_CANDIDATE, "IsIconic", (FARPROC)IsIconic, (FARPROC *)&pIsIconic, (FARPROC)extIsIconic},
-
- {HOOK_HOT_CANDIDATE, "FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect},
-
- {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
-};
-
-static HookEntry_Type NoGDIHooks[]={
- {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
-};
-
-static HookEntry_Type EmulateHooks[]={
- //{HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC},
- //{HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (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 ScaledHooks[]={
- {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_HOT_CANDIDATE, "FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect},
- //{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, "ValidateRect", (FARPROC)ValidateRect, (FARPROC *)&pValidateRect, (FARPROC)extValidateRect},
- {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
-};
-
-static HookEntry_Type RemapHooks[]={
- {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, "GetUpdateRgn", (FARPROC)GetUpdateRgn, (FARPROC *)&pGetUpdateRgn, (FARPROC)extGetUpdateRgn},
- //{HOOK_IAT_CANDIDATE, "GetUpdateRect", (FARPROC)GetUpdateRect, (FARPROC *)&pGetUpdateRect, (FARPROC)extGetUpdateRect},
- //{HOOK_IAT_CANDIDATE, "RedrawWindow", (FARPROC)RedrawWindow, (FARPROC *)&pRedrawWindow, (FARPROC)extRedrawWindow},
- {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
-};
-
-static HookEntry_Type PeekAllHooks[]={
- {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[]={
- {HOOK_HOT_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[]={
- {HOOK_HOT_CANDIDATE, "ShowWindow", (FARPROC)ShowWindow, (FARPROC *)&pShowWindow, (FARPROC)extShowWindow},
- {HOOK_HOT_CANDIDATE, "SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos},
- {HOOK_HOT_CANDIDATE, "DeferWindowPos", (FARPROC)DeferWindowPos, (FARPROC *)&pGDIDeferWindowPos, (FARPROC)extDeferWindowPos},
- {HOOK_HOT_CANDIDATE, "CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProcA, (FARPROC)extCallWindowProcA},
- {HOOK_HOT_CANDIDATE, "CallWindowProcW", (FARPROC)CallWindowProcW, (FARPROC *)&pCallWindowProcW, (FARPROC)extCallWindowProcW},
- {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
-};
-
-static HookEntry_Type MouseHooks2[]={
- {HOOK_HOT_CANDIDATE, "SetCursorPos", (FARPROC)SetCursorPos, (FARPROC *)&pSetCursorPos, (FARPROC)extSetCursorPos},
- {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
-};
-
-static HookEntry_Type TimeHooks[]={
- {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)
-{
- FARPROC addr;
- if (addr=RemapLibrary(proc, hModule, Hooks)) return addr;
- if (dxw.dwFlags1 & CLIENTREMAPPING) if (addr=RemapLibrary(proc, hModule, RemapHooks)) return addr;
-
- if (dxw.dwFlags2 & GDISTRETCHED) if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr;
- if (dxw.dwFlags3 & GDIEMULATEDC) if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr;
- if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC))
- if (addr=RemapLibrary(proc, hModule, NoGDIHooks)) return addr;
-
- if (dxw.dwFlags1 & MODIFYMOUSE) if (addr=RemapLibrary(proc, hModule, MouseHooks)) return addr;
- if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE))
- if (addr=RemapLibrary(proc, hModule, WinHooks)) return addr;
- if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED))
- if (addr=RemapLibrary(proc, hModule, MouseHooks2)) return addr;
- if (dxw.dwFlags3 & PEEKALLMESSAGES)
- if (addr=RemapLibrary(proc, hModule, PeekAllHooks)) return addr;
- if((dxw.dwFlags2 & TIMESTRETCH) && (dxw.dwFlags4 & STRETCHTIMERS))
- if (addr=RemapLibrary(proc, hModule, TimeHooks)) return addr;
-
- return NULL;
-}
-
-static char *libname = "user32.dll";
-
-void HookUser32(HMODULE hModule)
-{
- GDIEmulationMode = GDIMODE_STRETCHED; // default
- if (dxw.dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED;
- if (dxw.dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED;
-
- HookLibrary(hModule, Hooks, libname);
- if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC))
- HookLibrary(hModule, NoGDIHooks, libname);
- if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(hModule, EmulateHooks, libname);
- if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(hModule, ScaledHooks, libname);
-
- if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(hModule, RemapHooks, libname);
- if (dxw.dwFlags1 & MODIFYMOUSE) HookLibrary(hModule, MouseHooks, libname);
- if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE)) HookLibrary(hModule, WinHooks, libname);
- if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) HookLibrary(hModule, MouseHooks2, libname);
- if (dxw.dwFlags3 & PEEKALLMESSAGES) HookLibrary(hModule, PeekAllHooks, libname);
- if (dxw.dwFlags2 & TIMESTRETCH) HookLibrary(hModule, TimeHooks, libname);
-
- IsChangeDisplaySettingsHotPatched = IsHotPatched(Hooks, "ChangeDisplaySettingsExA") || IsHotPatched(Hooks, "ChangeDisplaySettingsExW");
- return;
-}
-
-void HookUser32Init()
-{
- HookLibInit(Hooks);
- HookLibInit(ScaledHooks);
- HookLibInit(EmulateHooks);
- HookLibInit(RemapHooks);
- HookLibInit(MouseHooks);
- HookLibInit(WinHooks);
- HookLibInit(MouseHooks2);
-}
-
-/* ------------------------------------------------------------------------------ */
-// auxiliary (static) functions
-/* ------------------------------------------------------------------------------ */
-
-static void Stopper(char *s, int line)
-{
- char sMsg[81];
- sprintf(sMsg,"break: \"%s\"", s);
- MessageBox(0, sMsg, "break", MB_OK | MB_ICONEXCLAMATION);
-}
-
-//#define STOPPER_TEST // comment out to eliminate
-#ifdef STOPPER_TEST
-#define STOPPER(s) Stopper(s, __LINE__)
-#else
-#define STOPPER(s)
-#endif
-
-static LPCSTR sTemplateName(LPCSTR tn)
-{
- static char sBuf[20+1];
- if((DWORD)tn >> 16)
- return tn;
- else {
- sprintf(sBuf, "ID:(%x)", ((DWORD)tn & 0x0000FFFF));
- return sBuf;
- }
-}
-
-// --------------------------------------------------------------------------
-//
-// globals, externs, static functions...
-//
-// --------------------------------------------------------------------------
-
-// PrimHDC: DC handle of the selected DirectDraw primary surface. NULL when invalid.
-HDC PrimHDC=NULL;
-
-LPRECT lpClipRegion=NULL;
-RECT ClipRegion;
-int LastCurPosX, LastCurPosY;
-
-extern GetDC_Type pGetDC;
-extern ReleaseDC_Type pReleaseDC;
-//extern void FixWindowFrame(HWND);
-extern HRESULT WINAPI sBlt(char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX, BOOL);
-
-LONG WINAPI MyChangeDisplaySettings(char *fname, BOOL WideChar, void *lpDevMode, DWORD dwflags)
-{
- HRESULT res;
- DWORD dmFields, dmBitsPerPel, dmPelsWidth, dmPelsHeight;
-
- // v2.02.32: reset the emulated DC used in GDIEMULATEDC mode
- dxw.ResetEmulatedDC();
-
- if(lpDevMode){
- if(WideChar){
- dmFields=((DEVMODEW *)lpDevMode)->dmFields;
- dmPelsWidth=((DEVMODEW *)lpDevMode)->dmPelsWidth;
- dmPelsHeight=((DEVMODEW *)lpDevMode)->dmPelsHeight;
- dmBitsPerPel=((DEVMODEW *)lpDevMode)->dmBitsPerPel;
- }
- else{
- dmFields=((DEVMODEA *)lpDevMode)->dmFields;
- dmPelsWidth=((DEVMODEA *)lpDevMode)->dmPelsWidth;
- dmPelsHeight=((DEVMODEA *)lpDevMode)->dmPelsHeight;
- dmBitsPerPel=((DEVMODEA *)lpDevMode)->dmBitsPerPel;
- }
- }
-
- // save desired settings first v.2.1.89
- // v2.1.95 protect when lpDevMode is null (closing game... Jedi Outcast)
- // v2.2.23 consider new width/height only when dmFields flags are set.
- if(lpDevMode && (dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT))){
- RECT client;
- dxw.SetScreenSize(dmPelsWidth, dmPelsHeight);
-
- // v2.02.31: when main win is bigger that expected resolution, you're in windowed fullscreen mode
- //(*pGetClientRect)((dxw.dwFlags1 & FIXPARENTWIN) ? dxw.hParentWnd : dxw.GethWnd(), &client);
- (*pGetClientRect)(dxw.GethWnd(), &client);
- OutTraceDW("%s: current hWnd=%x size=(%d,%d)\n", fname, dxw.GethWnd(), client.right, client.bottom);
- if((client.right>=(LONG)dmPelsWidth) && (client.bottom>=(LONG)dmPelsHeight)) {
- OutTraceDW("%s: entering FULLSCREEN mode\n", fname);
- dxw.SetFullScreen(TRUE);
- }
- }
-
- if ((dwflags==0 || dwflags==CDS_FULLSCREEN) && lpDevMode){
- if (dxw.dwFlags1 & EMULATESURFACE || !(dmFields & DM_BITSPERPEL)){
- OutTraceDW("%s: BYPASS res=DISP_CHANGE_SUCCESSFUL\n", fname);
- return DISP_CHANGE_SUCCESSFUL;
- }
- else{
- DEVMODEA NewMode;
- if(dwflags==CDS_FULLSCREEN) dwflags=0; // no FULLSCREEN
- (*pEnumDisplaySettings)(NULL, ENUM_CURRENT_SETTINGS, &NewMode);
- OutTraceDW("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> %d\n",
- NewMode.dmPelsWidth, NewMode.dmPelsHeight, NewMode.dmBitsPerPel, dmBitsPerPel);
- NewMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
- NewMode.dmBitsPerPel = dmBitsPerPel;
- res=(*pChangeDisplaySettingsExA)(NULL, &NewMode, NULL, 0, NULL);
- if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- return res;
- }
- }
- else{
- if(WideChar)
- return (*pChangeDisplaySettingsExW)(NULL, (LPDEVMODEW)lpDevMode, NULL, dwflags, NULL);
- else
- return (*pChangeDisplaySettingsExA)(NULL, (LPDEVMODEA)lpDevMode, NULL, dwflags, NULL);
- }
-}
-
-void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam)
-{
- LPWINDOWPOS wp;
- int MaxX, MaxY;
- wp = (LPWINDOWPOS)lParam;
- MaxX = dxw.iSizX;
- MaxY = dxw.iSizY;
- if (!MaxX) MaxX = dxw.GetScreenWidth();
- if (!MaxY) MaxY = dxw.GetScreenHeight();
- static int iLastCX, iLastCY;
- static int BorderX=-1;
- static int BorderY=-1;
- int cx, cy;
- extern void CalculateWindowPos(HWND, DWORD, DWORD, LPWINDOWPOS);
-
- OutTraceDW("%s: GOT hwnd=%x pos=(%d,%d) dim=(%d,%d) Flags=%x(%s)\n",
- ApiName, hwnd, wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags));
-
- if (dxw.dwFlags1 & PREVENTMAXIMIZE){
- int UpdFlag = 0;
- WINDOWPOS MaxPos;
- CalculateWindowPos(hwnd, MaxX, MaxY, &MaxPos);
-
- if(wp->cx>MaxPos.cx) { wp->cx=MaxPos.cx; UpdFlag=1; }
- if(wp->cy>MaxPos.cy) { wp->cy=MaxPos.cy; UpdFlag=1; }
- if (UpdFlag)
- OutTraceDW("%s: SET max dim=(%d,%d)\n", ApiName, wp->cx, wp->cy);
- }
-
- if ((wp->flags & (SWP_NOMOVE|SWP_NOSIZE))==(SWP_NOMOVE|SWP_NOSIZE)) return; //v2.02.13
-
- if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){
- CalculateWindowPos(hwnd, MaxX, MaxY, wp);
- OutTraceDW("%s: LOCK pos=(%d,%d) dim=(%d,%d)\n", ApiName, wp->x, wp->y, wp->cx, wp->cy);
- }
-
- if ((dxw.dwFlags2 & KEEPASPECTRATIO) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){
- // note: while keeping aspect ration, resizing from one corner doesn't tell
- // which coordinate is prevalent to the other. We made an arbitrary choice.
- // note: v2.1.93: compensation must refer to the client area, not the wp
- // window dimensions that include the window borders.
- if(BorderX==-1){
- // v2.02.92: Fixed for AERO mode, where GetWindowRect substantially LIES!
- RECT client, full;
- LONG dwStyle, dwExStyle;
- HMENU hMenu;
- extern GetWindowLong_Type pGetWindowLongA;
- (*pGetClientRect)(hwnd, &client);
- full=client;
- dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE);
- dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
- hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd);
- AdjustWindowRectEx(&full, dwStyle, (hMenu!=NULL), dwExStyle);
- if (hMenu && (hMenu != (HMENU)-1)) __try {CloseHandle(hMenu);} __except(EXCEPTION_EXECUTE_HANDLER){};
- BorderX= full.right - full.left - client.right;
- BorderY= full.bottom - full.top - client.bottom;
- OutTraceDW("%s: KEEPASPECTRATIO window borders=(%d,%d)\n", ApiName, BorderX, BorderY);
- }
- extern LRESULT LastCursorPos;
- switch (LastCursorPos){
- case HTBOTTOM:
- case HTTOP:
- case HTBOTTOMLEFT:
- case HTBOTTOMRIGHT:
- case HTTOPLEFT:
- case HTTOPRIGHT:
- cx = BorderX + ((wp->cy - BorderY) * dxw.iRatioX) / dxw.iRatioY;
- if(cx!=wp->cx){
- OutTraceDW("%s: KEEPASPECTRATIO adjusted cx=%d->%d\n", ApiName, wp->cx, cx);
- wp->cx = cx;
- }
- break;
- case HTLEFT:
- case HTRIGHT:
- cy = BorderY + ((wp->cx - BorderX) * dxw.iRatioY) / dxw.iRatioX;
- if(cy!=wp->cy){
- OutTraceDW("%s: KEEPASPECTRATIO adjusted cy=%d->%d\n", ApiName, wp->cy, cy);
- wp->cy = cy;
- }
- break;
- }
- }
-
- if ((dxw.dwFlags5 & CENTERTOWIN) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){
- RECT wrect;
- LONG dwStyle, dwExStyle;
- HMENU hMenu;
- int minx, miny;
- wrect = dxw.GetScreenRect();
- dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE);
- dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
- hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd);
- AdjustWindowRectEx(&wrect, dwStyle, (hMenu!=NULL), dwExStyle);
- minx = wrect.right - wrect.left;
- miny = wrect.bottom - wrect.top;
- if(wp->cx < minx) wp->cx = minx;
- if(wp->cy < miny) wp->cy = miny;
- }
-
- iLastCX= wp->cx;
- iLastCY= wp->cy;
-}
-
-void dxwFixMinMaxInfo(char *ApiName, HWND hwnd, LPARAM lParam)
-{
- if (dxw.dwFlags1 & PREVENTMAXIMIZE){
- LPMINMAXINFO lpmmi;
- lpmmi=(LPMINMAXINFO)lParam;
- OutTraceDW("%s: GOT MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName,
- lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y);
- lpmmi->ptMaxPosition.x=0;
- lpmmi->ptMaxPosition.y=0;
- lpmmi->ptMaxSize.x = dxw.GetScreenWidth();
- lpmmi->ptMaxSize.y = dxw.GetScreenHeight();
-
- OutTraceDW("%s: SET PREVENTMAXIMIZE MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName,
- lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y);
- }
-
- // v2.1.75: added logic to fix win coordinates to selected ones.
- // fixes the problem with "Achtung Spitfire", that can't be managed through PREVENTMAXIMIZE flag.
- if (dxw.dwFlags1 & LOCKWINPOS){
- LPMINMAXINFO lpmmi;
- lpmmi=(LPMINMAXINFO)lParam;
- OutTraceDW("%s: GOT MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName,
- lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y);
- lpmmi->ptMaxPosition.x=dxw.iPosX;
- lpmmi->ptMaxPosition.y=dxw.iPosY;
- lpmmi->ptMaxSize.x = dxw.iSizX ? dxw.iSizX : dxw.GetScreenWidth();
- lpmmi->ptMaxSize.y = dxw.iSizY ? dxw.iSizY : dxw.GetScreenHeight();
- OutTraceDW("%s: SET LOCKWINPOS MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName,
- lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y);
- }
-}
-
-static LRESULT WINAPI FixWindowProc(char *ApiName, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM *lpParam)
-{
- LPARAM lParam;
-
- lParam=*lpParam;
- OutTraceW("%s: hwnd=%x msg=[0x%x]%s(%x,%x)\n",
- ApiName, hwnd, Msg, ExplainWinMessage(Msg), wParam, lParam);
-
- switch(Msg){
- case WM_NCHITTEST:
- // v2.02.71 fix: when processing WM_NCHITTEST messages whith fixed coordinates avoid calling
- // the *pDefWindowProc call
- // fixes "Microsoft Motocross Madness" mouse handling
- if((dxw.dwFlags2 & FIXNCHITTEST) && (dxw.dwFlags1 & MODIFYMOUSE)){ // mouse processing
- OutTraceDW("%s: suppress WM_NCHITTEST\n", ApiName);
- return TRUE;
- }
- break;
- case WM_ERASEBKGND:
- OutTraceDW("%s: prevent erase background\n", ApiName);
- return TRUE; // 1=erased
- break; // useless
- case WM_GETMINMAXINFO:
- dxwFixMinMaxInfo(ApiName, hwnd, lParam);
- break;
- case WM_WINDOWPOSCHANGING:
- case WM_WINDOWPOSCHANGED:
- dxwFixWindowPos(ApiName, hwnd, lParam);
- break;
- case WM_STYLECHANGING:
- case WM_STYLECHANGED:
- dxw.FixStyle(ApiName, hwnd, wParam, lParam);
- break;
- case WM_SIZE:
- if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()) return 0;
- if (dxw.dwFlags1 & PREVENTMAXIMIZE){
- if ((wParam == SIZE_MAXIMIZED)||(wParam == SIZE_MAXSHOW)){
- OutTraceDW("%s: prevent screen SIZE to fullscreen wparam=%d(%s) size=(%d,%d)\n", ApiName,
- wParam, ExplainResizing(wParam), HIWORD(lParam), LOWORD(lParam));
- return 0; // checked
- //lParam = MAKELPARAM(dxw.GetScreenWidth(), dxw.GetScreenHeight());
- //OutTraceDW("%s: updated SIZE wparam=%d(%s) size=(%d,%d)\n", ApiName,
- // wParam, ExplainResizing(wParam), HIWORD(lParam), LOWORD(lParam));
- }
- }
- break;
- default:
- break;
- }
-
- // marker to run hooked function
- return(-1);
-}
-
-// --------------------------------------------------------------------------
-//
-// user32 API hookers
-//
-// --------------------------------------------------------------------------
-
-
-BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase)
-{
- if(lpRect)
- OutTraceDW("InvalidateRect: hwnd=%x rect=(%d,%d)-(%d,%d) erase=%x\n",
- hwnd, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, bErase);
- else
- OutTraceDW("InvalidateRect: hwnd=%x rect=NULL erase=%x\n",
- hwnd, bErase);
-
- if(dxw.IsFullScreen() && dxw.IsRealDesktop(hwnd)) {
- hwnd=dxw.GethWnd();
- dxw.MapClient(lpRect);
- return (*pInvalidateRect)(hwnd, lpRect, bErase);
- }
- else{
- // just exagerate ...
- return (*pInvalidateRect)(hwnd, NULL, bErase);
- }
-}
-
-BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow)
-{
- BOOL res;
-
- OutTraceDW("ShowWindow: hwnd=%x, CmdShow=%x(%s)\n", hwnd, nCmdShow, ExplainShowCmd(nCmdShow));
- if (dxw.dwFlags1 & PREVENTMAXIMIZE){
- if(nCmdShow==SW_MAXIMIZE){
- OutTraceDW("ShowWindow: suppress SW_MAXIMIZE maximize\n");
- nCmdShow=SW_SHOWNORMAL;
- }
- if(nCmdShow==SW_SHOWDEFAULT){
- STARTUPINFO StartupInfo;
- GetStartupInfo(&StartupInfo);
- OutTraceDW("DEBUG: StartupInfo dwFlags=%x ShowWindow=%x\n", StartupInfo.dwFlags, StartupInfo.wShowWindow);
- if((StartupInfo.dwFlags & STARTF_USESHOWWINDOW) && (StartupInfo.wShowWindow == SW_MAXIMIZE)){
- OutTraceDW("ShowWindow: suppress SW_SHOWDEFAULT maximize\n");
- nCmdShow=SW_SHOWNORMAL;
- }
- }
- }
-
- res=(*pShowWindow)(hwnd, nCmdShow);
- OutTraceDW("ShowWindow: res=%x\n", res);
-
- return res;
-}
-
-LONG WINAPI extGetWindowLong(GetWindowLong_Type pGetWindowLong, char *ApiName, HWND hwnd, int nIndex)
-{
- LONG res;
-
- res=(*pGetWindowLong)(hwnd, nIndex);
-
- OutTraceDW("%s: hwnd=%x, Index=%x(%s) res=%x\n", ApiName, hwnd, nIndex, ExplainSetWindowIndex(nIndex), res);
-
- if((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)){
- WNDPROC wp;
- wp=dxwws.GetProc(hwnd);
- OutTraceDW("%s: remapping WindowProc res=%x -> %x\n", ApiName, res, (LONG)wp);
- if(wp) res=(LONG)wp; // if not found, don't alter the value.
- }
-
- return res;
-}
-
-LONG WINAPI extGetWindowLongA(HWND hwnd, int nIndex)
-{
- return extGetWindowLong(pGetWindowLongA, "GetWindowLongA", hwnd, nIndex);
-}
-
-LONG WINAPI extGetWindowLongW(HWND hwnd, int nIndex)
-{
- return extGetWindowLong(pGetWindowLongW, "GetWindowLongW", hwnd, nIndex);
-}
-
-LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLong_Type pSetWindowLong)
-{
- LONG res;
-
- OutTraceDW("SetWindowLong: hwnd=%x, Index=%x(%s) Val=%x\n",
- hwnd, nIndex, ExplainSetWindowIndex(nIndex), dwNewLong);
-
- if (dxw.Windowize){
- if(dxw.dwFlags1 & LOCKWINSTYLE){
- if(nIndex==GWL_STYLE){
- OutTraceDW("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong);
- return (*pGetWindowLongA)(hwnd, nIndex);
- }
- if(nIndex==GWL_EXSTYLE){
- OutTraceDW("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong);
- return (*pGetWindowLongA)(hwnd, nIndex);
- }
- }
-
- if (dxw.dwFlags1 & PREVENTMAXIMIZE){
- if(nIndex==GWL_STYLE){
- dwNewLong &= ~WS_MAXIMIZE;
- if(dxw.IsDesktop(hwnd)){
- OutTraceDW("SetWindowLong: GWL_STYLE %x suppress MAXIMIZE\n", dwNewLong);
- dwNewLong |= WS_OVERLAPPEDWINDOW;
- dwNewLong &= ~(WS_DLGFRAME|WS_MAXIMIZE|WS_VSCROLL|WS_HSCROLL|WS_CLIPSIBLINGS);
- }
- }
- // v2.02.32: disable topmost for main window only
- if(dxw.IsDesktop(hwnd) && (nIndex==GWL_EXSTYLE)){
- OutTraceDW("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong);
- dwNewLong = dwNewLong & ~(WS_EX_TOPMOST);
- }
- }
-
- if (dxw.dwFlags1 & FIXWINFRAME){
- //if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD)){
- if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD) && dxw.IsDesktop(hwnd)){
- OutTraceDW("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong);
- dwNewLong |= WS_OVERLAPPEDWINDOW;
- dwNewLong &= ~WS_CLIPSIBLINGS;
- }
- }
- }
-
- if (((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)) && dxw.IsFullScreen()){ // v2.02.51 - see A10 Cuba....
- WNDPROC lres;
- WNDPROC OldProc;
- // GPL fix
- if(dxw.IsRealDesktop(hwnd) && dxw.Windowize) {
- hwnd=dxw.GethWnd();
- OutTraceDW("SetWindowLong: DESKTOP hwnd, FIXING hwnd=%x\n",hwnd);
- }
- // end of GPL fix
-
- OldProc = (WNDPROC)(*pGetWindowLongA)(hwnd, nIndex);
- // v2.02.70 fix
- if((OldProc==extWindowProc) ||
- (OldProc==extChildWindowProc)||
- (OldProc==extDialogWindowProc))
- OldProc=dxwws.GetProc(hwnd);
- dxwws.PutProc(hwnd, (WNDPROC)dwNewLong);
- res=(LONG)OldProc;
- SetLastError(0);
- lres=(WNDPROC)(*pSetWindowLongA)(hwnd, nIndex, (LONG)extWindowProc);
- if(!lres && GetLastError())OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- }
- else {
- res=(*pSetWindowLongA)(hwnd, nIndex, dwNewLong);
- }
-
- OutTraceDW("SetWindowLong: hwnd=%x, nIndex=%x, Val=%x, res=%x\n", hwnd, nIndex, dwNewLong, res);
- return res;
-}
-
-LONG WINAPI extSetWindowLongA(HWND hwnd, int nIndex, LONG dwNewLong)
-{
- return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongA);
-}
-
-LONG WINAPI extSetWindowLongW(HWND hwnd, int nIndex, LONG dwNewLong)
-{
- return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongW);
-}
-
-BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
-{
- BOOL res;
-
- OutTraceDW("SetWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n",
- hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags);
-
- // when not in fullscreen mode, just proxy the call
- if (!dxw.IsFullScreen()){
- res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags);
- if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- return res;
- }
-
- // in fullscreen, but a child window inside .....
- if (!dxw.IsDesktop(hwnd)){
- RECT r;
- r.left = X;
- r.right = X + cx;
- r.top = Y;
- r.bottom = Y + cy;
- if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){
- r = dxw.MapClientRect(&r);
- }
- else {
- //r = dxw.MapWindowRect(&r);
- }
- X = r.left;
- Y = r.top;
- cx = r.right - r.left;
- cy = r.bottom - r.top;
-
- res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags);
- if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__);
-
- //HFONT hFont;
- //hFont=CreateFont (
- // 30, 0, 0, 0, FW_DONTCARE, FALSE, FALSE,
- // FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
- // DEFAULT_PITCH | FF_SWISS, NULL); // "Arial");
- //SendMessage (hwnd, WM_SETFONT, WPARAM (hFont), TRUE);
-
- return res;
- }
-
- if (dxw.dwFlags1 & LOCKWINPOS){
- // Note: any attempt to change the window position, no matter where and how, through the
- // SetWindowPos API is causing resizing to the default 1:1 pixed size in Commandos.
- // in such cases, there is incompatibility between LOCKWINPOS and LOCKWINSTYLE.
- OutTraceDW("SetWindowPos: locked position\n");
- return 1;
- }
-
- if (dxw.dwFlags1 & PREVENTMAXIMIZE){
- int UpdFlag =0;
- int MaxX, MaxY;
- MaxX = dxw.iSizX;
- MaxY = dxw.iSizY;
- if (!MaxX) MaxX = dxw.GetScreenWidth();
- if (!MaxY) MaxY = dxw.GetScreenHeight();
- if(cx>MaxX) { cx=MaxX; UpdFlag=1; }
- if(cy>MaxY) { cy=MaxY; UpdFlag=1; }
- if (UpdFlag)
- OutTraceDW("SetWindowPos: using max dim=(%d,%d)\n", cx, cy);
- }
-
- // useful??? to be demonstrated....
- // when altering main window in fullscreen mode, fix the coordinates for borders
- DWORD dwCurStyle, dwExStyle;
- HMENU hMenu;
- RECT rect;
- rect.top=rect.left=0;
- rect.right=cx; rect.bottom=cy;
- dwCurStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE);
- dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
- // BEWARE: from MSDN - If the window is a child window, the return value is undefined.
- hMenu = (dwCurStyle & WS_CHILD) ? NULL : GetMenu(hwnd);
- AdjustWindowRectEx(&rect, dwCurStyle, (hMenu!=NULL), dwExStyle);
- if (hMenu && (hMenu != (HMENU)-1)) __try {CloseHandle(hMenu);} __except(EXCEPTION_EXECUTE_HANDLER){};
- cx=rect.right; cy=rect.bottom;
- OutTraceDW("SetWindowPos: main form hwnd=%x fixed size=(%d,%d)\n", hwnd, cx, cy);
-
- res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags);
- if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- return res;
-}
-
-HDWP WINAPI extDeferWindowPos(HDWP hWinPosInfo, HWND hwnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
-{
- // v2.02.31: heavily used by "Imperialism II" !!!
- HDWP res;
-
- OutTraceDW("DeferWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n",
- hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags);
-
- if(dxw.IsFullScreen()){
- dxw.MapClient(&X, &Y, &cx, &cy);
- OutTraceDW("DeferWindowPos: remapped pos=(%d,%d) dim=(%d,%d)\n", X, Y, cx, cy);
- }
-
- res=(*pGDIDeferWindowPos)(hWinPosInfo, hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags);
- if(!res)OutTraceE("DeferWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- return res;
-}
-
-LRESULT WINAPI extSendMessage(char *apiname, SendMessage_Type pSendMessage, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
-{
- LRESULT ret;
- OutTraceW("%s: hwnd=%x WinMsg=[0x%x]%s(%x,%x)\n",
- apiname, hwnd, Msg, ExplainWinMessage(Msg), wParam, lParam);
-
- if(dxw.dwFlags1 & MODIFYMOUSE){
- switch (Msg){
- case WM_MOUSEMOVE:
- case WM_MOUSEWHEEL:
- case WM_LBUTTONDOWN:
- case WM_LBUTTONUP:
- case WM_LBUTTONDBLCLK:
- case WM_RBUTTONDOWN:
- case WM_RBUTTONUP:
- case WM_RBUTTONDBLCLK:
- case WM_MBUTTONDOWN:
- case WM_MBUTTONUP:
- case WM_MBUTTONDBLCLK:
- // revert here the WindowProc mouse correction
- POINT prev, curr;
- RECT rect;
- prev.x = LOWORD(lParam);
- prev.y = HIWORD(lParam);
- (*pGetClientRect)(dxw.GethWnd(), &rect);
- curr.x = (prev.x * rect.right) / dxw.GetScreenWidth();
- curr.y = (prev.y * rect.bottom) / dxw.GetScreenHeight();
- if (Msg == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix
- POINT upleft={0,0};
- (*pClientToScreen)(dxw.GethWnd(), &upleft);
- curr = dxw.AddCoordinates(curr, upleft);
- }
- lParam = MAKELPARAM(curr.x, curr.y);
- OutTraceC("%s: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", apiname, hwnd, prev.x, prev.y, curr.x, curr.y);
- break;
- default:
- break;
- }
- }
- ret=(*pSendMessage)(hwnd, Msg, wParam, lParam);
- OutTraceW("%s: lresult=%x\n", apiname, ret);
- return ret;
-}
-
-LRESULT WINAPI extSendMessageA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
-{
- return extSendMessage("SendMessageA", pSendMessageA, hwnd, Msg, wParam, lParam);
-}
-
-LRESULT WINAPI extSendMessageW(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
-{
- return extSendMessage("SendMessageW", pSendMessageW, hwnd, Msg, wParam, lParam);
-}
-
-HCURSOR WINAPI extSetCursor(HCURSOR hCursor)
-{
- HCURSOR ret;
-
- ret=(*pSetCursor)(hCursor);
- OutTraceDW("GDI.SetCursor: Cursor=%x, ret=%x\n", hCursor, ret);
- //MessageBox(0, "SelectPalette", "GDI32.dll", MB_OK | MB_ICONEXCLAMATION);
- return ret;
-}
-
-BOOL WINAPI extGetCursorPos(LPPOINT lppoint)
-{
- HRESULT res;
- static int PrevX, PrevY;
- POINT prev;
-
- if(dxw.dwFlags1 & SLOWDOWN) dxw.DoSlow(2);
-
- if (pGetCursorPos) {
- res=(*pGetCursorPos)(lppoint);
- }
- else {
- lppoint->x =0; lppoint->y=0;
- res=1;
- }
-
- prev=*lppoint;
- *lppoint=dxw.ScreenToClient(*lppoint);
- *lppoint=dxw.FixCursorPos(*lppoint);
-
- GetHookInfo()->CursorX=(short)lppoint->x;
- GetHookInfo()->CursorY=(short)lppoint->y;
- OutTraceC("GetCursorPos: FIXED pos=(%d,%d)->(%d,%d)\n", prev.x, prev.y, lppoint->x, lppoint->y);
-
- return res;
-}
-
-BOOL WINAPI extSetCursorPos(int x, int y)
-{
- BOOL res;
- int PrevX, PrevY;
-
- PrevX=x;
- PrevY=y;
-
- if(dxw.dwFlags2 & KEEPCURSORFIXED) {
- OutTraceC("SetCursorPos: FIXED pos=(%d,%d)\n", x, y);
- LastCurPosX=x;
- LastCurPosY=y;
- return 1;
- }
-
- if(dxw.dwFlags1 & SLOWDOWN) dxw.DoSlow(2);
-
- if(dxw.dwFlags1 & KEEPCURSORWITHIN){
- // Intercept SetCursorPos outside screen boundaries (used as Cursor OFF in some games)
- if ((y<0)||(y>=(int)dxw.GetScreenHeight())||(x<0)||(x>=(int)dxw.GetScreenWidth())) return 1;
- }
-
- if(dxw.dwFlags1 & MODIFYMOUSE){
- POINT cur;
- RECT rect;
-
- // find window metrics
- if (!(*pGetClientRect)(dxw.GethWnd(), &rect)) {
- // report error and ignore ...
- OutTraceE("GetClientRect(%x) ERROR %d at %d\n", dxw.GethWnd(), GetLastError(), __LINE__);
- return 0;
- }
-
- x= x * rect.right / dxw.GetScreenWidth();
- y= y * rect.bottom / dxw.GetScreenHeight();
-
- // check for boundaries (???)
- if (x >= rect.right) x=rect.right-1;
- if (x<0) x=0;
- if (y >= rect.bottom) y=rect.bottom-1;
- if (y<0) y=0;
-
- // make it screen absolute
- cur.x = x;
- cur.y = y;
- if (!(*pClientToScreen)(dxw.GethWnd(), &cur)) {
- OutTraceE("ClientToScreen(%x) ERROR %d at %d\n", dxw.GethWnd(), GetLastError(), __LINE__);
- return 0;
- }
- x = cur.x;
- y = cur.y;
- }
-
- res=0;
- if (pSetCursorPos) res=(*pSetCursorPos)(x,y);
-
- OutTraceC("SetCursorPos: res=%x XY=(%d,%d)->(%d,%d)\n", res, PrevX, PrevY, x, y);
- return res;
-}
-
-BOOL WINAPI extPeekMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)
-{
- BOOL res;
-
- if((wMsgFilterMin==0) && (wMsgFilterMax == 0)){
- // no filtering, everything is good
- res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F));
- }
- else {
- MSG Dummy;
- // better eliminate all messages before and after the selected range !!!!
- //if(wMsgFilterMin)(*pPeekMessage)(&Dummy, hwnd, 0, wMsgFilterMin-1, TRUE);
- if(wMsgFilterMin>0x0F)(*pPeekMessage)(&Dummy, hwnd, 0x0F, wMsgFilterMin-1, TRUE);
- res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F));
- if(wMsgFilterMaxhwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg),
- lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF),
- lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res);
- else
- OutTraceW("PeekMessage: ANY lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) res=%x\n",
- lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), res);
-
-
- return res;
-}
-
-BOOL WINAPI extClientToScreen(HWND hwnd, LPPOINT lppoint)
-{
- // v2.02.10: fully revised to handle scaled windows
- BOOL res;
-
- OutTraceB("ClientToScreen: hwnd=%x hWnd=%x FullScreen=%x point=(%d,%d)\n",
- hwnd, dxw.GethWnd(), dxw.IsFullScreen(), lppoint->x, lppoint->y);
- if (lppoint && dxw.IsFullScreen()){
- // optimization: in fullscreen mode, coordinate conversion for the desktop window
- // should always keep the same values inaltered
- if(hwnd != dxw.GethWnd()){
- *lppoint = dxw.AddCoordinates(*lppoint, dxw.ClientOffset(hwnd));
- }
- OutTraceB("ClientToScreen: FIXED point=(%d,%d)\n", lppoint->x, lppoint->y);
- res=TRUE;
- }
- else {
- res=(*pClientToScreen)(hwnd, lppoint);
- }
- return res;
-}
-
-BOOL WINAPI extScreenToClient(HWND hwnd, LPPOINT lppoint)
-{
- // v2.02.10: fully revised to handle scaled windows
- BOOL res;
- OutTraceB("ScreenToClient: hwnd=%x hWnd=%x FullScreen=%x point=(%d,%d)\n",
- hwnd, dxw.GethWnd(), dxw.IsFullScreen(), lppoint->x, lppoint->y);
-
- if (lppoint && (lppoint->x == -32000) && (lppoint->y == -32000)) return 1;
-
- if (lppoint && dxw.IsFullScreen()){
- // optimization: in fullscreen mode, coordinate conversion for the desktop window
- // should always keep the same values inaltered
- if(hwnd != dxw.GethWnd()){
- *lppoint = dxw.SubCoordinates(*lppoint, dxw.ClientOffset(hwnd));
- OutTraceB("ScreenToClient: FIXED point=(%d,%d)\n", lppoint->x, lppoint->y);
- }
- res=TRUE;
- }
- else {
- res=(*pScreenToClient)(hwnd, lppoint);
- }
- return res;
-}
-
-BOOL WINAPI extGetClientRect(HWND hwnd, LPRECT lpRect)
-{
- BOOL ret;
- OutTraceB("GetClientRect: whnd=%x FullScreen=%x\n", hwnd, dxw.IsFullScreen());
-
- if(!lpRect) return 0;
-
- // proxed call
- ret=(*pGetClientRect)(hwnd, lpRect);
- if(!ret) {
- OutTraceE("GetClientRect: ERROR hwnd=%x err=%d at %d\n", hwnd, GetLastError(), __LINE__);
- return ret;
- }
- OutTraceB("GetClientRect: actual rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
-
- if (dxw.IsDesktop(hwnd)){
- *lpRect = dxw.GetScreenRect();
- OutTraceB("GetClientRect: desktop rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
- else
- if (dxw.IsFullScreen()){
- int w, h;
- if(FIXCHILDSIZE){
- if(dxwws.GetSize(hwnd, &w, &h)){
- lpRect->top=lpRect->left=0;
- lpRect->right=w;
- lpRect->bottom=h;
- OutTraceB("GetClientRect: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- return TRUE;
- }
- }
- *lpRect=dxw.GetClientRect(*lpRect);
- OutTraceB("GetClientRect: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
- return ret;
-}
-
-BOOL WINAPI extGetWindowRect(HWND hwnd, LPRECT lpRect)
-{
- BOOL ret;
- OutTraceB("GetWindowRect: hwnd=%x hWnd=%x FullScreen=%x\n", hwnd, dxw.GethWnd(), dxw.IsFullScreen());
- ret=(*pGetWindowRect)(hwnd, lpRect);
- if(!ret) {
- OutTraceE("GetWindowRect: GetWindowRect hwnd=%x error %d at %d\n", hwnd, GetLastError(), __LINE__);
- return ret;
- }
- OutTraceB("GetWindowRect: rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
-
- // minimized windows behaviour
- if((lpRect->left == -32000)||(lpRect->top == -32000)) return ret;
-
- if (dxw.IsDesktop(hwnd)){
- // to avoid keeping track of window frame
- *lpRect = dxw.GetScreenRect();
- OutTraceB("GetWindowRect: desktop rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
- else
- if (dxw.IsFullScreen()){
- *lpRect=dxw.GetWindowRect(*lpRect);
-
- // Diablo fix: it retrieves coordinates for the explorer window, that are as big as the real desktop!!!
- if(lpRect->left < 0) lpRect->left=0;
-// if(lpRect->left > (LONG)dxw.GetScreenWidth()) lpRect->left=dxw.GetScreenWidth();
-// if(lpRect->right < 0) lpRect->right=0;
- if(lpRect->right > (LONG)dxw.GetScreenWidth()) lpRect->right=dxw.GetScreenWidth();
- if(lpRect->top < 0) lpRect->top=0;
-// if(lpRect->top > (LONG)dxw.GetScreenHeight()) lpRect->top=dxw.GetScreenHeight();
-// if(lpRect->bottom < 0) lpRect->bottom=0;
- if(lpRect->bottom > (LONG)dxw.GetScreenHeight()) lpRect->bottom=dxw.GetScreenHeight();
-
- OutTraceB("GetWindowRect: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
-
- return ret;
-}
-
-int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints)
-{
- UINT pi;
- int ret;
- // a rarely used API, but responsible for a painful headache: needs hooking for "Commandos 2", "Alien Nations".
- // used also in "Full Pipe" activemovie
- // used also in "NBA Live 99" menu screen
-
- OutTraceDW("MapWindowPoints: hWndFrom=%x%s hWndTo=%x%s cPoints=%d FullScreen=%x\n",
- hWndFrom, dxw.IsDesktop(hWndFrom)?"(DESKTOP)":"",
- hWndTo, dxw.IsDesktop(hWndTo)?"(DESKTOP)":"",
- cPoints, dxw.IsFullScreen());
- if(IsDebug){
- OutTrace("Points: ");
- for(pi=0; pi>16, ret&0x0000FFFF);
- return ret;
-}
-
-HWND WINAPI extGetDesktopWindow(void)
-{
- HWND res;
-
- if((!dxw.Windowize) || (dxw.dwFlags5 & DIABLOTWEAK)) return (*pGetDesktopWindow)();
-
- OutTraceDW("GetDesktopWindow: FullScreen=%x\n", dxw.IsFullScreen());
- if (dxw.IsFullScreen()){
-#ifdef CREATEDESKTOP
- if(CREATEDESKTOP){
- extern HWND hDesktopWindow;
- OutTraceDW("GetDesktopWindow: returning desktop emulated hwnd=%x\n", hDesktopWindow);
- return hDesktopWindow;
- }
-#endif
- OutTraceDW("GetDesktopWindow: returning main window hwnd=%x\n", dxw.GethWnd());
- return dxw.GethWnd();
- }
- else{
- res=(*pGetDesktopWindow)();
- OutTraceDW("GetDesktopWindow: returning desktop window hwnd=%x\n", res);
- return res;
- }
-}
-
-int WINAPI extGetSystemMetrics(int nindex)
-{
- HRESULT res;
-
- res=(*pGetSystemMetrics)(nindex);
- OutTraceDW("GetSystemMetrics: index=%x(%s), res=%d\n", nindex, ExplainsSystemMetrics(nindex), res);
-
- if(!dxw.Windowize){
- // v2.02.95: if not in window mode, just implement the HIDEMULTIMONITOR flag
- if( (nindex ==SM_CMONITORS) &&
- (dxw.dwFlags2 & HIDEMULTIMONITOR) &&
- res>1) {
- res=1;
- OutTraceDW("GetSystemMetrics: fix SM_CMONITORS=%d\n", res);
- }
- return res;
- }
-
- switch(nindex){
- case SM_CXFULLSCREEN:
- case SM_CXSCREEN:
- case SM_CXVIRTUALSCREEN: // v2.02.31
- res= dxw.GetScreenWidth();
- OutTraceDW("GetSystemMetrics: fix SM_CXSCREEN=%d\n", res);
- break;
- case SM_CYFULLSCREEN:
- case SM_CYSCREEN:
- case SM_CYVIRTUALSCREEN: // v2.02.31
- res= dxw.GetScreenHeight();
- OutTraceDW("GetSystemMetrics: fix SM_CYSCREEN=%d\n", res);
- break;
- case SM_CMONITORS:
- if((dxw.dwFlags2 & HIDEMULTIMONITOR) && res>1) {
- res=1;
- OutTraceDW("GetSystemMetrics: fix SM_CMONITORS=%d\n", res);
- }
- break;
- }
-
- return res;
-}
-
-ATOM WINAPI extRegisterClassExA(WNDCLASSEX *lpwcx)
-{
- OutTraceDW("RegisterClassEx: PROXED ClassName=%s style=%x(%s) WndProc=%x cbClsExtra=%d cbWndExtra=%d hInstance=%x\n",
- lpwcx->lpszClassName, lpwcx->style, ExplainStyle(lpwcx->style), lpwcx->lpfnWndProc, lpwcx->cbClsExtra, lpwcx->cbWndExtra, lpwcx->hInstance);
- return (*pRegisterClassExA)(lpwcx);
-}
-
-ATOM WINAPI extRegisterClassA(WNDCLASS *lpwcx)
-{
- // referenced by Syberia, together with RegisterClassExA
- OutTraceDW("RegisterClass: PROXED ClassName=%s style=%x(%s) WndProc=%x cbClsExtra=%d cbWndExtra=%d hInstance=%x\n",
- lpwcx->lpszClassName, lpwcx->style, ExplainStyle(lpwcx->style), lpwcx->lpfnWndProc, lpwcx->cbClsExtra, lpwcx->cbWndExtra, lpwcx->hInstance);
- return (*pRegisterClassA)(lpwcx);
-}
-
-static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName)
-{
- // child window inherit the father's windproc, so if it's redirected to
- // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve
- // the correct value (dxwws.GetProc) before saving it (dxwws.PutProc).
- long res;
- WNDPROC pWindowProc;
-
- pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC);
- if((pWindowProc == extWindowProc) ||
- (pWindowProc == extChildWindowProc) ||
- (pWindowProc == extDialogWindowProc)){ // avoid recursions
- HWND Father;
- WNDPROC pFatherProc;
- Father=GetParent(hwnd);
- pFatherProc=dxwws.GetProc(Father);
- OutTraceDW("%s: WndProc=%s father=%x WndProc=%x\n", ApiName,
- (pWindowProc == extWindowProc) ? "extWindowProc" : ((pWindowProc == extChildWindowProc) ? "extChildWindowProc" : "extDialogWindowProc"),
- Father, pFatherProc);
- pWindowProc = pFatherProc;
- }
- dxwws.PutProc(hwnd, pWindowProc);
- if(dwStyle & WS_CHILD){
- OutTraceDW("%s: Hooking CHILD hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extChildWindowProc);
- res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc);
- }
- else { // must be dwStyle & WS_DLGFRAME
- OutTraceDW("%s: Hooking DLGFRAME hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extDialogWindowProc);
- res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extDialogWindowProc);
- }
- if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError());
-}
-
-HWND hControlParentWnd = NULL;
-
-static HWND WINAPI extCreateWindowCommon(
- LPCTSTR ApiName,
- BOOL WideChar,
- DWORD dwExStyle,
- void *lpClassName,
- void *lpWindowName,
- DWORD dwStyle,
- int x,
- int y,
- int nWidth,
- int nHeight,
- HWND hWndParent,
- HMENU hMenu,
- HINSTANCE hInstance,
- LPVOID lpParam)
-{
- HWND hwnd;
- BOOL isValidHandle=TRUE;
- int iOrigW, iOrigH;
-
- iOrigW=nWidth;
- iOrigH=nHeight;
- if(!dxw.Windowize || (hWndParent == HWND_MESSAGE)){ // v2.02.87: don't process message windows (hWndParent == HWND_MESSAGE)
- if(WideChar)
- hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
- else
- hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
-
- if ((dxw.dwFlags1 & HOOKCHILDWIN) && (dwStyle & (WS_CHILD|WS_DLGFRAME)))
- HookChildWndProc(hwnd, dwStyle, ApiName);
-
- OutTraceDW("%s: ret=%x\n", ApiName, hwnd);
- return hwnd;
- }
-
- // no maximized windows in any case
- if (dxw.dwFlags1 & PREVENTMAXIMIZE){
- OutTraceDW("%s: handling PREVENTMAXIMIZE mode\n", ApiName);
- dwStyle &= ~WS_MAXIMIZE;
- }
-
-#ifdef CREATEDESKTOP
- if(CREATEDESKTOP){
- extern HWND hDesktopWindow;
- if (dxw.IsRealDesktop(hWndParent)){
- OutTraceE("%s: new parent win %x->%x\n", ApiName, hWndParent, hDesktopWindow);
- hWndParent=hDesktopWindow;
- }
- }
-#endif
-
- // v2.1.92: fixes size & position for auxiliary big window, often used
- // for intro movies etc. : needed for ......
- // evidently, this was supposed to be a fullscreen window....
- // v2.1.100: fixes for "The Grinch": this game creates a new main window for OpenGL
- // rendering using CW_USEDEFAULT placement and 800x600 size while the previous
- // main win was 640x480 only!
- // v2.02.13: if it's a WS_CHILD window, don't reposition the x,y, placement for BIG win.
- // v2.02.30: fix (Fable - lost chapters) Fable creates a bigger win with negative x,y coordinates.
- if (
- (
- ((x<=0)&&(y<=0))
- ||
- ((x==CW_USEDEFAULT)&&(y==CW_USEDEFAULT))
- )
- &&
- (
- ((nWidth>=(int)dxw.GetScreenWidth())&&(nHeight>=(int)dxw.GetScreenHeight()))
- ||
- ((nWidth==CW_USEDEFAULT)&&(nHeight==CW_USEDEFAULT)) // good for Imperialism, but is it general?
- )
- &&
- !(dwExStyle & WS_EX_CONTROLPARENT) // Diablo fix
- &&
- !(dwStyle & WS_CHILD) // Diablo fix
- )
- {
- RECT screen;
- POINT upleft = {0,0};
-
- // v2.02.30: fix (Fable - lost chapters)
- if(nWidth==CW_USEDEFAULT) nWidth=dxw.GetScreenWidth();
- if(nHeight==CW_USEDEFAULT) nHeight=dxw.GetScreenHeight();
-
- // update virtual screen size if it has grown
- dxw.SetScreenSize(nWidth, nHeight);
- // inserted some checks here, since the main window could be destroyed
- // or minimized (see "Jedi Outcast") so that you may get a dangerous
- // zero size. In this case, better renew the hWnd assignement and its coordinates.
- do { // fake loop
- isValidHandle = FALSE;
- if (!(*pGetClientRect)(dxw.GethWnd(),&screen)) break;
- if (!(*pClientToScreen)(dxw.GethWnd(),&upleft)) break;
- if (screen.right==0 || screen.bottom==0) break;
- isValidHandle = TRUE;
- } while(FALSE);
- if (isValidHandle){ // use parent's coordinates
- if (!(dwStyle & WS_CHILD)){
- x=upleft.x;
- y=upleft.y;
- }
- nWidth=screen.right;
- nHeight=screen.bottom;
- OutTraceDW("%s: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight);
- }
- else {
- // invalid parent coordinates: use initial placement, but leave the size.
- // should also fix the window style and compensate for borders here?
- // if (!(dwStyle & WS_CHILD)){ // commented out: can't be! see if condition
- x=dxw.iPosX;
- y=dxw.iPosY;
- //}
- nWidth=dxw.iSizX;
- nHeight=dxw.iSizY;
- OutTraceDW("%s: renewed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight);
- }
- dxw.SetFullScreen(TRUE);
- if(dxw.Coordinates==DXW_DESKTOP_WORKAREA){
- RECT workarea;
- (*pSystemParametersInfoA)(SPI_GETWORKAREA, NULL, &workarea, 0);
- x=0;
- y=0;
- nWidth=workarea.right;
- nHeight=workarea.bottom;
- dwStyle=0;
- OutTraceDW("%s: WORKAREA win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight);
- }
- else if(dxw.Coordinates==DXW_DESKTOP_FULL){
- RECT workarea;
- (*pGetClientRect)((*pGetDesktopWindow)(), &workarea);
- x=0;
- y=0;
- nWidth=workarea.right;
- nHeight=workarea.bottom;
- dwStyle=0;
- OutTraceDW("%s: FULLDESKTOP win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight);
- }
- }
-
- if(!dxw.IsFullScreen()){ // v2.1.63: needed for "Monster Truck Madness"
- if(WideChar)
- hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
- else
- hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
- OutTraceDW("%s: windowed mode ret=%x\n", ApiName, hwnd);
- return hwnd;
- }
-
- // tested on Gangsters: coordinates must be window-relative!!!
- // Age of Empires....
- if (dwStyle & WS_CHILD){
- dxw.MapClient(&x, &y, &nWidth, &nHeight);
- OutTraceDW("%s: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n",
- ApiName, x, y, nWidth, nHeight);
- }
- // needed for Diablo, that creates a new control parent window that must be
- // overlapped to the directdraw surface.
- else if (dwExStyle & WS_EX_CONTROLPARENT){
- dxw.MapWindow(&x, &y, &nWidth, &nHeight);
- OutTraceDW("%s: fixed WS_EX_CONTROLPARENT pos=(%d,%d) size=(%d,%d)\n",
- ApiName, x, y, nWidth, nHeight);
- }
-
- OutTraceB("%s: fixed pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n",
- ApiName, x, y, nWidth, nHeight, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle));
-
- if(WideChar)
- hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
- else
- hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
- if (hwnd==(HWND)NULL){
- OutTraceE("%s: ERROR err=%d Style=%x(%s) ExStyle=%x\n",
- ApiName, GetLastError(), dwStyle, ExplainStyle(dwStyle), dwExStyle);
- return hwnd;
- }
-
- if (dwExStyle & WS_EX_CONTROLPARENT) hControlParentWnd=hwnd;
-
- if ((!isValidHandle) && dxw.IsFullScreen()){
- dxw.SethWnd(hwnd);
- extern void AdjustWindowPos(HWND, DWORD, DWORD);
- (*pSetWindowLongA)(hwnd, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW);
- (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0);
- OutTraceDW("%s: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", ApiName, hwnd);
- AdjustWindowPos(hwnd, nWidth, nHeight);
- (*pShowWindow)(hwnd, SW_SHOWNORMAL);
- }
-
- //if ((dxw.dwFlags1 & FIXWINFRAME) && !(dwStyle & WS_CHILD))
- if ((dxw.dwFlags1 & FIXWINFRAME) && !(dwStyle & WS_CHILD) && dxw.IsDesktop(hwnd))
- dxw.FixWindowFrame(hwnd);
-
- if ((dxw.dwFlags1 & HOOKCHILDWIN) && (dwStyle & (WS_CHILD|WS_DLGFRAME)))
- HookChildWndProc(hwnd, dwStyle, ApiName);
-
- if ((FIXCHILDSIZE) && (dwStyle & (WS_CHILD|WS_DLGFRAME)))
- dxwws.PutSize(hwnd, iOrigW, iOrigH);
-
- // "Hoyle Casino Empire" needs to be in a maximized state to continue after the intro movie.
- // Sending a SW_MAXIMIZE message intercepted by the PREVENTMAXIMIZE handling fixes the problem.
- //if (dxw.IsFullScreen() && (dxw.dwFlags1 & PREVENTMAXIMIZE)){
- if ((hwnd == dxw.GethWnd()) && dxw.IsFullScreen() && (dxw.dwFlags1 & PREVENTMAXIMIZE)){
- OutTraceDW("%s: entering maximized state\n", ApiName);
- (*pShowWindow)(hwnd, SW_MAXIMIZE);
- }
-
- OutTraceDW("%s: ret=%x\n", ApiName, hwnd);
- return hwnd;
-}
-
-static LPCSTR ClassToStr(LPCSTR Class)
-{
- static char AtomBuf[20+1];
- if(((DWORD)Class & 0xFFFF0000) == 0){
- 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(
- DWORD dwExStyle,
- LPCWSTR lpClassName,
- LPCWSTR lpWindowName,
- DWORD dwStyle,
- int x,
- int y,
- int nWidth,
- int nHeight,
- HWND hWndParent,
- HMENU hMenu,
- HINSTANCE hInstance,
- LPVOID lpParam)
-{
- if(IsTraceDW){
- char xString[20], yString[20], wString[20], hString[20];
- if (x==CW_USEDEFAULT) strcpy(xString,"CW_USEDEFAULT");
- else sprintf(xString,"%d", x);
- if (y==CW_USEDEFAULT) strcpy(yString,"CW_USEDEFAULT");
- else sprintf(yString,"%d", y);
- if (nWidth==CW_USEDEFAULT) strcpy(wString,"CW_USEDEFAULT");
- else sprintf(wString,"%d", nWidth);
- 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) hWndParent=%x%s hMenu=%x\n",
- ClassToWStr(lpClassName), lpWindowName, xString, yString, wString, hString,
- dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle),
- hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu);
- }
- if(IsDebug) OutTrace("CreateWindowExW: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight());
-
- if(!wcscmp(lpWindowName, L"ActiveMovie Window")){
- //x = y = 0;
- RECT MainWin;
- (*pGetClientRect)(dxw.GethWnd(), &MainWin);
- //nWidth = dxw.GetScreenWidth();
- //nHeight = dxw.GetScreenHeight();
- nWidth = MainWin.right;
- nHeight = MainWin.bottom;
- }
-
- return extCreateWindowCommon("CreateWindowExW", TRUE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
-}
-
-// GHO: pro Diablo
-HWND WINAPI extCreateWindowExA(
- DWORD dwExStyle,
- LPCTSTR lpClassName,
- LPCTSTR lpWindowName,
- DWORD dwStyle,
- int x,
- int y,
- int nWidth,
- int nHeight,
- HWND hWndParent,
- HMENU hMenu,
- HINSTANCE hInstance,
- LPVOID lpParam)
-{
- if(IsTraceDW){
- char xString[20], yString[20], wString[20], hString[20];
- if (x==CW_USEDEFAULT) strcpy(xString,"CW_USEDEFAULT");
- else sprintf(xString,"%d", x);
- if (y==CW_USEDEFAULT) strcpy(yString,"CW_USEDEFAULT");
- else sprintf(yString,"%d", y);
- if (nWidth==CW_USEDEFAULT) strcpy(wString,"CW_USEDEFAULT");
- else sprintf(wString,"%d", nWidth);
- if (nHeight==CW_USEDEFAULT) strcpy(hString,"CW_USEDEFAULT");
- else sprintf(hString,"%d", nHeight);
- OutTrace("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x\n",
- ClassToStr(lpClassName), lpWindowName, xString, yString, wString, hString,
- dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle),
- hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu);
- }
- if(IsDebug) OutTrace("CreateWindowExA: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight());
-
- if(!strcmp(lpWindowName, "ActiveMovie Window")){
- //x = y = 0;
- RECT MainWin;
- (*pGetClientRect)(dxw.GethWnd(), &MainWin);
- //nWidth = dxw.GetScreenWidth();
- //nHeight = dxw.GetScreenHeight();
- nWidth = MainWin.right;
- nHeight = MainWin.bottom;
- }
-
- return extCreateWindowCommon("CreateWindowExA", FALSE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
-}
-
-LRESULT WINAPI extCallWindowProcA(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
-{
- // v2.02.30: fix (Imperialism II): apply to main window only !!!
- HRESULT res;
-
- res = -1;
- if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcA", hwnd, Msg, wParam, &lParam);
-
- if (res==(HRESULT)-1)
- return (*pCallWindowProcA)(lpPrevWndFunc, hwnd, Msg, wParam, lParam);
- else
- return res;
-}
-
-LRESULT WINAPI extCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
-{
- // v2.02.30: fix (Imperialism II): apply to main window only !!!
- HRESULT res;
-
- res = -1;
- if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcW", hwnd, Msg, wParam, &lParam);
-
- if (res==(HRESULT)-1)
- return (*pCallWindowProcW)(lpPrevWndFunc, hwnd, Msg, wParam, lParam);
- else
- return res;
-}
-
-LRESULT WINAPI extDefWindowProcA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
-{
- // v2.02.30: fix (Imperialism II): apply to main window only !!!
- HRESULT res;
-
- res = (HRESULT)-1;
- if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcA", hwnd, Msg, wParam, &lParam);
-
- if (res==(HRESULT)-1)
- return (*pDefWindowProcA)(hwnd, Msg, wParam, lParam);
- else
- return res;
-}
-
-LRESULT WINAPI extDefWindowProcW(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
-{
- // v2.02.30: fix (Imperialism II): apply to main window only !!!
- HRESULT res;
-
- res = (HRESULT)-1;
- if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcW", hwnd, Msg, wParam, &lParam);
-
- if (res==(HRESULT)-1)
- return (*pDefWindowProcW)(hwnd, Msg, wParam, lParam);
- else
- return res;
-}
-
-int WINAPI extFillRect(HDC hdc, const RECT *lprc, HBRUSH hbr)
-{
- int res;
- RECT rc;
- OutTraceDW("FillRect: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom);
-
- if(dxw.dwFlags4 & NOFILLRECT) {
- OutTraceDW("FillRect: SUPPRESS\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom);
- return TRUE;
- }
-
- memcpy(&rc, lprc, sizeof(rc));
-
- if(dxw.IsRealDesktop(WindowFromDC(hdc))) {
- HWND VirtualDesktop;
- VirtualDesktop=dxw.GethWnd();
- if(VirtualDesktop==NULL){
- OutTraceDW("FillRect: no virtual desktop\n");
- return TRUE;
- }
- OutTraceDW("FillRect: remapped hdc to virtual desktop hwnd=%x\n", dxw.GethWnd());
- hdc=(*pGDIGetDC)(dxw.GethWnd());
- }
-
- if(!dxw.IsFullScreen()) {
- // when not in fullscreen mode, just proxy the call
- // but check coordinates: some games may use excessive coordinates: see "Premier Manager 98"
- RECT client;
- HWND hwnd;
- hwnd=WindowFromDC(hdc);
- (*pGetClientRect)(hwnd, &client);
- if(rc.left < 0) rc.left=0;
- if(rc.top < 0) rc.top=0;
- if(rc.right > client.right) rc.right=client.right;
- if(rc.bottom > client.bottom) rc.bottom=client.bottom;
- OutTraceDW("FillRect: remapped hdc from hwnd=%x to rect=(%d,%d)-(%d,%d)\n", hwnd, rc.left, rc.top, rc.right, rc.bottom);
- return (*pFillRect)(hdc, &rc, hbr);
- }
-
- if(OBJ_DC == GetObjectType(hdc)){
- if(rc.left < 0) rc.left = 0;
- if(rc.top < 0) rc.top = 0;
- if((DWORD)rc.right > dxw.GetScreenWidth()) rc.right = dxw.GetScreenWidth();
- if((DWORD)rc.bottom > dxw.GetScreenHeight()) rc.bottom = dxw.GetScreenHeight();
- dxw.MapClient(&rc);
- //dxw.MapWindow(&rc);
- OutTraceDW("FillRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom);
- }
-
- res=(*pFillRect)(hdc, &rc, hbr);
- return res;
-}
-
-int WINAPI extFrameRect(HDC hdc, const RECT *lprc, HBRUSH hbr)
-{
- int res;
- RECT rc;
- OutTraceDW("FrameRect: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom);
-
- // when not in fullscreen mode, just proxy the call
- if(!dxw.IsFullScreen()) return (*pFrameRect)(hdc, lprc, hbr);
-
- memcpy(&rc, lprc, sizeof(rc));
- if(OBJ_DC == GetObjectType(hdc)){
- if(rc.left < 0) rc.left = 0;
- if(rc.top < 0) rc.top = 0;
- if((DWORD)rc.right > dxw.GetScreenWidth()) rc.right = dxw.GetScreenWidth();
- if((DWORD)rc.bottom > dxw.GetScreenHeight()) rc.bottom = dxw.GetScreenHeight();
- dxw.MapClient(&rc);
- OutTraceDW("FrameRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom);
- }
-
- res=(*pFrameRect)(hdc, &rc, hbr);
- return res;
-}
-
-BOOL WINAPI extClipCursor(RECT *lpRectArg)
-{
- // reference: hooking and setting ClipCursor is mandatori in "Emergency: Fighters for Life"
- // where the application expects the cursor to be moved just in a inner rect within the
- // main window surface.
-
- BOOL res;
- RECT *lpRect;
- RECT Rect;
-
- if(IsTraceC){
- if (lpRectArg)
- OutTrace("ClipCursor: rect=(%d,%d)-(%d,%d)\n",
- lpRectArg->left,lpRectArg->top,lpRectArg->right,lpRectArg->bottom);
- else
- OutTrace("ClipCursor: rect=(NULL)\n");
- }
-
- if (!(dxw.dwFlags1 & ENABLECLIPPING)) return 1;
-
- if(lpRectArg){
- Rect=*lpRectArg;
- lpRect=&Rect;
- }
- else
- lpRect=NULL;
-
- if(dxw.dwFlags1 & MODIFYMOUSE){
- // save desired clip region
- // v2.02.39: fix - do not attempt to write to NULL lpRect
- if (lpRect) {
- ClipRegion=*lpRectArg;
- lpClipRegion=&ClipRegion;
- *lpRect=dxw.MapWindowRect(lpRect);
- }
- else
- lpClipRegion=NULL;
- }
-
- if (pClipCursor) res=(*pClipCursor)(lpRect);
- if (lpRect) OutTraceDW("ClipCursor: REMAPPED rect=(%d,%d)-(%d,%d) res=%x\n", lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, res);
-
- return TRUE;
-}
-
-BOOL WINAPI extGetClipCursor(LPRECT lpRect)
-{
- // v2.1.93: if ENABLECLIPPING, return the saved clip rect coordinates
-
- BOOL ret;
-
- // proxy....
- if (!(dxw.dwFlags1 & ENABLECLIPPING)) {
- ret=(*pGetClipCursor)(lpRect);
- // v2.03.11: fix for "SubCulture" mouse movement
- if(lpRect && dxw.Windowize) *lpRect = dxw.GetScreenRect();
- if(IsTraceDDRAW){
- if (lpRect)
- OutTrace("GetClipCursor: rect=(%d,%d)-(%d,%d) ret=%d\n",
- lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, ret);
- else
- OutTrace("GetClipCursor: rect=(NULL) ret=%d\n", ret);
- }
- return ret;
- }
-
- if(lpRect){
- if(lpClipRegion)
- *lpRect=ClipRegion;
- else
- *lpRect=dxw.GetScreenRect();
- OutTraceDW("GetClipCursor: rect=(%d,%d)-(%d,%d) ret=%d\n",
- lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, TRUE);
- }
-
- return TRUE;
-}
-
-LONG WINAPI extEnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, DEVMODE *lpDevMode)
-{
- LONG res;
- OutTraceDW("EnumDisplaySettings: Devicename=%s ModeNum=%x\n", lpszDeviceName, iModeNum);
- res=(*pEnumDisplaySettings)(lpszDeviceName, iModeNum, lpDevMode);
- if(dxw.dwFlags4 & LIMITSCREENRES){
- #define HUGE 100000
- DWORD maxw, maxh;
- maxw = maxh = HUGE;
- switch(dxw.MaxScreenRes){
- case DXW_NO_LIMIT: maxw=HUGE; maxh=HUGE; break;
- case DXW_LIMIT_320x200: maxw=320; maxh=200; break;
- case DXW_LIMIT_640x480: maxw=640; maxh=480; break;
- case DXW_LIMIT_800x600: maxw=800; maxh=600; break;
- case DXW_LIMIT_1024x768: maxw=1024; maxh=768; break;
- case DXW_LIMIT_1280x960: maxw=1280; maxh=960; break;
- }
- if((lpDevMode->dmPelsWidth > maxw) || (lpDevMode->dmPelsHeight > maxh)){
- OutTraceDW("EnumDisplaySettings: limit device size=(%d,%d)\n", maxw, maxh);
- lpDevMode->dmPelsWidth = maxw;
- lpDevMode->dmPelsHeight = maxh;
- }
- }
- return res;
-}
-
-LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *lpDevMode, DWORD dwflags)
-{
- if(IsTraceDDRAW){
- char sInfo[1024];
- strcpy(sInfo, "");
- if (lpDevMode) sprintf(sInfo, " DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d",
- lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields),
- lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel);
- OutTrace("ChangeDisplaySettingsA: lpDevMode=%x flags=%x(%s)%s\n",
- lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo);
- }
-
- if(dxw.Windowize)
- return MyChangeDisplaySettings("ChangeDisplaySettingsA", FALSE, lpDevMode, dwflags);
- else
- return (*pChangeDisplaySettingsExA)(NULL, lpDevMode, NULL, dwflags, NULL);
-}
-
-LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags)
-{
- if(IsTraceDDRAW){
- char sInfo[1024];
- strcpy(sInfo, "");
- if (lpDevMode) sprintf(sInfo, " DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d",
- lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields),
- lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel);
- OutTrace("ChangeDisplaySettingsW: lpDevMode=%x flags=%x(%s)%s\n",
- lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo);
- }
-
- if(dxw.Windowize)
- return MyChangeDisplaySettings("ChangeDisplaySettingsW", TRUE, lpDevMode, dwflags);
- else
- return (*pChangeDisplaySettingsW)(lpDevMode, dwflags);
-}
-
-LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR lpszDeviceName, DEVMODEA *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam)
-{
- if(IsTraceDDRAW){
- char sInfo[1024];
- strcpy(sInfo, "");
- if (lpDevMode) sprintf(sInfo, " DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d",
- lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields),
- lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel);
- OutTrace("ChangeDisplaySettingsExA: DeviceName=%s lpDevMode=%x flags=%x(%s)%s\n",
- lpszDeviceName, lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo);
- }
-
- if(dxw.Windowize)
- return MyChangeDisplaySettings("ChangeDisplaySettingsExA", FALSE, lpDevMode, dwflags);
- else
- return (*pChangeDisplaySettingsExA)(lpszDeviceName, lpDevMode, hwnd, dwflags, lParam);
-}
-
-LONG WINAPI extChangeDisplaySettingsExW(LPCTSTR lpszDeviceName, DEVMODEW *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam)
-{
- if(IsTraceDDRAW){
- char sInfo[1024];
- strcpy(sInfo, "");
- if (lpDevMode) sprintf(sInfo, " DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d",
- lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields),
- lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel);
- OutTrace("ChangeDisplaySettingsExW: DeviceName=%ls lpDevMode=%x flags=%x(%s)%s\n",
- lpszDeviceName, lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo);
- }
-
- if(dxw.Windowize)
- return MyChangeDisplaySettings("ChangeDisplaySettingsExW", TRUE, lpDevMode, dwflags);
- else
- return (*pChangeDisplaySettingsExW)(lpszDeviceName, lpDevMode, hwnd, dwflags, lParam);
-}
-
-static HDC WINAPI sGetDC(HWND hwnd, char *ApiName)
-{
- // to do: add parameter and reference to pGDIGetDCEx to merge properly GetDC and GetDCEx
- HDC ret;
- HWND lochwnd;
-
- if(!dxw.IsFullScreen()) return(*pGDIGetDC)(hwnd);
-
- lochwnd=hwnd;
-
- if (dxw.IsRealDesktop(hwnd)) {
- OutTraceDW("%s: desktop remapping hwnd=%x->%x\n", ApiName, hwnd, dxw.GethWnd());
- lochwnd=dxw.GethWnd();
- }
-
- if(bFlippedDC) {
- extern HDC hFlippedDC;
- LPDIRECTDRAWSURFACE lpDDSPrim;
- lpDDSPrim = dxwss.GetPrimarySurface();
- if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC);
- if (!(hwnd == dxw.GethWnd())) {
- POINT father, child, offset;
- father.x = father.y = 0;
- child.x = child.y = 0;
- (*pClientToScreen)(dxw.GethWnd(),&father);
- (*pClientToScreen)(hwnd,&child);
- offset.x = child.x - father.x;
- offset.y = child.y - father.y;
- offset.x >>= 2;
- offset.y >>= 2;
- dxw.UnmapClient(&offset);
- OutTraceDW("%s: child window hwnd=%x offset=(%d,%d)\n", ApiName, hwnd, offset.x, offset.y);
- (*pSetViewportOrgEx)(hFlippedDC, offset.x, offset.y, NULL);
- }
- OutTraceDW("%s: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", ApiName, lpDDSPrim, hFlippedDC);
- if(hFlippedDC) return hFlippedDC;
- }
-
- switch(GDIEmulationMode){
- case GDIMODE_STRETCHED:
- ret=(*pGDIGetDC)(lochwnd);
- break;
- case GDIMODE_EMULATED:
- ret=dxw.AcquireEmulatedDC(lochwnd);
- dxw.VirtualHDC=ret;
- break;
- }
-
- if(ret){
- OutTraceDW("%s: hwnd=%x ret=%x\n", ApiName, lochwnd, ret);
- }
- else{
- int err;
- err=GetLastError();
- OutTraceE("%s ERROR: hwnd=%x err=%d at %d\n", ApiName, lochwnd, err, __LINE__);
- if((err==ERROR_INVALID_WINDOW_HANDLE) && (lochwnd!=hwnd)){
- ret=(*pGDIGetDC)(hwnd);
- if(ret)
- OutTraceDW("%s: hwnd=%x ret=%x\n", ApiName, hwnd, ret);
- else
- OutTraceE("%s ERROR: hwnd=%x err=%d at %d\n", ApiName, hwnd, GetLastError(), __LINE__);
- }
- }
-
- return ret;
-}
-
-HDC WINAPI extGDIGetDC(HWND hwnd)
-{
- OutTraceDW("GDI.GetDC: hwnd=%x\n", hwnd);
- return sGetDC(hwnd, "GDI.GetDC");
-}
-
-HDC WINAPI extGDIGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags)
-{
- // used by Star Wars Shadow of the Empire
- OutTraceDW("GDI.GetDCEx: hwnd=%x hrgnClip=%x flags=%x(%s)\n", hwnd, hrgnClip, flags, ExplainGetDCExFlags(flags));
- return sGetDC(hwnd, "GDI.GetDCEx");
-}
-
-HDC WINAPI extGDIGetWindowDC(HWND hwnd)
-{
- OutTraceDW("GDI.GetWindowDC: hwnd=%x\n", hwnd);
-
- // if not fullscreen or not desktop win, just proxy the call
- if(!dxw.IsFullScreen() || !dxw.IsDesktop(hwnd)){
- HDC ret;
- ret=(*pGDIGetWindowDC)(hwnd);
- OutTraceDW("GDI.GetWindowDC: hwnd=%x hdc=%x\n", hwnd, ret);
- return ret;
- }
-
- return sGetDC(hwnd, "GDI.GetWindowDC");
-}
-
-int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC)
-{
- int res;
-
- OutTraceDW("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC);
-
- if (dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd();
- if(hwnd == 0) return(TRUE);
-
- if(bFlippedDC && (hDC == hFlippedDC)) {
- HRESULT ret;
- LPDIRECTDRAWSURFACE lpDDSPrim;
- lpDDSPrim = dxwss.GetPrimarySurface();
- if(!lpDDSPrim) return(TRUE);
- OutTraceDW("GDI.ReleaseDC: releasing flipped GDI hdc=%x\n", hDC);
- ret=(*pReleaseDC)(dxwss.GetPrimarySurface(), hDC);
- if (ret) OutTraceE("GDI.ReleaseDC ERROR: err=%x(%s) at %d\n", ret, ExplainDDError(ret), __LINE__);
- else dxw.ScreenRefresh();
- return (ret == DD_OK);
- }
-
- switch(GDIEmulationMode){
- case GDIMODE_STRETCHED:
- res=(*pGDIReleaseDC)(hwnd, hDC);
- break;
- case GDIMODE_EMULATED:
- HDC windc;
- windc=(*pGDIGetDC)(hwnd);
- res=dxw.ReleaseEmulatedDC(hwnd);
- res=(*pGDIReleaseDC)(hwnd, windc);
- break;
- }
-
- if (!res) OutTraceE("GDI.ReleaseDC ERROR: err=%d at %d\n", GetLastError(), __LINE__);
- return(res);
-}
-
-HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint)
-{
- HDC hdc;
-
- OutTraceDW("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen());
-
- // avoid access to real desktop
- if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd();
-
- //if(bFlippedDC) {
- // LPDIRECTDRAWSURFACE lpDDSPrim;
- // lpDDSPrim = dxwss.GetPrimarySurface();
- // if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC);
- // if (!(hwnd == dxw.GethWnd())) {
- // POINT father, child, offset;
- // father.x = father.y = 0;
- // child.x = child.y = 0;
- // (*pClientToScreen)(dxw.GethWnd(),&father);
- // (*pClientToScreen)(hwnd,&child);
- // offset.x = child.x - father.x;
- // offset.y = child.y - father.y;
- // dxw.UnmapClient(&offset);
- // OutTraceDW("GDI.BeginPaint: child window hwnd=%x offset=(%d,%d)\n", hwnd, offset.x, offset.y);
- // (*pSetViewportOrgEx)(hFlippedDC, offset.x, offset.y, NULL);
- // }
- // OutTraceDW("GDI.BeginPaint: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", lpDDSPrim, hFlippedDC);
- // if(hFlippedDC) {
- // lpPaint->hdc=hFlippedDC;
- // return hFlippedDC;
- // }
- //}
-
- hdc=(*pBeginPaint)(hwnd, lpPaint);
-
- // if not in fullscreen mode, that's all!
- if(!dxw.IsFullScreen()) return hdc;
-
- // on CLIENTREMAPPING, resize the paint area to virtual screen size
- if(dxw.dwFlags1 & CLIENTREMAPPING) lpPaint->rcPaint=dxw.GetScreenRect();
-
- switch(GDIEmulationMode){
- case GDIMODE_STRETCHED:
- break;
- case GDIMODE_EMULATED:
- HDC EmuHDC;
- EmuHDC = dxw.AcquireEmulatedDC(hwnd);
- lpPaint->hdc=EmuHDC;
- hdc = EmuHDC;
- break;
- }
-
- OutTraceDW("GDI.BeginPaint: hdc=%x rcPaint=(%d,%d)-(%d,%d)\n",
- hdc, lpPaint->rcPaint.left, lpPaint->rcPaint.top, lpPaint->rcPaint.right, lpPaint->rcPaint.bottom);
- return hdc;
-}
-
-BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint)
-{
- BOOL ret;
-
- OutTraceDW("GDI.EndPaint: hwnd=%x lpPaint=%x lpPaint.hdc=%x lpPaint.rcpaint=(%d,%d)-(%d-%d)\n",
- hwnd, lpPaint, lpPaint->hdc, lpPaint->rcPaint.left, lpPaint->rcPaint.top, lpPaint->rcPaint.right, lpPaint->rcPaint.bottom);
-
- //if(bFlippedDC && hFlippedDC) {
- // LPDIRECTDRAWSURFACE lpDDSPrim;
- // lpDDSPrim = dxwss.GetPrimarySurface();
- // ret = DDERR_GENERIC;
- // if (lpDDSPrim) ret=(*pReleaseDC)(lpDDSPrim, hFlippedDC);
- // OutTraceDW("GDI.EndPaint: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", lpDDSPrim, hFlippedDC);
-
- // //dxw.ScreenRefresh();
- // return (ret == DD_OK);
- //}
-
- // if not fullscreen or not desktop win, just proxy the call
- if(!dxw.IsFullScreen() || !dxw.Windowize){
- ret=(*pEndPaint)(hwnd, lpPaint);
- return ret;
- }
-
- // avoid access to real desktop
- if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd();
-
- switch(GDIEmulationMode){
- case GDIMODE_STRETCHED:
- ret=(*pEndPaint)(hwnd, lpPaint);
- break;
- case GDIMODE_EMULATED:
- ret=dxw.ReleaseEmulatedDC(hwnd);
- break;
- }
-
- if(ret)
- OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret);
- else
- OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__);
-
- return ret;
-}
-
-HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit)
-{
- HWND RetHWND;
- BOOL FullScreen;
- FullScreen = dxw.IsFullScreen();
- OutTraceDW("CreateDialogIndirectParam: hInstance=%x lpTemplate=(style=%x extstyle=%x items=%d pos=(%d,%d) size=(%dx%d)) hWndParent=%x lpDialogFunc=%x lParamInit=%x\n",
- hInstance,
- lpTemplate->style, lpTemplate->dwExtendedStyle, lpTemplate->cdit, lpTemplate->x, lpTemplate->y, lpTemplate->cx, lpTemplate->cy,
- hWndParent, lpDialogFunc, lParamInit);
- if(dxw.IsFullScreen() && hWndParent==NULL) hWndParent=dxw.GethWnd();
- RetHWND=(*pCreateDialogIndirectParam)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit);
- dxw.SetFullScreen(FullScreen);
-
- // v2.02.73: redirect lpDialogFunc only when it is nor NULL
- if(lpDialogFunc) {
- dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc);
- if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc))
- OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- }
-
- OutTraceDW("CreateDialogIndirectParam: hwnd=%x\n", RetHWND);
- return RetHWND;
-}
-
-HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit)
-{
- HWND RetHWND;
- BOOL FullScreen;
- FullScreen = dxw.IsFullScreen();
- OutTraceDW("CreateDialogParam: hInstance=%x lpTemplateName=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n",
- hInstance, sTemplateName(lpTemplateName), hWndParent, lpDialogFunc, lParamInit);
- if(hWndParent==NULL) hWndParent=dxw.GethWnd();
- RetHWND=(*pCreateDialogParam)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, lParamInit);
- dxw.SetFullScreen(FullScreen);
-
- // v2.02.73: redirect lpDialogFunc only when it is nor NULL: fix for "LEGO Stunt Rally"
- if(lpDialogFunc) {
- dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc);
- if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc))
- OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- }
-
- OutTraceDW("CreateDialogParam: hwnd=%x\n", RetHWND);
- return RetHWND;
-}
-
-BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint)
-{
- BOOL ret;
- OutTraceDW("MoveWindow: hwnd=%x xy=(%d,%d) size=(%d,%d) repaint=%x fullscreen=%x\n",
- hwnd, X, Y, nWidth, nHeight, bRepaint, dxw.IsFullScreen());
-
- if(dxw.Windowize){
- if(dxw.IsDesktop(hwnd)){
- // v2.1.93: happens in "Emergency Fighters for Life" ...
- // what is the meaning of this? is it related to video stretching?
- OutTraceDW("MoveWindow: prevent moving desktop win\n");
- return TRUE;
- }
-
- if((hwnd==dxw.GethWnd()) || (hwnd==dxw.hParentWnd)){
- OutTraceDW("MoveWindow: prevent moving main win\n");
- return TRUE;
- }
-
- if (dxw.IsFullScreen()){
- POINT upleft={0,0};
- RECT client;
- BOOL isChild;
- (*pClientToScreen)(dxw.GethWnd(),&upleft);
- (*pGetClientRect)(dxw.GethWnd(),&client);
- if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){
- isChild=TRUE;
- // child coordinate adjustement
- X = (X * client.right) / dxw.GetScreenWidth();
- Y = (Y * client.bottom) / dxw.GetScreenHeight();
- nWidth = (nWidth * client.right) / dxw.GetScreenWidth();
- nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight();
- }
- else {
- isChild=FALSE;
- // regular win coordinate adjustement
- X = upleft.x + (X * client.right) / dxw.GetScreenWidth();
- Y = upleft.y + (Y * client.bottom) / dxw.GetScreenHeight();
- nWidth = (nWidth * client.right) / dxw.GetScreenWidth();
- nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight();
- }
- OutTraceDW("MoveWindow: DEBUG client=(%d,%d) screen=(%d,%d)\n",
- client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight());
- OutTraceDW("MoveWindow: hwnd=%x child=%x relocated to xy=(%d,%d) size=(%d,%d)\n",
- hwnd, isChild, X, Y, nWidth, nHeight);
- }
- else{
- if((X==0)&&(Y==0)&&(nWidth==dxw.GetScreenWidth())&&(nHeight==dxw.GetScreenHeight())){
- // evidently, this was supposed to be a fullscreen window....
- RECT screen;
- POINT upleft = {0,0};
- (*pGetClientRect)(dxw.GethWnd(),&screen);
- (*pClientToScreen)(dxw.GethWnd(),&upleft);
- X=upleft.x;
- Y=upleft.y;
- nWidth=screen.right;
- nHeight=screen.bottom;
- OutTraceDW("MoveWindow: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", X, Y, nWidth, nHeight);
- }
- }
- }
-
- ret=(*pMoveWindow)(hwnd, X, Y, nWidth, nHeight, bRepaint);
- if(!ret) OutTraceE("MoveWindow: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- return ret;
-}
-
-int WINAPI extShowCursor(BOOL bShow)
-{
- static int iFakeCounter;
- int ret;
-
- OutTraceC("ShowCursor: bShow=%x\n", bShow);
- if (bShow){
- if (dxw.dwFlags1 & HIDEHWCURSOR){
- iFakeCounter++;
- OutTraceC("ShowCursor: HIDEHWCURSOR ret=%x\n", iFakeCounter);
- return iFakeCounter;
- }
- }
- else {
- if (dxw.dwFlags2 & SHOWHWCURSOR){
- iFakeCounter--;
- OutTraceC("ShowCursor: SHOWHWCURSOR ret=%x\n", iFakeCounter);
- return iFakeCounter;
- }
- }
- ret=(*pShowCursor)(bShow);
- OutTraceC("ShowCursor: ret=%x\n", ret);
- return ret;
-}
-
-BOOL WINAPI extDrawFocusRect(HDC hDC, const RECT *lprc)
-{
- return TRUE;
-}
-
-BOOL WINAPI extScrollDC(HDC hDC, int dx, int dy, const RECT *lprcScroll, const RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate)
-{
- return TRUE;
-}
-
-HWND WINAPI extGetTopWindow(HWND hwnd)
-{
- HWND ret;
- OutTraceDW("GetTopWindow: hwnd=%x fullscreen=%x\n", hwnd, dxw.IsFullScreen());
- // a fullscreen program is supposed to be always top Z-order on the desktop!
- ret = (dxw.IsFullScreen() && dxw.IsDesktop(hwnd)) ? dxw.GethWnd() : (*pGetTopWindow)(hwnd);
- OutTraceDW("GetTopWindow: ret=%x\n", ret);
- return ret;
-}
-
-LONG WINAPI extTabbedTextOutA(HDC hdc, int X, int Y, LPCTSTR lpString, int nCount, int nTabPositions, const LPINT lpnTabStopPositions, int nTabOrigin)
-{
- BOOL res;
- OutTraceDW("TabbedTextOut: hdc=%x xy=(%d,%d) nCount=%d nTP=%d nTOS=%d str=(%d)\"%s\"\n",
- hdc, X, Y, nCount, nTabPositions, nTabOrigin, lpString);
-
- if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
- dxw.MapClient(&X, &Y);
- OutTraceDW("TextOut: fixed dest=(%d,%d)\n", X, Y);
- }
-
- res=(*pTabbedTextOutA)(hdc, X, Y, lpString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin);
- return res;
-}
-
-BOOL WINAPI extDestroyWindow(HWND hWnd)
-{
- // v2.02.43: "Empire Earth" builds test surfaces that must be destroyed!
- // v2.03.20: "Prince of Persia 3D" destroys the main window that must be preserved!
- BOOL res;
- OutTraceB("DestroyWindow: hwnd=%x\n", hWnd);
- if (hWnd == dxw.GethWnd()) {
- if(dxw.dwFlags6 & NODESTROYWINDOW) {
- OutTraceDW("DestroyWindow: do NOT destroy main hwnd=%x\n", hWnd);
- return TRUE;
- }
- OutTraceDW("DestroyWindow: destroy main hwnd=%x\n", hWnd);
- dxw.SethWnd(NULL);
- }
- if (hControlParentWnd && (hWnd == hControlParentWnd)) {
- OutTraceDW("DestroyWindow: destroy control parent hwnd=%x\n", hWnd);
- hControlParentWnd = NULL;
- }
- res=(*pDestroyWindow)(hWnd);
- if(!res)OutTraceE("DestroyWindow: ERROR err=%d\n", GetLastError());
- return res;
-}
-
-static char *ExplainTAAlign(UINT c)
-{
- static char eb[256];
- unsigned int l;
- strcpy(eb,"TA_");
- strcat(eb, (c & TA_UPDATECP) ? "UPDATECP+" : "NOUPDATECP+");
- strcat(eb, (c & TA_RIGHT) ? (((c & TA_CENTER) == TA_CENTER) ? "CENTER+" : "RIGHT+") : "LEFT+");
- strcat(eb, (c & TA_BOTTOM) ? "BOTTOM+" : "TOP+");
- if ((c & TA_BASELINE)==TA_BASELINE) strcat(eb, "BASELINE+");
- if (c & TA_RTLREADING) strcat(eb, "RTLREADING+");
- l=strlen(eb);
- eb[l-1]=0;
- return(eb);
-}
-
-static char *ExplainDTFormat(UINT c)
-{
- static char eb[256];
- unsigned int l;
- strcpy(eb,"DT_");
- if(!(c & (DT_CENTER|DT_RIGHT))) strcat(eb, "LEFT+");
- if(c & DT_CENTER) strcat(eb, "CENTER+");
- if(c & DT_RIGHT) strcat(eb, "RIGHT+");
- if(!(c & (DT_VCENTER|DT_BOTTOM))) strcat(eb, "TOP+");
- if(c & DT_VCENTER) strcat(eb, "VCENTER+");
- if(c & DT_BOTTOM) strcat(eb, "BOTTOM+");
- if(c & DT_WORDBREAK) strcat(eb, "WORDBREAK+");
- if(c & DT_SINGLELINE) strcat(eb, "SINGLELINE+");
- if(c & DT_EXPANDTABS) strcat(eb, "EXPANDTABS+");
- if(c & DT_TABSTOP) strcat(eb, "TABSTOP+");
- if(c & DT_NOCLIP) strcat(eb, "NOCLIP+");
- if(c & DT_EXTERNALLEADING) strcat(eb, "EXTERNALLEADING+");
- if(c & DT_CALCRECT) strcat(eb, "CALCRECT+");
- if(c & DT_NOPREFIX) strcat(eb, "NOPREFIX+");
- if(c & DT_INTERNAL) strcat(eb, "INTERNAL+");
- l=strlen(eb);
- eb[l-1]=0;
- return(eb);
-}
-
-BOOL gFixed;
-
-int WINAPI extDrawTextA(HDC hdc, LPCTSTR lpchText, int nCount, LPRECT lpRect, UINT uFormat)
-{
- int ret;
- BOOL MustScale;
- OutTraceDW("DrawText: hdc=%x rect=(%d,%d)-(%d,%d) Format=%x(%s) Text=(%d)\"%s\"\n",
- hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, uFormat, ExplainDTFormat(uFormat), nCount, lpchText);
-
- MustScale = dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc));
- if (MustScale){
- dxw.MapClient((RECT *)lpRect);
- OutTraceDW("DrawText: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
-
- gFixed = TRUE;
- ret=(*pDrawText)(hdc, lpchText, nCount, lpRect, uFormat);
- gFixed=FALSE;
-
- // if nCount is zero, DrawRect returns 0 as text heigth, but this is not an error! (ref. "Imperialism II")
- if(nCount && !ret) OutTraceE("DrawText: ERROR ret=%x err=%d\n", ret, GetLastError());
-
- if (MustScale){
- dxw.UnmapClient((RECT *)lpRect);
- OutTraceDW("DrawText: fixed output rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
-
- return ret;
-}
-
-int WINAPI extDrawTextExA(HDC hdc, LPTSTR lpchText, int nCount, LPRECT lpRect, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams)
-{
- int ret;
- BOOL MustScale;
-
- OutTraceDW("DrawTextEx: hdc=%x rect=(%d,%d)-(%d,%d) DTFormat=%x Text=(%d)\"%s\"\n",
- hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, dwDTFormat, nCount, lpchText);
- if (IsDebug){
- if(lpDTParams)
- OutTrace("DTParams: size=%d (L,R)margins=(%d,%d) TabLength=%d lDrawn=%d\n",
- lpDTParams->cbSize, lpDTParams->iLeftMargin, lpDTParams->iRightMargin,
- lpDTParams->iTabLength, lpDTParams->uiLengthDrawn);
- else
- OutTrace("DTParams: NULL\n");
- }
-
- MustScale = dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc));
-
- if (MustScale){
- dxw.MapClient((RECT *)lpRect);
- OutTraceDW("DrawTextEx: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
-
- gFixed = TRUE;
- ret=(*pDrawTextEx)(hdc, lpchText, nCount, lpRect, dwDTFormat, lpDTParams);
- gFixed=FALSE;
- if(nCount && !ret) OutTraceE("DrawTextEx: ERROR ret=%x err=%d\n", ret, GetLastError());
-
- if (MustScale){
- dxw.UnmapClient((RECT *)lpRect);
- OutTraceDW("DrawTextEx: fixed output rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
-
- return ret;
-}
-
-BOOL WINAPI extCloseWindow(HWND hWnd)
-{
- // from MSDN: Minimizes (but does not destroy) the specified window.
- BOOL res;
- OutTraceB("CloseWindow: hwnd=%x\n", hWnd);
- if (hWnd == dxw.GethWnd()) {
- OutTraceDW("CloseWindow: close main hwnd=%x\n", hWnd);
- // do not delete the reference to main hWnd.
- }
- res=(*pCloseWindow)(hWnd);
- if(!res)OutTraceE("CloseWindow: ERROR err=%d\n", GetLastError());
- return res;
-}
-
-BOOL WINAPI extSetSysColors(int cElements, const INT *lpaElements, const COLORREF *lpaRgbValues)
-{
- // v2.02.32: added to avoid SysColors changes by "Western Front"
- BOOL ret;
- OutTraceDW("SetSysColors: Elements=%d\n", cElements);
-
- if(dxw.dwFlags3 & LOCKSYSCOLORS) return TRUE;
-
- ret=(*pSetSysColors)(cElements, lpaElements, lpaRgbValues);
- if(!ret) OutTraceE("SetSysColors: ERROR er=%d\n", GetLastError());
- return ret;
-}
-
-BOOL WINAPI extUpdateWindow(HWND hwnd)
-{
- BOOL ret;
- OutTraceDW("UpdateWindow: hwnd=%x\n", hwnd);
-
- if(dxw.Windowize && dxw.IsRealDesktop(hwnd)){
- OutTraceDW("UpdateWindow: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd());
- hwnd=dxw.GethWnd();
- }
-
- ret=(*pUpdateWindow)(hwnd);
- if(!ret) OutTraceE("UpdateWindow: ERROR er=%d\n", GetLastError());
- return ret;
-}
-
-BOOL WINAPI extRedrawWindow(HWND hWnd, const RECT *lprcUpdate, HRGN hrgnUpdate, UINT flags)
-{
- OutTraceDW("RedrawWindow: hwnd=%x flags=%x\n", hWnd, flags);
- return (*pRedrawWindow)(hWnd, lprcUpdate, hrgnUpdate, flags);
-}
-
-
-BOOL WINAPI extGetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl)
-{
- BOOL ret;
- OutTraceDW("GetWindowPlacement: hwnd=%x\n", hwnd);
-
- if(dxw.IsRealDesktop(hwnd)){
- OutTraceDW("GetWindowPlacement: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd());
- hwnd=dxw.GethWnd();
- }
-
- ret=(*pGetWindowPlacement)(hwnd, lpwndpl);
- OutTraceDW("GetWindowPlacement: flags=%x showCmd=%x MinPosition=(%d,%d) MaxPosition=(%d,%d) NormalPosition=(%d,%d)-(%d,%d)\n",
- lpwndpl->flags, lpwndpl->showCmd,
- lpwndpl->ptMinPosition.x, lpwndpl->ptMinPosition.y,
- lpwndpl->ptMaxPosition.x, lpwndpl->ptMaxPosition.y,
- lpwndpl->rcNormalPosition.left, lpwndpl->rcNormalPosition.top, lpwndpl->rcNormalPosition.right, lpwndpl->rcNormalPosition.bottom);
-
- switch (lpwndpl->showCmd){
- case SW_SHOW:
- if (dxw.IsFullScreen()){
- lpwndpl->showCmd = SW_MAXIMIZE;
- OutTraceDW("GetWindowPlacement: forcing SW_MAXIMIZE state\n");
- }
- break;
- }
- if(!ret) OutTraceE("GetWindowPlacement: ERROR er=%d\n", GetLastError());
- return ret;
-}
-
-BOOL WINAPI extSetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl)
-{
- BOOL ret;
- OutTraceDW("SetWindowPlacement: hwnd=%x\n", hwnd);
-
- if(dxw.IsRealDesktop(hwnd)){
- OutTraceDW("SetWindowPlacement: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd());
- hwnd=dxw.GethWnd();
- }
-
- OutTraceDW("SetWindowPlacement: flags=%x showCmd=%x MinPosition=(%d,%d) MaxPosition=(%d,%d) NormalPosition=(%d,%d)-(%d,%d)\n",
- lpwndpl->flags, lpwndpl->showCmd,
- lpwndpl->ptMinPosition.x, lpwndpl->ptMinPosition.y,
- lpwndpl->ptMaxPosition.x, lpwndpl->ptMaxPosition.y,
- lpwndpl->rcNormalPosition.left, lpwndpl->rcNormalPosition.top, lpwndpl->rcNormalPosition.right, lpwndpl->rcNormalPosition.bottom);
-
- switch (lpwndpl->showCmd){
- case SW_MAXIMIZE:
- if (dxw.IsFullScreen()){
- lpwndpl->showCmd = SW_SHOW;
- OutTraceDW("SetWindowPlacement: forcing SW_SHOW state\n");
- }
- break;
- }
- ret=(*pSetWindowPlacement)(hwnd, lpwndpl);
- if(!ret) OutTraceE("SetWindowPlacement: ERROR er=%d\n", GetLastError());
- return ret;
-}
-
-HWND WINAPI extSetCapture(HWND hwnd)
-{
- HWND ret;
- OutTraceDW("SetCapture: hwnd=%x\n", hwnd);
- ret=(*pSetCapture)(hwnd);
- OutTraceDW("SetCapture: ret=%x\n", ret);
- return ret;
-}
-
-HWND WINAPI extGetActiveWindow(void)
-{
- HWND ret;
- ret=(*pGetActiveWindow)();
- if(dxw.Windowize && dxw.IsFullScreen()) {
- OutTraceDW("GetActiveWindow: ret=%x->%x\n", ret, dxw.GethWnd());
- return dxw.GethWnd();
- }
- return ret;
-}
-
-HWND WINAPI extGetForegroundWindow(void)
-{
- HWND ret;
- ret=(*pGetForegroundWindow)();
- if(dxw.Windowize && dxw.IsFullScreen()) {
- OutTraceDW("GetForegroundWindow: ret=%x->%x\n", ret, dxw.GethWnd());
- return dxw.GethWnd();
- }
- return ret;
-}
-
-BOOL WINAPI extIsWindowVisible(HWND hwnd)
-{
- BOOL ret;
- ret=(*pIsWindowVisible)(hwnd);
- OutTraceB("IsWindowVisible: hwnd=%x ret=%x\n", hwnd, ret);
- if(dxw.IsDesktop(hwnd) && !ret){
- OutTraceDW("IsWindowVisible: FORCING ret=TRUE\n");
- ret=TRUE;
- }
- return ret;
-}
-
-BOOL WINAPI extSystemParametersInfoA(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
-{
- BOOL ret;
- OutTraceDW("SystemParametersInfoA: Action=%x Param=%x WinIni=%x\n", uiAction, uiParam, fWinIni);
- switch(uiAction){
- case SPI_SETKEYBOARDDELAY:
- case SPI_SETKEYBOARDSPEED:
- OutTraceDW("SystemParametersInfoA: bypass action=%x\n", uiAction);
- return TRUE;
- break;
- }
- ret=(*pSystemParametersInfoA)(uiAction, uiParam, pvParam, fWinIni);
- if(uiAction==SPI_GETWORKAREA){
- LPRECT cli = (LPRECT)pvParam;
- *cli = dxw.GetScreenRect();
- OutTraceDW("SystemParametersInfoA: resized client workarea rect=(%d,%d)-(%d,%d)\n", cli->left, cli->top, cli->right, cli->bottom);
- }
- return ret;
-}
-
-BOOL WINAPI extSystemParametersInfoW(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
-{
- BOOL ret;
- OutTraceDW("SystemParametersInfoW: Action=%x Param=%x WinIni=%x\n", uiAction, uiParam, fWinIni);
- switch(uiAction){
- case SPI_SETKEYBOARDDELAY:
- case SPI_SETKEYBOARDSPEED:
- OutTraceDW("SystemParametersInfoW: bypass action=%x\n", uiAction);
- return TRUE;
- break;
- }
- ret=(*pSystemParametersInfoW)(uiAction, uiParam, pvParam, fWinIni);
- if(uiAction==SPI_GETWORKAREA){
- LPRECT cli = (LPRECT)pvParam;
- *cli = dxw.GetScreenRect();
- OutTraceDW("SystemParametersInfoW: resized client workarea rect=(%d,%d)-(%d,%d)\n", cli->left, cli->top, cli->right, cli->bottom);
- }
- return ret;
-}
-
-#undef OutTraceDW
-#define OutTraceDW OutTrace
-
-UINT_PTR WINAPI extSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
-{
- UINT uShiftedElapse;
- UINT_PTR ret;
- // beware: the quicker the time flows, the more the time clicks are incremented,
- // and the lesser the pauses must be lasting! Shift operations are reverted in
- // GetSystemTime vs. Sleep or SetTimer
- uShiftedElapse = dxw.StretchTime(uElapse);
- OutTraceDW("SetTimer: hwnd=%x TimerFunc=%x elapse=%d->%d timeshift=%d\n", hWnd, lpTimerFunc, uElapse, uShiftedElapse, dxw.TimeShift);
- ret = (*pSetTimer)(hWnd, nIDEvent, uShiftedElapse, lpTimerFunc);
- if(ret) dxw.PushTimer(hWnd, ret, uElapse, lpTimerFunc);
- OutTraceDW("SetTimer: IDEvent=%x ret=%x\n", nIDEvent, ret);
- return ret;
-}
-
-BOOL WINAPI extKillTimer(HWND hWnd, UINT_PTR uIDEvent)
-{
- BOOL ret;
- OutTraceDW("KillTimer: hwnd=%x IDEvent=%x\n", hWnd, uIDEvent);
- ret = (*pKillTimer)(hWnd, uIDEvent);
- OutTraceDW("KillTimer: ret=%x\n", ret);
- if(ret) dxw.PopTimer(hWnd, uIDEvent);
- return ret;
-}
-
-BOOL WINAPI extGetUpdateRect(HWND hWnd, LPRECT lpRect, BOOL bErase)
-{
- BOOL ret;
- OutTraceDW("GetUpdateRect: hwnd=%x Erase=%x\n", hWnd, bErase);
- ret = (*pGetUpdateRect)(hWnd, lpRect, bErase);
- if(ret){
- OutTraceDW("GetUpdateRect: rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- if(dxw.IsFullScreen()){
- dxw.UnmapClient(lpRect);
- OutTraceDW("GetUpdateRect: FIXED rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
- }
- }
- else
- OutTraceE("GetUpdateRect ERROR: err=%d\n", GetLastError());
- return ret;
-}
-
-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.UnmapWindow(&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.Windowize){
- 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.Windowize){
- 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;
-}
-
-BOOL extGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpmi, GetMonitorInfo_Type pGetMonitorInfo)
-{
- BOOL res;
- OutTraceDW("GetMonitorInfo: hMonitor=%x mi=MONITORINFO%s\n", hMonitor, lpmi->cbSize==sizeof(MONITORINFO)?"":"EX");
- res=(*pGetMonitorInfo)(hMonitor, lpmi);
- //v2.03.15 - must fix the coordinates also in case of error: that may depend on the windowed mode.
- if(dxw.Windowize){
- OutTraceDW("GetMonitorInfo: FIX Work=(%d,%d)-(%d,%d) Monitor=(%d,%d)-(%d,%d) -> (%d,%d)-(%d,%d)\n",
- lpmi->rcWork.left, lpmi->rcWork.top, lpmi->rcWork.right, lpmi->rcWork.bottom,
- lpmi->rcMonitor.left, lpmi->rcMonitor.top, lpmi->rcMonitor.right, lpmi->rcMonitor.bottom,
- 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight());
- lpmi->rcWork = dxw.GetScreenRect();
- lpmi->rcMonitor = dxw.GetScreenRect();
- res=TRUE;
- }
- else
- OutTraceE("GetMonitorInfo: ERROR err=%d\n", GetLastError());
-
- return res;
-}
-
-BOOL WINAPI extGetMonitorInfoA(HMONITOR hMonitor, LPMONITORINFO lpmi)
-{
- return extGetMonitorInfo(hMonitor, lpmi, pGetMonitorInfoA);
-}
-
-BOOL WINAPI extGetMonitorInfoW(HMONITOR hMonitor, LPMONITORINFO lpmi)
-{
- return extGetMonitorInfo(hMonitor, lpmi, pGetMonitorInfoW);
-}
-
-int WINAPI extGetUpdateRgn(HWND hWnd, HRGN hRgn, BOOL bErase)
-{
- int regionType;
- regionType=(*pGetUpdateRgn)(hWnd, hRgn, bErase);
- OutTraceDW("GetUpdateRgn: hwnd=%x hrgn=%x erase=%x regionType=%x(%s)\n",
- hWnd, hRgn, bErase, regionType, ExplainRegionType(regionType));
-
- if(dxw.Windowize && dxw.IsFullScreen()){
- if(regionType == SIMPLEREGION){
- RECT rc;
- if(!pGetRgnBox) pGetRgnBox=GetRgnBox;
- regionType = (*pGetRgnBox)(hRgn, &rc);
- OutTraceDW("GetUpdateRgn: regionType=%x(%s) box=(%d,%d)-(%d,%d)\n",
- regionType, ExplainRegionType(regionType), rc.left, rc.top, rc.right, rc.bottom);
- if(regionType == SIMPLEREGION){
- dxw.UnmapClient(&rc);
- if(SetRectRgn(hRgn, rc.left, rc.top, rc.right, rc.bottom )){
- // success
- OutTraceDW("GetUpdateRgn: FIXED box=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom);
- }
- }
- }
-#if 0
- if(regionType == COMPLEXREGION){
- RECT rc;
- if(!pGetRgnBox) pGetRgnBox=GetRgnBox;
- regionType = (*pGetRgnBox)(hRgn, &rc);
- OutTraceDW("GetUpdateRgn: regionType=%x(%s) box=(%d,%d)-(%d,%d)\n",
- regionType, ExplainRegionType(regionType), rc.left, rc.top, rc.right, rc.bottom);
- if(regionType == COMPLEXREGION){
- //dxw.UnmapClient(&rc);
- //if(SetRectRgn(hRgn, rc.left, rc.top, rc.right, rc.bottom )){
- if(SetRectRgn(hRgn, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight())){
- // success
- OutTraceDW("GetUpdateRgn: FIXED box=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom);
- }
- }
- }
-#endif
- }
-
- return regionType;
-}
-
-#ifdef TRACEPALETTE
-UINT WINAPI extGetDIBColorTable(HDC hdc, UINT uStartIndex, UINT cEntries, RGBQUAD *pColors)
-{
- UINT ret;
- OutTraceDW("GetDIBColorTable: hdc=%x start=%d entries=%d\n", hdc, uStartIndex, cEntries);
-
- //if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){
- // //extern PALETTEENTRY PalEntries[256];
- // extern DWORD *PaletteEntries;
- // if((uStartIndex+cEntries) > 256) cEntries = 256 - uStartIndex;
- // for(UINT i=0; i 256) cEntries = 256 - uStartIndex;
- // for(UINT i=0; ileft, lpRect->top, lpRect->right, lpRect->bottom);
- else
- OutTrace("ValidateRect: hwnd=%x rect=NULL\n", hWnd);
- }
- ret = (*pValidateRect)(hWnd, lpRect);
- return ret;
-}
-
-int WINAPI extGetWindowTextA(HWND hWnd, LPTSTR lpString, int nMaxCount)
-{
- // purpose of this wrapped call is to clear the FPS indicator (format " ~ (%d FPS)")
- // from the window title, if present. It crashes games such as "Panzer General 3 Scorched Earth"
- // when FPS on window title is activated.
- int ret;
- OutTraceDW("GetWindowTextA: hwnd=%x MaxCount=%d\n", hWnd, nMaxCount);
- ret=(*pGetWindowTextA)(hWnd, lpString, nMaxCount);
- if(ret) OutTraceDW("GetWindowTextA: ret=%d String=\"%s\"\n", ret, lpString);
- if (ret && (dxw.dwFlags2 & SHOWFPS) && dxw.ishWndFPS(hWnd)){
- char *p;
- p=strstr(lpString, " ~ (");
- if(p){
- *p = NULL;
- ret = strlen(lpString);
- OutTraceDW("GetWindowTextA: FIXED ret=%d String=\"%s\"\n", ret, lpString);
- }
- }
- return ret;
-}
-#endif
-
-BOOL WINAPI extBringWindowToTop(HWND hwnd)
-{
- BOOL res;
- OutTraceDW("BringWindowToTop: hwnd=%x\n", hwnd);
- if(dxw.dwFlags5 & UNLOCKZORDER) return TRUE;
- res=(*pBringWindowToTop)(hwnd);
- return res;
-}
-
-BOOL WINAPI extSetForegroundWindow(HWND hwnd)
-{
- BOOL res;
- OutTraceDW("SetForegroundWindow: hwnd=%x\n", hwnd);
- if(dxw.dwFlags5 & UNLOCKZORDER) return TRUE;
- res=(*pSetForegroundWindow)(hwnd);
- return res;
-}
-
-HOOKPROC glpMouseHookProcessFunction;
-HOOKPROC glpMessageHookProcessFunction;
-/*
-LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam)
-{
- LRESULT ret;
- OutTrace("HookProc intercepted: code=%x wParam=%x lParam=%x\n", code, wParam, lParam);
- MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
- if (pMouseStruct != NULL){
- dxw.UnmapWindow(&(pMouseStruct->pt));
- }
- ret= (*glpMouseHookProcessFunction)(code, wParam, lParam);
- return ret;
-}
-*/
-
-LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam)
-{
- LRESULT ret;
- OutTrace("MessageHookProc: code=%x wParam=%x lParam=%x\n", code, wParam, lParam);
- MSG * pMessage = (MSG *)lParam;
- ret = NULL;
- if(pMessage){
- UINT message = pMessage->message;
- if ((message >= 0x600) || // custom messages
- ((message >= WM_KEYFIRST) && (message <= WM_KEYLAST))) // keyboard messages
- ret = (*glpMessageHookProcessFunction)(code, wParam, lParam);
- }
- return ret;
-}
-
-HHOOK WINAPI extSetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId)
-{
- HHOOK ret;
- if(dxw.dwFlags5 & EASPORTSHACK){
- if(idHook == WH_MOUSE) return NULL;
- if(idHook == WH_GETMESSAGE) {
- glpMessageHookProcessFunction = lpfn;
- lpfn=extMessageHookProc;
- }
- }
- ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId);
- return ret;
-}
-
-
-HRESULT WINAPI extMessageBoxTimeoutA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds)
-{
- HRESULT res;
- if(1) dwMilliseconds=1000;
- res=(*pMessageBoxTimeoutA)(hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds);
- return res;
-}
-
-HRESULT WINAPI extMessageBoxTimeoutW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds)
-{
- HRESULT res;
- if(1) dwMilliseconds=1000;
- res=(*pMessageBoxTimeoutW)(hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds);
- return res;
-}
-
-HDESK WINAPI extCreateDesktop( LPCTSTR lpszDesktop, LPCTSTR lpszDevice, DEVMODE *pDevmode, DWORD dwFlags, ACCESS_MASK dwDesiredAccess, LPSECURITY_ATTRIBUTES lpsa)
-{
- //OutTrace("CreateDesktop: SUPPRESS Desktop=%s Device=%s flags=%x access=%x\n", lpszDesktop, lpszDevice, dwFlags, dwDesiredAccess);
- OutTraceDW("CreateDesktop: SUPPRESS flags=%x access=%x\n", dwFlags, dwDesiredAccess);
- return (HDESK)0xDEADBEEF; // fake handle
- //return (HDESK)NULL; // fake handle
-}
-
-BOOL WINAPI extSwitchDesktop(HDESK hDesktop)
-{
- OutTraceDW("SwitchDesktop: SUPPRESS hDesktop=%x\n", hDesktop);
- return TRUE;
-}
-
-HDESK WINAPI extOpenDesktop(LPTSTR lpszDesktop, DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess)
-{
- OutTraceDW("CreateDesktop: SUPPRESS flags=%x access=%x\n", dwFlags, dwDesiredAccess);
- return (HDESK)0xDEADBEEF; // fake handle
- //return (HDESK)NULL; // fake handle
-}
-
-BOOL WINAPI extCloseDesktop(HDESK hDesktop)
-{
- OutTraceDW("CloseDesktop: SUPPRESS hDesktop=%x\n", hDesktop);
- return TRUE;
-}
-
-INT_PTR WINAPI extDialogBoxParamA(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
-{
- BOOL ret, FullScreen;
- FullScreen = dxw.IsFullScreen();
- OutTraceDW("DialogBoxParamA: FullScreen=%x TemplateName=\"%s\" WndParent=%x\n",
- FullScreen, sTemplateName(lpTemplateName), hWndParent);
- dxw.SetFullScreen(FALSE);
- ret = (*pDialogBoxParamA)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
- dxw.SetFullScreen(FullScreen);
- OutTraceDW("DialogBoxParamA: ret=%x\n", ret);
- return ret;
-}
-
-BOOL WINAPI extIsZoomed(HWND hWnd)
-{
- BOOL ret;
- ret = (*pIsZoomed)(hWnd);
- OutTrace("IsZoomed: hwnd=%x ret=%x\n", hWnd, ret);
- //if(dxw.IsFullScreen()) ret = FALSE;
- return ret;
-}
-
-BOOL WINAPI extIsIconic(HWND hWnd)
-{
- BOOL ret;
- ret = (*pIsIconic)(hWnd);
- OutTrace("IsIconic: hwnd=%x ret=%x\n", hWnd, ret);
- //return FALSE;
- return ret;
-}
diff --git a/host/TabSysLibs.cpp b/host/TabSysLibs.cpp
index a0e8c11..235fe07 100644
--- a/host/TabSysLibs.cpp
+++ b/host/TabSysLibs.cpp
@@ -33,10 +33,12 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_FIXTEXTOUT, cTarget->m_FixTextOut);
DDX_Check(pDX, IDC_SHAREDDC, cTarget->m_SharedDC);
DDX_Check(pDX, IDC_NOFILLRECT, cTarget->m_NoFillRect);
+ DDX_Check(pDX, IDC_REUSEEMULATEDDC, cTarget->m_ReuseEmulatedDC);
// OpenGL
DDX_Check(pDX, IDC_HOOKOPENGL, cTarget->m_HookOpenGL); // duplicated
DDX_Check(pDX, IDC_FORCEHOOKOPENGL, cTarget->m_ForceHookOpenGL);
+ DDX_Check(pDX, IDC_FIXPIXELZOOM, cTarget->m_FixPixelZoom);
DDX_Text(pDX, IDC_OPENGLLIB, cTarget->m_OpenGLLib);
// Glide
diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp
index 3407cf3..d554b24 100644
--- a/host/TargetDlg.cpp
+++ b/host/TargetDlg.cpp
@@ -26,6 +26,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_DxFilterMode = 0; // default: ddraw filtering
m_DCEmulationMode = 0; // default: no emulation
m_MouseVisibility = 0;
+ m_TextureHandling = 0;
m_HookDI = FALSE;
m_ModifyMouse = TRUE; // default true !!
m_LogEnabled = FALSE;
@@ -134,7 +135,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_KeepCursorFixed = FALSE;
m_UseRGB565 = TRUE; // seems the default for 16bit video mode
m_SuppressDXErrors = FALSE;
- m_FlipEmulation = FALSE;
+ m_FlipEmulation = TRUE; // better set true default, since this mode is more compatible
m_MarkBlit = FALSE;
m_MarkLock = FALSE;
m_NoSysMemPrimary = FALSE;
@@ -181,6 +182,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_InterceptRDTSC = FALSE;
m_HookOpenGL = FALSE;
m_ForceHookOpenGL = FALSE;
+ m_FixPixelZoom = FALSE;
m_FakeVersion = FALSE;
m_FullRectBlt = FALSE;
m_CenterToWin = FALSE;
@@ -190,6 +192,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_NoDDRAWFlip = FALSE;
m_NoGDIBlt = FALSE;
m_NoFillRect = FALSE;
+ m_ReuseEmulatedDC = FALSE; // ??
m_AnalyticMode = FALSE;
m_NoPaletteUpdate = FALSE;
m_WireFrame = FALSE;
diff --git a/host/TargetDlg.h b/host/TargetDlg.h
index 3bceea0..fda4200 100644
--- a/host/TargetDlg.h
+++ b/host/TargetDlg.h
@@ -148,6 +148,7 @@ public:
BOOL m_InterceptRDTSC;
BOOL m_HookOpenGL;
BOOL m_ForceHookOpenGL;
+ BOOL m_FixPixelZoom;
BOOL m_FakeVersion;
BOOL m_FullRectBlt;
BOOL m_CenterToWin;
@@ -157,6 +158,7 @@ public:
BOOL m_NoDDRAWFlip;
BOOL m_NoGDIBlt;
BOOL m_NoFillRect;
+ BOOL m_ReuseEmulatedDC;
BOOL m_AnalyticMode;
BOOL m_NoPaletteUpdate;
BOOL m_LimitResources;
diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps
index 50c8c15..90d15a5 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index bec4db0..abdb202 100644
Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ
diff --git a/host/dxwndhost.vs2008.sln b/host/dxwndhost.vs2008.sln
new file mode 100644
index 0000000..5bf4fb1
--- /dev/null
+++ b/host/dxwndhost.vs2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwndhost", "dxwndhost.vs2008.vcproj", "{FD0B0234-8EC5-43C0-A384-1B881DD3D925}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Debug|Win32.ActiveCfg = Debug|Win32
+ {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Debug|Win32.Build.0 = Debug|Win32
+ {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.ActiveCfg = Release|Win32
+ {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
deleted file mode 100644
index 30dbff6..0000000
Binary files a/host/dxwndhost.vs2008.suo and /dev/null differ
diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp
index 20c7c29..f1bea04 100644
--- a/host/dxwndhostView.cpp
+++ b/host/dxwndhostView.cpp
@@ -380,6 +380,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_InterceptRDTSC) t->flags4 |= INTERCEPTRDTSC;
if(dlg->m_HookOpenGL) t->flags2 |= HOOKOPENGL;
if(dlg->m_ForceHookOpenGL) t->flags3 |= FORCEHOOKOPENGL;
+ if(dlg->m_FixPixelZoom) t->flags6 |= FIXPIXELZOOM;
if(dlg->m_WireFrame) t->flags2 |= WIREFRAME;
if(dlg->m_NoTextures) t->flags4 |= NOTEXTURES;
if(dlg->m_BlackWhite) t->flags3 |= BLACKWHITE;
@@ -393,6 +394,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_NoDDRAWFlip) t->flags3 |= NODDRAWFLIP;
if(dlg->m_NoGDIBlt) t->flags3 |= NOGDIBLT;
if(dlg->m_NoFillRect) t->flags4 |= NOFILLRECT;
+ if(dlg->m_ReuseEmulatedDC) t->flags6 |= REUSEEMULATEDDC;
if(dlg->m_AnalyticMode) t->flags3 |= ANALYTICMODE;
if(dlg->m_ReplacePrivOps) t->flags5 |= REPLACEPRIVOPS;
t->initx = dlg->m_InitX;
@@ -614,6 +616,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_InterceptRDTSC = t->flags4 & INTERCEPTRDTSC ? 1 : 0;
dlg->m_HookOpenGL = t->flags2 & HOOKOPENGL ? 1 : 0;
dlg->m_ForceHookOpenGL = t->flags3 & FORCEHOOKOPENGL ? 1 : 0;
+ dlg->m_FixPixelZoom = t->flags6 & FIXPIXELZOOM ? 1 : 0;
dlg->m_WireFrame = t->flags2 & WIREFRAME ? 1 : 0;
dlg->m_NoTextures = t->flags4 & NOTEXTURES ? 1 : 0;
dlg->m_BlackWhite = t->flags3 & BLACKWHITE ? 1 : 0;
@@ -627,6 +630,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_NoDDRAWFlip = t->flags3 & NODDRAWFLIP ? 1 : 0;
dlg->m_NoGDIBlt = t->flags3 & NOGDIBLT ? 1 : 0;
dlg->m_NoFillRect = t->flags4 & NOFILLRECT ? 1 : 0;
+ dlg->m_ReuseEmulatedDC = t->flags6 & REUSEEMULATEDDC ? 1 : 0;
dlg->m_AnalyticMode = t->flags3 & ANALYTICMODE ? 1 : 0;
dlg->m_ReplacePrivOps = t->flags5 & REPLACEPRIVOPS ? 1 : 0;
dlg->m_InitX = t->initx;
diff --git a/host/resource b/host/resource
index 561b289..b2a4983 100644
Binary files a/host/resource and b/host/resource differ