From 94f575cc42deaee7a340b5cdb7661b1a4a82757a Mon Sep 17 00:00:00 2001 From: gho tik Date: Sat, 11 Jun 2016 12:48:04 -0400 Subject: [PATCH] v2_03_95_src Former-commit-id: adab4a2a08a147e905d42ffcd996639aac05b1ab --- Include/dxwnd.h | 3 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 107 ++++++++++++++++++++++++++++++- build/exports/Medford Asylum.dxw | 35 ++++++++++ build/exports/dxwnd.log | 31 +-------- build/exports/dxwnd.reg | 20 ------ build/readme-relnotes.txt | 10 ++- dll/dwhide.cpp | 8 +-- dll/dxhook.cpp | 6 +- dll/dxmapping.cpp | 4 ++ dll/dxwcore.cpp | 6 +- dll/dxwcore.hpp | 2 + dll/dxwnd.aps | Bin 58196 -> 58248 bytes dll/dxwnd.cpp | 4 +- dll/dxwnd.vs2008.sln | 20 ++++++ dll/dxwnd.vs2008.suo | Bin 66560 -> 88064 bytes dll/hotpatch.cpp | 2 +- dll/kernel32.cpp | 65 ++++++++++++------- dll/msvfw.cpp | 9 +-- dll/user32.cpp | 90 +++++++++++++++++++++----- dll/winmm.cpp | 63 +++++++++++++++++- host/TabDirect3D.cpp | 4 ++ host/TabWindow.cpp | 8 +-- host/TargetDlg.cpp | 5 +- host/TargetDlg.h | 5 +- host/dxwndhost.aps | Bin 250004 -> 250776 bytes host/dxwndhost.cpp | 2 + host/dxwndhost.rc | Bin 135090 -> 135580 bytes host/dxwndhost.vs2008.sln | 20 ++++++ host/dxwndhost.vs2008.suo | Bin 46592 -> 46592 bytes host/dxwndhostView.cpp | 40 ++++++++++-- host/resource | Bin 49030 -> 49306 bytes 33 files changed, 448 insertions(+), 127 deletions(-) create mode 100644 build/exports/Medford Asylum.dxw delete mode 100644 build/exports/dxwnd.reg create mode 100644 dll/dxwnd.vs2008.sln create mode 100644 host/dxwndhost.vs2008.sln diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 9369f4d..266d200 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -63,7 +63,7 @@ #define HIDEMULTIMONITOR 0x00008000 // hide multimonitor configurations: GetAdapterCount returns 1. #define TIMESTRETCH 0x00010000 // make system time stretchable #define HOOKOPENGL 0x00020000 // Hook OpenGL calls -//#define WALLPAPERMODE 0x00040000 // mouse events are discarded (good for screensaver-like) +#define LOCKEDSIZE 0x00040000 // window resizzing is not allowed #define SHOWHWCURSOR 0x00080000 // enable hardware cursor #define GDISTRETCHED 0x00100000 // Stretch GDI/user32 coordinates to adapt to window size #define SHOWFPSOVERLAY 0x00200000 // shows FPS value to status win / log / screen overlay @@ -243,6 +243,7 @@ #define LOCKCOLORDEPTH 0x02000000 // lock ddraw color depth to current desktop value (used in SetDisplayMode) #define FIXSMACKLOOP 0x04000000 // fix Smack loop by insert processmessage and blit between frames #define FIXFREELIBRARY 0x08000000 // fix FreeLibrary simulating retcode 0(error) when attempting free of unallocated module +#define ANCHORED 0x10000000 // Anchored position & size, mo stretching or sliding is allowed // eighth flags DWORD dxw.dwFlags8: diff --git a/build/dxwnd.dll b/build/dxwnd.dll index f6ce91f..eb6f0b0 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:287b4afcae41e705bf3b4f67be71fce5403a26b7494cad40d5f1e4dbf5bf2925 -size 698368 +oid sha256:e98419de58b94f79d91d5044fe603e7754db6ea3d79e641b4fc16d9df5ea17e5 +size 700416 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 3dd268f..a2e5bb3 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:46c4384a402e3f5d23af6b3f6f9649833e7aefedf0c46bfd7eee282d8029f6ff +oid sha256:a75eed6fc7414d986f53c430fc32131c3052a40abfabdac6c13e0ba6a8900b08 size 664576 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 792bbe7..aed0584 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -3,8 +3,19 @@ exepath=D:\Games\Year Dead\ posx=1164 posy=243 sizx=320 -sizy=200 +sizy=494 exportpath=G:\DxWnd.develop\v2_03_94fx3_src\build\exports\ +debug=1 +autohide=0 +checkadmin=0 +namefromfolder=0 +multiprocesshook=0 +updatepaths=1 +defaultcoord=0 +defaultposx=50 +defaultposy=50 +defaultsizx=800 +defaultsizy=600 [target] title0=NITRO.EXE path0=D:\Games\WCW Nitro\NITRO.EXE @@ -109,7 +120,7 @@ slowratio2=2 initresw2=640 initresh2=480 title3=yeardead.exe -path3=D:\Games\Year Dead\yeardead.exe +path3=f:\Games\Year Dead\yeardead.exe startfolder3= launchpath3= module3= @@ -176,3 +187,95 @@ maxddinterface4=7 slowratio4=1 initresw4=0 initresh4=0 +title5=Adrenix 3D +path5=F:\Games\Adrenix\AdrenixD.exe +startfolder5= +launchpath5= +module5= +opengllib5= +notes5= +registry5= +ver5=0 +monitorid5=0 +coord5=0 +flag5=134235174 +flagg5=1216413696 +flagh5=20 +flagi5=138412036 +flagj5=5248 +flagk5=65536 +flagl5=0 +flagm5=0 +tflag5=6402 +dflag5=0 +posx5=50 +posy5=50 +sizx5=800 +sizy5=600 +maxfps5=0 +initts5=0 +winver5=0 +maxres5=-1 +swapeffect5=0 +maxddinterface5=7 +slowratio5=1 +initresw5=0 +initresh5=0 +title6=Adrenix +path6=F:\Games\Adrenix\Adrenix.exe +startfolder6= +launchpath6= +module6= +opengllib6= +notes6= +registry6= +ver6=0 +monitorid6=0 +coord6=0 +flag6=136314918 +flagg6=1207959552 +flagh6=20 +flagi6=138412036 +flagj6=4224 +flagk6=0 +flagl6=0 +flagm6=0 +tflag6=0 +dflag6=0 +posx6=50 +posy6=50 +sizx6=800 +sizy6=600 +maxfps6=0 +initts6=0 +winver6=0 +maxres6=-1 +swapeffect6=0 +maxddinterface6=7 +slowratio6=1 +initresw6=0 +initresh6=0 +[texture] +MinTexX=0 +MinTexY=0 +MaxTexX=0 +MaxTexY=0 +[keymapping] +timetoggle= +timefast= +timeslow= +altf4= +cliptoggle= +refresh= +logtoggle= +plogtoggle= +fpstoggle= +printscreen= +corner= +freezetime= +fullscreen= +workarea= +desktop= +minimize= +restore= +kill= diff --git a/build/exports/Medford Asylum.dxw b/build/exports/Medford Asylum.dxw new file mode 100644 index 0000000..9002bcc --- /dev/null +++ b/build/exports/Medford Asylum.dxw @@ -0,0 +1,35 @@ +[target] +title0=Medford Asylum +path0=F:\Games\Medford Asylum\MedfordAsylum.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=675282948 +flagj0=4224 +flagk0=65536 +flagl0=25165824 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/exports/dxwnd.log b/build/exports/dxwnd.log index a286f15..ef57fae 100644 --- a/build/exports/dxwnd.log +++ b/build/exports/dxwnd.log @@ -1,31 +1,6 @@ -OnRun idx=16 prog="F:\Games\Adrenix\Adrenix.exe" +OnRun idx=7 prog="F:\Games\Warhammer 40K Rites Of War\RoW.exe" setwindowshook mode -OnRun idx=17 prog="F:\Games\Adrenix\AdrenixD.exe" +OnRun idx=7 prog="F:\Games\Warhammer 40K Rites Of War\RoW.exe" setwindowshook mode -OnRun idx=16 prog="F:\Games\Adrenix\Adrenix.exe" -checksafediscversion -setwindowshook mode -OnRun idx=16 prog="F:\Games\Adrenix\Adrenix.exe" -setwindowshook mode -OnRun idx=16 prog="F:\Games\Adrenix\Adrenix.exe" -setwindowshook mode -OnRun idx=18 prog="V:\ADRENIX.EXE" -setwindowshook mode -OnRun idx=19 prog="V:\ADRENIXD.EXE" -setwindowshook mode -OnRun idx=20 prog="V:\ADRHEAT.EXE" -setwindowshook mode -OnRun idx=21 prog="V:\ADRHEATD.EXE" -setwindowshook mode -OnRun idx=22 prog="V:\ADX_VID.EXE" -setwindowshook mode -OnRun idx=16 prog="F:\Games\Adrenix\Adrenix.exe" -setwindowshook mode -OnRun idx=17 prog="F:\Games\Adrenix\AdrenixD.exe" -setwindowshook mode -OnRun idx=17 prog="F:\Games\Adrenix\AdrenixD.exe" -setwindowshook mode -OnRun idx=16 prog="F:\Games\Adrenix\Adrenix.exe" -setwindowshook mode -OnRun idx=16 prog="F:\Games\Adrenix\Adrenix.exe" +OnRun idx=7 prog="F:\Games\Warhammer 40K Rites Of War\RoW.exe" setwindowshook mode diff --git a/build/exports/dxwnd.reg b/build/exports/dxwnd.reg deleted file mode 100644 index 396bec7..0000000 --- a/build/exports/dxwnd.reg +++ /dev/null @@ -1,20 +0,0 @@ - -[HKEY_LOCAL_MACHINE\SOFTWARE\Interplay] - -[HKEY_LOCAL_MACHINE\SOFTWARE\Interplay\Dragon Dice] -"ApplicationPath"="d:\\games\\ddice\\" -"StarfleetDemo"=dword:00000001 -"GameInstalled"=dword:00000001 -"ZoomLevel"=dword:00000000 -"DieSortType"=dword:00000001 -"DisplayDieFaceType"=dword:00000000 -"DisplayRoll"=dword:00000001 -"DisplayBattle"=dword:00000001 -"DisplayDragonVsDragon"=dword:00000001 -"PlaySounds"=dword:00000001 -"PlayMusic"=dword:00000001 -"DemoMode"=dword:00000001 -"DisplayGameMessages"=dword:00000001 - -[HKEY_LOCAL_MACHINE\SOFTWARE\Interplay\Dragon Dice\1.0] - diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 8b9fb48..50dd839 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1330,4 +1330,12 @@ add: more logging in mciSendCommand - possibly some regression problem... fix: corrected clipping bug introduced in v2.03.93. fix: SetWindowLog hooker preventing to set DxWnd windowproc when not in fullscreen mode. Fixes "Nascar Racing 3" recursion and crash. fix: eliminated useless filter to suppress high resolutions detection in PREVENTMAXIMAZE mode -fix: fixed mciSendCommand wrapper log messages that could crash the program \ No newline at end of file +fix: fixed mciSendCommand wrapper log messages that could crash the program + +v2.03.95: +fix: fixed prototype for ICDrawBegin wrapper +add: extended logging for mci multimedia API +add: window position selector & "locked size" + "anchored" modes +fix: transient mode when system tray is not available +fix: recursion problem in kernel32 LoadLibrary* wrappers. Allows "Hot patch" on WinXP. +fix: initial position problem. diff --git a/dll/dwhide.cpp b/dll/dwhide.cpp index e888303..09f8b77 100644 --- a/dll/dwhide.cpp +++ b/dll/dwhide.cpp @@ -41,15 +41,15 @@ void gShowHideTaskBar(BOOL bHide /*=FALSE*/) // Code to Hide the System Task Bar rectWorkArea.bottom += (rectTaskBar.bottom - rectTaskBar.top); (*pSystemParametersInfoA)(SPI_SETWORKAREA, 0, (LPVOID)&rectWorkArea, 0); - ShowWindow(pWnd, SW_HIDE); - ShowWindow(pStart, SW_HIDE); + (*pShowWindow)(pWnd, SW_HIDE); + (*pShowWindow)(pStart, SW_HIDE); } else{ // Code to Show the System Task Bar rectWorkArea.bottom -= (rectTaskBar.bottom - rectTaskBar.top); (*pSystemParametersInfoA)(SPI_SETWORKAREA, 0, (LPVOID)&rectWorkArea, 0); - ShowWindow(pWnd, SW_SHOW); - ShowWindow(pStart, SW_SHOW); + (*pShowWindow)(pWnd, SW_SHOW); + (*pShowWindow)(pStart, SW_SHOW); } } diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 1b82994..168596c 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -78,7 +78,7 @@ static char *Flag2Names[32]={ "KEEPASPECTRATIO", "INIT8BPP", "FORCEWINRESIZE", "INIT16BPP", "KEEPCURSORFIXED", "DISABLEGAMMARAMP", "INDEPENDENTREFRESH", "FIXNCHITTEST", "LIMITFPS", "SKIPFPS", "SHOWFPS", "HIDEMULTIMONITOR", - "TIMESTRETCH", "HOOKOPENGL", "-------", "SHOWHWCURSOR", + "TIMESTRETCH", "HOOKOPENGL", "LOCKEDSIZE", "SHOWHWCURSOR", "GDISTRETCHED", "SHOWFPSOVERLAY", "FAKEVERSION", "FULLRECTBLT", "NOPALETTEUPDATE", "SUPPRESSIME", "NOBANNER", "WINDOWIZE", "LIMITRESOURCES", "STARTDEBUG", "SETCOMPATIBILITY", "WIREFRAME", @@ -136,7 +136,7 @@ static char *Flag7Names[32]={ "SSUPPRESSDIERRORS", "HOOKNORUN", "FIXBINDTEXTURE", "ENUM16BITMODES", "SHAREDKEYBOARD", "HOOKNOUPDATE", "HOOKGLUT32", "INITIALRES", "MAXIMUMRES", "LOCKCOLORDEPTH", "FIXSMACKLOOP", "FIXFREELIBRARY", - "", "", "", "", + "ANCHORED", "", "", "", }; static char *Flag8Names[32]={ @@ -1616,7 +1616,7 @@ void HookLibraryEx(HMODULE hModule, HookEntryEx_Type *Hooks, char *DLLName) ((dxw.dwFlags4 & HOTPATCHALWAYS) && (Hooks->HookStatus != HOOK_HOT_LINKED))) // force hot patch and not already hooked && Hooks->StoreAddress){ // and save ptr available - // Hot Patch - beware! This way yo're likely to hook unneeded libraries. + // Hot Patch - beware! This way you're likely to hook unneeded libraries. if(!Hooks->OriginalAddress) { if(!hDLL) { hDLL = (*pLoadLibraryA)(DLLName); diff --git a/dll/dxmapping.cpp b/dll/dxmapping.cpp index 2b29b3f..6abf839 100644 --- a/dll/dxmapping.cpp +++ b/dll/dxmapping.cpp @@ -410,6 +410,10 @@ void dxwCore::CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWP if(dxw.dwFlags4 & BILINEAR2XFILTER) MaxY <<= 1; // double } else{ + if((dxw.dwFlags2 & LOCKEDSIZE) || (dxw.dwFlags7 & ANCHORED)){ + iSizX = iSiz0X; + iSizY = iSiz0Y; + } MaxX = iSizX; MaxY = iSizY; } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index dbec457..d13cd06 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -126,8 +126,8 @@ void dxwCore::InitTarget(TARGETMAP *target) pTimeShifter = TimeShifterCoarse; pTimeShifter64 = TimeShifter64Coarse; } - iSizX = target->sizx; - iSizY = target->sizy; + iSiz0X = iSizX = target->sizx; + iSiz0Y = iSizY = target->sizy; iPosX = target->posx; iPosY = target->posy; iMaxW = target->resw; @@ -1013,6 +1013,8 @@ void dxwCore::ShowBanner(HWND hwnd) hClientDC=(*pGDIGetDC)(hwnd); (*pGetClientRect)(hwnd, &client); + //(*pInvalidateRect)((*pGetDesktopWindow)(), NULL, FALSE); // invalidate full desktop, no erase. + (*pInvalidateRect)(0, NULL, FALSE); // invalidate full desktop, no erase. (*pGDIBitBlt)(hClientDC, 0, 0, client.right, client.bottom, NULL, 0, 0, BLACKNESS); if(JustOnce || (dwFlags2 & NOBANNER)) return; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 7f79766..9d43712 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -176,6 +176,8 @@ public: // simple data variables long iPosY; long iSizX; long iSizY; + long iSiz0X; + long iSiz0Y; long iMaxW; long iMaxH; int iRatioX; diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index 73667a31cd45104a6492172da92f45d081e78fa6..1a299718fea858b3e7d7b2df016345753045dd78 100644 GIT binary patch delta 456 zcmajbF-yZh6bJDCH7j+SV$2Q=zA-6F) ztmJ6}^VH1BB?rjpczC%`u#|p=>xI2HD(=sx^bb?|@o2Mf|F)eIpaZ)qYIJJXM4x)r z6W=7nBIR~o?9wm)C2i%dXweb-Od-2N*KD8e*%f+c?`WL68*z!xn*oPtW1r(>^2UPC PIXm+om`nh-B3?&SS3^5ET3^_ok z$50N0Mw|WbDl;+epImysP7J#RlldNK;F1c&Ej0zV)OFlaQV(@-*_HTEbaKT*6-J%O zb04ZRE}2-X&nm{i!0=?^UVT<(Aj4p??jvKykjaUUoyiA*euEGbSrOmS@XgVqo}jXR_O4IoAD*3=A!kGat(X0PrJ%LjV8( diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 323cee6..caf94af 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.94.fx3" +#define VERSION "2.03.95" #define DDTHREADLOCK 1 //#define LOCKTHREADS @@ -59,6 +59,8 @@ BOOL APIENTRY DllMain( HANDLE hmodule, HANDLE hCurrentThread; if(dwreason == DLL_PROCESS_DETACH){ + //if(pInvalidateRect && pGetDesktopWindow) (*pInvalidateRect)((*pGetDesktopWindow)(), NULL, FALSE); // invalidate full desktop, no erase. + if(pInvalidateRect) (*pInvalidateRect)(0, NULL, FALSE); // invalidate full desktop, no erase. UnmapViewOfFile(pMapping); CloseHandle(hMapping); } 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 index 5c8cd337a5ef6ffda2f4a59bdd6635c198287b0c..40035cd8446fd5f8ae41c990175cb5033c95b98c 100644 GIT binary patch literal 88064 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≀VuQ`bnjI)M&MZ6^ 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 hook=%x\n", apiname, apiproc, orig_address, hookproc); return orig_address; #endif -} \ No newline at end of file +} \ No newline at end of file diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 4cd2989..3065f0d 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -521,12 +521,25 @@ LoadLibrary (hooking) related APIs HMODULE SysLibs[SYSLIBIDX_MAX]; -HMODULE WINAPI LoadLibraryExWrapper(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags, char *api) +HMODULE WINAPI LoadLibraryExWrapper(LPVOID lpFileName, BOOL IsWidechar, HANDLE hFile, DWORD dwFlags, char *api) { HMODULE libhandle; int idx; + // recursion control: this is necessary so far only on WinXP while other OS like Win7,8,10 don't get into + // recursion problems, but in any case better to leave it here, you never know .... + static BOOL Recursed = FALSE; - libhandle=(*pLoadLibraryExA)(lpFileName, hFile, dwFlags); + if(IsWidechar){ + OutTraceB("%s: file=%ls flags=%x\n", api, lpFileName, dwFlags); + libhandle=(*pLoadLibraryExW)((LPCWSTR)lpFileName, hFile, dwFlags); + } + else{ + OutTraceB("%s: file=%s flags=%x\n", api, lpFileName, dwFlags); + libhandle=(*pLoadLibraryExA)((LPCTSTR)lpFileName, hFile, dwFlags); + } + + if(Recursed) return libhandle; + Recursed = TRUE; // found in "The Rage" (1996): loading a module with relative path after a SetCurrentDirectory may fail, though // the module is present in the current directory folder. To fix this problem in case of failure it is possible @@ -534,14 +547,23 @@ HMODULE WINAPI LoadLibraryExWrapper(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFl if(!libhandle){ char lpBuffer[MAX_PATH+1]; GetCurrentDirectory(MAX_PATH, lpBuffer); + if(IsWidechar) + sprintf_s(lpBuffer, MAX_PATH, "%s/%ls", lpBuffer, lpFileName); + else sprintf_s(lpBuffer, MAX_PATH, "%s/%s", lpBuffer, lpFileName); - OutTrace("GHODEBUG: fullpath=\"%s\"\n", lpBuffer); + + OutTrace("LoadLibrary: RETRY fullpath=\"%s\"\n", lpBuffer); libhandle=(*pLoadLibraryExA)(lpBuffer, hFile, dwFlags); } + if(IsWidechar) + OutTraceDW("%s: FileName=%ls hFile=%x Flags=%x(%s) hmodule=%x\n", api, lpFileName, hFile, dwFlags, ExplainLoadLibFlags(dwFlags), libhandle); + else OutTraceDW("%s: FileName=%s hFile=%x Flags=%x(%s) hmodule=%x\n", api, lpFileName, hFile, dwFlags, ExplainLoadLibFlags(dwFlags), libhandle); + if(!libhandle){ OutTraceE("%s: ERROR FileName=%s err=%d\n", api, lpFileName, GetLastError()); + Recursed = FALSE; return libhandle; } @@ -549,46 +571,45 @@ HMODULE WINAPI LoadLibraryExWrapper(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFl // there's no symbol map, then itìs no possible to hook function calls. if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE|LOAD_LIBRARY_AS_DATAFILE)) return libhandle; + char *AnsiFileName; + if(IsWidechar){ + static char sFileName[256+1]; + wcstombs_s(NULL, sFileName, (LPCWSTR)lpFileName, 80); + AnsiFileName = sFileName; + } + else + AnsiFileName = (char *)lpFileName; + idx=dxw.GetDLLIndex((char *)lpFileName); if(idx != -1) { - OutTraceDW("%s: push idx=%x library=%s hdl=%x\n", api, idx, lpFileName, libhandle); + OutTraceDW("%s: push idx=%x library=%s hdl=%x\n", api, idx, AnsiFileName, libhandle); SysLibs[idx]=libhandle; } // handle custom OpenGL library - if(!lstrcmpi(lpFileName,dxw.CustomOpenGLLib)){ + if(!lstrcmpi(AnsiFileName,dxw.CustomOpenGLLib)){ idx=SYSLIBIDX_OPENGL; SysLibs[idx]=libhandle; } if (idx == -1) { - OutTraceDW("%s: hooking lib=\"%s\" handle=%x\n", api, lpFileName, libhandle); + OutTraceDW("%s: hooking lib=\"%s\" handle=%x\n", api, AnsiFileName, libhandle); HookModule(libhandle, 0); } + + Recursed = FALSE; return libhandle; } HMODULE WINAPI extLoadLibraryA(LPCTSTR lpFileName) -{ - return LoadLibraryExWrapper(lpFileName, NULL, 0, "LoadLibraryA"); -} +{ return LoadLibraryExWrapper((LPVOID)lpFileName, FALSE, NULL, 0, "LoadLibraryA"); } HMODULE WINAPI extLoadLibraryW(LPCWSTR lpFileName) -{ - char sFileName[256+1]; - wcstombs_s(NULL, sFileName, lpFileName, 80); - return LoadLibraryExWrapper(sFileName, NULL, 0, "LoadLibraryW");; -} +{ return LoadLibraryExWrapper((LPVOID)lpFileName, TRUE, NULL, 0, "LoadLibraryW"); } HMODULE WINAPI extLoadLibraryExA(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags) -{ - return LoadLibraryExWrapper(lpFileName, hFile, dwFlags, "LoadLibraryExA"); -} +{ return LoadLibraryExWrapper((LPVOID)lpFileName, FALSE, hFile, dwFlags, "LoadLibraryExA"); } HMODULE WINAPI extLoadLibraryExW(LPCWSTR lpFileName, HANDLE hFile, DWORD dwFlags) -{ - char sFileName[256+1]; - wcstombs_s(NULL, sFileName, lpFileName, 80); - return LoadLibraryExWrapper(sFileName, hFile, dwFlags, "LoadLibraryExW");; -} +{ return LoadLibraryExWrapper((LPVOID)lpFileName, TRUE, hFile, dwFlags, "LoadLibraryExW"); } extern DirectDrawCreate_Type pDirectDrawCreate; extern DirectDrawCreateEx_Type pDirectDrawCreateEx; diff --git a/dll/msvfw.cpp b/dll/msvfw.cpp index 5768d26..cc43fd6 100644 --- a/dll/msvfw.cpp +++ b/dll/msvfw.cpp @@ -10,9 +10,9 @@ #include "msvfwhook.h" #undef DXWDECLARATIONS -typedef DWORD (WINAPI *ICDrawBegin_Type)(HIC, DWORD, HPALETTE, HWND, HDC, int, int, int, int, LPBITMAPINFOHEADER, int, int, int, int, DWORD, DWORD); +typedef DWORD (WINAPIV *ICDrawBegin_Type)(HIC, DWORD, HPALETTE, HWND, HDC, int, int, int, int, LPBITMAPINFOHEADER, int, int, int, int, DWORD, DWORD); ICDrawBegin_Type pICDrawBegin = NULL; -DWORD WINAPI extICDrawBegin(HIC, DWORD, HPALETTE, HWND, HDC, int, int, int, int, LPBITMAPINFOHEADER, int, int, int, int, DWORD, DWORD); +DWORD WINAPIV extICDrawBegin(HIC, DWORD, HPALETTE, HWND, HDC, int, int, int, int, LPBITMAPINFOHEADER, int, int, int, int, DWORD, DWORD); typedef BOOL (WINAPI *DrawDibDraw_Type)(HDRAWDIB, HDC, int, int, int, int, LPBITMAPINFOHEADER, LPVOID, int, int, int, int, UINT); DrawDibDraw_Type pDrawDibDraw = NULL; BOOL WINAPI extDrawDibDraw(HDRAWDIB, HDC, int, int, int, int, LPBITMAPINFOHEADER, LPVOID, int, int, int, int, UINT); @@ -34,7 +34,7 @@ static HookEntryEx_Type Hooks[]={ //{HOOK_HOT_CANDIDATE, 0, "ICOpen", (FARPROC)NULL, (FARPROC *)&pICOpen, (FARPROC)extICOpen}, {HOOK_HOT_CANDIDATE, 0, "MCIWndCreateA", (FARPROC)NULL, (FARPROC *)&pMCIWndCreateA, (FARPROC)extMCIWndCreateA}, // "Man in Black" - beware: this is NOT STDCALL!!! {HOOK_HOT_CANDIDATE, 0, "ICGetDisplayFormat", (FARPROC)NULL, (FARPROC *)&pICGetDisplayFormat, (FARPROC)extICGetDisplayFormat}, // "Man in Black" - beware: this is NOT STDCALL!!! - {HOOK_HOT_CANDIDATE, 0, "ICDrawBegin", (FARPROC)NULL, (FARPROC *)&pICDrawBegin, (FARPROC)extICDrawBegin}, + {HOOK_HOT_CANDIDATE, 0, "ICDrawBegin", (FARPROC)NULL, (FARPROC *)&pICDrawBegin, (FARPROC)extICDrawBegin}, // AoE demo: not a STDCALL !! {HOOK_HOT_CANDIDATE, 0, "DrawDibDraw", (FARPROC)NULL, (FARPROC *)&pDrawDibDraw, (FARPROC)extDrawDibDraw}, {HOOK_HOT_CANDIDATE, 0, "DrawDibBegin", (FARPROC)NULL, (FARPROC *)&pDrawDibBegin, (FARPROC)extDrawDibBegin}, {HOOK_HOT_CANDIDATE, 0, "DrawDibStart", (FARPROC)NULL, (FARPROC *)&pDrawDibStart, (FARPROC)extDrawDibStart}, @@ -237,7 +237,7 @@ HIC WINAPI extICGetDisplayFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINF return ret; } -DWORD WINAPI extICDrawBegin(HIC hic, DWORD dwFlags, HPALETTE hpal, HWND hwnd, HDC hdc, int xDst, int yDst, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi, int xSrc, int ySrc, int dxSrc, int dySrc, DWORD dwRate, DWORD dwScale) +DWORD WINAPIV extICDrawBegin(HIC hic, DWORD dwFlags, HPALETTE hpal, HWND hwnd, HDC hdc, int xDst, int yDst, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi, int xSrc, int ySrc, int dxSrc, int dySrc, DWORD dwRate, DWORD dwScale) { OutTrace("ICDrawBegin\n"); @@ -253,6 +253,7 @@ BOOL WINAPI extDrawDibDraw(HDRAWDIB hdd, HDC hdc, int xDst, int yDst, int dxDst, ret = (*pDrawDibDraw)(hdd, hdc, xDst, yDst, dxDst, dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, wFlags); return ret; } + BOOL WINAPI extDrawDibBegin(HDRAWDIB hdd, HDC hdc, int dxDest, int dyDest, LPBITMAPINFOHEADER lpbi, int dxSrc, int dySrc, UINT wFlags) { // Reah game transitions diff --git a/dll/user32.cpp b/dll/user32.cpp index 76d0974..4ef1743 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -342,12 +342,11 @@ void HookUser32(HMODULE hModule) { HookLibraryEx(hModule, Hooks, libname); + HookLibraryEx(hModule, WinHooks, libname); + if (dxw.GDIEmulationMode != GDIMODE_NONE) HookLibraryEx(hModule, SyscallHooks, libname); if (dxw.dwFlags2 & GDISTRETCHED) HookLibraryEx(hModule, ScaledHooks, libname); - if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibraryEx(hModule, RemapHooks, libname); - //if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE)) HookLibraryEx(hModule, WinHooks, libname); - HookLibraryEx(hModule, WinHooks, libname); if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) HookLibraryEx(hModule, MouseHooks, libname); if (dxw.dwFlags3 & PEEKALLMESSAGES) HookLibraryEx(hModule, PeekAllHooks, libname); if (dxw.dwFlags2 & TIMESTRETCH) HookLibraryEx(hModule, TimeHooks, libname); @@ -370,14 +369,15 @@ FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; - if (dxw.dwFlags1 & CLIENTREMAPPING) if (addr=RemapLibraryEx(proc, hModule, RemapHooks)) return addr; - if (dxw.GDIEmulationMode != GDIMODE_NONE) if(addr=RemapLibraryEx(proc, hModule, SyscallHooks)) return addr; + if (addr=RemapLibraryEx(proc, hModule, WinHooks)) return addr; - if (dxw.dwFlags2 & GDISTRETCHED) + if (dxw.dwFlags1 & CLIENTREMAPPING) + if (addr=RemapLibraryEx(proc, hModule, RemapHooks)) return addr; + if (dxw.GDIEmulationMode != GDIMODE_NONE) + if(addr=RemapLibraryEx(proc, hModule, SyscallHooks)) return addr; + if (dxw.dwFlags2 & GDISTRETCHED) if (addr=RemapLibraryEx(proc, hModule, ScaledHooks)) return addr; - if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE)) - if (addr=RemapLibraryEx(proc, hModule, WinHooks)) return addr; - if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) + if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) if (addr=RemapLibraryEx(proc, hModule, MouseHooks)) return addr; if (dxw.dwFlags3 & PEEKALLMESSAGES) if (addr=RemapLibraryEx(proc, hModule, PeekAllHooks)) return addr; @@ -536,13 +536,31 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) 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); + OutTraceDW("%s: SET max size=(%dx%d)\n", ApiName, wp->cx, wp->cy); } - if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){ - dxw.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.IsFullScreen() && (hwnd==dxw.GethWnd())){ + if (dxw.dwFlags1 & LOCKWINPOS){ + dxw.CalculateWindowPos(hwnd, MaxX, MaxY, wp); + OutTraceDW("%s: LOCK pos=(%d,%d) size=(%dx%d)\n", ApiName, wp->x, wp->y, wp->cx, wp->cy); + } + // v2.03.95: locked size + if (dxw.dwFlags2 & LOCKEDSIZE){ + WINDOWPOS MaxPos; + dxw.CalculateWindowPos(hwnd, MaxX, MaxY, &MaxPos); + wp->cx = MaxPos.cx; + wp->cy = MaxPos.cy; + OutTraceDW("%s: SET locked size=(%dx%d)\n", ApiName, wp->cx, wp->cy); + } + if (dxw.dwFlags7 & ANCHORED){ + WINDOWPOS MaxPos; + dxw.CalculateWindowPos(hwnd, MaxX, MaxY, &MaxPos); + wp->cx = MaxPos.cx; + wp->cy = MaxPos.cy; + wp->x = MaxPos.x; + wp->y = MaxPos.y; + OutTraceDW("%s: SET anchored pos=(%d,%d) size=(%dx%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 @@ -739,6 +757,8 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow) { BOOL res; extern HWND hTrayWnd; + static long iLastSizX, iLastSizY; + //static long iLastPosX, iLastPosY; OutTraceDW("ShowWindow: hwnd=%x, CmdShow=%x(%s)\n", hwnd, nCmdShow, ExplainShowCmd(nCmdShow)); @@ -765,6 +785,25 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow) } res=(*pShowWindow)(hwnd, nCmdShow); + // v2.03.95: force zero size when minimize and drefresh window coordinates + if(hwnd == dxw.GethWnd()){ + if(nCmdShow==SW_MINIMIZE) { + iLastSizX = dxw.iSizX; + iLastSizY = dxw.iSizY; + //iLastPosX = dxw.iPosX; + //iLastPosY = dxw.iPosY; + dxw.iSizX = dxw.iSizY = 0; + } + else { + if((dxw.iSizX == 0) && (dxw.iSizY == 0)){ + dxw.iSizX = iLastSizX; + dxw.iSizY = iLastSizY; + //dxw.iPosX = iLastPosX; + //dxw.iPosY = iLastPosY; + } + } + } + //dxw.UpdateDesktopCoordinates(); OutTraceDW("ShowWindow: res=%x\n", res); return res; @@ -3012,12 +3051,33 @@ BOOL WINAPI extUpdateWindow(HWND hwnd) return ret; } +static char *sRedrawFlags(UINT flags) +{ + static char s[256]; + strcpy(s, "RDW_"); + if(flags & RDW_ERASE) strcat(s, "ERASE+"); + if(flags & RDW_FRAME) strcat(s, "FRAME+"); + if(flags & RDW_INTERNALPAINT) strcat(s, "INTERNALPAINT+"); + if(flags & RDW_INVALIDATE) strcat(s, "INVALIDATE+"); + if(flags & RDW_NOERASE) strcat(s, "NOERASE+"); + if(flags & RDW_NOFRAME) strcat(s, "NOFRAME+"); + if(flags & RDW_NOINTERNALPAINT) strcat(s, "NOINTERNALPAINT+"); + if(flags & RDW_VALIDATE) strcat(s, "VALIDATE+"); + if(flags & RDW_ERASENOW) strcat(s, "ERASENOW+"); + if(flags & RDW_UPDATENOW) strcat(s, "UPDATENOW+"); + if(flags & RDW_ALLCHILDREN) strcat(s, "ALLCHILDREN+"); + if(flags & RDW_NOCHILDREN) strcat(s, "NOCHILDREN+"); + if(strlen(s)>strlen("RDW_")) s[strlen(s)-1]=0; + else s[0]=0; + return s; +} + BOOL WINAPI extRedrawWindow(HWND hWnd, const RECT *lprcUpdate, HRGN hrgnUpdate, UINT flags) { RECT rcUpdate; BOOL ret; - OutTraceDW("RedrawWindow: hwnd=%x hrgn=%x flags=%x\n", hWnd, hrgnUpdate, flags); + OutTraceDW("RedrawWindow: hwnd=%x hrgn=%x flags=%x(%s)\n", hWnd, hrgnUpdate, flags, sRedrawFlags(flags)); // v2.03.64 fix: if hrgnUpdate is set, lprcUpdate is ignored, so it can't be scaled // beware: they both could be null, and that means the whole window diff --git a/dll/winmm.cpp b/dll/winmm.cpp index de489fb..ec9499c 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -40,6 +40,18 @@ MMRESULT WINAPI extjoyGetPos(DWORD, LPJOYINFO); typedef MMRESULT (WINAPI *auxGetNumDevs_Type)(void); auxGetNumDevs_Type pauxGetNumDevs = NULL; MMRESULT WINAPI extauxGetNumDevs(void); +typedef BOOL (WINAPI *mciGetErrorStringA_Type)(DWORD, LPCSTR, UINT); +mciGetErrorStringA_Type pmciGetErrorStringA; +BOOL WINAPI extmciGetErrorStringA(DWORD, LPCSTR, UINT); +typedef MMRESULT (WINAPI *mixerGetLineControlsA_Type)(HMIXEROBJ, LPMIXERLINECONTROLS, DWORD); +mixerGetLineControlsA_Type pmixerGetLineControlsA; +MMRESULT WINAPI extmixerGetLineControlsA(HMIXEROBJ, LPMIXERLINECONTROLS, DWORD); +typedef UINT (WINAPI *waveOutGetNumDevs_Type)(void); +waveOutGetNumDevs_Type pwaveOutGetNumDevs; +UINT WINAPI extwaveOutGetNumDevs(void); +typedef UINT (WINAPI *mixerGetNumDevs_Type)(void); +mixerGetNumDevs_Type pmixerGetNumDevs; +UINT WINAPI extmixerGetNumDevs(void); static HookEntryEx_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0, "mciSendCommandA", NULL, (FARPROC *)&pmciSendCommandA, (FARPROC)extmciSendCommandA}, @@ -71,12 +83,22 @@ static HookEntryEx_Type JoyHooks[]={ {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; +static HookEntryEx_Type DebugHooks[]={ + {HOOK_IAT_CANDIDATE, 0, "mciGetErrorStringA", NULL, (FARPROC *)&pmciGetErrorStringA, (FARPROC)extmciGetErrorStringA}, + {HOOK_IAT_CANDIDATE, 0, "mixerGetLineControlsA", NULL, (FARPROC *)&pmixerGetLineControlsA, (FARPROC)extmixerGetLineControlsA}, + {HOOK_IAT_CANDIDATE, 0, "waveOutGetNumDevs", NULL, (FARPROC *)&pwaveOutGetNumDevs, (FARPROC)extwaveOutGetNumDevs}, + {HOOK_IAT_CANDIDATE, 0, "auxGetNumDevs", NULL, (FARPROC *)&pauxGetNumDevs, (FARPROC)extauxGetNumDevs}, + {HOOK_IAT_CANDIDATE, 0, "mixerGetNumDevs", NULL, (FARPROC *)&pmixerGetNumDevs, (FARPROC)extmixerGetNumDevs}, + {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator +}; + void HookWinMM(HMODULE module, char *libname) { HookLibraryEx(module, Hooks, libname); if(dxw.dwFlags2 & TIMESTRETCH) HookLibraryEx(module, TimeHooks, libname); if(dxw.dwFlags5 & REMAPMCI) HookLibraryEx(module, RemapHooks, libname); if(dxw.dwFlags6 & VIRTUALJOYSTICK) HookLibraryEx(module, JoyHooks, libname); + if(IsDebug) HookLibraryEx(module, DebugHooks, libname); } FARPROC Remap_WinMM_ProcAddress(LPCSTR proc, HMODULE hModule) @@ -90,6 +112,8 @@ FARPROC Remap_WinMM_ProcAddress(LPCSTR proc, HMODULE hModule) if (addr=RemapLibraryEx(proc, hModule, RemapHooks)) return addr; if(dxw.dwFlags6 & VIRTUALJOYSTICK) if (addr=RemapLibraryEx(proc, hModule, JoyHooks)) return addr; + if(IsDebug) + if (addr=RemapLibraryEx(proc, hModule, DebugHooks)) return addr; return NULL; } @@ -651,9 +675,42 @@ static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) DeleteDC(hdcMem); } -// dangerous thing to do: it interferes with "Imperialism II" !!! MMRESULT WINAPI extauxGetNumDevs(void) { - OutTraceDW("auxGetNumDevs: returning fake 1\n"); - return 1; + UINT ret; + ret = (*pauxGetNumDevs)(); + OutTrace("auxGetNumDevs: ret=%d\n", ret); + return ret; +} + +BOOL WINAPI extmciGetErrorStringA(DWORD fdwError, LPCSTR lpszErrorText, UINT cchErrorText) +{ + BOOL ret; + ret = (*pmciGetErrorStringA)(fdwError, lpszErrorText, cchErrorText); + OutTrace("mciGetErrorStringA: ret=%x err=%d text=(%d)\"%s\"\n", ret, fdwError, cchErrorText, lpszErrorText); + return ret; +} + +MMRESULT WINAPI extmixerGetLineControlsA(HMIXEROBJ hmxobj, LPMIXERLINECONTROLS pmxlc, DWORD fdwControls) +{ + MMRESULT ret; + ret = (*pmixerGetLineControlsA)(hmxobj, pmxlc, fdwControls); + OutTrace("mixerGetLineControlsA: ret=%x hmxobj=%x Controls=%x\n", ret, hmxobj, fdwControls); + return ret; +} + +UINT WINAPI extwaveOutGetNumDevs(void) +{ + UINT ret; + ret = (*pwaveOutGetNumDevs)(); + OutTrace("waveOutGetNumDevs: ret=%d\n", ret); + return ret; +} + +UINT WINAPI extmixerGetNumDevs(void) +{ + UINT ret; + ret = (*pmixerGetNumDevs)(); + OutTrace("mixerGetNumDevs: ret=%d\n", ret); + return ret; } diff --git a/host/TabDirect3D.cpp b/host/TabDirect3D.cpp index d1956d1..3bbf77a 100644 --- a/host/TabDirect3D.cpp +++ b/host/TabDirect3D.cpp @@ -35,6 +35,10 @@ void CTabDirect3D::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt); DDX_Check(pDX, IDC_ENUM16BITMODES, cTarget->m_Enum16bitModes); + // Direct3D window tweaks + DDX_Check(pDX, IDC_FIXD3DFRAME, cTarget->m_FixD3DFrame); + DDX_Check(pDX, IDC_NOWINDOWMOVE, cTarget->m_NoWindowMove); + // Texture management DDX_Radio(pDX, IDC_TEXTURENONE, cTarget->m_TextureHandling); diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp index 997d962..71ff946 100644 --- a/host/TabWindow.cpp +++ b/host/TabWindow.cpp @@ -32,26 +32,24 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX) // window management DDX_Check(pDX, IDC_FIXWINFRAME, cTarget->m_FixWinFrame); DDX_Check(pDX, IDC_PREVENTMAXIMIZE, cTarget->m_PreventMaximize); - DDX_Check(pDX, IDC_LOCKWINPOS, cTarget->m_LockWinPos); DDX_Check(pDX, IDC_LOCKWINSTYLE, cTarget->m_LockWinStyle); DDX_Check(pDX, IDC_FIXPARENTWIN, cTarget->m_FixParentWin); DDX_Check(pDX, IDC_MODALSTYLE, cTarget->m_ModalStyle); DDX_Check(pDX, IDC_FORCEWINRESIZE, cTarget->m_ForceWinResize); DDX_Check(pDX, IDC_HIDEMULTIMONITOR, cTarget->m_HideMultiMonitor); - //DDX_Check(pDX, IDC_WALLPAPERMODE, cTarget->m_WallpaperMode); DDX_Check(pDX, IDC_RECOVERSCREENMODE, cTarget->m_RecoverScreenMode); DDX_Check(pDX, IDC_REFRESHONRESIZE, cTarget->m_RefreshOnResize); - DDX_Check(pDX, IDC_FIXD3DFRAME, cTarget->m_FixD3DFrame); - DDX_Check(pDX, IDC_NOWINDOWMOVE, cTarget->m_NoWindowMove); DDX_Check(pDX, IDC_HIDETASKBAR, cTarget->m_HideTaskbar); DDX_Check(pDX, IDC_UNLOCKZORDER, cTarget->m_UnlockZOrder); DDX_Check(pDX, IDC_NODESTROYWINDOW, cTarget->m_NoDestroyWindow); DDX_Check(pDX, IDC_ACTIVATEAPP, cTarget->m_ActivateApp); + DDX_Radio(pDX, IDC_FREEMOVE, cTarget->m_WinMovementType); + // color management DDX_Radio(pDX, IDC_COLORCURRENT, cTarget->m_InitColorDepth); DDX_Check(pDX, IDC_DISABLEGAMMARAMP, cTarget->m_DisableGammaRamp); - DDX_Check(pDX, IDC_FORCE16BPP, cTarget->m_Force16BPP); + //DDX_Check(pDX, IDC_FORCE16BPP, cTarget->m_Force16BPP); DDX_Check(pDX, IDC_LOCKSYSCOLORS, cTarget->m_LockSysColors); DDX_Check(pDX, IDC_LOCKRESERVEDPALETTE, cTarget->m_LockReservedPalette); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 6f994d4..1d10baa 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -174,17 +174,15 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_GDIColorConv = FALSE; m_PreventMaximize = FALSE; m_ClientRemapping = TRUE; // default true !! - m_LockWinPos = FALSE; m_LockWinStyle = FALSE; m_FixParentWin = FALSE; m_ModalStyle = FALSE; m_KeepAspectRatio = FALSE; m_ForceWinResize = FALSE; m_HideMultiMonitor = FALSE; - //m_WallpaperMode = FALSE; m_FixD3DFrame = FALSE; m_NoWindowMove = FALSE; - m_Force16BPP = FALSE; + //m_Force16BPP = FALSE; m_HookChildWin = FALSE; m_MessageProc = FALSE; //m_NoMouseProc = FALSE; @@ -250,6 +248,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_InitTS = 8; m_SwapEffect = 0; m_InjectionMode = 0; + m_WinMovementType = 0; //}}AFX_DATA_INIT } diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 164f87d..6fa1328 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -40,6 +40,7 @@ public: int m_SlowRatio; int m_LogMode; int m_MonitorId; + int m_WinMovementType; BOOL m_HookDI; BOOL m_HookDI8; BOOL m_EmulateRelMouse; @@ -135,14 +136,12 @@ public: BOOL m_GDIColorConv; BOOL m_PreventMaximize; BOOL m_ClientRemapping; - BOOL m_LockWinPos; BOOL m_LockWinStyle; BOOL m_FixParentWin; BOOL m_ModalStyle; BOOL m_KeepAspectRatio; BOOL m_ForceWinResize; BOOL m_HideMultiMonitor; - //BOOL m_WallpaperMode; BOOL m_FixD3DFrame; BOOL m_NoWindowMove; BOOL m_HookChildWin; @@ -253,7 +252,7 @@ public: BOOL m_BlackWhite; BOOL m_SuppressD3DExt; BOOL m_Enum16bitModes; - BOOL m_Force16BPP; + //BOOL m_Force16BPP; BOOL m_LimitScreenRes; BOOL m_InitialRes; BOOL m_MaximumRes; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 53f67572a92d7db5536318f10ed259e8129b4b01..674fbb24b001631c5c9ae37fbadb3db28940e317 100644 GIT binary patch delta 5970 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 delta 4822 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 diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp index c4dd3be..acbb58c 100644 --- a/host/dxwndhost.cpp +++ b/host/dxwndhost.cpp @@ -64,6 +64,8 @@ void CNewCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast) // /e -- terminates (Ends) the active dxwnd session // /r: -- run the n-th game in configuration and terminate together with it // /a -- auto-hide mode while a game is running + // /q -- quiet mode, no error/message dialog boxes + if(bFlag) { CString sParam(lpszParam); if (sParam.MakeLower() == "t"){ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 6ec6f9e299971ba6dea3809cfe53e7af1bf9ab49..56ce0ec3b9e33590843857cce65cd156a1ee2449 100644 GIT binary patch delta 639 zcmY*WOK4M35S>Y0<4Yo?@lz{=G)aF5t-P1-bCH;mO6k3XM zAko~S&V7v2@=^i1BWWQGfNG(8C+(PSMnc?PAc2HtPJE zHl~Y0D|b9DYa(yutf@Bh2vHV#4-agvHk0c`d-3=37?NJG6{o%zB%{gh|GSnC{Ny8$$%Pu#)@F=mnqG4i^FKmcMC>k){&31`?A++M z#^Q}b3f$1i#|k>3vVvo)d{@h7(w`5YvdxiTry6ir-$*2y1Dy}@hh&csG z8veA4s~XLHaJmkuV5D`QfMMBUQNYN&u7KOA30%;*--I%xO z+fAT}Wzep0+iHG6saX^hl(b8tHxtBLyz|a^_uO;2`*Gvtkue=g(Aa7tGYJ)@j6HSZ zB3H5sz3iX~JIV2IN@~1{)Q3$$0*Ug9o5gletXzS4SfH748_BOm62DtXJ@HVf(52L( zfnvF1US{Afw>I?a)M{R*Sf~|c-GXKd5$zLs@-n#|6&>#tWfF@KEdnh)$)rY2lq*KH zx8MeeUD(l2S5GNDqold_(cry_P7?}mmbLN7i$Md0lLhqA#Cd1t>^Y3wMKmvi72M#3 z9tiMbg%C4uVFUZwMvM!6P*5txE8=;wDouNZ({&aV9_3@up4cAe-z z4;wz@IM$6V`bZh)OWL4Ct7!)boV=d|ZPYZ`o@svf3A*3|&%cnJ^HcI;UE|4GYNWvD ZorZ-D@aoy8OO|SFH5+f`>$ftdEx$HEp27eC 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 index 59b8477f3a93e37c4d3c025f49361adc67b3e369..e6386958c0f37cf90cc91f38b4f4002aa147882e 100644 GIT binary patch delta 5487 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 BYghmP delta 5615 zcma)=d2m(b8OFbJw}g<53t0#Ok`Qh}0^#03LINS)K*A0}bVkQgp%P@o075euAb2kz zma-`1bvhJL5rkF|&|F2QgG@l&cRJd!ik4}|(Tcc0>rVPSm-o_d{HOhrllM8l^L+bq z4n)tnqUT)O!;brjhTC19OFcb3a?Evo8pUK|%oJQxWnE3qj`_o5E$(C|JzVZSw|nGi z$Bie^>twa(WqB?qB++D#w0nQ-KN5H_t^!;vqzG{Yu8?f=m8U)r71SrOQ@%PU^KUP- zwcqggx04@w^_GtV9pBW+iL{`ElQ%hyQrJAo`)jkpEQmS1E_l7$kgrp|OMf-B7z#zl zlf3OImWvtp6(xI4x>CqTxQqh>Q_Yg|p34diYLzE4bE6=`u>b(rqf4{4}D2BjDn*2B;u@ z8e~b|_v{`?q+f%(&=~1iGQKOT-EsaQtFqsem(pt_n$zfI&-%&PtiE!_lPec0lX&ihVc?+lcA0}3UWS0NRJ{#bY62A9vtL_U9_lvrEwYcBDR@Jn;y zQVEx=kZ543lPX6_21|EoSTe(nvS*UV$&ie^IWjBIPb!9W?hBVWGNCyj)20?nN?Em5 zImm;VGZJlD>}1Nbla@PvSvzH3?C9{7F6TB`7r3S~7?soG2RSJyY$kfy57-GbV66_4 zXE!eCtPD#q?3Y==TyHW;YL#_agJa>!s8=fU%4APrc4tk2vt0^n26(x6cW~v)^)&@M z<`>A$nht4nL)J)ZZE9+K_30nEv$jKmv6&m| zS=Z?JFljj25@u=JaCt`mpEY+|9j4<^f_hcE#FVjLs7rEWEuIk846}_acPpTocdg}% zLh~)RK^aeiUqLh7r3|ALF}rZX*X?}@S>SGE_bX$jhoIev`;@VP2ci2T93&qY%%{acDPUx5Zvi_M$RY{0=mJ&AZC@COS!g^qw;651`$M zA1dQ}w{adsoR5ff841UdjV%wofp zRah)?2?a5Q6jG0dW`Wfft5a65j18O#%`@f~mhVRO&9{7upt(L;E#I=szKB_F8E=O! zgmJaSI+U%oSX9|YWyoSSL9@}DE#FRPHt<1nRmDqleJh4`g1?vk&R zeXWcIo`q(*sEm0taiDOA^+DwNU|zqnNMD6uCL5Zq&Q-?DqoFy3Rm!~3)yl>wqi+T@ zzd&ay^Fq&3cC|A4Zh{_zxZpC2#9Py%aG@IU+$@G>V_KDQ_*X(#BSw^Q@2`g*g1Eu* zZH8u}wuj~h9Ua%jP{iKYIIS$R#qm0^%*0IA$h+GR18nbaj zZ;nEqW-e%^fy$^0p_zGz#fB*>x7b)^b;?-B6lm5lO&RN`3GnsWB zpvw@KE90=^$kN|mL84Ttt2R#?7~(EJxt z$nw>yZ`>6h=D$vj^$J;W6Eu(8Nmq=zE z==l8aP{;y5!Vq$vI+d|^_e1mh?g3>i@IhsJlnn;kt@>e&%zHq6e^AD}e^mAeV*LA$ znfI&VkVf|8Ff@M66UvymOW9M(_~rbJ>TZjjQ2nw-miG$uP{h}jp}dHBL*d&B@!Y%v z%|-YZWgM=Lp_#r>#sX7IFMt1~A#xqDf$7RJl+pKl&D%#A%j*Z7%kdwi5X=-qv*Lhd zoC;kB)@HHw&|DvPD&sEMq-?V?ZqJ?2_%*wf)k1Go_5c~`kAHydRd_&+Y~dry4l83N zZ$k5v{C$g^RraaH{sqnCLMu5kEUycUujn*oEH9FY8y474Ay2&`&77?a$n=Ni$P7@% z0;{08cB++es}`%Sv3%3iH{J5pUecufy?4oFtC`vWA12fs_51 zvct;Qnx|DCv)Hq$Pikak&p~rtJgxcTwn3i0hPbSl27tpbW_T i7Mcrci!yGPt*Y<6;`12uyRy9p((!*&;aK>|Zs$M3&iyd} diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 8d3a3c6..fe73bd6 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -302,6 +302,13 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) case 3: t->tflags |= (OUTTRACE|OUTSEPARATED); break; } + switch(dlg->m_WinMovementType){ + case 0: break; + case 1: t->flags |= LOCKWINPOS; break; + case 2: t->flags |= LOCKWINPOS; t->flags2 |= LOCKEDSIZE; break; + case 3: t->flags |= LOCKWINPOS; t->flags7 |= ANCHORED; break; + } + if(dlg->m_HookDI) t->flags |= HOOKDI; if(dlg->m_HookDI8) t->flags |= HOOKDI8; if(dlg->m_EmulateRelMouse) t->flags6 |= EMULATERELMOUSE; @@ -419,17 +426,15 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_GDIColorConv) t->flags5 |= GDICOLORCONV; if(dlg->m_PreventMaximize) t->flags |= PREVENTMAXIMIZE; if(dlg->m_ClientRemapping) t->flags |= CLIENTREMAPPING; - if(dlg->m_LockWinPos) t->flags |= LOCKWINPOS; if(dlg->m_LockWinStyle) t->flags |= LOCKWINSTYLE; if(dlg->m_FixParentWin) t->flags |= FIXPARENTWIN; if(dlg->m_ModalStyle) t->flags2 |= MODALSTYLE; if(dlg->m_KeepAspectRatio) t->flags2 |= KEEPASPECTRATIO; if(dlg->m_ForceWinResize) t->flags2 |= FORCEWINRESIZE; if(dlg->m_HideMultiMonitor) t->flags2 |= HIDEMULTIMONITOR; -// if(dlg->m_WallpaperMode) t->flags2 |= WALLPAPERMODE; if(dlg->m_FixD3DFrame) t->flags3 |= FIXD3DFRAME; if(dlg->m_NoWindowMove) t->flags3 |= NOWINDOWMOVE; - if(dlg->m_Force16BPP) t->flags3 |= FORCE16BPP; + //if(dlg->m_Force16BPP) t->flags3 |= FORCE16BPP; if(dlg->m_HookChildWin) t->flags |= HOOKCHILDWIN; if(dlg->m_MessageProc) t->flags |= MESSAGEPROC; //if(dlg->m_NoMouseProc) t->flags6 |= NOMOUSEPROC; @@ -589,6 +594,11 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) if(t->tflags & ERASELOGFILE) dlg->m_LogMode = 1; if(t->tflags & OUTSEPARATED) dlg->m_LogMode = 3; + dlg->m_WinMovementType = 0; + if(t->flags & LOCKWINPOS) dlg->m_WinMovementType = 1; + if(t->flags2 & LOCKEDSIZE) dlg->m_WinMovementType = 2; + if(t->flags7 & ANCHORED) dlg->m_WinMovementType = 3; + dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0; dlg->m_HookDI8 = t->flags & HOOKDI8 ? 1 : 0; dlg->m_EmulateRelMouse = t->flags6 & EMULATERELMOUSE ? 1 : 0; @@ -706,17 +716,15 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_GDIColorConv = t->flags5 & GDICOLORCONV ? 1 : 0; dlg->m_PreventMaximize = t->flags & PREVENTMAXIMIZE ? 1 : 0; dlg->m_ClientRemapping = t->flags & CLIENTREMAPPING ? 1 : 0; - dlg->m_LockWinPos = t->flags & LOCKWINPOS ? 1 : 0; dlg->m_LockWinStyle = t->flags & LOCKWINSTYLE ? 1 : 0; dlg->m_FixParentWin = t->flags & FIXPARENTWIN ? 1 : 0; dlg->m_ModalStyle = t->flags2 & MODALSTYLE ? 1 : 0; dlg->m_KeepAspectRatio = t->flags2 & KEEPASPECTRATIO ? 1 : 0; dlg->m_ForceWinResize = t->flags2 & FORCEWINRESIZE ? 1 : 0; dlg->m_HideMultiMonitor = t->flags2 & HIDEMULTIMONITOR ? 1 : 0; - //dlg->m_WallpaperMode = t->flags2 & WALLPAPERMODE ? 1 : 0; dlg->m_FixD3DFrame = t->flags3 & FIXD3DFRAME ? 1 : 0; dlg->m_NoWindowMove = t->flags3 & NOWINDOWMOVE ? 1 : 0; - dlg->m_Force16BPP = t->flags3 & FORCE16BPP ? 1 : 0; + //dlg->m_Force16BPP = t->flags3 & FORCE16BPP ? 1 : 0; dlg->m_HookChildWin = t->flags & HOOKCHILDWIN ? 1 : 0; dlg->m_MessageProc = t->flags & MESSAGEPROC ? 1 : 0; dlg->m_FixNCHITTEST = t->flags2 & FIXNCHITTEST ? 1 : 0; @@ -2271,6 +2279,24 @@ void CDxwndhostView::OnClearAllLogs() _unlink(FilePath); } +DWORD WINAPI SilentUpdate(CSystemTray *Tray) +{ + int DxStatus; + int IdleCount; + IdleCount=0; + while (TRUE) { + // once a second ... + Sleep(1000); + DxStatus=GetHookStatus(NULL); + if (DxStatus != DXW_RUNNING){ + IdleCount++; + if(IdleCount >= 2) exit(0); + } + else { + IdleCount=0; + } + } +} DWORD WINAPI TrayIconUpdate(CSystemTray *Tray) { @@ -2359,6 +2385,8 @@ void CDxwndhostView::OnGoToTrayIcon() "DxWnd", NIIF_INFO, 10)){ MessageBoxLang(DXW_STRING_TRAYFAIL, DXW_STRING_ERROR, MB_OK); + // error path: if can't create a system tray icon, transient logic must be silently placed here + if (gTransientMode) StatusThread= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SilentUpdate, (LPVOID)NULL, 0, &dwThrdId); return; } IconId=(menu->GetMenuState(ID_HOOK_START, MF_BYCOMMAND)==MF_CHECKED)?IDI_DXWAIT:IDI_DXIDLE; diff --git a/host/resource b/host/resource index c2ab1e74e7dfeeb28169db8bfcb1d84b72559b26..dde3f7fee6cc72db2144db147c3456eec7ab03c2 100644 GIT binary patch delta 117 zcmZqs&orx%d4rwu=2^-ISSQ;l+ibSdY{=qvV+dk!1wvm2|H=QEbSE1yvoM-X4iu6H zD&d&?PLgeMgR#;iMh=j~Q)>49*N54E_v3liyb=PrlH?H@V11VX|K*-{cdM TbtXTU#4)c^nh