diff --git a/Include/ddraw.h b/Include/ddraw.h index e66314b..9432f1b 100644 --- a/Include/ddraw.h +++ b/Include/ddraw.h @@ -2438,7 +2438,7 @@ typedef struct _DDOPTSURFACEDESC /* * The surface's optimized pixelformat is compressed */ -#define DDOSDCAPS_OPTCOMPRESSED 0x00000001l +#define DDSDCAPS_PRIMARYSURFACE 0x00000001l /* * The surface's optimized pixelformat is reordered diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 143c59f..538aa94 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -186,6 +186,8 @@ #define NODESTROYWINDOW 0x00000004 // suppress the main window destruction #define NOMOVIES 0x00000008 // suppress MCI Movies #define SUPPRESSRELEASE 0x00000010 // Avoid releasing critical emulated surfaces - the backbuffer +#define FIXMOVIESCOLOR 0x00000020 // Fixes vfw movies color depth forcing the virtual value +#define WOW64REGISTRY 0x00000040 // Sets KEY_WOW64_64KEY registry flag // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 9dafcdc..b78801c 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:56ab101cb2b224e431663b2780b0f9909105b05d8224c9aaf04fce73f4478f2c -size 576000 +oid sha256:4ab5dd831d56508ccd5cbbda6a530cd2590513f33e24d99218eda96a1c592d5f +size 578048 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index d4cbbf5..78a4a7a 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4689f5e3e9616fb6a9cffaa580a02ca3aceb4364593deeb30b373e1e6f0d0696 -size 539648 +oid sha256:1520acef3baabbb9746fcc7f4e3ef6e485a67880b7c1503d9abf37097bfdd4ab +size 540160 diff --git a/build/exports/Rollcage (D3D).dxw b/build/exports/Rollcage (D3D).dxw index bb50259..8c16fb5 100644 --- a/build/exports/Rollcage (D3D).dxw +++ b/build/exports/Rollcage (D3D).dxw @@ -6,8 +6,8 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=150994976 -flagg0=134217728 +flag0=134217762 +flagg0=1207959552 flagh0=20 flagi0=136314884 tflag0=6147 @@ -25,3 +25,7 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +notes0= +flagj0=128 +flagk0=0 +swapeffect0=0 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index c53a606..4ff201a 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -830,4 +830,9 @@ add: added the "Suppress Release on backbuffer" that makes "Tetris Worlds" worki v2.03.25: fix: CoCreateInstance hooking for IDirectDraw interface: fixes "Darius Gaiden" fix: BackBufferCaps value for NOSYSTEMEMULATED option. Fixes "Forsaken" crashes in AERO mode. -fix: GDI GetDC and GetWindowDC must not redirect the zero hWnd to the current main window if not in fullscreen mode. \ No newline at end of file +fix: GDI GetDC and GetWindowDC must not redirect the zero hWnd to the current main window if not in fullscreen mode. + +v2.03.26: +add: Added "Set KEY_WOW64_64KEY flag" flag to registry operations. It could prove useful for old programs on recent W64 platforms. +add: Added "fix movies color depth" flag. It fixes some problems when windows multimedia functions detect and process the actual video color mode and they should rather consider the virtual value. Fixes "Killing Time" intro movies decoding. +fix: suppressed hooking for comdlg32.dll module. Common dialogues never need to be altered. Fixes "Road Rash" save/load game dialog problems. diff --git a/dll/advapi.cpp b/dll/advapi.cpp index a6e52ad..4335d05 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -152,6 +152,8 @@ LONG WINAPI extRegOpenKeyEx( if(res == ERROR_SUCCESS) return res; } + if(dxw.dwFlags6 & WOW64REGISTRY) ulOptions |= KEY_WOW64_64KEY; + res=(*pRegOpenKeyEx)(hKey, lpSubKey, ulOptions, samDesired, phkResult); OutTraceR("RegOpenKeyEx: res=%x phkResult=%x\n", res, phkResult ? *phkResult : 0); diff --git a/dll/avifile.cpp b/dll/avifile.cpp index 833e977..7b1c729 100644 --- a/dll/avifile.cpp +++ b/dll/avifile.cpp @@ -10,17 +10,21 @@ typedef LONG (WINAPI *AVIFileRelease_Type)(PAVIFILE); typedef LONG (WINAPI *AVIStreamRelease_Type)(PAVISTREAM); +typedef PGETFRAME (WINAPI *AVIStreamGetFrameOpen_Type)(PAVISTREAM, LPBITMAPINFOHEADER); AVIFileRelease_Type pAVIFileRelease = NULL; AVIStreamRelease_Type pAVIStreamRelease = NULL; +AVIStreamGetFrameOpen_Type pAVIStreamGetFrameOpen = NULL; LONG WINAPI extAVIFileRelease(PAVIFILE); LONG WINAPI extAVIStreamRelease(PAVISTREAM); +PGETFRAME WINAPI extAVIStreamGetFrameOpen(PAVISTREAM, LPBITMAPINFOHEADER); static HookEntry_Type Hooks[]={ //{HOOK_IAT_CANDIDATE, "AVIFileClose", NULL, (FARPROC *)&pAVIFileClose, (FARPROC)extAVIFileClose}, - {HOOK_IAT_CANDIDATE, "AVIFileRelease", NULL, (FARPROC *)&pAVIFileRelease, (FARPROC)extAVIFileRelease}, - {HOOK_IAT_CANDIDATE, "AVIStreamRelease", NULL, (FARPROC *)&pAVIStreamRelease, (FARPROC)extAVIStreamRelease}, + //{HOOK_IAT_CANDIDATE, "AVIFileRelease", NULL, (FARPROC *)&pAVIFileRelease, (FARPROC)extAVIFileRelease}, + //{HOOK_IAT_CANDIDATE, "AVIStreamRelease", NULL, (FARPROC *)&pAVIStreamRelease, (FARPROC)extAVIStreamRelease}, + {HOOK_IAT_CANDIDATE, "AVIStreamGetFrameOpen", NULL, (FARPROC *)&pAVIStreamGetFrameOpen, (FARPROC)extAVIStreamGetFrameOpen}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -54,5 +58,30 @@ LONG WINAPI extAVIStreamRelease(PAVISTREAM pavi) return (*pAVIStreamRelease)(pavi); } +PGETFRAME WINAPI extAVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted) +{ + if(IsTraceDW){ + char sColor[12]; + switch ((DWORD)lpbiWanted){ + case 0: strcpy(sColor, "DEFAULT"); break; + case AVIGETFRAMEF_BESTDISPLAYFMT: strcpy(sColor, "BEST"); break; + default: sprintf(sColor,"%d", lpbiWanted->biBitCount); + } + OutTrace("AVIStreamGetFrameOpen: pavi=%x lpbiwanted=%x bitcount=%s\n", pavi, lpbiWanted, sColor); + } + + if((dxw.dwFlags6 & FIXMOVIESCOLOR) && (((DWORD)lpbiWanted == 0) || ((DWORD)lpbiWanted == AVIGETFRAMEF_BESTDISPLAYFMT))){ + BITMAPINFOHEADER biWanted; + memset(&biWanted, 0, sizeof(BITMAPINFOHEADER)); + biWanted.biSize = sizeof(BITMAPINFOHEADER); + biWanted.biBitCount = (WORD)dxw.VirtualPixelFormat.dwRGBBitCount; + biWanted.biPlanes = 1; + biWanted.biClrUsed = (0x1 << biWanted.biBitCount); // 8 -> 256; + biWanted.biClrImportant = biWanted.biClrUsed; + return (*pAVIStreamGetFrameOpen)(pavi, &biWanted); + } + + return (*pAVIStreamGetFrameOpen)(pavi, lpbiWanted); +} diff --git a/dll/comdlg32.cpp b/dll/comdlg32.cpp new file mode 100644 index 0000000..3b702fd --- /dev/null +++ b/dll/comdlg32.cpp @@ -0,0 +1,87 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include "dxwnd.h" +#include "dxwcore.hpp" +#include "syslibs.h" +#include "dxhook.h" +#include "dxhelper.h" + +typedef BOOL (WINAPI *GetFileNameA_Type)(LPOPENFILENAMEA); +typedef BOOL (WINAPI *GetFileNameW_Type)(LPOPENFILENAMEW); +GetFileNameA_Type pGetOpenFileNameA = NULL; +GetFileNameA_Type pGetSaveFileNameA = NULL; +GetFileNameW_Type pGetOpenFileNameW = NULL; +GetFileNameW_Type pGetSaveFileNameW = NULL; +BOOL WINAPI extGetSaveFileNameA(LPOPENFILENAMEA); +BOOL WINAPI extGetOpenFileNameA(LPOPENFILENAMEA); +BOOL WINAPI extGetSaveFileNameW(LPOPENFILENAMEW); +BOOL WINAPI extGetOpenFileNameW(LPOPENFILENAMEW); + +static HookEntry_Type Hooks[]={ + {HOOK_IAT_CANDIDATE, "GetSaveFileNameA", NULL, (FARPROC *)&pGetSaveFileNameA, (FARPROC)extGetSaveFileNameA}, + {HOOK_IAT_CANDIDATE, "GetOpenFileNameA", NULL, (FARPROC *)&pGetOpenFileNameA, (FARPROC)extGetOpenFileNameA}, + {HOOK_IAT_CANDIDATE, "GetSaveFileNameW", NULL, (FARPROC *)&pGetSaveFileNameW, (FARPROC)extGetSaveFileNameW}, + {HOOK_IAT_CANDIDATE, "GetOpenFileNameW", NULL, (FARPROC *)&pGetOpenFileNameW, (FARPROC)extGetOpenFileNameW}, + {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator +}; + +void HookComDlg32(HMODULE module) +{ + HookLibrary(module, Hooks, "comdlg32.dll"); +} + +FARPROC Remap_ComDlg32_ProcAddress(LPCSTR proc, HMODULE hModule) +{ + FARPROC addr; + if (addr=RemapLibrary(proc, hModule, Hooks)) return addr; + return NULL; +} + +BOOL WINAPI extGetSaveFileNameA(LPOPENFILENAMEA lpofn) +{ + BOOL ret, FullScreen; + FullScreen = dxw.IsFullScreen(); + OutTraceDW("GetSaveFileNameA: FullScreen=%x\n", FullScreen); + dxw.SetFullScreen(FALSE); + ret = (*pGetSaveFileNameA)(lpofn); + dxw.SetFullScreen(FullScreen); + OutTraceDW("GetSaveFileNameA: ret=%x\n", ret); + return ret; +} + +BOOL WINAPI extGetOpenFileNameA(LPOPENFILENAMEA lpofn) +{ + BOOL ret, FullScreen; + FullScreen = dxw.IsFullScreen(); + OutTraceDW("GetOpenFileNameA: FullScreen=%x\n", FullScreen); + dxw.SetFullScreen(FALSE); + ret = (*pGetOpenFileNameA)(lpofn); + dxw.SetFullScreen(FullScreen); + OutTraceDW("GetOpenFileNameA: ret=%x\n", ret); + return ret; +} + +BOOL WINAPI extGetSaveFileNameW(LPOPENFILENAMEW lpofn) +{ + BOOL ret, FullScreen; + FullScreen = dxw.IsFullScreen(); + OutTraceDW("GetSaveFileNameW: FullScreen=%x\n", FullScreen); + dxw.SetFullScreen(FALSE); + ret = (*pGetSaveFileNameW)(lpofn); + dxw.SetFullScreen(FullScreen); + OutTraceDW("GetSaveFileNameW: ret=%x\n", ret); + return ret; +} + +BOOL WINAPI extGetOpenFileNameW(LPOPENFILENAMEW lpofn) +{ + BOOL ret, FullScreen; + FullScreen = dxw.IsFullScreen(); + OutTraceDW("GetOpenFileNameW: FullScreen=%x\n", FullScreen); + dxw.SetFullScreen(FALSE); + ret = (*pGetOpenFileNameW)(lpofn); + dxw.SetFullScreen(FullScreen); + OutTraceDW("GetOpenFileNameW: ret=%x\n", ret); + return ret; +} diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 01085a1..3ec7cbc 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -3848,6 +3848,7 @@ HRESULT WINAPI EnumModesCallbackDumper(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l OutTrace("\tdwBackBufferCount=%d\n", lpDDSurfaceDesc->dwBackBufferCount); OutTrace("\tdwRefreshRate=%d\n", lpDDSurfaceDesc->dwRefreshRate); OutTrace("\tlpSurface=%x\n", lpDDSurfaceDesc->lpSurface); + OutTrace("\tCaps=%x(%s)\n", lpDDSurfaceDesc->ddsCaps.dwCaps, ExplainDDSCaps(lpDDSurfaceDesc->ddsCaps.dwCaps)); OutTrace("\tddpfPixelFormat %s\n", DumpPixelFormat((LPDDSURFACEDESC2)lpDDSurfaceDesc)); #ifdef FULLHEXDUMP diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 0811309..3ab5828 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -106,7 +106,7 @@ static char *Flag5Names[32]={ static char *Flag6Names[32]={ "FORCESWAPEFFECT", "LEGACYALLOC", "NODESTROYWINDOW", "NOMOVIES", - "SUPPRESSRELEASE", "", "", "", + "SUPPRESSRELEASE", "FIXMOVIESCOLOR", "WOW64REGISTRY", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -1375,8 +1375,10 @@ void HookModule(HMODULE base, int dxversion) (dxw.dwFlags4 & OVERRIDEREGISTRY) || (dxw.dwTFlags & OUTREGISTRY)) HookAdvApi32(base); HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for? + HookAVIFil32(base); //HookSmackW32(base); //HookDirectSound(base); + //HookComDlg32(base); } #define USEWINNLSENABLE diff --git a/dll/dxhook.h b/dll/dxhook.h index acaf554..ecce047 100644 --- a/dll/dxhook.h +++ b/dll/dxhook.h @@ -13,6 +13,8 @@ extern void HookWinMM(HMODULE); extern void HookAdvApi32(HMODULE); extern void HookImagehlp(HMODULE); extern void HookSmackW32(HMODULE); +extern void HookAVIFil32(HMODULE); +extern void HookComDlg32(HMODULE); extern void InitPosition(int, int, int, int, int, int); //void InitWindowPos(int, int, int, int); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 587f36c..5a60ffe 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -1,4 +1,5 @@ #define _CRT_SECURE_NO_WARNINGS +#define SYSLIBNAMES_DEFINES #include #include "dxwnd.h" @@ -1428,45 +1429,7 @@ int dxwCore::GetDLLIndex(char *lpFileName) { int idx; char *lpName, *lpNext; - char *SysNames[]={ - "kernel32", - "USER32", - "GDI32", - "imelib", - "ADVAPI32", - "ole32", - "ddraw", - "d3d8", - "d3d9", - "d3d10", - "d3d10_1", - "d3d11", - "opengl32", - "msvfw32", - "smackw32", - "version", - "dplayx", - "dsound", - "winmm", - "imm32", - "wsock32", - "dinput", - "dinput8", - "shfolder", - "shell32", - "ws2_32", - "tapi32", - "netapi32", - "wintrust", - "d3dim", - "d3dim700", - "imagehlp", -// "+glide", -// "+glide2x", -// "+glide3x", - NULL - }; - + lpName=lpFileName; while (lpNext=strchr(lpName,'\\')) lpName=lpNext+1; for(idx=0; SysNames[idx]; idx++){ diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 3dea15a..9a01f44 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -284,9 +284,54 @@ typedef enum { // SYSLIBIDX_GLIDE, // SYSLIBIDX_GLIDE2X, // SYSLIBIDX_GLIDE3X, + SYSLIBIDX_COMDLG32, SYSLIBIDX_MAX } enum_syslibraries; +#ifdef SYSLIBNAMES_DEFINES +char *SysNames[]={ + "kernel32", + "USER32", + "GDI32", + "imelib", + "ADVAPI32", + "ole32", + "ddraw", + "d3d8", + "d3d9", + "d3d10", + "d3d10_1", + "d3d11", + "opengl32", + "msvfw32", + "smackw32", + "version", + "dplayx", + "dsound", + "winmm", + "imm32", + "wsock32", + "dinput", + "dinput8", + "shfolder", + "shell32", + "ws2_32", + "tapi32", + "netapi32", + "wintrust", + "d3dim", + "d3dim700", + "imagehlp", +// "+glide", +// "+glide2x", +// "+glide3x", + "comdlg32", + NULL +}; +#else +extern char *SysNames[]; +#endif + typedef enum { DXVK_NONE=0, DXVK_CLIPTOGGLE, diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 7b07040..b5f476f 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.25" +#define VERSION "2.03.26" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 1155ddf..5693827 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj index de9bd1a..ccc6767 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -229,6 +229,10 @@ RelativePath=".\avifile.cpp" > + + diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index ca52881..a3698b7 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -724,7 +724,6 @@ HDC WINAPI extGDICreateCompatibleDC(HDC hdc) BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) { BOOL res; - extern BOOL isWithinDialog; OutTraceDW("GDI.BitBlt: HDC=%x nXDest=%d nYDest=%d nWidth=%d nHeight=%d hdcSrc=%x nXSrc=%d nYSrc=%d dwRop=%x(%s)\n", hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop, ExplainROP(dwRop)); diff --git a/dll/msvfw.cpp b/dll/msvfw.cpp index f39bc68..fff3eb5 100644 --- a/dll/msvfw.cpp +++ b/dll/msvfw.cpp @@ -14,6 +14,7 @@ static HookEntry_Type Hooks[]={ //{HOOK_HOT_CANDIDATE, "ICSendMessage", (FARPROC)NULL, (FARPROC *)&pICSendMessage, (FARPROC)extICSendMessage}, //{HOOK_HOT_CANDIDATE, "ICOpen", (FARPROC)NULL, (FARPROC *)&pICOpen, (FARPROC)extICOpen}, //{HOOK_HOT_CANDIDATE, "MCIWndCreateA", (FARPROC)NULL, (FARPROC *)&pMCIWndCreateA, (FARPROC)extMCIWndCreateA}, // "Man in Black" - beware: this is NOT STDCALL!!! + {HOOK_HOT_CANDIDATE, "ICGetDisplayFormat", (FARPROC)NULL, (FARPROC *)&pICGetDisplayFormat, (FARPROC)extICGetDisplayFormat}, // "Man in Black" - beware: this is NOT STDCALL!!! {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -176,4 +177,24 @@ HWND extMCIWndCreateA(HWND hwndParent, HINSTANCE hInstance, DWORD dwStyle, LPCTS } return g_hwndMCIWnd; +} + +HIC WINAPI extICGetDisplayFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, int BitDepth, int dx, int dy) +{ + HIC ret; + OutTraceDW("ICGetDisplayFormat: hic=%x bitdepth=%d dx=%d dy=%d indepth=%d\n", hic, BitDepth, dx, dy, lpbiIn->biBitCount); + + ret=(*pICGetDisplayFormat)(hic, lpbiIn, lpbiOut, BitDepth, dx, dy); + if(ret){ + OutTraceDW("ICGetDisplayFormat: ret=%x outdepth=%d\n", hic, lpbiOut->biBitCount); + if(dxw.dwFlags6 & FIXMOVIESCOLOR){ + lpbiOut->biBitCount = (WORD)dxw.VirtualPixelFormat.dwRGBBitCount; + OutTraceDW("ICGetDisplayFormat: FIXED outdepth=%d\n", lpbiOut->biBitCount); + } + } + else { + OutTraceDW("ICGetDisplayFormat ERROR: err=%d\n", GetLastError()); + } + + return ret; } \ No newline at end of file diff --git a/dll/msvfwhook.h b/dll/msvfwhook.h index 99d3e5c..759a0fa 100644 --- a/dll/msvfwhook.h +++ b/dll/msvfwhook.h @@ -5,11 +5,13 @@ extern void HookMSV4WLibs(HMODULE); typedef LRESULT (WINAPI * ICSendMessage_Type)(HIC, UINT, DWORD_PTR, DWORD_PTR); typedef HIC (WINAPI *ICOpen_Type)(DWORD, DWORD, UINT); +typedef HIC (WINAPI *ICGetDisplayFormat_Type)(HIC, LPBITMAPINFOHEADER, LPBITMAPINFOHEADER, int, int, int); //typedef HWND (WINAPI *MCIWndCreateA_Type)(HWND, HINSTANCE, DWORD, LPCTSTR); typedef HWND (*MCIWndCreateA_Type)(HWND, HINSTANCE, DWORD, LPCTSTR); extern LRESULT WINAPI extICSendMessage(HIC, UINT, DWORD_PTR, DWORD_PTR); extern HIC WINAPI extICOpen(DWORD, DWORD, UINT); +extern HIC WINAPI extICGetDisplayFormat(HIC, LPBITMAPINFOHEADER, LPBITMAPINFOHEADER, int, int, int); //extern HWND WINAPI extMCIWndCreateA(HWND, HINSTANCE, DWORD, LPCTSTR); extern HWND extMCIWndCreateA(HWND, HINSTANCE, DWORD, LPCTSTR); @@ -28,4 +30,5 @@ extern HWND extMCIWndCreateA(HWND, HINSTANCE, DWORD, LPCTSTR); // MSVFW32.dll: DXWEXTERN ICSendMessage_Type pICSendMessage DXWINITIALIZED; DXWEXTERN ICOpen_Type pICOpen DXWINITIALIZED; +DXWEXTERN ICGetDisplayFormat_Type pICGetDisplayFormat; DXWEXTERN MCIWndCreateA_Type pMCIWndCreateA DXWINITIALIZED; diff --git a/dll/user32.cpp b/dll/user32.cpp index caf2d76..622fb68 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -63,6 +63,10 @@ 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; @@ -143,6 +147,8 @@ static HookEntry_Type Hooks[]={ {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, 0, NULL, 0, 0} // terminator }; @@ -309,7 +315,6 @@ static void Stopper(char *s, int line) // PrimHDC: DC handle of the selected DirectDraw primary surface. NULL when invalid. HDC PrimHDC=NULL; -BOOL isWithinDialog=FALSE; LPRECT lpClipRegion=NULL; RECT ClipRegion; int LastCurPosX, LastCurPosY; @@ -2095,11 +2100,13 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) { HWND RetHWND; - isWithinDialog=TRUE; + BOOL FullScreen; + FullScreen = dxw.IsFullScreen(); OutTraceDW("CreateDialogIndirectParam: hInstance=%x lpTemplate=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", hInstance, "tbd", 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) { @@ -2109,19 +2116,19 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT } OutTraceDW("CreateDialogIndirectParam: hwnd=%x\n", RetHWND); - isWithinDialog=FALSE; - //if (IsDebug) EnumChildWindows(RetHWND, (WNDENUMPROC)TraceChildWin, (LPARAM)RetHWND); return RetHWND; } HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) { HWND RetHWND; - isWithinDialog=TRUE; + BOOL FullScreen; + FullScreen = dxw.IsFullScreen(); OutTraceDW("CreateDialogParam: hInstance=%x lpTemplateName=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", hInstance, "tbd", 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) { @@ -2131,16 +2138,14 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW } OutTraceDW("CreateDialogParam: hwnd=%x\n", RetHWND); - isWithinDialog=FALSE; - //if (IsDebug) EnumChildWindows(RetHWND, (WNDENUMPROC)TraceChildWin, (LPARAM)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 indialog=%x fullscreen=%x\n", - hwnd, X, Y, nWidth, nHeight, bRepaint, isWithinDialog, dxw.IsFullScreen()); + 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)){ @@ -2940,4 +2945,16 @@ BOOL WINAPI extCloseDesktop(HDESK hDesktop) { OutTraceDW("CloseDesktop: SUPPRESS hDesktop=%x\n", hDesktop); return TRUE; -} \ No newline at end of file +} + +INT_PTR WINAPI extDialogBoxParamA(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) +{ + BOOL ret, FullScreen; + FullScreen = dxw.IsFullScreen(); + OutTraceDW("DialogBoxParamA: FullScreen=%x\n", FullScreen); + dxw.SetFullScreen(FALSE); + ret = (*pDialogBoxParamA)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam); + dxw.SetFullScreen(FullScreen); + OutTraceDW("DialogBoxParamA: ret=%x\n", ret); + return ret; +} diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index abce254..253a5de 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -47,6 +47,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) // Registry management DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); DDX_Check(pDX, IDC_OVERRIDEREGISTRY, cTarget->m_OverrideRegistry); + DDX_Check(pDX, IDC_WOW64REGISTRY, cTarget->m_Wow64Registry); } BEGIN_MESSAGE_MAP(CTabCompat, CDialog) diff --git a/host/TabSysLibs.cpp b/host/TabSysLibs.cpp index 83f4944..e41fa2e 100644 --- a/host/TabSysLibs.cpp +++ b/host/TabSysLibs.cpp @@ -41,6 +41,7 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX) // MCI DDX_Check(pDX, IDC_REMAPMCI, cTarget->m_RemapMCI); DDX_Check(pDX, IDC_NOMOVIES, cTarget->m_NoMovies); + DDX_Check(pDX, IDC_FIXMOVIESCOLOR, cTarget->m_FixMoviesColor); // Kernel32 DDX_Radio(pDX, IDC_SONDEFAULT, cTarget->m_SonProcessMode); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index b43bfe7..2c33c6f 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -87,6 +87,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_HookEnabled = TRUE; // default true !! m_EmulateRegistry = FALSE; m_OverrideRegistry = FALSE; + m_Wow64Registry = FALSE; m_FullScreenOnly = FALSE; m_FilterMessages = FALSE; m_PeekAllMessages = FALSE; @@ -112,6 +113,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_HookGlide = FALSE; m_RemapMCI = TRUE; m_NoMovies = FALSE; + m_FixMoviesColor = FALSE; m_SuppressRelease = FALSE; m_KeepCursorWithin = FALSE; m_KeepCursorFixed = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 85be721..084ab4c 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -57,6 +57,7 @@ public: BOOL m_HookDLLs; BOOL m_EmulateRegistry; BOOL m_OverrideRegistry; + BOOL m_Wow64Registry; BOOL m_FullScreenOnly; BOOL m_FilterMessages; BOOL m_PeekAllMessages; @@ -88,6 +89,7 @@ public: BOOL m_HookGlide; BOOL m_RemapMCI; BOOL m_NoMovies; + BOOL m_FixMoviesColor; BOOL m_SuppressRelease; BOOL m_KeepCursorWithin; BOOL m_KeepCursorFixed; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 731ced8..11e1fb7 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index ab69f90..32288e5 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index fd8ba34..54e09c3 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 7179486..b1a731b 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -173,6 +173,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_HookDLLs) t->flags3 |= HOOKDLLS; if(dlg->m_EmulateRegistry) t->flags3 |= EMULATEREGISTRY; if(dlg->m_OverrideRegistry) t->flags4 |= OVERRIDEREGISTRY; + if(dlg->m_Wow64Registry) t->flags6 |= WOW64REGISTRY; if(dlg->m_HookEnabled) t->flags3 |= HOOKENABLED; if(dlg->m_NoBanner) t->flags2 |= NOBANNER; if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG; @@ -308,6 +309,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_HookGlide) t->flags4 |= HOOKGLIDE; if(dlg->m_RemapMCI) t->flags5 |= REMAPMCI; if(dlg->m_NoMovies) t->flags6 |= NOMOVIES; + if(dlg->m_FixMoviesColor) t->flags6 |= FIXMOVIESCOLOR; if(dlg->m_SuppressRelease) t->flags6 |= SUPPRESSRELEASE; if(dlg->m_KeepCursorWithin) t->flags |= KEEPCURSORWITHIN; if(dlg->m_KeepCursorFixed) t->flags2 |= KEEPCURSORFIXED; @@ -405,6 +407,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_HookDLLs = t->flags3 & HOOKDLLS ? 1 : 0; dlg->m_EmulateRegistry = t->flags3 & EMULATEREGISTRY ? 1 : 0; dlg->m_OverrideRegistry = t->flags4 & OVERRIDEREGISTRY ? 1 : 0; + dlg->m_Wow64Registry = t->flags6 & WOW64REGISTRY ? 1 : 0; dlg->m_HookEnabled = t->flags3 & HOOKENABLED ? 1 : 0; dlg->m_NoBanner = t->flags2 & NOBANNER ? 1 : 0; dlg->m_StartDebug = t->flags2 & STARTDEBUG ? 1 : 0; @@ -526,6 +529,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_HookGlide = t->flags4 & HOOKGLIDE ? 1 : 0; dlg->m_RemapMCI = t->flags5 & REMAPMCI ? 1 : 0; dlg->m_NoMovies = t->flags6 & NOMOVIES ? 1 : 0; + dlg->m_FixMoviesColor = t->flags6 & FIXMOVIESCOLOR ? 1 : 0; dlg->m_SuppressRelease = t->flags6 & SUPPRESSRELEASE ? 1 : 0; dlg->m_KeepCursorWithin = t->flags & KEEPCURSORWITHIN ? 1 : 0; dlg->m_KeepCursorFixed = t->flags2 & KEEPCURSORFIXED ? 1 : 0; diff --git a/host/resource b/host/resource index 7f61693..7098e47 100644 Binary files a/host/resource and b/host/resource differ diff --git a/to do 24.txt b/to do 24.txt new file mode 100644 index 0000000..9e81c6b --- /dev/null +++ b/to do 24.txt @@ -0,0 +1,26 @@ +Rotture di AERO: Worms Pinball, Sim City 3000 + +regolazione luminosita + +scrolling decelerato + +CONTROLLO MOUSE IN gIOVANNA d'aRCO + +Tetris Worlds - va in crash, come mai??? + +Thief dark project GOLD GOG + +Thorgal (lock after movies) + +Total annihilation kingdoms ,,,,,, -> native modes / SVGA modes !!!! EnumDisplayModesD + +Total immersion racing + +Total soccer (directx) + +Risk II (hasbro) + +Sid Meier's Alpha Centauri (GOG) + +GetMessagePos() hook in Settlers III ??? + diff --git a/todo.txt.txt b/todo.txt.txt new file mode 100644 index 0000000..54cfcd0 --- /dev/null +++ b/todo.txt.txt @@ -0,0 +1,8 @@ +darius gaiden - CoCreateInstance used instead of DirectDrawCreate??? fixed + +Crimson Skies - fixed + +Echelon ??? + +Forsaken: why the Viewport::Clear method crashes? see d3d7.cpp +dipende dall' aver attivato AEROBOOST. Tolto quello, va ..... \ No newline at end of file