diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 18e8142..1fdaa57 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -150,7 +150,7 @@ #define DIABLOTWEAK 0x00000001 // ... ??? ... #define CLEARTARGET 0x00000002 // forces a D3D clean on target surface upon each BeginScene invocation #define NOWINPOSCHANGES 0x00000004 // suppress WM_WINDOWPOSCHANGING/CHANGED messages (RollerCoaster Tycoon...) -//#define NOSYSTEMMEMORY 0x00000008 // forces suppression of DDSCAPS_SYSTEMMEMORY capability on surfaces +#define ANSIWIDE 0x00000008 // by default uses Widechar version of API intead od ANSI #define NOBLT 0x00000010 // suppress blit to primary surface //#define NOSYSTEMEMULATED 0x00000020 // forces suppression of DDSCAPS_SYSTEMMEMORY capability on emulated front & backbuffer surfaces #define DOFASTBLT 0x00000040 // use FastBlt to primary surface diff --git a/build/dxwnd.dll b/build/dxwnd.dll index f2b647a..2bcf3a2 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c352a420894e9be21d4b1a04c665e7e463d533be4c54b70201c90db2702ef994 -size 643584 +oid sha256:537e48142d49baefcb73703effbe1cbdf7577aa64e9326adac8f4fe6dfe99958 +size 644096 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 66e542e..133d6a3 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b9bf619ccedb715b22ab6deee04a4182be6f76f31f702ac1e2ff1bb172447e49 -size 556032 +oid sha256:9f4fdbf4310c5fd473a72b37e4fcc5c30f5f12f4537a238748890b2b9ce38b43 +size 557056 diff --git a/build/exports/A10 Cuba.dxw b/build/exports/A10 Cuba.dxw index 9052c32..34a202f 100644 --- a/build/exports/A10 Cuba.dxw +++ b/build/exports/A10 Cuba.dxw @@ -27,3 +27,9 @@ notes0= flagj0=128 winver0=0 maxres0=0 +registry0= +flagk0=65536 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Divine Divinity (GOG).dxw b/build/exports/Divine Divinity (GOG).dxw index e5d9c81..080a18d 100644 --- a/build/exports/Divine Divinity (GOG).dxw +++ b/build/exports/Divine Divinity (GOG).dxw @@ -7,10 +7,10 @@ opengllib0= notes0= ver0=1 coord0=0 -flag0=683687970 +flag0=683687978 flagg0=2013265920 flagh0=20 -flagi0=675282948 +flagi0=138412036 flagj0=4224 tflag0=0 initx0=0 @@ -30,3 +30,6 @@ maxres0=-1 registry0= flagk0=65536 swapeffect0=0 +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Drakan Order of the Flame (10th anniversary).dxw b/build/exports/Drakan Order of the Flame (10th anniversary).dxw new file mode 100644 index 0000000..a24040c --- /dev/null +++ b/build/exports/Drakan Order of the Flame (10th anniversary).dxw @@ -0,0 +1,29 @@ +[target] +title0=Drakan Order of the Flame (10th anniversary) +path0=D:\Games\drakan\drakan.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=740311126 +flagg0=1476395008 +flagh0=20 +flagi0=203423748 +flagj0=4224 +flagk0=268500994 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Fallout.dxw b/build/exports/Fallout.dxw index 2d93619..cc25df4 100644 --- a/build/exports/Fallout.dxw +++ b/build/exports/Fallout.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=1 coord0=0 flag0=134217762 -flagg0=1744830464 +flagg0=1207959552 flagh0=20 -flagi0=4194308 +flagi0=71303172 tflag0=0 initx0=0 inity0=0 diff --git a/build/exports/Fifa 99 (Direct3D).dxw b/build/exports/Fifa 99 (Direct3D).dxw index 9ebbd8a..06f35d7 100644 --- a/build/exports/Fifa 99 (Direct3D).dxw +++ b/build/exports/Fifa 99 (Direct3D).dxw @@ -4,12 +4,12 @@ path0=D:\Games\Fifa 99\fifa99.exe launchpath0= module0= opengllib0= -ver0=7 +ver0=0 coord0=0 flag0=671105058 flagg0=1207959552 flagh0=20 -flagi0=138412036 +flagi0=205520900 flagj0=128 tflag0=0 initx0=0 @@ -30,3 +30,6 @@ notes0= flagk0=65536 swapeffect0=0 registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Fighting Force.dxw b/build/exports/Fighting Force.dxw index cec77f1..7fad0fb 100644 --- a/build/exports/Fighting Force.dxw +++ b/build/exports/Fighting Force.dxw @@ -6,11 +6,11 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134218272 +flag0=134218274 flagg0=1207959552 flagh0=20 flagi0=138412036 -flagj0=128 +flagj0=67108992 tflag0=0 initx0=0 inity0=0 @@ -26,3 +26,10 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +notes0= +registry0= +flagk0=65536 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Genocide (ORIGINAL).dxw b/build/exports/Genocide (ORIGINAL).dxw index bb51d25..0167945 100644 --- a/build/exports/Genocide (ORIGINAL).dxw +++ b/build/exports/Genocide (ORIGINAL).dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134218272 +flag0=134218274 flagg0=1207959552 flagh0=20 flagi0=4194308 @@ -27,5 +27,9 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Genocide (REMIXED VERSION).dxw b/build/exports/Genocide (REMIXED VERSION).dxw index 7a5c76f..a926854 100644 --- a/build/exports/Genocide (REMIXED VERSION).dxw +++ b/build/exports/Genocide (REMIXED VERSION).dxw @@ -9,7 +9,7 @@ flag0=134217762 flagg0=1207959552 flagh0=20 flagi0=4194308 -tflag0=6402 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -27,5 +27,9 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Grand Theft Auto 3 Vice City.dxw b/build/exports/Grand Theft Auto 3 Vice City.dxw new file mode 100644 index 0000000..ac741d8 --- /dev/null +++ b/build/exports/Grand Theft Auto 3 Vice City.dxw @@ -0,0 +1,29 @@ +[target] +title0=Grand Theft Auto 3: Vice City +path0=D:\Games\GTA3ViceCity\gta-vc.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=-2011168218 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Gunbound.dxw b/build/exports/Gunbound.dxw new file mode 100644 index 0000000..1129ee7 --- /dev/null +++ b/build/exports/Gunbound.dxw @@ -0,0 +1,29 @@ +[target] +title0=Gunbound +path0=D:\Games\GunBound\GunGame.gme +launchpath0=D:\Games\GunBound\Launcher.exe +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314922 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Mechwarrior 3.dxw b/build/exports/Mechwarrior 3.dxw new file mode 100644 index 0000000..ebafe25 --- /dev/null +++ b/build/exports/Mechwarrior 3.dxw @@ -0,0 +1,29 @@ +[target] +title0=Mechwarrior 3 +path0=D:\Games\Mechwarrior 3 (full)\Mech3.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0=\n[HKEY_LOCAL_MACHINE\Software]\n[HKEY_LOCAL_MACHINE\Software\MicroProse]\n[HKEY_LOCAL_MACHINE\Software\MicroProse\MechWarrior 3 EP1]\n[HKEY_LOCAL_MACHINE\Software\MicroProse\MechWarrior 3 EP1\1.0]\n"Program"="..\\"\n"Version"="1.0"\n"InstallOptions"=dword:00050707\n\n[HKEY_LOCAL_MACHINE\Software\Microsoft]\n[HKEY_LOCAL_MACHINE\Software\Microsoft\DirectPlay]\n[HKEY_LOCAL_MACHINE\Software\Microsoft\DirectPlay\Applications]\n[HKEY_LOCAL_MACHINE\Software\Microsoft\DirectPlay\Applications\MechWarrior 3 EP1]\n"Guid"="{FA96C421-18DD-11D3-95AF-0060089877F0}"\n"File"="Mech3.exe"\n"CommandLine"="\n"Path"=".\\"\n"CurrentDirectory"=".\\"\n\n +ver0=0 +coord0=0 +flag0=136331398 +flagg0=1207959552 +flagh0=9236 +flagi0=1277165574 +flagj0=4224 +flagk0=65600 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Resident Evil (sw mode).dxw b/build/exports/Resident Evil (sw mode).dxw index b1a61be..8bf63b4 100644 --- a/build/exports/Resident Evil (sw mode).dxw +++ b/build/exports/Resident Evil (sw mode).dxw @@ -12,7 +12,7 @@ flagg0=1744830592 flagh0=20 flagi0=138412036 flagj0=4224 -tflag0=6403 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -27,3 +27,9 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +registry0= +flagk0=65536 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Runaway.dxw b/build/exports/Runaway.dxw index 76dc15d..eba2660 100644 --- a/build/exports/Runaway.dxw +++ b/build/exports/Runaway.dxw @@ -8,9 +8,9 @@ notes0= registry0= ver0=0 coord0=0 -flag0=136314912 +flag0=136331296 flagg0=1207959552 -flagh0=20 +flagh0=262164 flagi0=138412038 flagj0=266368 flagk0=65536 diff --git a/build/exports/Tomb Raider - Anniversary Demo.dxw b/build/exports/Tomb Raider - Anniversary Demo.dxw new file mode 100644 index 0000000..767948c --- /dev/null +++ b/build/exports/Tomb Raider - Anniversary Demo.dxw @@ -0,0 +1,29 @@ +[target] +title0=Tomb Raider - Anniversary Demo +path0=D:\Games\Tomb Raider - Anniversary Demo\tra.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4232 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Wind Fantasy SP.dxw b/build/exports/Wind Fantasy SP.dxw index b423bd3..425e4c8 100644 --- a/build/exports/Wind Fantasy SP.dxw +++ b/build/exports/Wind Fantasy SP.dxw @@ -6,11 +6,11 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134218272 +flag0=134218274 flagg0=1207959552 flagh0=20 flagi0=4194308 -tflag0=64 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -26,3 +26,10 @@ initts0=0 winver0=0 maxres0=-1 flagj0=4224 +notes0= +registry0= +flagk0=0 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini new file mode 100644 index 0000000..213d79a --- /dev/null +++ b/build/exports/dxwnd.ini @@ -0,0 +1,35 @@ +[window] +posx=981 +posy=578 +sizx=320 +sizy=200 +exportpath=D:\DxWnd\exports\ +[target] +title0=Imperialism +path0=D:\Games\Imperialism\Imperialism.exe +launchpath0= +module0= +opengllib0= +notes0=Note:\nMap zooming is currently not workind. Do not click on the magnifying glass, \nor the game will crash. +registry0= +ver0=0 +coord0=0 +flag0=1746935851 +flagg0=1207959553 +flagh0=20 +flagi0=4194308 +flagj0=128 +flagk0=262144 +flagl0=4 +flagm0=0 +tflag0=-2147477245 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 2cd24df..e9836f5 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1081,5 +1081,11 @@ fix: added CDS_UPDATEREGISTRY to the ChangeDisplaySettings modes to be neutraliz v2.03.62 fix: flag "Intercept Alt-F4 key" now working also alone with no need to set "Enable hot keys" fix: file open dialogs initialization on WinXP platform -fix: hooked ANSI & WIDECHAR version of DirectInput8Create: makes "Gooka the Mystery of Janatris" working. +fix: hooked ANSI & WIDECHAR version of DirectInput8CreateDevice: makes "Gooka the Mystery of Janatris" working. fix: rebuild up-to-date dxwnd proxies + +v2.03.63 +fix: saved config changes in case DxWnd is restarted for acquiring admin caps +fix: duplicated several function pointers in D3D8/9 wrappers: fix some GTA3 crashes and reduce the need to suppress Reset operation +add: flag "Widechar program vs. ANSI" to replace default ansi calls with widechar equivalents: fixes "Tomb Raider Anniversary" mouse problems + diff --git a/build/v2_03_63_fix3_build.rar b/build/v2_03_63_fix3_build.rar new file mode 100644 index 0000000..ddd3f53 Binary files /dev/null and b/build/v2_03_63_fix3_build.rar differ diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index b5929d5..8817830 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -3978,13 +3978,13 @@ HRESULT WINAPI extSetPalette(SetPalette_Type pSetPalette, LPDIRECTDRAWSURFACE lp HRESULT WINAPI extSetPalette1(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) { return extSetPalette(pSetPalette1, lpdds, lpddp); } HRESULT WINAPI extSetPalette2(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) -{ return extSetPalette(pSetPalette1, lpdds, lpddp); } +{ return extSetPalette(pSetPalette2, lpdds, lpddp); } HRESULT WINAPI extSetPalette3(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) -{ return extSetPalette(pSetPalette1, lpdds, lpddp); } +{ return extSetPalette(pSetPalette3, lpdds, lpddp); } HRESULT WINAPI extSetPalette4(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) -{ return extSetPalette(pSetPalette1, lpdds, lpddp); } +{ return extSetPalette(pSetPalette4, lpdds, lpddp); } HRESULT WINAPI extSetPalette7(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) -{ return extSetPalette(pSetPalette1, lpdds, lpddp); } +{ return extSetPalette(pSetPalette7, lpdds, lpddp); } HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dwstart, DWORD dwcount, LPPALETTEENTRY lpentries) { diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index a5c22e1..3faa977 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -29,6 +29,8 @@ dxwCore dxw; dxwSStack dxwss; dxwWStack dxwws; dxwSDC sdc; +GetWindowLong_Type pGetWindowLong; +SetWindowLong_Type pSetWindowLong; extern LRESULT CALLBACK MessageHook(int, WPARAM, LPARAM); @@ -99,7 +101,7 @@ static char *Flag4Names[32]={ }; static char *Flag5Names[32]={ - "DIABLOTWEAK", "CLEARTARGET", "NOWINPOSCHANGES", "**", + "DIABLOTWEAK", "CLEARTARGET", "NOWINPOSCHANGES", "ANSIWIDE", "NOBLT", "**", "DOFASTBLT", "AEROBOOST", "QUARTERBLT", "NOIMAGEHLP", "BILINEARFILTER", "REPLACEPRIVOPS", "REMAPMCI", "TEXTUREHIGHLIGHT", "TEXTUREDUMP", "TEXTUREHACK", @@ -564,8 +566,8 @@ void CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWPOS wp) RECT UnmappedRect; UnmappedRect=rect; - dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); + dwStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); + dwExStyle=(*pGetWindowLong)(hwnd, GWL_EXSTYLE); // BEWARE: from MSDN - If the window is a child window, the return value is undefined. hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd); AdjustWindowRectEx(&rect, dwStyle, (hMenu!=NULL), dwExStyle); @@ -624,7 +626,7 @@ void HookWindowProc(HWND hwnd) if(dxw.dwFlags6 & NOWINDOWHOOKS) return; - pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); + pWindowProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC); // don't hook twice .... if ((pWindowProc == extWindowProc) || (pWindowProc == extChildWindowProc) || diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 6b8f715..d2ac7ef 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -137,6 +137,12 @@ void dxwCore::InitTarget(TARGETMAP *target) if (dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED; if (dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED; if (dwFlags6 & SHAREDDC) GDIEmulationMode = GDIMODE_SHAREDDC; + + extern GetWindowLong_Type pGetWindowLong; + extern SetWindowLong_Type pSetWindowLong; + // made before hooking !!! + pGetWindowLong = (dwFlags5 & ANSIWIDE) ? GetWindowLongW : GetWindowLongA; + pSetWindowLong = (dwFlags5 & ANSIWIDE) ? SetWindowLongW : SetWindowLongA; } void dxwCore::SetScreenSize(void) @@ -1516,7 +1522,7 @@ void dxwCore::FixWindowFrame(HWND hwnd) OutTraceDW("FixWindowFrame: hwnd=%x\n", hwnd); - nOldStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); + nOldStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); if (!nOldStyle){ OutTraceE("FixWindowFrame: GetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); return; @@ -1553,7 +1559,7 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) lpSS->styleNew= WS_OVERLAPPEDWINDOW; } if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value - lpSS->styleNew= (*pGetWindowLongA)(hwnd, GWL_STYLE); + lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_STYLE); } if (dxw.dwFlags1 & PREVENTMAXIMIZE){ // disable maximize settings if (lpSS->styleNew & WS_MAXIMIZE){ @@ -1569,7 +1575,7 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) lpSS->styleNew= 0; } if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value - lpSS->styleNew= (*pGetWindowLongA)(hwnd, GWL_EXSTYLE); + lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_EXSTYLE); } if ((dxw.dwFlags1 & PREVENTMAXIMIZE) && (hwnd==hWnd)){ // disable maximize settings if (lpSS->styleNew & WS_EX_TOPMOST){ diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 3cfcd9a..6c37661 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -372,3 +372,5 @@ typedef enum { typedef HRESULT (WINAPI *ColorConversion_Type)(int, LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); extern ColorConversion_Type pColorConversion; extern void ToggleAcquiredDevices(BOOL); +extern GetWindowLong_Type pGetWindowLong; +extern SetWindowLong_Type pSetWindowLong; \ No newline at end of file diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index bce8911..d24a3f8 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.62.fix2" +#define VERSION "2.03.63" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index d61afda..d8b0e53 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index ddc03bc..f830f4b 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -56,7 +57,8 @@ typedef HRESULT (WINAPI *CheckDeviceFormat_Type)(void *, UINT, D3DDEVTYPE, D3DFO typedef HRESULT (WINAPI *CheckDeviceMultiSampleType_Type)(void *, UINT, D3DDEVTYPE, D3DFORMAT, BOOL, D3DMULTISAMPLE_TYPE, DWORD *); typedef HRESULT (WINAPI *CheckDepthStencilMatch_Type)(void *, UINT, D3DDEVTYPE, D3DFORMAT, D3DFORMAT, D3DFORMAT); typedef HRESULT (WINAPI *CheckDeviceFormatConversion_Type)(void *, UINT, D3DDEVTYPE, D3DFORMAT, D3DFORMAT); -typedef HRESULT (WINAPI *D3DGetDeviceCaps_Type)(void *, UINT, D3DDEVTYPE, D3DCAPS9 *); +typedef HRESULT (WINAPI *D3DGetDeviceCaps8_Type)(void *, UINT, D3DDEVTYPE, D3DCAPS8 *); +typedef HRESULT (WINAPI *D3DGetDeviceCaps9_Type)(void *, UINT, D3DDEVTYPE, D3DCAPS9 *); typedef HMONITOR (WINAPI *GetAdapterMonitor_Type)(void *, UINT); typedef HRESULT (WINAPI *CreateDevice_Type)(void *, UINT, D3DDEVTYPE, HWND, DWORD, void *, void **); typedef HRESULT (WINAPI *CreateDeviceEx_Type)(void *, UINT, D3DDEVTYPE, HWND, DWORD, void *, D3DDISPLAYMODEEX *, void **); @@ -73,10 +75,11 @@ HRESULT WINAPI extCheckDeviceFormat(void *, UINT, D3DDEVTYPE, D3DFORMAT, DWORD, HRESULT WINAPI extCheckDeviceMultiSampleType(void *, UINT, D3DDEVTYPE, D3DFORMAT, BOOL, D3DMULTISAMPLE_TYPE, DWORD *); HRESULT WINAPI extCheckDepthStencilMatch(void *, UINT, D3DDEVTYPE, D3DFORMAT, D3DFORMAT, D3DFORMAT); HRESULT WINAPI extCheckDeviceFormatConversion(void *, UINT, D3DDEVTYPE, D3DFORMAT, D3DFORMAT); -HRESULT WINAPI extD3DGetDeviceCaps8(void *, UINT, D3DDEVTYPE, D3DCAPS9 *); +HRESULT WINAPI extD3DGetDeviceCaps8(void *, UINT, D3DDEVTYPE, D3DCAPS8 *); HRESULT WINAPI extD3DGetDeviceCaps9(void *, UINT, D3DDEVTYPE, D3DCAPS9 *); HMONITOR WINAPI extGetAdapterMonitor(void *, UINT); -HRESULT WINAPI extCreateDevice(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, void **); +HRESULT WINAPI extCreateDevice8(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, void **); +HRESULT WINAPI extCreateDevice9(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, void **); HRESULT WINAPI extCreateDeviceEx(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, D3DDISPLAYMODEEX *, void **); RegisterSoftwareDevice_Type pRegisterSoftwareDevice = 0; @@ -90,7 +93,8 @@ CheckDeviceFormat_Type pCheckDeviceFormat = 0; CheckDeviceMultiSampleType_Type pCheckDeviceMultiSampleType = 0; CheckDepthStencilMatch_Type pCheckDepthStencilMatch = 0; CheckDeviceFormatConversion_Type pCheckDeviceFormatConversion = 0; -D3DGetDeviceCaps_Type pD3DGetDeviceCaps = 0; +D3DGetDeviceCaps8_Type pD3DGetDeviceCaps8 = 0; +D3DGetDeviceCaps9_Type pD3DGetDeviceCaps9 = 0; GetAdapterMonitor_Type pGetAdapterMonitor = 0; CreateDevice_Type pCreateDevice8 = 0; CreateDevice_Type pCreateDevice9 = 0; @@ -133,7 +137,8 @@ void WINAPI extSetCursorPosition9(void *, int, int, DWORD); void WINAPI extSetCursorPosition8(void *, int, int, DWORD); BOOL WINAPI extShowCursor8(void *, BOOL); BOOL WINAPI extShowCursor9(void *, BOOL); -HRESULT WINAPI extCreateAdditionalSwapChain(void *, D3DPRESENT_PARAMETERS *, IDirect3DSwapChain9 **); +HRESULT WINAPI extCreateAdditionalSwapChain8(void *, D3DPRESENT_PARAMETERS *, IDirect3DSwapChain9 **); +HRESULT WINAPI extCreateAdditionalSwapChain9(void *, D3DPRESENT_PARAMETERS *, IDirect3DSwapChain9 **); HRESULT WINAPI extGetSwapChain(void *, UINT, IDirect3DSwapChain9**); UINT WINAPI extGetNumberOfSwapChains(void *); HRESULT WINAPI extBeginStateBlock8(void *); @@ -158,7 +163,8 @@ SetCursorPosition9_Type pSetCursorPosition9 = 0; SetCursorPosition8_Type pSetCursorPosition8 = 0; ShowCursor8_Type pShowCursor8 = 0; ShowCursor9_Type pShowCursor9 = 0; -CreateAdditionalSwapChain_Type pCreateAdditionalSwapChain = 0; +CreateAdditionalSwapChain_Type pCreateAdditionalSwapChain8 = 0; +CreateAdditionalSwapChain_Type pCreateAdditionalSwapChain9 = 0; GetSwapChain_Type pGetSwapChain = 0; GetNumberOfSwapChains_Type pGetNumberOfSwapChains = 0; BeginStateBlock_Type pBeginStateBlock8 = 0; @@ -239,12 +245,14 @@ HRESULT WINAPI extEnumAdapterModes8(void *, UINT, UINT , D3DDISPLAYMODE *); HRESULT WINAPI extEnumAdapterModes9(void *, UINT, D3DFORMAT, UINT , D3DDISPLAYMODE *); HRESULT WINAPI extGetAdapterDisplayMode8(void *, UINT, D3DDISPLAYMODE *); HRESULT WINAPI extGetAdapterDisplayMode9(void *, UINT, D3DDISPLAYMODE *); -HRESULT WINAPI extPresent(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *); +HRESULT WINAPI extPresent8(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *); +HRESULT WINAPI extPresent9(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *); HRESULT WINAPI extSetRenderState(void *, D3DRENDERSTATETYPE, DWORD); HRESULT WINAPI extGetRenderState(void *, D3DRENDERSTATETYPE, DWORD); HRESULT WINAPI extGetViewport(void *, D3DVIEWPORT9 *); HRESULT WINAPI extSetViewport(void *, D3DVIEWPORT9 *); -HRESULT WINAPI extReset(void *, D3DPRESENT_PARAMETERS *); +HRESULT WINAPI extReset8(void *, D3DPRESENT_PARAMETERS *); +HRESULT WINAPI extReset9(void *, D3DPRESENT_PARAMETERS *); void WINAPI extSetGammaRamp(void *, UINT, DWORD, D3DGAMMARAMP *); void WINAPI extGetGammaRamp(void *, UINT, D3DGAMMARAMP *); ULONG WINAPI extAddRef9(void *); @@ -286,7 +294,8 @@ EnumAdapterModes8_Type pEnumAdapterModes8 = 0; EnumAdapterModes9_Type pEnumAdapterModes9 = 0; GetAdapterDisplayMode_Type pGetAdapterDisplayMode8 = 0; GetAdapterDisplayMode_Type pGetAdapterDisplayMode9 = 0; -Present_Type pPresent = 0; +Present_Type pPresent8 = 0; +Present_Type pPresent9 = 0; SetRenderState_Type pSetRenderState = 0; GetRenderState_Type pGetRenderState = 0; GetViewport_Type pGetViewport = 0; @@ -300,7 +309,8 @@ BeginScene_Type pBeginScene8 = 0; EndScene_Type pEndScene8 = 0; BeginScene_Type pBeginScene9 = 0; EndScene_Type pEndScene9 = 0; -Reset_Type pReset = 0; +Reset_Type pReset8 = 0; +Reset_Type pReset9 = 0; SetTexture8_Type pSetTexture8 = 0; SetTexture9_Type pSetTexture9 = 0; @@ -486,9 +496,9 @@ void HookD3DDevice8(void** ppD3Ddev8) SetHook((void *)(**(DWORD **)ppD3Ddev8 + 32), extGetDisplayMode8, (void **)&pGetDisplayMode8, "GetDisplayMode(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 44), extSetCursorPosition8, (void **)&pSetCursorPosition8, "SetCursorPosition(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 48), extShowCursor8, (void **)&pShowCursor8, "ShowCursor(D8)"); - SetHook((void *)(**(DWORD **)ppD3Ddev8 + 52), extCreateAdditionalSwapChain, (void **)&pCreateAdditionalSwapChain, "CreateAdditionalSwapChain(D8)"); - SetHook((void *)(**(DWORD **)ppD3Ddev8 + 56), extReset, (void **)&pReset, "Reset(D8)"); - SetHook((void *)(**(DWORD **)ppD3Ddev8 + 60), extPresent, (void **)&pPresent, "Present(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 52), extCreateAdditionalSwapChain8, (void **)&pCreateAdditionalSwapChain8, "CreateAdditionalSwapChain(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 56), extReset8, (void **)&pReset8, "Reset(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 60), extPresent8, (void **)&pPresent8, "Present(D8)"); if(dxw.dwFlags2 & DISABLEGAMMARAMP){ SetHook((void *)(**(DWORD **)ppD3Ddev8 + 72), extSetGammaRamp, (void **)&pSetGammaRamp, "SetGammaRamp(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 76), extGetGammaRamp, (void **)&pGetGammaRamp, "GetGammaRamp(D8)"); @@ -528,11 +538,11 @@ void HookD3DDevice9(void** ppD3Ddev9) SetHook((void *)(**(DWORD **)ppD3Ddev9 + 32), extGetDisplayMode9, (void **)&pGetDisplayMode9, "GetDisplayMode(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 44), extSetCursorPosition9, (void **)&pSetCursorPosition9, "SetCursorPosition(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 48), extShowCursor9, (void **)&pShowCursor9, "ShowCursor(D9)"); - SetHook((void *)(**(DWORD **)ppD3Ddev9 + 52), extCreateAdditionalSwapChain, (void **)&pCreateAdditionalSwapChain, "CreateAdditionalSwapChain(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 52), extCreateAdditionalSwapChain9, (void **)&pCreateAdditionalSwapChain9, "CreateAdditionalSwapChain(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 56), extGetSwapChain, (void **)&pGetSwapChain, "GetSwapChain(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 60), extGetNumberOfSwapChains, (void **)&pGetNumberOfSwapChains, "extGetNumberOfSwapChains(D9)"); - SetHook((void *)(**(DWORD **)ppD3Ddev9 + 64), extReset, (void **)&pReset, "Reset(D9)"); - SetHook((void *)(**(DWORD **)ppD3Ddev9 + 68), extPresent, (void **)&pPresent, "Present(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 64), extReset9, (void **)&pReset9, "Reset(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 68), extPresent9, (void **)&pPresent9, "Present(D9)"); if(dxw.dwFlags2 & DISABLEGAMMARAMP){ SetHook((void *)(**(DWORD **)ppD3Ddev9 + 84), extSetGammaRamp, (void **)&pSetGammaRamp, "SetGammaRamp(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 88), extGetGammaRamp, (void **)&pGetGammaRamp, "GetGammaRamp(D9)"); @@ -595,8 +605,8 @@ void HookDirect3D8(void *lpd3d) SetHook((void *)(*(DWORD *)lpd3d + 20), extGetAdapterIdentifier8, (void **)&pGetAdapterIdentifier8, "GetAdapterIdentifier(D8)"); SetHook((void *)(*(DWORD *)lpd3d + 28), extEnumAdapterModes8, (void **)&pEnumAdapterModes8, "EnumAdapterModes(D8)"); SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode8, (void **)&pGetAdapterDisplayMode8, "GetAdapterDisplayMode(D8)"); - SetHook((void *)(*(DWORD *)lpd3d + 52), extD3DGetDeviceCaps8, (void **)&pD3DGetDeviceCaps, "GetDeviceCaps(D8)"); - SetHook((void *)(*(DWORD *)lpd3d + 60), extCreateDevice, (void **)&pCreateDevice8, "CreateDevice(D8)"); + SetHook((void *)(*(DWORD *)lpd3d + 52), extD3DGetDeviceCaps8, (void **)&pD3DGetDeviceCaps8, "GetDeviceCaps(D8)"); + SetHook((void *)(*(DWORD *)lpd3d + 60), extCreateDevice8, (void **)&pCreateDevice8, "CreateDevice(D8)"); } BOOL WINAPI extDisableD3DSpy(void) @@ -629,8 +639,8 @@ void HookDirect3D9(void *lpd3d, BOOL ex) SetHook((void *)(*(DWORD *)lpd3d + 20), extGetAdapterIdentifier9, (void **)&pGetAdapterIdentifier9, "GetAdapterIdentifier(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 28), extEnumAdapterModes9, (void **)&pEnumAdapterModes9, "EnumAdapterModes(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode9, (void **)&pGetAdapterDisplayMode9, "GetAdapterDisplayMode(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 56), extD3DGetDeviceCaps9, (void **)&pD3DGetDeviceCaps, "GetDeviceCaps(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 64), extCreateDevice, (void **)&pCreateDevice9, "CreateDevice(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 56), extD3DGetDeviceCaps9, (void **)&pD3DGetDeviceCaps9, "GetDeviceCaps(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 64), extCreateDevice9, (void **)&pCreateDevice9, "CreateDevice(D9)"); if(ex) SetHook((void *)(*(DWORD *)lpd3d + 80), extCreateDeviceEx, (void **)&pCreateDeviceEx, "CreateDeviceEx(D9)"); //if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; //SetHook((void *)(*(DWORD *)lpd3d + 12), extRegisterSoftwareDevice, (void **)&pRegisterSoftwareDevice, "RegisterSoftwareDevice(D9)"); @@ -751,13 +761,14 @@ static char *ExplainSwapEffect(DWORD f) return s; } -HRESULT WINAPI extReset(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) +static HRESULT WINAPI extReset(int dwD3DVersion, void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) { HRESULT res; DWORD param[64], *tmp; D3DDISPLAYMODE mode; DWORD Windowed; void *pD3D; + Reset_Type pReset; memcpy(param, pPresParam, (dwD3DVersion == 9)?56:52); dxw.SetScreenSize(param[0], param[1]); @@ -784,6 +795,7 @@ HRESULT WINAPI extReset(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) } Windowed = (dwD3DVersion == 8) ? param[7] : param[8]; + pReset = (dwD3DVersion == 8) ? pReset8 : pReset9; if(dxw.Windowize){ if(Windowed) { // do not attempt to reset when returning to windowed mode: it is useless (you are windowed already) @@ -876,7 +888,12 @@ HRESULT WINAPI extReset(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) return D3D_OK; } -HRESULT WINAPI extPresent(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) +HRESULT WINAPI extReset8(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) +{ return extReset(8, pd3dd, pPresParam); } +HRESULT WINAPI extReset9(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) +{ return extReset(9, pd3dd, pPresParam); } + +static HRESULT WINAPI extPresent(Present_Type pPresent, void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) { HRESULT res; RECT RemappedSrcRect, RemappedDstRect; @@ -916,6 +933,11 @@ HRESULT WINAPI extPresent(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDes return res; } +HRESULT WINAPI extPresent8(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) +{ return extPresent(pPresent8, pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); } +HRESULT WINAPI extPresent9(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) +{ return extPresent(pPresent9, pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); } + HRESULT WINAPI extGetDisplayMode8(void *lpd3d, D3DDISPLAYMODE *pMode) { HRESULT res; @@ -1045,14 +1067,14 @@ HWND FixD3DWindowFrame(HWND hFocusWin) return hRetWnd; } -HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, - HWND hfocuswindow, DWORD behaviorflags, D3DPRESENT_PARAMETERS *ppresentparam, void **ppd3dd) +static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, + HWND hfocuswindow, DWORD behaviorflags, D3DPRESENT_PARAMETERS *ppresentparam, void **ppd3dd, int dwD3DVersion) { HRESULT res; DWORD param[64], *tmp; D3DDISPLAYMODE mode; - OutTraceD3D("CreateDevice: D3DVersion=%d lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n", + OutTraceD3D("CreateDevice(%d): lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n", dwD3DVersion, lpd3d, adapter, hfocuswindow, behaviorflags, ppresentparam->BackBufferWidth, ppresentparam->BackBufferHeight); memcpy(param, ppresentparam, (dwD3DVersion == 9)?56:52); @@ -1180,6 +1202,12 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, return 0; } +HRESULT WINAPI extCreateDevice8(void *lpd3d, UINT adapter, D3DDEVTYPE dt, HWND hfw, DWORD bf, D3DPRESENT_PARAMETERS *ppp, void **ppd3dd) +{ return extCreateDevice(lpd3d, adapter, dt, hfw, bf, ppp, ppd3dd, 8); } +HRESULT WINAPI extCreateDevice9(void *lpd3d, UINT adapter, D3DDEVTYPE dt, HWND hfw, DWORD bf, D3DPRESENT_PARAMETERS *ppp, void **ppd3dd) +{ return extCreateDevice(lpd3d, adapter, dt, hfw, bf, ppp, ppd3dd, 9); } + + HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, HWND hfocuswindow, DWORD behaviorflags, D3DPRESENT_PARAMETERS *ppresentparam, D3DDISPLAYMODEEX *pFullscreenDisplayMode, void **ppd3dd) { @@ -1335,13 +1363,20 @@ HRESULT WINAPI extSetViewport(void *pd3dd, D3DVIEWPORT9 *pViewport) return (*pSetViewport)(pd3dd, pViewport); } -HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3dd, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **ppSwapChain) +static HRESULT WINAPI extCreateAdditionalSwapChain(int dwD3DVersion, void *lpd3dd, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **ppSwapChain) { HRESULT res, res2; DWORD param[64], *tmp; D3DDISPLAYMODE mode; + CreateAdditionalSwapChain_Type pCreateAdditionalSwapChain; + Reset_Type pReset; + GetAdapterDisplayMode_Type pGetAdapterDisplayMode; - OutTraceD3D("CreateAdditionalSwapChain: d3d=%x\n", lpd3dd); + OutTraceD3D("CreateAdditionalSwapChain(%d): d3d=%x\n", dwD3DVersion, lpd3dd); + + pCreateAdditionalSwapChain = (dwD3DVersion == 8) ? pCreateAdditionalSwapChain8 : pCreateAdditionalSwapChain9; + pReset = (dwD3DVersion == 8) ? pReset8 : pReset9; + pGetAdapterDisplayMode = (dwD3DVersion == 8) ? pGetAdapterDisplayMode8 : pGetAdapterDisplayMode9; memcpy(param, pPresentationParameters, (dwD3DVersion == 9)?56:52); dxw.SetScreenSize(param[0], param[1]); @@ -1368,10 +1403,8 @@ HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3dd, D3DPRESENT_PARAMETERS OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++)); } - if (dwD3DVersion == 9) - res2=(*pGetAdapterDisplayMode9)(lpd3dd, D3DADAPTER_DEFAULT, &mode); - else - res2=(*pGetAdapterDisplayMode8)(lpd3dd, D3DADAPTER_DEFAULT, &mode); + res2=(*pGetAdapterDisplayMode)(lpd3dd, D3DADAPTER_DEFAULT, &mode); + if(res2==DD_OK){ OutTraceD3D(" Current Format = 0x%x\n", mode.Format); OutTraceD3D(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height); @@ -1431,6 +1464,11 @@ HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3dd, D3DPRESENT_PARAMETERS return res; } +HRESULT WINAPI extCreateAdditionalSwapChain8(void *lpd3dd, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **ppSwapChain) +{ return extCreateAdditionalSwapChain(8, lpd3dd, pPresentationParameters, ppSwapChain); } +HRESULT WINAPI extCreateAdditionalSwapChain9(void *lpd3dd, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **ppSwapChain) +{ return extCreateAdditionalSwapChain(9, lpd3dd, pPresentationParameters, ppSwapChain); } + // to do: // hook SetCursorPosition ShowCursor to handle cursor @@ -1952,7 +1990,12 @@ HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceT { HRESULT res; OutTraceD3D("GetDeviceCaps(%d): d3d=%x adapter=%d devtype=%x(%s)\n", version, lpd3d, Adapter, DeviceType, ExplainD3D9DeviceType(DeviceType)); - res=(*pD3DGetDeviceCaps)(lpd3d, Adapter, DeviceType, pCaps); + + if(version == 8) + res=(*pD3DGetDeviceCaps8)(lpd3d, Adapter, DeviceType, (D3DCAPS8 *)pCaps); + else + res=(*pD3DGetDeviceCaps9)(lpd3d, Adapter, DeviceType, pCaps); + if(res){ OutTraceE("GetDeviceCaps: ERROR: err=%x\n", res); } @@ -2091,12 +2134,12 @@ HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceT return res; } -HRESULT WINAPI extD3DGetDeviceCaps8(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) +HRESULT WINAPI extD3DGetDeviceCaps8(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS8 *pCaps) { - return extD3DGetDeviceCaps(lpd3d, Adapter, DeviceType, pCaps, 8); + return extD3DGetDeviceCaps(lpd3d, Adapter, DeviceType, (D3DCAPS9 *)pCaps, 8); } -HRESULT WINAPI extD3DGetDeviceCaps9(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) +HRESULT WINAPI extD3DGetDeviceCaps9(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9 *pCaps) { return extD3DGetDeviceCaps(lpd3d, Adapter, DeviceType, pCaps, 9); } diff --git a/dll/user32.cpp b/dll/user32.cpp index 19f2c16..c09ede2 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -488,11 +488,11 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) RECT client, full; LONG dwStyle, dwExStyle; HMENU hMenu; - extern GetWindowLong_Type pGetWindowLongA; + extern GetWindowLong_Type pGetWindowLong; (*pGetClientRect)(hwnd, &client); full=client; - dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); + dwStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); + dwExStyle=(*pGetWindowLong)(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){}; @@ -531,8 +531,8 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) HMENU hMenu; int minx, miny; wrect = dxw.GetScreenRect(); - dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); + dwStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); + dwExStyle=(*pGetWindowLong)(hwnd, GWL_EXSTYLE); hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd); AdjustWindowRectEx(&wrect, dwStyle, (hMenu!=NULL), dwExStyle); minx = wrect.right - wrect.left; @@ -724,7 +724,7 @@ 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 WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLong_Type pSetWindowLong, GetWindowLong_Type pGetWindowLong) { LONG res; @@ -735,11 +735,11 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon if(dxw.dwFlags1 & LOCKWINSTYLE){ if(nIndex==GWL_STYLE){ OutTraceDW("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong); - return (*pGetWindowLongA)(hwnd, nIndex); + return (*pGetWindowLong)(hwnd, nIndex); } if(nIndex==GWL_EXSTYLE){ OutTraceDW("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong); - return (*pGetWindowLongA)(hwnd, nIndex); + return (*pGetWindowLong)(hwnd, nIndex); } } @@ -781,7 +781,7 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon } // end of GPL fix - OldProc = (WNDPROC)(*pGetWindowLongA)(hwnd, nIndex); + OldProc = (WNDPROC)(*pGetWindowLong)(hwnd, nIndex); // v2.02.70 fix if((OldProc==extWindowProc) || (OldProc==extChildWindowProc)|| @@ -790,11 +790,11 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); res=(LONG)OldProc; SetLastError(0); - lres=(WNDPROC)(*pSetWindowLongA)(hwnd, nIndex, (LONG)extWindowProc); + lres=(WNDPROC)(*pSetWindowLong)(hwnd, nIndex, (LONG)extWindowProc); if(!lres && GetLastError())OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } else { - res=(*pSetWindowLongA)(hwnd, nIndex, dwNewLong); + res=(*pSetWindowLong)(hwnd, nIndex, dwNewLong); } OutTraceDW("SetWindowLong: hwnd=%x, nIndex=%x, Val=%x, res=%x\n", hwnd, nIndex, dwNewLong, res); @@ -803,12 +803,12 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon LONG WINAPI extSetWindowLongA(HWND hwnd, int nIndex, LONG dwNewLong) { - return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongA); + return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongA, pGetWindowLongA); } LONG WINAPI extSetWindowLongW(HWND hwnd, int nIndex, LONG dwNewLong) { - return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongW); + return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongW, pGetWindowLongW); } BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags) @@ -832,7 +832,7 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c r.right = X + cx; r.top = Y; r.bottom = Y + cy; - if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){ + if ((*pGetWindowLong)(hwnd, GWL_STYLE) & WS_CHILD){ r = dxw.MapClientRect(&r); } else { @@ -884,8 +884,8 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c RECT rect; rect.top=rect.left=0; rect.right=cx; rect.bottom=cy; - dwCurStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); + dwCurStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); + dwExStyle=(*pGetWindowLong)(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); @@ -1386,7 +1386,7 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName) if(dxw.dwFlags6 & NOWINDOWHOOKS) return; - pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); + pWindowProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC); if((pWindowProc == extWindowProc) || (pWindowProc == extChildWindowProc) || (pWindowProc == extDialogWindowProc)){ // avoid recursions @@ -1402,11 +1402,11 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName) 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); + res=(*pSetWindowLong)(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); + res=(*pSetWindowLong)(hwnd, GWL_WNDPROC, (LONG)extDialogWindowProc); } if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError()); } @@ -1612,8 +1612,8 @@ static HWND WINAPI extCreateWindowCommon( 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); + (*pSetWindowLong)(hwnd, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW); + (*pSetWindowLong)(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); @@ -2360,7 +2360,7 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT if( lpDialogFunc && !(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug option dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc); - if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) + if(!(*pSetWindowLong)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } @@ -2384,7 +2384,7 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW if( lpDialogFunc && !(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug option dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc); - if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) + if(!(*pSetWindowLong)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } @@ -2417,7 +2417,7 @@ BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL BOOL isChild; (*pClientToScreen)(dxw.GethWnd(),&upleft); (*pGetClientRect)(dxw.GethWnd(),&client); - if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){ + if ((*pGetWindowLong)(hwnd, GWL_STYLE) & WS_CHILD){ isChild=TRUE; // child coordinate adjustement X = (X * client.right) / dxw.GetScreenWidth(); @@ -2446,7 +2446,7 @@ BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL POINT upleft = {0,0}; (*pGetClientRect)(dxw.GethWnd(),&screen); (*pClientToScreen)(dxw.GethWnd(),&upleft); - if((dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE)) && WS_CHILDWINDOW){ + if((dwStyle=(*pGetWindowLong)(hwnd, GWL_STYLE)) && WS_CHILDWINDOW){ // Big main child window: see "Reah" X=Y=0; } diff --git a/dll/winproc.cpp b/dll/winproc.cpp index dd8dbec..d1f2b9e 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -175,18 +175,18 @@ static void dx_Cornerize(HWND hwnd) if (bCornerized){ // toggle .... OutTraceDW("DxWnd: exiting corner mode\n"); - (*pSetWindowLongA)(hwnd, GWL_STYLE, OldStyle); - (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, OldExtStyle); + (*pSetWindowLong)(hwnd, GWL_STYLE, OldStyle); + (*pSetWindowLong)(hwnd, GWL_EXSTYLE, OldExtStyle); (*pMoveWindow)(hwnd, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom, TRUE); memset(&WinRect, 0, sizeof(WinRect)); } else { OutTraceDW("DxWnd: entering corner mode\n"); (*pGetWindowRect)(hwnd, &WinRect); - OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE); - OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE); - (*pSetWindowLongA)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED); - (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0); + OldStyle = (*pGetWindowLong)(hwnd, GWL_STYLE); + OldExtStyle = (*pGetWindowLong)(hwnd, GWL_EXSTYLE); + (*pSetWindowLong)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED); + (*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0); (*pMoveWindow)(hwnd, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), TRUE); } bCornerized = !bCornerized; // switch toggle @@ -211,8 +211,8 @@ void dx_FullScreenToggle(HWND hwnd) MessageBox(NULL,"Error: Failed to recover display mode.", "Error", 0); } // MoveWindow doesn't recover the exact position!!! - (*pSetWindowLongA)(hwnd, GWL_STYLE, OldStyle); - (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, OldExtStyle); + (*pSetWindowLong)(hwnd, GWL_STYLE, OldStyle); + (*pSetWindowLong)(hwnd, GWL_EXSTYLE, OldExtStyle); (*pSetWindowPos)(hwnd, HWND_TOP, WinRect.left, WinRect.top, (WinRect.right-WinRect.left), (WinRect.bottom-WinRect.top), SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_SHOWWINDOW); @@ -224,8 +224,8 @@ void dx_FullScreenToggle(HWND hwnd) if((WinRect.left==0) && (WinRect.right==0) && (WinRect.top==0) && (WinRect.bottom==0)) (*pGetWindowRect)(hwnd, &WinRect); OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE); OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE); - (*pSetWindowLongA)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED); - (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0); + (*pSetWindowLong)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED); + (*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0); (*pMoveWindow)(hwnd, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), TRUE); (*pUpdateWindow)(hwnd); @@ -278,8 +278,8 @@ static void dx_DesktopToggle(HWND hwnd, BOOL bWorkArea) if (bDesktopToggle){ // toggle .... OutTraceDW("DxWnd: exiting desktop mode: style=%x extstyle=%x pos=(%d,%d)-(%d,%d)\n", OldStyle, OldExtStyle, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom); - (*pSetWindowLongA)(hwnd, GWL_STYLE, OldStyle); - (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, OldExtStyle); + (*pSetWindowLong)(hwnd, GWL_STYLE, OldStyle); + (*pSetWindowLong)(hwnd, GWL_EXSTYLE, OldExtStyle); // MoveWindow doesn't recover the exact position!!! (*pSetWindowPos)(hwnd, HWND_TOP, WinRect.left, WinRect.top, (WinRect.right-WinRect.left), (WinRect.bottom-WinRect.top), @@ -294,8 +294,8 @@ static void dx_DesktopToggle(HWND hwnd, BOOL bWorkArea) if((WinRect.left==0) && (WinRect.right==0) && (WinRect.top==0) && (WinRect.bottom==0)) (*pGetWindowRect)(hwnd, &WinRect); OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE); OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE); - (*pSetWindowLongA)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED); - (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0); + (*pSetWindowLong)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED); + (*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0); (*pUpdateWindow)(hwnd); DesktopWnd = (*pGetDesktopWindow)(); hClientDC=(*pGDIGetDC)(hwnd); diff --git a/host/TabHook.cpp b/host/TabHook.cpp index 26529c8..a38d0d8 100644 --- a/host/TabHook.cpp +++ b/host/TabHook.cpp @@ -32,6 +32,7 @@ void CTabHook::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_STARTDEBUG, cTarget->m_StartDebug); DDX_Check(pDX, IDC_HOTPATCH, cTarget->m_HotPatch); DDX_Check(pDX, IDC_HOOKDLLS, cTarget->m_HookDLLs); + DDX_Check(pDX, IDC_ANSIWIDE, cTarget->m_AnsiWide); DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin); // Kernel32 diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp index ca800b1..155f2ce 100644 --- a/host/TabProgram.cpp +++ b/host/TabProgram.cpp @@ -80,45 +80,65 @@ static BOOL IsWinXP() void CTabProgram::OnOpen() { - // TODO: Please add your control notification handler code here char path[MAX_PATH]; CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); cTarget->m_File.GetWindowText(path, MAX_PATH); GetPrivateProfileString("window", "exepath", NULL, path, MAX_PATH, gInitPath); if(!dirExists(path)) strcpy(path, ""); // XP fix: path must end with '\.' - if(IsWinXP()) strcat(path, "."); - CFileDialog dlg( TRUE, "*.*", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, - "Program (*.exe)|*.exe|All Files (*.*)|*.*||", this); - if( dlg.DoModal() == IDOK) { - cTarget->m_File.SetWindowText(dlg.GetPathName()); - if(GetPrivateProfileInt("window", "updatepaths", 1, gInitPath)){ - strcpy(path, dlg.GetPathName()); - GetFolderFromPath(path); - WritePrivateProfileString("window", "exepath", path, gInitPath); + if(IsWinXP()) if((strlen(path) > 2) && (path[strlen(path)-1] == '\\')) strcat(path, "."); + while(TRUE){ + int ret; + CFileDialog dlg( TRUE, "*.*", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, + "Program (*.exe)|*.exe|All Files (*.*)|*.*||", this); + ret = dlg.DoModal(); + //char debug[512]; + //sprintf(debug, "ret=%x path=%s", ret, path); + //MessageBox(debug, "debug", MB_OK); + if(ret==IDOK){ + cTarget->m_File.SetWindowText(dlg.GetPathName()); + if(GetPrivateProfileInt("window", "updatepaths", 1, gInitPath)){ + strcpy(path, dlg.GetPathName()); + GetFolderFromPath(path); + WritePrivateProfileString("window", "exepath", path, gInitPath); + } + break; } + if(ret==IDCANCEL) break; + //else + strcpy(path,""); } } void CTabProgram::OnOpenLaunch() { - // TODO: Please add your control notification handler code here char path[MAX_PATH]; CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); cTarget->m_File.GetWindowText(path, MAX_PATH); GetPrivateProfileString("window", "exepath", NULL, path, MAX_PATH, gInitPath); if(!dirExists(path)) strcpy(path, ""); // XP fix: path must end with '\.' - if(IsWinXP()) strcat(path, "."); - CFileDialog dlg( TRUE, "*.*", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, - "Program (*.exe)|*.exe|All Files (*.*)|*.*||", this); - if( dlg.DoModal() == IDOK) { - cTarget->m_Launch.SetWindowText(dlg.GetPathName()); - if(GetPrivateProfileInt("window", "updatepaths", 1, gInitPath)){ - strcpy(path, dlg.GetPathName()); - GetFolderFromPath(path); - WritePrivateProfileString("window", "exepath", path, gInitPath); + if(IsWinXP()) if((strlen(path) > 2) && (path[strlen(path)-1] == '\\')) strcat(path, "."); + while(TRUE){ + int ret; + CFileDialog dlg( TRUE, "*.*", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, + "Program (*.exe)|*.exe|All Files (*.*)|*.*||", this); + ret = dlg.DoModal(); + //char debug[512]; + //sprintf(debug, "ret=%x path=%s", ret, path); + //MessageBox(debug, "debug", MB_OK); + if(ret==IDOK){ + cTarget->m_Launch.SetWindowText(dlg.GetPathName()); + if(GetPrivateProfileInt("window", "updatepaths", 1, gInitPath)){ + strcpy(path, dlg.GetPathName()); + GetFolderFromPath(path); + WritePrivateProfileString("window", "exepath", path, gInitPath); + } + break; } + if(ret==IDCANCEL) break; + //else + strcpy(path,""); } } diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 380da05..e04a79b 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -110,6 +110,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_Windowize = TRUE; // default true !! m_HotPatch = FALSE; m_HookDLLs = TRUE; // default true !! + m_AnsiWide = FALSE; m_TerminateOnClose = FALSE; m_ConfirmOnClose = FALSE; m_HookEnabled = TRUE; // default true !! diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 22e5845..cfa8e60 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -60,6 +60,7 @@ public: BOOL m_Windowize; BOOL m_HotPatch; BOOL m_HookDLLs; + BOOL m_AnsiWide; BOOL m_TerminateOnClose; BOOL m_ConfirmOnClose; BOOL m_EmulateRegistry; @@ -257,6 +258,7 @@ protected: // Generated message map functions //{{AFX_MSG(CTargetDlg) afx_msg void OnOpen(); + afx_msg void OnOpenLaunch(); //}}AFX_MSG DECLARE_MESSAGE_MAP() diff --git a/host/dxelevate.cpp b/host/dxelevate.cpp index 5c1352b..9f42d24 100644 --- a/host/dxelevate.cpp +++ b/host/dxelevate.cpp @@ -8,7 +8,7 @@ extern BOOL IsProcessElevated(); extern BOOL IsUserInAdminGroup(); -BOOL DxSelfElevate() +BOOL DxSelfElevate(CDxwndhostView *view) { BOOL const fInAdminGroup = IsUserInAdminGroup(); if(!fInAdminGroup) return TRUE; @@ -20,6 +20,11 @@ BOOL DxSelfElevate() MustRestart=MessageBoxLang(DXW_STRING_ADMINCAP, DXW_STRING_WARNING, MB_OKCANCEL | MB_ICONQUESTION); if(MustRestart==IDOK){ extern HANDLE GlobalLocker; + // Autoelevation at startup has no HostView yet, but nothing to save either + if (view && view->isUpdated){ + if (MessageBoxLang(DXW_STRING_LISTUPDATE, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION)==IDYES) + view->SaveConfigFile(); + } CloseHandle(GlobalLocker); char szPath[MAX_PATH]; if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath))) diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp index d3512eb..0574b53 100644 --- a/host/dxwndhost.cpp +++ b/host/dxwndhost.cpp @@ -138,12 +138,6 @@ BOOL CDxwndhostApp::InitInstance() // standard initialization -//#ifdef _AFXDLL -// Enable3dControls(); // if MFC is in shared DLL use this call. -//#else -// Enable3dControlsStatic(); // if MFC is statically linked use this call. -//#endif - // Register the document template. CSingleDocTemplate* pDocTemplate; @@ -228,11 +222,11 @@ BOOL CDxwndhostApp::InitInstance() m_pMainWnd->UpdateWindow(); BOOL bCheckAdminRights = GetPrivateProfileInt("window", "checkadmin", 0, InitPath); - extern BOOL DxSelfElevate(); + extern BOOL DxSelfElevate(CDxwndhostView *); OSVERSIONINFO osver = { sizeof(osver) }; // self elevation at start if configured for the whole DxWnd session if (bCheckAdminRights && (GetVersionEx(&osver)) && (osver.dwMajorVersion >= 6)){ - DxSelfElevate(); + DxSelfElevate((CDxwndhostView *)NULL); } return TRUE; } diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 3636ab8..28c13b0 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 cbc9a0e..e967260 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 275ce71..bbadf4e 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -197,6 +197,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_UnNotify) t->flags |= UNNOTIFY; if(dlg->m_Windowize) t->flags2 |= WINDOWIZE; if(dlg->m_HookDLLs) t->flags3 |= HOOKDLLS; + if(dlg->m_AnsiWide) t->flags5 |= ANSIWIDE; if(dlg->m_TerminateOnClose) t->flags6 |= TERMINATEONCLOSE; if(dlg->m_ConfirmOnClose) t->flags6 |= CONFIRMONCLOSE; if(dlg->m_EmulateRegistry) t->flags3 |= EMULATEREGISTRY; @@ -468,6 +469,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_Windowize = t->flags2 & WINDOWIZE ? 1 : 0; dlg->m_HotPatch = t->flags4 & HOTPATCH ? 1 : 0; dlg->m_HookDLLs = t->flags3 & HOOKDLLS ? 1 : 0; + dlg->m_AnsiWide = t->flags5 & ANSIWIDE ? 1 : 0; dlg->m_TerminateOnClose = t->flags6 & TERMINATEONCLOSE ? 1 : 0; dlg->m_ConfirmOnClose = t->flags6 & CONFIRMONCLOSE ? 1 : 0; dlg->m_EmulateRegistry = t->flags3 & EMULATEREGISTRY ? 1 : 0; @@ -2476,10 +2478,10 @@ void CDxwndhostView::OnRun() // self-elevation if configured and necessary if(TargetMaps[i].flags & NEEDADMINCAPS){ - extern BOOL DxSelfElevate(); + extern BOOL DxSelfElevate(CDxwndhostView *); OSVERSIONINFO osver = { sizeof(osver) }; if (GetVersionEx(&osver) && (osver.dwMajorVersion >= 6)){ - DxSelfElevate(); + DxSelfElevate(this); } } diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index bef96e9..287005a 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -16,13 +16,13 @@ class CDxwndhostView : public CListView protected: // Create from serialization only features. CDxwndhostView(); DECLARE_DYNCREATE(CDxwndhostView) + BOOL isUpdated; + void SaveConfigFile(); private: void Resize(void); - void SaveConfigFile(); TARGETMAP TargetMaps[MAXTARGETS]; PRIVATEMAP PrivateMaps[MAXTARGETS]; - BOOL isUpdated; DEVMODE InitDevMode; CSystemTray SystemTray; int LastX, LastY, LastCX, LastCY; diff --git a/host/resource b/host/resource index 7032813..73902db 100644 Binary files a/host/resource and b/host/resource differ