From 56f19f7c4298124fed6cf06fb89d0a10445b66b8 Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 9 Sep 2015 12:41:24 -0400 Subject: [PATCH] v2_03_36_src Former-commit-id: 48168527cfa5375694423fef4183d6e561199859 --- Include/dxwnd.h | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/exports/Beetle Crazy Cup.dxw | 31 +++++ ...nd & Conquer - Red Alert The Aftermath.dxw | 32 +++++ build/exports/Empire Earth.dxw | 5 +- build/exports/Empire of the Ants.dxw | 2 +- build/exports/Evolva.dxw | 5 +- build/exports/Flying Heroes.dxw | 4 + build/exports/Force 21.dxw | 5 +- build/exports/Forsaken (HW).dxw | 4 +- build/exports/Horde 2 the Citadel.dxw | 4 +- build/exports/Star Trek Armada.dxw | 32 +++++ build/exports/Star Trek Generations.dxw | 32 +++++ build/exports/eXpendable.dxw | 3 +- build/readme-relnotes.txt | 14 +- dll/advapi.cpp | 23 +++- dll/dxhook.cpp | 6 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 473088 -> 493568 bytes dll/gdi32.cpp | 28 ++-- dll/user32.cpp | 72 +++++++++-- host/TabCompat.cpp | 1 + host/TabRegistry.cpp | 40 ++++++ host/TabRegistry.h | 45 +++++++ host/TargetDlg.cpp | 3 + host/TargetDlg.h | 2 + host/dxTabCtrl.cpp | 3 + host/dxwndhost.aps | Bin 159312 -> 160172 bytes host/dxwndhost.h | 2 + host/dxwndhost.rc | Bin 103126 -> 104488 bytes host/dxwndhost.vs2008.suo | Bin 270848 -> 280064 bytes host/dxwndhost.vs2008.vcproj | 8 ++ host/dxwndhostView.cpp | 120 ++++++++++++------ host/dxwndhostView.h | 3 +- host/resource | Bin 36342 -> 36778 bytes 36 files changed, 459 insertions(+), 81 deletions(-) create mode 100644 build/exports/Beetle Crazy Cup.dxw create mode 100644 build/exports/Command & Conquer - Red Alert The Aftermath.dxw create mode 100644 build/exports/Star Trek Armada.dxw create mode 100644 build/exports/Star Trek Generations.dxw create mode 100644 host/TabRegistry.cpp create mode 100644 host/TabRegistry.h diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 52b2ac6..c1315ce 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -200,6 +200,7 @@ #define FLIPEMULATION 0x00010000 // create virtual primary and backbuffer as un-attached surfaces and replace Flip with Blt #define SETZBUFFERBITDEPTHS 0x00020000 // when not set, set the legacy dwZBufferBitDepths field in the directdraw capability from GetCaps() #define SHAREDDC 0x00040000 // enable sharing window DC and primary surface DC +#define WOW32REGISTRY 0x00080000 // Sets KEY_WOW32_64KEY registry flag // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 5ba6e8d..5df4d43 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7974a9d6ece70e47422cce4c82daa4d31131c217d89aa967ad23993ba7a3268c -size 583680 +oid sha256:f2fe03b12248b3b75bf4e724f83017b2767ac7eaf5f5c25ac2021da81ba9dd23 +size 585728 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 134653c..4b98fce 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd704d7423b954daf34806d31bb047aa8d606752a5fa6cd1f9f602b668c5e5f3 -size 542208 +oid sha256:482a21422742238d783015f22714a6001eac5a1dc38332c53db686dcd086c7c3 +size 544256 diff --git a/build/exports/Beetle Crazy Cup.dxw b/build/exports/Beetle Crazy Cup.dxw new file mode 100644 index 0000000..9cc57d5 --- /dev/null +++ b/build/exports/Beetle Crazy Cup.dxw @@ -0,0 +1,31 @@ +[target] +title0=Beetle Crazy Cup +path0=D:\Games\Beetle Crazy Cup\beetle.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=327680 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Command & Conquer - Red Alert The Aftermath.dxw b/build/exports/Command & Conquer - Red Alert The Aftermath.dxw new file mode 100644 index 0000000..78003a6 --- /dev/null +++ b/build/exports/Command & Conquer - Red Alert The Aftermath.dxw @@ -0,0 +1,32 @@ +[target] +title0=Command & Conquer - Red Alert The Aftermath +path0=D:\Games\C&C - Red Alert The Aftermath\RA95.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136331362 +flagg0=1207959552 +flagh0=532 +flagi0=138412036 +flagj0=4224 +flagk0=262144 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Empire Earth.dxw b/build/exports/Empire Earth.dxw index 0fb0433..b592392 100644 --- a/build/exports/Empire Earth.dxw +++ b/build/exports/Empire Earth.dxw @@ -9,7 +9,7 @@ flag0=671088675 flagg0=1207959552 flagh0=20 flagi0=4325380 -tflag0=6147 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -27,5 +27,6 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= diff --git a/build/exports/Empire of the Ants.dxw b/build/exports/Empire of the Ants.dxw index 9c5eaee..f5052ac 100644 --- a/build/exports/Empire of the Ants.dxw +++ b/build/exports/Empire of the Ants.dxw @@ -27,5 +27,5 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 diff --git a/build/exports/Evolva.dxw b/build/exports/Evolva.dxw index c715fc8..869dbd1 100644 --- a/build/exports/Evolva.dxw +++ b/build/exports/Evolva.dxw @@ -9,7 +9,7 @@ flag0=134217762 flagg0=1207959552 flagh0=20 flagi0=4194308 -tflag0=6146 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -27,3 +27,6 @@ maxres0=-1 launchpath0= notes0= flagj0=128 +registry0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Flying Heroes.dxw b/build/exports/Flying Heroes.dxw index 89f2c1e..4fc9c2a 100644 --- a/build/exports/Flying Heroes.dxw +++ b/build/exports/Flying Heroes.dxw @@ -26,3 +26,7 @@ winver0=0 maxres0=-1 launchpath0= flagj0=128 +notes0= +registry0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Force 21.dxw b/build/exports/Force 21.dxw index 7ecf597..47bb7b6 100644 --- a/build/exports/Force 21.dxw +++ b/build/exports/Force 21.dxw @@ -10,7 +10,7 @@ flag0=136331298 flagg0=1207959552 flagh0=20 flagi0=138412036 -flagj0=8320 +flagj0=128 tflag0=0 initx0=0 inity0=0 @@ -26,3 +26,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +notes0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Forsaken (HW).dxw b/build/exports/Forsaken (HW).dxw index 636132a..a0ee2c1 100644 --- a/build/exports/Forsaken (HW).dxw +++ b/build/exports/Forsaken (HW).dxw @@ -26,6 +26,6 @@ winver0=0 maxres0=-1 launchpath0= notes0= -flagj0=162 -flagk0=0 +flagj0=130 +flagk0=73728 swapeffect0=0 diff --git a/build/exports/Horde 2 the Citadel.dxw b/build/exports/Horde 2 the Citadel.dxw index a889d01..e7b079c 100644 --- a/build/exports/Horde 2 the Citadel.dxw +++ b/build/exports/Horde 2 the Citadel.dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134217766 +flag0=136314918 flagg0=1207959552 flagh0=20 flagi0=4194308 @@ -27,3 +27,5 @@ maxres0=-1 launchpath0= notes0= flagj0=128 +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Star Trek Armada.dxw b/build/exports/Star Trek Armada.dxw new file mode 100644 index 0000000..b8f7965 --- /dev/null +++ b/build/exports/Star Trek Armada.dxw @@ -0,0 +1,32 @@ +[target] +title0=Star Trek Armada +path0=D:\Games\Star Trek Armada\Armada.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=-2011168669 +flagg0=1543503872 +flagh0=98320 +flagi0=136314884 +flagj0=4224 +flagk0=327680 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=100 +posy0=100 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Star Trek Generations.dxw b/build/exports/Star Trek Generations.dxw new file mode 100644 index 0000000..b5be506 --- /dev/null +++ b/build/exports/Star Trek Generations.dxw @@ -0,0 +1,32 @@ +[target] +title0=Star Trek Generations +path0=D:\Games\stgen\sgens.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\MicroProse\Star Trek Generations]\n[HKEY_LOCAL_MACHINE\SOFTWARE\MicroProse\Star Trek Generations\1.0]\n"Path"="D:\\GAMES\\STGEN"\n"CDPath"="F:\\GENS"\n"InstallSet"="MED"\n +ver0=1 +coord0=0 +flag0=136314978 +flagg0=1744830464 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/eXpendable.dxw b/build/exports/eXpendable.dxw index d6101cf..8b8e574 100644 --- a/build/exports/eXpendable.dxw +++ b/build/exports/eXpendable.dxw @@ -27,5 +27,6 @@ initts0=0 winver0=0 maxres0=-1 notes0= -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 2fc8c67..48db031 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -887,4 +887,16 @@ fix: the flags for disabling DDSCAPS_SYSTEMMEMORY capability are now used also i fix: handling of NULL DC in non emulated modes: the NULL DC (corresponding to the whole desktop) is replaced by the window DC. This reduces problems like clearing the whole desktop. fix: EnumDisplayModes was returning wrong modes list in SVGA mode. fix: applied the error suppression to the DeleteAttachedSurface hooker. -fix: hooked User32 CreateRectRegion/Indirect calls. \ No newline at end of file +fix: hooked User32 CreateRectRegion/Indirect calls. + +v2.03.36: +fix: fixed "fix movies color depth" flag for color depths greater than 8BPP. Fixes the "Horde 2 the Citadel" intro movie. +add: added the "Set KEY_WOW64_32KEY flag" flag to prevent registry redirection for win32 applications +add: virtual registry configuration integrated in DxWnd configuration and exported files +add: hooking of RegEnumValue() call. Useful for "Star trek Generations" +fix: fixed mouse handling through "Message processing" option for child windows. Fixes "Star Trek Armada" mouse problems +fix: fixed GetDC hooker for child windows. Fixes some "Star Trek Armada" graphic problems +fix: CreateCompatibleDC hooker printing wrong error messages in normal conditions +fix: fixed DrawText, DrawTextEx hookers returning wrong RECT structure. Fixes "Star Trek Armada" text placement problems +add: completed log messages for DrawTextEx, CreateDialogParam, DialogBoxParam and CreateDialogIndirectParam + diff --git a/dll/advapi.cpp b/dll/advapi.cpp index 4335d05..84eab58 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -10,6 +10,9 @@ typedef LONG (WINAPI *RegFlushKey_Type)(HKEY); LONG WINAPI extRegFlushKey(HKEY); RegFlushKey_Type pRegFlushKey = NULL; +typedef LONG (WINAPI *RegEnumValueA_Type)(HKEY, DWORD, LPTSTR, LPDWORD, LPDWORD, LPDWORD, LPBYTE, LPDWORD); +LONG WINAPI extRegEnumValueA(HKEY, DWORD, LPTSTR, LPDWORD, LPDWORD, LPDWORD, LPBYTE, LPDWORD); +RegEnumValueA_Type pRegEnumValueA = NULL; static HookEntry_Type Hooks[]={ {HOOK_IAT_CANDIDATE, "RegOpenKeyExA", NULL, (FARPROC *)&pRegOpenKeyEx, (FARPROC)extRegOpenKeyEx}, @@ -19,6 +22,8 @@ static HookEntry_Type Hooks[]={ {HOOK_IAT_CANDIDATE, "RegCreateKeyExA", NULL, (FARPROC *)&pRegCreateKeyEx, (FARPROC)extRegCreateKeyEx}, {HOOK_IAT_CANDIDATE, "RegSetValueExA", NULL, (FARPROC *)&pRegSetValueEx, (FARPROC)extRegSetValueEx}, {HOOK_IAT_CANDIDATE, "RegFlushKey", NULL, (FARPROC *)&pRegFlushKey, (FARPROC)extRegFlushKey}, + // v2.3.36 + {HOOK_IAT_CANDIDATE, "RegEnumValueA", NULL, (FARPROC *)&pRegEnumValueA, (FARPROC)extRegEnumValueA}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -152,7 +157,14 @@ LONG WINAPI extRegOpenKeyEx( if(res == ERROR_SUCCESS) return res; } - if(dxw.dwFlags6 & WOW64REGISTRY) ulOptions |= KEY_WOW64_64KEY; + if(dxw.dwFlags6 & WOW64REGISTRY){ + ulOptions &= ~KEY_WOW64_32KEY; + ulOptions |= KEY_WOW64_64KEY; + } + if(dxw.dwFlags6 & WOW32REGISTRY){ + ulOptions &= ~KEY_WOW64_64KEY; + ulOptions |= KEY_WOW64_32KEY; + } res=(*pRegOpenKeyEx)(hKey, lpSubKey, ulOptions, samDesired, phkResult); OutTraceR("RegOpenKeyEx: res=%x phkResult=%x\n", res, phkResult ? *phkResult : 0); @@ -368,3 +380,12 @@ LONG WINAPI extRegCreateKey(HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult) else return (*pRegCreateKey)(hKey, lpSubKey, phkResult); } + +LONG WINAPI extRegEnumValueA(HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcchValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData) +{ + LONG ret; + OutTrace("RegEnumValue: hKey=%x(%s) Index=%x\n", hKey, hKey2String(hKey), dwIndex); + ret=(*pRegEnumValueA)(hKey, dwIndex, lpValueName, lpcchValueName, lpReserved, lpType, lpData, lpcbData); + OutTrace("RegEnumValue: hKey=%x(%s) Index=%x ValueName=\"%s\", Type=%x ret=%x\n", hKey, hKey2String(hKey), dwIndex, lpValueName, lpType ? *lpType : 0, ret); + return ret; +} diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index fc41b93..c8b98eb 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -109,7 +109,7 @@ static char *Flag6Names[32]={ "SUPPRESSRELEASE", "FIXMOVIESCOLOR", "WOW64REGISTRY", "DISABLEMAXWINMODE", "FIXPITCH", "POWER2WIDTH", "HIDETASKBAR", "ACTIVATEAPP", "NOSYSMEMPRIMARY", "NOSYSMEMBACKBUF", "CONFIRMONCLOSE", "TERMINATEONCLOSE", - "FLIPEMULATION", "SETZBUFFERBITDEPTHS", "SHAREDDC", "", + "FLIPEMULATION", "SETZBUFFERBITDEPTHS", "SHAREDDC", "WOW32REGISTRY", "", "", "", "", "", "", "", "", "", "", "", "", @@ -1383,6 +1383,7 @@ void HookModule(HMODULE base, int dxversion) if(dxw.dwFlags4 & HOOKGLIDE) HookGlideLibs(base); if( (dxw.dwFlags3 & EMULATEREGISTRY) || (dxw.dwFlags4 & OVERRIDEREGISTRY) || + (dxw.dwFlags6 & (WOW32REGISTRY|WOW64REGISTRY)) || (dxw.dwTFlags & OUTREGISTRY)) HookAdvApi32(base); HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for? HookAVIFil32(base); @@ -1485,7 +1486,8 @@ LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPARAM lParam) else { // fix the message point coordinates POINT upleft={0,0}; - (*pClientToScreen)(dxw.GethWnd(), &upleft); + // v2.03.36: offset to be calculated from target window + (*pClientToScreen)(msg->hwnd, &upleft); msg->pt = dxw.SubCoordinates(msg->pt, upleft); msg->pt=dxw.FixCursorPos(msg->pt); // beware: needs fix for mousewheel? diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 13a79bd..8802646 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.35" +#define VERSION "2.03.36" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 8423cf11188b41543d7da60fb2a30c5b72530c1e..06a5c31f80ec9b29920d7bf92cfe73d1aa880e35 100644 GIT binary patch delta 9737 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 delta 2476 zcmY*b4Qx}_752IB-uK+ZaXr^KA#<}A#|bP6ksC7NW)VE13`J>FIVeI~NV1eM$WT=> zhN|$h)T9N1o3;*SJ`;hG|K|pSc*_Z8KNHQCRA0BvWNl#vh(bQ zbx%6-efQm;bI$jD=QtE83e9>V1}y%=>I!Zj9oc{O`~RK+#bU7-BDs_2F#ceEem**= z)@KIEX*B?j8(ptd{r2bm4X<2${YUmAw|C%gmN9?Qu)e4~0)@1dcFdz=SXr8!%ROE& zyxpIi@%f7}ILUQP)q*QIxTX(cVc^*RF}I@L%52esoAu*O$86EaO^(4oaYyo0+dlCE z9cHmyGu^Q)vOKAbu^jXC0%ieoik`r`Z9F@&SoBlom_2;AsPqMBW#n=!x>rJ$p(L(TY{VfTDMXB;9kqx*>L7i2NA z!(`aO;92nE83vo#5|GsjeD+wLdFI0hznu@?%v>Xz^5LWvxAlo?On;ZVn z1K^RKjqoYNYB-Goa6}w6Dgn^Bo;9OwIkQIFepP_S-y&s03DsogZ3YT8>Sci-UlrGB0Cd#lHRz?z2Y@3XS&AI+|R$y|+E#q)UGBm% zg4+`RRS@L{Nf+0iksII&Tu$#wYta<)nuoTu_-T<2AQ zHMPX%^gl%<_Imj~3^jAQsEDTl$A3WKIZJqZ22~vW7cZBppI>0vcl{VI$EoGq8@t2_ z93Q`$i{5fVEkj;c9seA#z7`5&CE$u}A`Ubf{0L+h*YK+Xy8z0ibAW#Y2S2Af>v>wq z+iK~v?66c>dPqH=;GSA2#mIf(mi{w-4WGsrzzb=42@$;Ej3B6s6x9d}FDG`|27N4TM2Xc>fL>L^b=mQf9oYP>S_ zM{Za#UdLVVMb?p-mxF$ zMgY)&UzAfYqpd_R<4a;|P!((OP>=;MR18k6*Tg*xjhJU%qD0`q72v}wC8WS!tB3&3 zo>N@t(uFUP=4IGG1q!=MpiuVcVn)I9ttLHlM0$}hGgpYKJ6S0@HZNTEs!xn&k?x)p zRP{@RfxRCxf~`+H%dz2md`J$JiS4a2yjwgEc>I{~O7FC|Lc@0EkdBLD7P1l4Pn13D9iWM zBEYyRykBc;(?sefn|d-AjlEh5sf-(6!M#`=&B2?R@MjCiz*#l{a-vji_Te@!p*+(` z@Nc}Yj!f9KDmZw9@MuwwRk8gP%UY!z=XR#E%d^N`u8!dNkSDIf*9A@@ODtMNk> 16) + return tn; + else { + sprintf(sBuf, "ID:(%x)", ((DWORD)tn & 0x0000FFFF)); + return sBuf; + } +} + // -------------------------------------------------------------------------- // // globals, externs, static functions... @@ -1952,6 +1963,18 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName) LPDIRECTDRAWSURFACE lpDDSPrim; lpDDSPrim = dxwss.GetPrimarySurface(); if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC); + if (!(hwnd == dxw.GethWnd())) { + POINT father, child, offset; + father.x = father.y = 0; + child.x = child.y = 0; + (*pClientToScreen)(dxw.GethWnd(),&father); + (*pClientToScreen)(hwnd,&child); + offset.x = child.x - father.x; + offset.y = child.y - father.y; + dxw.UnmapClient(&offset); + OutTraceDW("%s: child window hwnd=%x offset=(%d,%d)\n", ApiName, hwnd, offset.x, offset.y); + (*pSetViewportOrgEx)(hFlippedDC, offset.x, offset.y, NULL); + } OutTraceDW("%s: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", ApiName, lpDDSPrim, hFlippedDC); if(hFlippedDC) return hFlippedDC; } @@ -2012,6 +2035,7 @@ HDC WINAPI extGDIGetWindowDC(HWND hwnd) return sGetDC(hwnd, "GDI.GetWindowDC"); } + int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) { int res; @@ -2120,8 +2144,10 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT HWND RetHWND; BOOL FullScreen; FullScreen = dxw.IsFullScreen(); - OutTraceDW("CreateDialogIndirectParam: hInstance=%x lpTemplate=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", - hInstance, "tbd", hWndParent, lpDialogFunc, lParamInit); + OutTraceDW("CreateDialogIndirectParam: hInstance=%x lpTemplate=(style=%x extstyle=%x items=%d pos=(%d,%d) size=(%dx%d)) hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", + hInstance, + lpTemplate->style, lpTemplate->dwExtendedStyle, lpTemplate->cdit, lpTemplate->x, lpTemplate->y, lpTemplate->cx, lpTemplate->cy, + hWndParent, lpDialogFunc, lParamInit); if(dxw.IsFullScreen() && hWndParent==NULL) hWndParent=dxw.GethWnd(); RetHWND=(*pCreateDialogIndirectParam)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); dxw.SetFullScreen(FullScreen); @@ -2143,7 +2169,7 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW BOOL FullScreen; FullScreen = dxw.IsFullScreen(); OutTraceDW("CreateDialogParam: hInstance=%x lpTemplateName=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", - hInstance, "tbd", hWndParent, lpDialogFunc, lParamInit); + hInstance, sTemplateName(lpTemplateName), hWndParent, lpDialogFunc, lParamInit); if(hWndParent==NULL) hWndParent=dxw.GethWnd(); RetHWND=(*pCreateDialogParam)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, lParamInit); dxw.SetFullScreen(FullScreen); @@ -2354,35 +2380,64 @@ BOOL gFixed; int WINAPI extDrawTextA(HDC hdc, LPCTSTR lpchText, int nCount, LPRECT lpRect, UINT uFormat) { int ret; + BOOL MustScale; OutTraceDW("DrawText: hdc=%x rect=(%d,%d)-(%d,%d) Format=%x(%s) Text=(%d)\"%s\"\n", hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, uFormat, ExplainDTFormat(uFormat), nCount, lpchText); - gFixed = TRUE; - if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + MustScale = dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)); + if (MustScale){ dxw.MapClient((RECT *)lpRect); OutTraceDW("DrawText: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); } + gFixed = TRUE; ret=(*pDrawText)(hdc, lpchText, nCount, lpRect, uFormat); gFixed=FALSE; + // if nCount is zero, DrawRect returns 0 as text heigth, but this is not an error! (ref. "Imperialism II") if(nCount && !ret) OutTraceE("DrawText: ERROR ret=%x err=%d\n", ret, GetLastError()); + + if (MustScale){ + dxw.UnmapClient((RECT *)lpRect); + OutTraceDW("DrawText: fixed output rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + return ret; } int WINAPI extDrawTextExA(HDC hdc, LPTSTR lpchText, int nCount, LPRECT lpRect, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams) { int ret; + BOOL MustScale; + OutTraceDW("DrawTextEx: hdc=%x rect=(%d,%d)-(%d,%d) DTFormat=%x Text=(%d)\"%s\"\n", hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, dwDTFormat, nCount, lpchText); + if (IsDebug){ + if(lpDTParams) + OutTrace("DTParams: size=%d (L,R)margins=(%d,%d) TabLength=%d lDrawn=%d\n", + lpDTParams->cbSize, lpDTParams->iLeftMargin, lpDTParams->iRightMargin, + lpDTParams->iTabLength, lpDTParams->uiLengthDrawn); + else + OutTrace("DTParams: NULL\n"); + } - if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + MustScale = dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)); + + if (MustScale){ dxw.MapClient((RECT *)lpRect); OutTraceDW("DrawTextEx: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); } + gFixed = TRUE; ret=(*pDrawTextEx)(hdc, lpchText, nCount, lpRect, dwDTFormat, lpDTParams); - if(!ret) OutTraceE("DrawTextEx: ERROR ret=%x err=%d\n", ret, GetLastError()); + gFixed=FALSE; + if(nCount && !ret) OutTraceE("DrawTextEx: ERROR ret=%x err=%d\n", ret, GetLastError()); + + if (MustScale){ + dxw.UnmapClient((RECT *)lpRect); + OutTraceDW("DrawTextEx: fixed output rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + return ret; } @@ -2960,7 +3015,8 @@ INT_PTR WINAPI extDialogBoxParamA(HINSTANCE hInstance, LPCTSTR lpTemplateName, H { BOOL ret, FullScreen; FullScreen = dxw.IsFullScreen(); - OutTraceDW("DialogBoxParamA: FullScreen=%x\n", FullScreen); + OutTraceDW("DialogBoxParamA: FullScreen=%x TemplateName=\"%s\" WndParent=%x\n", + FullScreen, sTemplateName(lpTemplateName), hWndParent); dxw.SetFullScreen(FALSE); ret = (*pDialogBoxParamA)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam); dxw.SetFullScreen(FullScreen); diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index ffee0f3..3d91d1f 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -49,6 +49,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); DDX_Check(pDX, IDC_OVERRIDEREGISTRY, cTarget->m_OverrideRegistry); DDX_Check(pDX, IDC_WOW64REGISTRY, cTarget->m_Wow64Registry); + DDX_Check(pDX, IDC_WOW32REGISTRY, cTarget->m_Wow32Registry); } BEGIN_MESSAGE_MAP(CTabCompat, CDialog) diff --git a/host/TabRegistry.cpp b/host/TabRegistry.cpp new file mode 100644 index 0000000..7c3de2b --- /dev/null +++ b/host/TabRegistry.cpp @@ -0,0 +1,40 @@ +// TabRegistry.cpp : implementation file +// + +#include "stdafx.h" +#include "TargetDlg.h" +#include "TabRegistry.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CTabRegistry dialog + +CTabRegistry::CTabRegistry(CWnd* pParent /*=NULL*/) +// : CTargetDlg(pParent) + : CDialog(CTabRegistry::IDD, pParent) +{ + //{{AFX_DATA_INIT(CTabRegistry) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT +} + +void CTabRegistry::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); + DDX_Text(pDX, IDC_REGISTRY, cTarget->m_Registry); +} + +BEGIN_MESSAGE_MAP(CTabRegistry, CDialog) + //{{AFX_MSG_MAP(CTabRegistry) + // NOTE: the ClassWizard will add message map macros here + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CTabRegistry message handlers diff --git a/host/TabRegistry.h b/host/TabRegistry.h new file mode 100644 index 0000000..2453893 --- /dev/null +++ b/host/TabRegistry.h @@ -0,0 +1,45 @@ +#if !defined(AFX_TABNOTES_H__798A9124_C906_446C_822D_322B5AB6F1F1__INCLUDED_) +#define AFX_TABNOTES_H__798A9124_C906_446C_822D_322B5AB6F1F1__INCLUDED_ + +#include "resource.h" +#include "TargetDlg.h" + +///////////////////////////////////////////////////////////////////////////// +// CTabRegistry dialog + +//class CTabRegistry : public CTargetDlg +class CTabRegistry : public CDialog +{ +// Construction +public: + CTabRegistry(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CTabDirectX) + enum { IDD = IDD_TAB_REGISTRY }; + // NOTE: the ClassWizard will add data members here + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CTabDirectX) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + //BOOL OnInitDialog(); + + // Generated message map functions + //{{AFX_MSG(CTabDirectX) + // NOTE: the ClassWizard will add member functions here + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_TABTHREE_H__798A9124_C906_446C_822D_322B5AB6C4C4__INCLUDED_) diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 9c71c72..9cbddb8 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -99,6 +99,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_EmulateRegistry = FALSE; m_OverrideRegistry = FALSE; m_Wow64Registry = FALSE; + m_Wow32Registry = FALSE; m_FullScreenOnly = FALSE; m_FilterMessages = FALSE; m_PeekAllMessages = FALSE; @@ -246,6 +247,8 @@ BOOL CTargetDlg::OnInitDialog() m_tabdxTabCtrl.InsertItem(i++, _T(sCaption)); LoadString(AfxGetResourceHandle(), DXW_TAB_COMPAT, sCaption, sizeof(sCaption)); m_tabdxTabCtrl.InsertItem(i++, _T(sCaption)); + LoadString(AfxGetResourceHandle(), DXW_TAB_REGISTRY, sCaption, sizeof(sCaption)); + m_tabdxTabCtrl.InsertItem(i++, _T(sCaption)); LoadString(AfxGetResourceHandle(), DXW_TAB_NOTES, sCaption, sizeof(sCaption)); m_tabdxTabCtrl.InsertItem(i++, _T(sCaption)); LoadString(AfxGetResourceHandle(), DXW_TAB_DEBUG, sCaption, sizeof(sCaption)); diff --git a/host/TargetDlg.h b/host/TargetDlg.h index cb61681..3cdbf9c 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -60,6 +60,7 @@ public: BOOL m_EmulateRegistry; BOOL m_OverrideRegistry; BOOL m_Wow64Registry; + BOOL m_Wow32Registry; BOOL m_FullScreenOnly; BOOL m_FilterMessages; BOOL m_PeekAllMessages; @@ -75,6 +76,7 @@ public: CString m_Title; CString m_OpenGLLib; CString m_Notes; + CString m_Registry; BOOL m_SaveLoad; BOOL m_SlowDown; BOOL m_BlitFromBackBuffer; diff --git a/host/dxTabCtrl.cpp b/host/dxTabCtrl.cpp index 89699c8..755f1a1 100644 --- a/host/dxTabCtrl.cpp +++ b/host/dxTabCtrl.cpp @@ -31,6 +31,7 @@ #include "TabOpenGL.h" #include "TabCompat.h" #include "TabColor.h" +#include "TabRegistry.h" #include "TabNotes.h" #include "TabSysLibs.h" #include "TabDebug.h" @@ -58,6 +59,7 @@ CDXTabCtrl::CDXTabCtrl() m_tabPages[i++]=new CTabLogs; m_tabPages[i++]=new CTabSysLibs; m_tabPages[i++]=new CTabCompat; + m_tabPages[i++]=new CTabRegistry; m_tabPages[i++]=new CTabNotes; if (gbDebug) m_tabPages[i++]=new CTabDebug; @@ -85,6 +87,7 @@ void CDXTabCtrl::Init() m_tabPages[i++]->Create(IDD_TAB_LOG, this); m_tabPages[i++]->Create(IDD_TAB_SYSLIBS, this); m_tabPages[i++]->Create(IDD_TAB_COMPAT, this); + m_tabPages[i++]->Create(IDD_TAB_REGISTRY, this); m_tabPages[i++]->Create(IDD_TAB_NOTES, this); if (gbDebug) m_tabPages[i++]->Create(IDD_TAB_DEBUG, this); diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 851b00fe9ade565949f52c68331ca587ebc697fa..98ad216c2123fc91e3388465767e912b7993563e 100644 GIT binary patch delta 9506 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 PYX)@9RrKmB6!ZTBaDWsf delta 8764 zcmZWu34B!5)xY;;BMTuUnar9=2#AP4W?uk>mzg)2Av5!aSxCa-pin^xn=2?aaj7g~ zQI7hk3xc9mQ544-sTQ@?Rzx9GBwjENiusS+KT9E6gT9AFt^axh@n9B|8}HA}zxRtIX;qK8{2} zQB~q0{vkkBc!`t+#15vgSx8_AU<#X+vSzx| z1936J#@Xf~ZICY331I?_d-Ottz^px58ii+zO*(m~L{jQV%Bdt4uv-b2*tx zNb%Mdr_0GWJBf2Nk&4CQQX=8+km7MU&KhKQkOWvtj1!Vvk_;u)S+sjeDqAQlx1-Qu zA@g8$NnLF_huP32nFWW9bU@b=#_mo|1jVR7EQ#S{z`}$g=#$>gSlPusc z=GovmTx8)8zy{CZCW|#R+))j4-3n5!VLu8e5z*hjag}1D8?73+eOx8v7p?Z#oS~) zfwHHK^d>l3rq$id1#HBb3up~vTRj%C0sdX4*Zy#rZ1sm2V>dZ{;kZwZw8-kB@;J$@9E-{^F)SsMQYz*blWb@_E^-^^B4WI)B^+Xt<8hPQ zIT#Kl_`>vf$Q?t_xFoBT3BBY;9L1rIiBXC5z-u9Q!ntyde_>)n(pFcK#uz)T$DpA&g&vuVQod7a5sS| zdkw;m3556R=r%Z5p{4i0?!5+jFMLy>^>60}k~o8jn8a2LZdL*uWy9|ehjAz2Mj`hN zgG0*;mn*p+!lRA)2RQ4O5^YI27D$D$!&daA3iOPwqdQ>nb9MA5uy3@v_Q7F0Z1${H z8+i!MjyBSV;k(fW_amH^apvM7zZ92Rairt86RlP!*~!VMjGgt%?GaQl!bKj1NTuGm zi_>g>Bsvp5IjnjgtJOnx!>yGyQy=3zu9}1or)Zw@Lvy*7G zxydsikI@TzF|xd%H$2Nl^U*y7q__`#8~PZl-9ny&N5&X+`#7D9i$00X3u}ViMxKYh zFFdH4alf1|YpBRgXi8hA0NCqrbnrSa(88%cH92n&x zKjUCj_WR>vdrKHsz7;+7%LESYudD0Lu{eyJb6CkM@Mx7@I6z?Ri+bVb7(ZXs(O2Os z#9kxN^`b8F3tlSQJxi{C4i7n)vlo-wrMQi^!r>*a58+Zg;FD8PHO5-e>%IZ2#_EMP z$@WYg{Uz)gTc>@CYyBOuxZI)6EBf4D5r}2RlT<=tGx7}vvb$;Y~nZuBsRgSaTOtDNC>@*dnC-ASA4ZZffF_Gk}487;)IHSFq_CMtsktJ;83yz3VTyBx&1Zx$#&M$MiP(*B%g5em09puj( zo|{5PE5)-moa8UCUt^+Q!4ZwF`D-pw*MIJGXZ3o?d5*`W2yP`GPKyoCs^1Wp`HG(Y z6`Jde`v2hyc4kV&rKlXmEoeiR`ZxIa6&?LMj6G1J{l}0di01*uyU71y0J~*_wi`2U z@+}wO22*{QPmZD|u~|Ii|2PrsY(d}1_qWaBCI8Q1Jj1dDVY6DuKRF`#LrE(`tmHe6 z#6!N|kj_T_#nFTu^-BRU6?Wjz+3*}ZW9F(djc0Bt? z^QBO94(=Ptk9L{HO$5$jkFu>spIks;=g;eCA@pgD_98C8FqFW#ilrhrSvGXT#T?I$ zCkDER$eM^J+!8SBjC2%C*BOkZTqVWDgcO!r`8~ph?zoJ?npd?#Ifc7lH47CK_P?s7 zqu~vmPN<~t<*SD7F}!G^U5usGxDdy%V8fGcRUQ!thgf^i;f~EieR2$!w+&Ce)p;n3 zTwzfq9Hb_XU`8Z#u{QL`wHyyiV_QXErx?bN#RwPCU=v?62z3;Wy;ft=av6FM40R!i zhcqVi5*-}X*Ej3AfE`g-)I$oLv4Ml!pSFkmNpw9nJU|;MEdE8E-o$CqmkiCrfG5US z*YE^g4|5F0>1NJGWsIP>gR>`Arf`u4&f$6tgyIo7>I=&Ww!ZNc-AD=atkpDO#zV$& zo!VhFs;c)b8#?tSl&!f@2lBz9?(s~O#`VB1UUr)sJ=_Ep@=JIWlT^q?E>I!S?^pA7 zGEvP-9WjhpT;m`Ys#rV~RW)uhNzKP{fQMYffxNoBWX5C;4%dcW?qZH*tMgdN6b|Io zhwg4Fd}FK;rcv1acCFA%;q|v0sRb@E)oZP)oUOmKxPMNS2+f!6L>~q zZN+n%Lq&1Xrg4JXRnSYEL*P*BJm_g$DvUiJ5_|A!?1r-@t=6M*YRyR&P7%PV_8nv^?l-W~eL!)9BKZd{{l`ZDy(jYZf+GOr{cQ0WY~k#r++) za?(-<9*ofr`kYHuI3doH)cwamE188LJYKJ>o1HDx9`$2S)gpEx!m)atwne4dFxsYB zqH-SM+iuqC{VJvQir-uqiDxzmEN1_23nap*gwqX{_Jpfe;@J)4FWF`i~82DJcQcHw-3PMAmGvJ(cOox&|Aw6p^* zZPXh&De-r(agJlmPPdCVsxEv8!Fw&NZ8XsZ@MBCD!rn$x!6Mv4$L_5e#dy4}Qt0fj zH>F3ES7!xzoR!6>uG(G;`}&LN<=`D>60V?dy5B4;p)lBQ5|&aJH_$Nd2P4YkI!Hw% zbsaG)E^;M>s|Mm)>S|Z zg;{s-%)E-i`jbYyX`X8`6|BLw-3yu$M!E5VX&PTIT!YOzX%w!d(0IxyTt`7XWfHEZ zP<5Y{>Cgq=0Q<*lgc~XBI;ElO;N$Uii`Mfh@venFoE_OZSas-5Z^|R=eid|+n}@;d z;fskqWWz9yTP&ffz2t{5cY;QL%P@!cM?5hx7JY3ubWf-=^l&yidm((8P-#246`r3^ z-+bF}VIF%~Stq%jlC&60r0xDR?#5(XW>+n;8HakOnQno=yXHaXU^Rtz!X69#?tU8pJ%}A@){J;4uWNe243r~%BxTK8?Ne=o=ii}dI}%vtKs0SQ}Sq91BJK6 zVB$)BX2We4ji|(udHwdCBM=#G{Lzg3!tL*9y?hy5qeaKBXU z#Fw<|$Tj%X0~o};B$;$K&?Qp&33f*IY(6A#X&+RPsw z)Y2jop=2@$4{x4QkH>~k+TWpWGj?A^h7xlYWkKJH&xk760KE@S=x$UgB=9Kgz=vce zAD6>yh&edcl*8IiANt*cR>zwA(m~@M8y2*1k8WrTB?U5 zk3^^eOgnF<#>}prf25hmcNq(76G1U9`Pribb8UD`rldM^V9#g`oH<~GHxC#y-yKL7 zX7(OjR1U#+P3REtygm6{GyJuo4!YmHK)9H|Gn0+Qc>Jd1V))IwPtmEc=CB#lZHJAR z?mgUu>5;?rbZX|$hcBVD879BqAT;BYOx5#Z&2aVm4Tx`1(`PulZJ7N+#mkN`&EzAE ztn9J7Yao530)eh0jhNo8ru)?NsG6Qv)3HZgf(@VMre&+L!SbVKYJ-hO>rFNso;16m z;Jbg+Pb}*sJUkM$BQ|*BXama59_?hspKsRkmfE1BuMzR}edfI4IDj%Q?#mU=^gT_j zu;^G5od!L}^q4+)>^VH61%GR%mdvu>zC-C0upDo|G1y@wZR+3qj+=!k1Qt)u zHhK#D<@j`J&rJF-MX3vewh7Z&jk;oW=3Q_=1x}o3M0i`HF$X`}Xe{9hHC{uczZ?af z{Y{u|z{u;$1!e~Syq}dm-9H}F!TxcWjvJVOX<(oUwEd&u`hhy|;P;M!TIj&<`lf2A z?yrWA1~jk(^9!2BLe4}6c%YCB0ht&$eGVZ$jYoPB` zk$YGR@2(&<6)P1o4bsn*luWM|2vOdXX_OWz#u(j3_b7W~G^N}V zr^RI@WGm@pZk8wu=hDecx@j)m$-XDW=?(bZyDLu1CHTYh zPM|`ItmsnIudJC*D@v=-+z&|^8KsP#OWnN-Q*=^kZ!k@NB?tqBO63)_Wo$J%qQSu; z{Exq2;HOKu{0drg$-|V8nM2h5Dm8!@I^?VzUyAWF3fnS_DJtes_M?gJJ} z5g1;N@bk_H>>&n`Z%1JGmW-cC1^HF&RI!c`*rO`8iDQ-7cJ5ZeSCqL+uv?#x&_AwH zy25ir}_s|l0Z9#9>GCJ^Y;UA(rE$4XD0uFJiT9g}*JEowyI+}uL9&AyxJkQGM%In9<>r3m4-r75K>);}1<_5ITC_{8T| z{J*ZJh*s=T2a2Zr;L!8kt*f&Sj{vndHw>d=0eO|jR%L>)2Q;# zX6)KDY}$M7oEg3X^3D7X#U{Mj@@n{M$meHc#f<@~oNh(S`-%za!OV;xWl2@qD3tpFh5UDxWOEn)l#1_AI1| zoTmEX0qo%Nw6cAL&>}2es+?FMmVGPqKxD|>=jW%LHTw^@C`K(U~FS&FStOCQ&=RxsoD^3r{ia=><8`aQ3pd@?huFL-B;pq!4d z+-e-Wsy0Cx6BVYG;3Sb4W@OA1YcR8^P1(6xu#JDCjhQRP|LlZ2a;Gt0*%cO)ZduTm zT!xuzMCWKE5DaEVPG@vt6rX%Yjc;;`l+flBg?W!A|C_-vU51HKgxQ$EXu2^IqcVswng35Z zuOWjGgCTG1}P>ddAqu(u{P0Yn^= cTqg>*pi%+6JeRz90S=eElmQyI)QpF diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 52635b60e5f66b14e67b5caef870e564c1690269..3ba046e028ce427f9d433fce8873a27acc449032 100644 GIT binary patch delta 12359 zcmd5?3wTu3wLa_Y$vc5b2q7dPnaPWY5Qj+!L0%I;1O$wT3W_oTs`$c)_&|Y7cqmoC zkb_yp0!>g-t*F5$V?}8|itiS!)%rjNirU-yz?S+J?!V628FDYZ)b?J#?;hAWd)C=! zpS9Os>tBy^LVMhyRjF;)x>7EC`l8am>?36uM!?;Et7`(q_eB3V4y(Gj#OjE5wSO5C zZ@PanefBl(b;)Nht1BG5J2!bW*B?GsM)+{q}v6O&|NzT{> zY3B-W?MKt*E6#tO`n5M?JWerp;OWZYa6x8>V%Or1QA^vu?wvT8vbf=WN^kFd-V1%H z%G$rUujO;OZ4u=z-07mK_Wg@Lh>fKXriihphnpt zDWBcP%o4tHH6_YVj}@Hm!!-YG>V2!IlAG7#&zLoszqwlZIkX;gu4_~7rU{hOp0oM! zSl2b!bL;g7-pxEFGVgM9{I{ygyWE_= z1KjyOr%bM0rqb9~LTT-r9@%t0{g#KD^eIgW4^Z^G9Nzsgm2l|SDuerptlC20-!qA_ zsLoov{^wM#MYhmmb@b{+XY#>0Dvv`65L?H6Dow314F1(R^0wxa+2#3Z*1qN(ky(xv zsm2bJQ6^32nm5&Sp7Ev%h{)ruj@#3?_-|&GRo$FyP2N~3;;*#a8(mGs^fJ8@ex;bo zhzl7x0`ZW+m6QP&!9eW5P&_OUB4EW36CIf9r5d zPE$WB9G@HyT}2bYrQqyF>#l#N;+%%o11%k`Ct3ztFSJaw-e_59*=Wbs*7QormkuT> zbO;6fct0AJIvl@7pp8TeI9HB0^{1^dTVbfjcw2vJ@BOxPap!wD@7MhUIG2YP51?hP zm@;Fg;kR0P4WRyf#$KpjaJ8!BfETK=V1=2_k%eYAK2oD#DBF^;ZEL*>D%#66f-d8# zHB`j;H>v(Hb73g+EZTtE%OR@WymmEZe>vP_>>=(F&%Qupt~`7X3oXsglIpxuqu zfVLKG9h!wE_uPYX6WUfZo>5Ly;~z#Z0V@wbSx)16@N0uj54)S8PW`_&)7c$SBdo(4 zbF5%SEC&yoE_N4^kC$(eEqz1v6AjG}i+}-+GD~Bg!77@q^OCP@oj@i(_8rVDRD_LQ zJ_jOM^Ar_QKhdY5w)I*gu1V*)&qCRc?4?30r#XvjPa_vCV!FV*f!(LUT*bDjj9Wsg zXVY-X4d+g#LjyVOMX35L$Jjl)RXGji`thB>@X1r;qpe~AP&I*uU_7AVBCcPLy@{+* zzL){Pr?FhW4!=XoWYVQ{D8ZW5lFpSclbe=sOO|UoFONV?ec5I%N6N65wi*Ykus6Tu z)B|P_Ctt6!#71&>T_e^X^twu|NOL?#{0>M!juXjGms?c@gISoej@;!EVRD;S<#NN> zW+sQmV=N3#*66)SmC;;2=!Z(!5P%Ub_Kc$p>LZE*&6sNXQ$K--#{xm4m}wn9-5d5a zP$Z70cp={-ACa4HpG1Y+JjC?VFL~`mtbW01ln--F=Guw4vMxjy^WiPPgUI=24%ddT zGZXl;@pO7P=UzG-V>Pdz&;9SFG@IYx8bFA>=aJ9UFgn*!TlY)w2R3^F*$Eq8JV204 zTFLcuRCd#Rl@rd{O#KNsD;_Vr;68fXbzY_Iz3oO-%Apabu1m8JNoS^S9iVshDo*p57 zY!9?@1C+;}>j=O4Eu>KW9K?2bsVt_*Oyq`2l|hSbcLKO}ya~)~Te=I7mf@6ltl>r2TyTWxqa89e6#b8oO7J6* zo)(v%H@&UmW6prAr}3vl%`?KeZ_|xQykP>A>9>>2oN&kc6o|DNmyV+WBC(+yh*LR$ z9!GgZPM#2a(mKb_w>7GK(bX6?uwWYR%2p$-&?6c4(t9|-5`0*dwthnKan2Txb!;%Q zN%`pvN8vpm(=ZxqRV^GWMwiZ`Ryp2#G6(+xlyvW*_?WwGj_Yfbmp9uw@tG*kmlRRS zKQeAMN)ZVe#&yI?rmGpisz*OYs1rQT!-1WYZgW#A(j6_EoC$kFr~p+Il^U_o%mv2E z^58Wy9QS{
F7GN;Wp@uXuEN#aprB~N~V`P){5vB29ZmY(36kANx7Pb(i{9Oy}& zg9Tzjbh;Bjcxp?5&TA2K*$w~;$l-5yAu71m5mDriDx+yBgrAda9!}!je#(VS3K(c- z4z?sr+i3yBuClcg6P4O=4NY_A2);?>bgzI^5g$neU`?~?&mYVUZ&5z%!`7^}-sUi# z^Ck=@a9Sq_ED{cFR7kew?M-XSQ{B5naC6)b}rjZB2!YtajUJK%jG z0NpE&=sg=^xg!hC2*v=Dn+qNS#{rCA@Y*8T!8cT4Yo%!>NnGvd(|Bh;5%8t)Cy1l@ z7Zqk92R9bul?vwrMA(3u4XP9|7fv40{ z+C6TUpN{}E=vNN=$2P+Y?wbh9Vh5=9RUp(}x7v1TyJkVFM#P!vbfsfGp37i8IkNFZ z>^a*k*Gf9hY>w$ZW6UiV&6_jhCjU%d*-YOM-Z#lCrvlu+iMdBgnKGv;0w4oo(8 zE15l?8qc4K|MPu5V`Q?u~;#-3Pw}`qbafuZqzx$zM*h1a1^E1BfUIyzheQx zb5yal^bxFbs(Cn;y)(=_{@DbT#2GWpe$wm4Yq9{1p-aqAA8a;`!Z~OD7jDZcW-ge& za3H@LRC%rfTnqmgSb|hWGk0RbZ3ll*g$+l@<&AR}W9C;Z5%Pm|p#k>T{FK7aP zoW|8t5P-o^=UAcu9&%}8LSmB1<`gUs##}1H-1MZgqrp*TC2i+j=bIywt~6$8Z3x(= z0+2}N=JO#RJISbCk6COdktU!bklk{V8Xyr2T`tU?&Y`OXK&~<)DcpF4+23+)faj1* zLvjed{0ih}PRL%&?kmh>2{DjMUFd1d??yejWv+P%yXTrKTW>XE6Ryy_{NDE6Hek8M z+0JtC*-psB7ts|_Bd{SZUnG#vFhOXU*u=D`-DlX|o+h4{QLu(a^YMiy>~EOHp~mp zyWMO&iWF0a3L8M}g&8+TXTpellbZllYb{0YyOI*(DKU_W{!-D`TuIoqnxB;$cAdIIF7H zV0+uc6Aqc%d-H3L!J(AC2TT)8f`V#D`p}Ub`~q_KyApZjLBSmtf=1G=D`Jjd*T>)} z^p3M39Eu>!wV}<{XUTbKo8v3A;`_Pd0Q4*UfH{r*dx4J4-vA9=V(XDNXjsfoV3P1A ztLZGB@2B)9($z;X+;+LZjPJPgEf{Z_iRyynUk@*_y4CwR_6Nye1az4nEIgHP7)Q5rPs7b#Qrt^YrR1 zs!Nr?>`vCPU*6Bb1ceHP)Hv*T8NMo$rih;?;)X8}6qNQiJ@kmq@_AJ<2Rv#o2PeXV zKksOs=e<&MxWVo`wbJp$o(|>XO%>vhr4#{_b2;I}YQ3cKz$6hUU1+`9+$)@Mrn<__ z^%K_wkN$qByYP`J44H)pF4W#`3g3D zi8x0X*Ej_K&pDx@KoL)^lq^;}JaodneX1Ir%v-WlAKp4aWmspN*IhD~3@*FG^l=m1 zQfrN(ILF_5onX0kuo|I-zqHdU-t1f|O$U72Ui&)R9n}s|XY%9euKwK7sM4j5mC4mZ zWbY)Gj2uxFbdFO^=$NI3S%LCa6=N7y-DTscyR1bAYl6f8ueBj~xnN8BI+YwwzFZwe zGP}`3a~;Pg;e?&0y{&Li@t&>XDp{{7Hu$*df^ zdl3bq>v`S^-L)pBugp$L7 z)vCkAjYZJo$WuskhC8V0`2zWbVY6eWDmFrXP%F}f5jr8u=q|Yxm~;wKR3UP60^XZc zKWo&ZCE=2FDl?w_Vk@ZD_+7^;pReS1zk#j*vy#m+(ar)s5>)P_vOy9Hlp|WXfdg%- znyWWL>!HN`c}Odr&HIBY1<7|+n;IX*`E8G= zu~axkj>veayxx^a??y9WAlhS;W(O^=IcS3H(SB6SJ=hY-T`y>DRf&9L4HaAS?r`(V zmMXW7Y=EgtKJlo{4wQY)nm<6XLP3=n4m_jciGn;ZsCrnz;>_@ZooXu4>=T5ezf#H22|x5s)I0lR_3p%u zt2(0}@6Bou{m6l7z*8xEwjlDe>%);rKI+>g)6!*7nk|X~A?tuSM%DudAZ4Qfnv1SQsDLV6ly+=#8lj2aSl!L1#!2v--GMcV1UD3+L**yJC zHToZxcFQ$tzojBpXmS<@wy8q)h;m3#`E#cVgOshG9d2CagyGfq!Ql7pQ6;>t2yu~Q zAM~^YgSK`;kEJ39&(n=ZoeAJee^+gFf?R>3&8URRWUfiiJv`ZJ9-q#&H==I3q(0X+ z$Ij?EKTj5v0BPXAQHGW%9UN&kZ5rG8whTwS*qM8m$4jcc{=jci?3vp}nca9wHrOlU z&O9Y~pbRNGW2jpuvw;TZ9%vHy_ePWF3_{CBlR?gFgD7_eCo7uFIAG?4LpW*Zs(R1t z)A!_oof^6GcMrCo7<}+^>dpQiK~19Bck+RP_9dMotmbR7u&-UhN>|!h`+v%wzpCdi zz1J3pVGPCSpK1|>OlK7{L90h!j(0V!6#f00mW5Yha?53C+46b}$Ca8^jQ&;ZJwVxY zH))awq?`4y+cd2Rv_+bBho*T!Td8S3(KHe6dQID`X%(Q|r)dvp8c4>2n)Z-G%Q563 zTQzZ8mw}Hd|s&<9d$2b(!O+rhTqyDH!*K?#JTQ zoycbdTB5wh!{OF6>8EO1nx=_Zi_n*66+5(mA&T5X5A^GS^2}=VMJnfMnv5&cFj*`kW83NEs^&*vQcn)!wUH?IZ<ysT63wM-|d0JEn5Kjp%K;ysPVcCz8hR36sdEfb*+R<_Ud=kQfsO z^>d`WjG9&!zx=H#u{<{n16(_0(?_UZlj$lvEfpG)jOIp5LF;y&?Sy0<>JaBePxv% zErzjL(>7`vNX8~j`*dAl>Fp|^TcVQW1-(VQH$l7$qr|#6jK5f(Zy!(U2R_|7J*dxU+Ad8KvFz5ggI&fQ z(lq&EKwu^Z%|u_0(=<&M-%r!d5n3Gx`Dhb0ak?Jp1?^%@yGqlFK)YJgZr3!y|2s5o zSC?_SH7%lPGT%W>`%u%w&g=f9i63iX0f?Vy+R-ip|E_7@bfJB#X(r5HRxDel(3c}Y z(?nW{nwF($!$He-Xmv(V6Z?W#;}DIIrh#P03spJfg{nNH8`^T+zeAs4PKNa5__3zR zHyZLnRWRhInkHJi5q;U3W}6223vmyAh-$ylWnct-@o67wnxOpO(4T|RB7@#M^?Q6&g{oRHl+6f7ZKQukYNuU%!AYMKNGu8 z-Dd?i;@vLKS|fqJhYB0Fdr%DYzDor$ORyD-qvjv`5LEbLfr~;_Vfd_;9_Por1=1|* zt0(&6BMJPDy$$<2r*jBi`pPUzF-v`PmZYT^B2gC(uGv9(G{#9&+X~@BPNb=My2yB~ z4-ulclBQ#7nv~+~tnLGGRQGhaob&>(eCy8EoR({pH% zb+AuQt05zc7M%#`>;9+Ed6BWmxDDSC`HZuSfkqYL^wBW60mdk#2!o6v=#}G2Ij#-B zuTi+>L$3_~D(vfi!;d@sxKnzIZH9UpFSuSb6GbndGi`%3PQ!)DNz=r@?ZY$C?ni$| z>Ctu6$(K$u@WQDEHTjddp9{YKuQ?y+FDu7aF-Ak|29=0}<@j;GW*_WTKJ1Nh>)C4e zqrW@3&xvyXk9Wa-i&6K(upVXnpYe?^^-f~^|C##O8_;zfw)%XJ4e)%A4M?l|VKiqD zJeAg+uB@M|I=w{vCv8FgDOlGje(Vp#`S;}8h2{Ngd?SPO|A0J4QRY-;+S4#kl6AjR z$@)fh<`2m8NveIaez>G)auUzE@OP)w5&fM(#@v6R-m!*!D{K5of~oJPu>VkBPX!sM zx|IJQF!wJo+*u)zRXWG1zySqnpWgLK+xJz%n>lR&Je?n2&kw&h5dX&5zOWKk2iv~T zhrjY~tW6mN>JW@^e4%)h9}*Wj_dM^P?0MsgTtsAf?^03BGHm|JXxtRL7;)3A&d{n{ zLaV-X`-#gE=0_thzg#{)rVg~Zc62t_3B{IU%0QF5^J`Gf575)Vh8X+NSb^{_{$NLDgeZ|5mL1hs3Y_B#`|yr%kh zzRRR%tnaF}a6=Kf)WyaeP7RrT?9dvz(%&wNzSK1AQ!AL8ZiVor`qt^bOC|3R+mdur z&TO%u9QWF-%hd`Esu0ae_d97EB_`eu0nBIF83gmoC>c0@P~ zA}k^Kw0ppF4ASHfQa% z_g;Ig_x-)U_qW~?d~8tg4NuptM&horALoA2OVZ_X^~87IV@#(Q58D0sSataYR!@x4 z{ewG3c)q!QL(#Kq?yuf(^jAxgw*7E7(;4zv{+KU0w1Er`rHSP3%GmW}{ni*~`8FBW z4{=vU(L{_D!-uBIi>;m{!&)7GrMljICjN++kW4O@7snXf^Um`n$=_T!)lWEIj`MqP zB>r7LPF-gA`J|~7MbT)x?QvImuGa57F0HCOx;E9!MHrczPu_eNKrFzzHCkRkLht`l-}*0`N>GC zv_4rg(()M|ZJn&U_Zn2${mGgyqGDZlWBvoSi#mcwC%gGa!^rP8*Y`-e(0%M-8f>~; z7jOl4>LnUzsF%9&t@>^tHrI<>Hjj(Z^c7bf6D#<(7b%6_U>a`B;lkB2g}bhz(H#6% zq;ZcI)=%-$wVdFky!NeveO}7sQ+brd+olTBG7p!~Jbt=Mj%8mS74Z`XD3^B+6A4!5 zP*W5VH|03W_v)Xq?8G3O?p7~?*(iG!f zc)>dOY#y%@MoOz;WOiph*C#KD!XohbQenz9#5GZNi8y7I{}Fn9s<-^bn+^4?KIRLm zEu3?HX`=M9?;NFZ5JgNt62N&IrVELZ-@ zpnG}T2@GvCl8`LW!yiCyy?p7@iD-SYB-;Z)Oqvb+uen#!8=CNr8^ot)LKX{ zxb-c(qma7wqXUn80@tV^KEwBl@R~97put^1D&}>i(qwbLETPG~Vg;svm@eljj{_++ z8>rMVNfm7O9uI01BP?@HDL?}=W;ZWh$O}toR?NUl!n;eTW-!;L!-{oYN_Ag{^-g7a zg37r3ZSv6lyw6J`II>atXbjJ6ks~+|WB6ze&%8o-dG|)3?k0;ym2qbf6m$Afj}_Wt zw6tf2GpAD@adDg|V9!RltK@_%vN|6zsfwF7z${Trr?{~cuMA#ES>dc&IzEm=^Re*ZJo7A#utLq{G)}G2%Uwr-nnSE7ONA6(yEGWH@IZVm`CDYCLI26tbs)4EJ>)hppV0 zCYyO>2yuGkJV4d+HU6ovrHz<}m+Q&_ykHK_+pU=iIjyg%MK;m#Xsi9nwN%18+T~>S zl*PXq=1LRBGxLB3^*S12d&c|_Ub=>xV*v`>8`bd?MX^W+Z#>M6Ax!Xo zK;7zjC>gg~_VDlgq(-wYuszCcMm`r^)WwjKVVY8hI zh~hQrhFATHUKU&zkc0SzHhBfr*vL_94FA4^O5=I|PO9LN1DI`Kh^(M9D*U|c52_g7 zNd-Ks1r`m=6+U`Py$m*dTa30MZ80>Fb4<_yAPw?+#Ek6+GN-$ix+Zb|OOz8fU#19R zce%*q;4T&Z=M)X^qDnh}8_uFH_^B|s@Bml<6q&1r&fv?t< z%=vDZ5;*uW!CbFWB$kuMQxVPPLtX>0N;S&GB8SO?dCCxP;UB^y*G4g-C6(5ww@+^U zSmx0>CV-s-gJmI|wvCb-rWpvjdi#m zA+nGouK*&IR&yId2K)&GBy*@yrf@CZoIThW0sLo@(`mQuww!BL=Y5;ErsS#TX78GPC0p#l#o6mbe=5 z=W;!+Y<-92%qfL?&H+5Zd2&7gj1Y(SMuU}pqh>OePkZ5IorbgGkh=pRM0dG_`UwrZnPeD7O?TY{e2ewl&{KvE_hyURi4z$favb6#L_a&w64D9Q7fbr?b_? zJg(6Wm(g~hm)pUu1wi02XscN~vr7@=K>UVlFVIeSCJkJs*(&e__^FQftwSP+WKQBp zx-h_ixtsPHsoc{@X#j=h*uV#%@~7MB;gE8L0GPML9YF zB*75UV+Gqh6m1jd1z4+K7=lfM8W>NoZu?!b)iX4SX4tHzU`zM$v2?MB*O`h`-hD#@pLrz zj1j4PO9!P`=7U2zibM?k#eO0<2~X(t`6h`vD|A%}G7j*l0csDL?c?@ebE2SCMNakmqvs+QPBufJlZ8JEqKnl}8!n?3s)az>zvTC2_-*(xeow znugcF-LOS+x}1ACSU55$R1Baw+zsF{7H_JPjW3d0<_2{zt2(O#tA4v0V~**f)W zjTv_UCYplSE|W`KORdJv;o;0#qA$wInK|5Miq?RfAjTJ4o(G3#9NW(f1Q{sCt}m`>Uxo& zq-1Gpf>2UPK+IL|LBv!jBFwhk8|tPQn&3p|1Vn0&!jn$g87d!;v{?dMge3MY0(gh< z zt>?Cbz<0=eJpuNe$A~Z`n0+AS>a5Xw4ttKsEg1C^EOw|C?qTdCBkA0`hcdKSe$yuB zrf50KPB3Z{v&hMu(<&&@T9d!s>grIq*!KvPfnSnsY%I5D8hM{8XtOo}oBe=O;95-G z7mGZlL+)>PZqX3OQsmb_RTi8T^r?7Np0LcuOzw?EjA&3tdSnSV z#Y)2-6z=_*K%$Fm$mqSUX8!4FTc(6Kl&4ZaDur{9iMkH_**z+KdEt7Am{4<(0w9l!57N|AVvTr<~D z3iszo&~fo&*Z`Z*<}kj&o$(@#HvE*hq17j1%h*r~h$>A*zt-%B+cUVX9?QnQ6~a|1 zdyUqI25|34fE*iNT15F(+IsmK;9N7f7K#THU14eU5*pZRXf5Vb;g3|-13B2R1WwWK zh}OEvg4PP*F8dt;lB4Md&S{YI z6x0zQst%zyU1o!Ni`wLX_HEvDmw|2}$wt|dEb$_oZi9+cTC$EGxLShxX2}r=+&4p9 z!*7AYxo3-<(6LyORlH`M^=?TTxs_l-M)ew*TsZ?9p?tODtz!QSnMPOgpvkJ-GFzn3 zhYC=z!dyhQ`5@+^cb9=7aO#V8u$WmDFp0KRU?bKsPK|V(N;a@&tWm@bEAZG8vEZok zaQ}@GTgTi3#oT2{Eth!jRRfaYGBu!=1Ea8gQ56q1EO-R;gH5;^EwTr$sB6JuE+S?zI z&xD`pkaJ_X8U-hAItvw5?wvbW)&B|Sqc|go1(;>$jFUZlG{Du)gR` zTVhlIyUW|1>HnupP<8ETs!TOcRY(2*XH^svd%X>gANrciwtCtMXec+Ug2F(F)Ln=% zYxvN|AOmc|H4qKndXq@ux({U+R~I9z=oD1qxVK;Wk%!84U~ol0l3XBEq~n?vJLR*L zrS4RCQ59*f;Oa>bM=5`lFK|vRz?blW%$InlPQLbL@b7D~HZ_G5j&hU!nF1*Gta`Uz z;*|FOpVdzNtV31*a)mQzJ+>x4moYJX_&k84tFNJETadxVx;CmMK6oTUYhezZLzKON z`U;y@07i*UJ*1OzJHC+7e_Pxv;+-cc|EKaq_{d3lCK1|0{W=kU1hwqB@CZKEzUHCy zoI~+>IeyTK1D`wa`qHE;_S+V5@@aVPEePf_0W6Ow!^7IV70QSl;0|hymVD3P7rpzI1%4T zI4)A>I~M;tH8+zIY=cCRS}n)eZ@1RTWf2`PhDf zfCp-Ws%#lj=~&e-d_3z4mH)j)3ClC!KhGJI2=UL`nriqR74g^VbP8R|jR`2`p(0z% zM^lXgt`Cw)0j_!+&{kDzS>syD$BH3sKOJg(;l2m6liJzti(~LJ3;(xajAS$2C=ho! zt4KHWPf6}*T%XT$6qKibI)JoJwUzi!b#JdOc7UF;P-gyDYTMjof_&=YMBG1L(;j&W zMy|)vQ^sqwj>%_np&s3HrWw`pOYvcs5l(JP{}AGuQ3}+dX|&4t^jBT??JA zMb0-s=TdF;S?u%;MSB_ACHP+H^bJG%PP8-ez4~W;ThLa&E_ME_Z#UYd=zHDiL!NNG z745nn272~ShzKw$>Q%DB=9 go>KEVfkO>G0mq+ks2_5_#4#|(uhCA!aZ>mFFXB^f?*IS* diff --git a/host/dxwndhost.vs2008.vcproj b/host/dxwndhost.vs2008.vcproj index f0fd80a..954da59 100644 --- a/host/dxwndhost.vs2008.vcproj +++ b/host/dxwndhost.vs2008.vcproj @@ -433,6 +433,10 @@ RelativePath=".\TabProgram.cpp" > + + @@ -554,6 +558,10 @@ RelativePath=".\TabProgram.h" > + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index a3dce89..8c5a084 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -45,7 +45,7 @@ char *strnncpy(char *dest, char *src, size_t count) static char *Escape(char *s) { - static char tmp[1024]; + static char tmp[2048]; char *t = tmp; for(; *s; s++){ if(*s=='\n'){ @@ -66,7 +66,7 @@ static char *Escape(char *s) static char *Unescape(char *s) { - static char tmp[1024]; + static char tmp[2048]; char *t = tmp; for(; *s; s++){ if((*s=='\\') && (*(s+1)=='n')){ @@ -180,6 +180,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_EmulateRegistry) t->flags3 |= EMULATEREGISTRY; if(dlg->m_OverrideRegistry) t->flags4 |= OVERRIDEREGISTRY; if(dlg->m_Wow64Registry) t->flags6 |= WOW64REGISTRY; + if(dlg->m_Wow32Registry) t->flags6 |= WOW32REGISTRY; if(dlg->m_HookEnabled) t->flags3 |= HOOKENABLED; if(dlg->m_NoBanner) t->flags2 |= NOBANNER; if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG; @@ -425,6 +426,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_EmulateRegistry = t->flags3 & EMULATEREGISTRY ? 1 : 0; dlg->m_OverrideRegistry = t->flags4 & OVERRIDEREGISTRY ? 1 : 0; dlg->m_Wow64Registry = t->flags6 & WOW64REGISTRY ? 1 : 0; + dlg->m_Wow32Registry = t->flags6 & WOW32REGISTRY ? 1 : 0; dlg->m_HookEnabled = t->flags3 & HOOKENABLED ? 1 : 0; dlg->m_NoBanner = t->flags2 & NOBANNER ? 1 : 0; dlg->m_StartDebug = t->flags2 & STARTDEBUG ? 1 : 0; @@ -652,6 +654,8 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, WritePrivateProfileString("target", key, TargetMap->OpenGLLib, InitPath); sprintf_s(key, sizeof(key), "notes%i", i); WritePrivateProfileString("target", key, Escape(PrivateMap->notes), InitPath); + sprintf_s(key, sizeof(key), "registry%i", i); + WritePrivateProfileString("target", key, Escape(PrivateMap->registry), InitPath); sprintf_s(key, sizeof(key), "ver%i", i); sprintf_s(val, sizeof(val), "%i", TargetMap->dxversion); WritePrivateProfileString("target", key, val, InitPath); @@ -785,6 +789,8 @@ static void ClearTarget(int i, char *InitPath) WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "notes%i", i); WritePrivateProfileString("target", key, 0, InitPath); + sprintf_s(key, sizeof(key), "registry%i", i); + WritePrivateProfileString("target", key, 0, InitPath); } static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, char *InitPath) @@ -805,6 +811,9 @@ static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, c sprintf_s(key, sizeof(key), "notes%i", i); GetPrivateProfileString("target", key, "", PrivateMap->notes, MAX_NOTES, InitPath); strcpy(PrivateMap->notes, Unescape(PrivateMap->notes)); + sprintf_s(key, sizeof(key), "registry%i", i); + GetPrivateProfileString("target", key, "", PrivateMap->registry, MAX_NOTES, InitPath); + strcpy(PrivateMap->registry, Unescape(PrivateMap->registry)); sprintf_s(key, sizeof(key), "ver%i", i); TargetMap->dxversion = GetPrivateProfileInt("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "coord%i", i); @@ -887,7 +896,7 @@ void CDxwndhostView::SaveConfigFile() for(i = 0; i < MAXTARGETS; i ++){ if(!TargetMaps[i].path[0]) break; - SaveConfigItem(&TargetMaps[i], &TitleMaps[i], i, InitPath); + SaveConfigItem(&TargetMaps[i], &PrivateMaps[i], i, InitPath); } for(; i < MAXTARGETS; i ++) ClearTarget(i, InitPath); this->isUpdated=FALSE; @@ -977,17 +986,17 @@ void CDxwndhostView::OnInitialUpdate() listctrl.InsertColumn(0, &listcol); for(i = 0; i < MAXTARGETS; i ++){ - if (!LoadConfigItem(&TargetMaps[i], &TitleMaps[i], i, InitPath)) break; + if (!LoadConfigItem(&TargetMaps[i], &PrivateMaps[i], i, InitPath)) break; listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; - listitem.pszText = TitleMaps[i].title; + listitem.pszText = PrivateMaps[i].title; listitem.iImage = SetTargetIcon(TargetMaps[i]); listctrl.InsertItem(&listitem); } for(; i < MAXTARGETS; i ++) { TargetMaps[i].path[0] = 0; - TitleMaps[i].title[0] = 0; + PrivateMaps[i].title[0] = 0; } Resize(); SetTarget(TargetMaps); @@ -997,7 +1006,7 @@ void CDxwndhostView::OnInitialUpdate() this->OnHookStop(); if(m_StartToTray) this->OnGoToTrayIcon(); this->isUpdated=FALSE; - pTitles = &TitleMaps[0]; + pTitles = &PrivateMaps[0]; pTargets= &TargetMaps[0]; } @@ -1043,7 +1052,7 @@ void CDxwndhostView::OnExport() i = listctrl.GetNextSelectedItem(pos); GetPrivateProfileString("window", "exportpath", NULL, path, MAX_PATH, InitPath); //strcat_s(path, MAX_PATH, "\\"); - strcat_s(path, MAX_PATH, TitleMaps[i].title); + strcat_s(path, MAX_PATH, PrivateMaps[i].title); CFileDialog dlg( FALSE, "*.dxw", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "dxwnd task config (*.dxw)|*.dxw|All Files (*.*)|*.*||", this); if( dlg.DoModal() == IDOK) { @@ -1055,7 +1064,7 @@ void CDxwndhostView::OnExport() TargetMap = &TargetMaps[i]; TFlags = TargetMap->tflags; TargetMap->tflags = 0; - SaveConfigItem(&TargetMaps[i], &TitleMaps[i], 0, path); + SaveConfigItem(&TargetMaps[i], &PrivateMaps[i], 0, path); TargetMap->tflags = TFlags; if(GetPrivateProfileInt("window", "updatepaths", 1, InitPath)) { GetFolderFromPath(path); @@ -1095,12 +1104,12 @@ void CDxwndhostView::OnImport() if(ImportExportPath[ofn.nFileOffset - 1] != '\0'){ // Single-Select // "buffer" - name of file - if(LoadConfigItem(&TargetMaps[i], &TitleMaps[i], 0, ImportExportPath)){ + if(LoadConfigItem(&TargetMaps[i], &PrivateMaps[i], 0, ImportExportPath)){ listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; listitem.iImage = SetTargetIcon(TargetMaps[i]); - listitem.pszText = TitleMaps[i].title; + listitem.pszText = PrivateMaps[i].title; listctrl.InsertItem(&listitem); if(GetPrivateProfileInt("window", "updatepaths", 1, InitPath)) { GetFolderFromPath(ImportExportPath); @@ -1122,12 +1131,12 @@ void CDxwndhostView::OnImport() if(i==MAXTARGETS) break; strcpy(pathname, folder); strcat(pathname, p); - if (LoadConfigItem(&TargetMaps[i], &TitleMaps[i], 0, pathname)){ + if (LoadConfigItem(&TargetMaps[i], &PrivateMaps[i], 0, pathname)){ listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; listitem.iImage = SetTargetIcon(TargetMaps[i]); - listitem.pszText = TitleMaps[i].title; + listitem.pszText = PrivateMaps[i].title; listctrl.InsertItem(&listitem); i++; } @@ -1151,21 +1160,23 @@ void CDxwndhostView::OnModify() if(!listctrl.GetSelectedCount()) return; pos = listctrl.GetFirstSelectedItemPosition(); i = listctrl.GetNextSelectedItem(pos); - dlg.m_Title = TitleMaps[i].title; - dlg.m_Notes = TitleMaps[i].notes; - dlg.m_LaunchPath = TitleMaps[i].launchpath; + dlg.m_Title = PrivateMaps[i].title; + dlg.m_Notes = PrivateMaps[i].notes; + dlg.m_Registry = PrivateMaps[i].registry; + dlg.m_LaunchPath = PrivateMaps[i].launchpath; SetDlgFromTarget(&TargetMaps[i], &dlg); if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ - strnncpy(TitleMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE); - strnncpy(TitleMaps[i].notes, (char *)dlg.m_Notes.GetString(), MAX_NOTES); - strnncpy(TitleMaps[i].launchpath, (char *)dlg.m_LaunchPath.GetString(), MAX_PATH); + strnncpy(PrivateMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE); + strnncpy(PrivateMaps[i].notes, (char *)dlg.m_Notes.GetString(), MAX_NOTES); + strnncpy(PrivateMaps[i].registry, (char *)dlg.m_Registry.GetString(), MAX_REGISTRY); + strnncpy(PrivateMaps[i].launchpath, (char *)dlg.m_LaunchPath.GetString(), MAX_PATH); SetTargetFromDlg(&TargetMaps[i], &dlg); CListCtrl& listctrl = GetListCtrl(); listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; listitem.iImage = SetTargetIcon(TargetMaps[i]); - listitem.pszText = TitleMaps[i].title; + listitem.pszText = PrivateMaps[i].title; listctrl.SetItem(&listitem); Resize(); SetTarget(TargetMaps); @@ -1269,6 +1280,31 @@ void CDxwndhostView::OnDebugView() CloseHandle(pinfo.hThread); } +void CDxwndhostView::OnSetRegistry() +{ + int i; + CTargetDlg dlg; + POSITION pos; + CString Registry; + FILE *regfp; + + CListCtrl& listctrl = GetListCtrl(); + + if(!listctrl.GetSelectedCount()) return; + pos = listctrl.GetFirstSelectedItemPosition(); + i = listctrl.GetNextSelectedItem(pos); + Registry = PrivateMaps[i].registry; + + regfp=fopen("dxwnd.reg", "w"); + if(regfp==NULL){ + MessageBox("Error writing virtual registry file", "Error", MB_ICONERROR|MB_OK); + return; + } + + fwrite(Registry.GetString(), Registry.GetLength(), 1, regfp); + fclose(regfp); +} + #define strcasecmp lstrcmpi void CDxwndhostView::OnSort() @@ -1294,14 +1330,14 @@ void CDxwndhostView::OnSort() while(swapped){ swapped=0; for(i=0; i0){ + if(strcasecmp(PrivateMaps[i].title, PrivateMaps[i+1].title)>0){ // swap entries MapEntry=TargetMaps[i]; TargetMaps[i]=TargetMaps[i+1]; TargetMaps[i+1]=MapEntry; - TitEntry=TitleMaps[i]; - TitleMaps[i]=TitleMaps[i+1]; - TitleMaps[i+1]=TitEntry; + TitEntry=PrivateMaps[i]; + PrivateMaps[i]=PrivateMaps[i+1]; + PrivateMaps[i+1]=TitEntry; swapped=1; } } @@ -1314,7 +1350,7 @@ void CDxwndhostView::OnSort() listitem.iItem = i; listitem.iSubItem = 0; listitem.iImage = SetTargetIcon(TargetMaps[i]); - listitem.pszText = TitleMaps[i].title; + listitem.pszText = PrivateMaps[i].title; listctrl.SetItem(&listitem); listctrl.InsertItem(&listitem); } @@ -1376,7 +1412,7 @@ void CDxwndhostView::OnPause() } else { wchar_t *wcstring = new wchar_t[48+1]; - mbstowcs_s(NULL, wcstring, 48, TitleMaps[DxWndStatus.TaskIdx].title, _TRUNCATE); + mbstowcs_s(NULL, wcstring, 48, PrivateMaps[DxWndStatus.TaskIdx].title, _TRUNCATE); res=MessageBoxLangArg(DXW_STRING_PAUSETASK, DXW_STRING_INFO, MB_YESNO | MB_ICONQUESTION, wcstring); if(res!=IDYES) return; PauseResumeThreadList(DxWndStatus.dwPid, FALSE); @@ -1393,7 +1429,7 @@ void CDxwndhostView::OnResume() } else { wchar_t *wcstring = new wchar_t[48+1]; - mbstowcs_s(NULL, wcstring, 48, TitleMaps[DxWndStatus.TaskIdx].title, _TRUNCATE); + mbstowcs_s(NULL, wcstring, 48, PrivateMaps[DxWndStatus.TaskIdx].title, _TRUNCATE); res=MessageBoxLangArg(DXW_STRING_RESUMETASK, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION, wcstring); if(res!=IDYES) return; PauseResumeThreadList(DxWndStatus.dwPid, TRUE); @@ -1447,7 +1483,7 @@ void CDxwndhostView::OnKill() } else { wchar_t *wcstring = new wchar_t[48+1]; - mbstowcs_s(NULL, wcstring, 48, TitleMaps[DxWndStatus.TaskIdx].title, _TRUNCATE); + mbstowcs_s(NULL, wcstring, 48, PrivateMaps[DxWndStatus.TaskIdx].title, _TRUNCATE); res=MessageBoxLangArg(DXW_STRING_KILLTASK, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION, wcstring); if(res!=IDYES) return; DxWndStatus.dwPid; @@ -1487,7 +1523,7 @@ void CDxwndhostView::OnProcessKill() if(!KillProcByName(lpProcName, FALSE)){ wchar_t *wcstring = new wchar_t[48+1]; - mbstowcs_s(NULL, wcstring, 48, TitleMaps[i].title, _TRUNCATE); + mbstowcs_s(NULL, wcstring, 48, PrivateMaps[i].title, _TRUNCATE); res=MessageBoxLangArg(DXW_STRING_KILLTASK, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION, wcstring); if(res!=IDYES) return; KillProcByName(lpProcName, TRUE); @@ -1514,24 +1550,25 @@ void CDxwndhostView::OnAdd() } memset(&TargetMaps[i],0,sizeof(TARGETMAP)); // clean up, just in case.... if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ - strnncpy(TitleMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE); - strnncpy(TitleMaps[i].notes, (char *)dlg.m_Notes.GetString(), MAX_NOTES); - strnncpy(TitleMaps[i].launchpath, (char *)dlg.m_LaunchPath.GetString(), MAX_PATH); + strnncpy(PrivateMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE); + strnncpy(PrivateMaps[i].notes, (char *)dlg.m_Notes.GetString(), MAX_NOTES); + strnncpy(PrivateMaps[i].registry, (char *)dlg.m_Registry.GetString(), MAX_REGISTRY); + strnncpy(PrivateMaps[i].launchpath, (char *)dlg.m_LaunchPath.GetString(), MAX_PATH); SetTargetFromDlg(&TargetMaps[i], &dlg); CListCtrl& listctrl = GetListCtrl(); listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; listitem.iImage = SetTargetIcon(TargetMaps[i]); - if (strlen(TitleMaps[i].title)==0){ + if (strlen(PrivateMaps[i].title)==0){ int len; CString FilePath; FilePath=TargetMaps[i].path; len=FilePath.ReverseFind('\\'); FilePath=FilePath.Right(FilePath.GetLength()-len-1); - strncpy_s(TitleMaps[i].title, sizeof(TitleMaps[i].title), FilePath.GetString(), sizeof(TitleMaps[i].title)-1); + strncpy_s(PrivateMaps[i].title, sizeof(PrivateMaps[i].title), FilePath.GetString(), sizeof(PrivateMaps[i].title)-1); } - listitem.pszText = TitleMaps[i].title; + listitem.pszText = PrivateMaps[i].title; listctrl.InsertItem(&listitem); Resize(); SetTarget(TargetMaps); @@ -1551,7 +1588,7 @@ void CDxwndhostView::OnDelete() pos = listctrl.GetFirstSelectedItemPosition(); i = listctrl.GetNextSelectedItem(pos); - FilePath=TitleMaps[i].title; + FilePath=PrivateMaps[i].title; if (FilePath.GetLength()==0){ FilePath = TargetMaps[i].path; len=FilePath.ReverseFind('\\'); @@ -1565,7 +1602,7 @@ void CDxwndhostView::OnDelete() if(res!=IDYES) return; listctrl.DeleteItem(i); for(; i < MAXTARGETS - 1; i ++) { - TitleMaps[i] = TitleMaps[i + 1]; // V2.1.74 fix + PrivateMaps[i] = PrivateMaps[i + 1]; // V2.1.74 fix TargetMaps[i] = TargetMaps[i + 1]; } Resize(); @@ -1771,7 +1808,7 @@ void CDxwndhostView::Resize() for(i = 0; i < MAXTARGETS; i ++){ if(strlen(TargetMaps[i].path) == 0) break; - tmp = listctrl.GetStringWidth(TitleMaps[i].title); + tmp = listctrl.GetStringWidth(PrivateMaps[i].title); if(size < tmp) size = tmp; } @@ -1813,6 +1850,9 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point) case ID_PLOG_DEBUGVIEW: OnDebugView(); break; + case ID_SETREGISTRY: + OnSetRegistry(); + break; case ID_TASK_KILL: OnKill(); break; @@ -2037,12 +2077,12 @@ void CDxwndhostView::OnRun() PathRemoveFileSpec(path); if(TargetMaps[i].flags2 & STARTDEBUG){ ThreadInfo.TM=&TargetMaps[i]; - ThreadInfo.PM=&TitleMaps[i]; + ThreadInfo.PM=&PrivateMaps[i]; CloseHandle(CreateThread( NULL, 0, StartDebug, &ThreadInfo, 0, NULL)); } else{ CreateProcess(NULL, - (strlen(TitleMaps[i].launchpath)>0) ? TitleMaps[i].launchpath: TargetMaps[i].path, + (strlen(PrivateMaps[i].launchpath)>0) ? PrivateMaps[i].launchpath: TargetMaps[i].path, 0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, path, &sinfo, &pinfo); CloseHandle(pinfo.hProcess); // no longer needed, avoid handle leakage CloseHandle(pinfo.hThread); // no longer needed, avoid handle leakage diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index 83247f7..f4dc736 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -21,7 +21,7 @@ private: void Resize(void); void SaveConfigFile(); TARGETMAP TargetMaps[MAXTARGETS]; - PRIVATEMAP TitleMaps[MAXTARGETS]; + PRIVATEMAP PrivateMaps[MAXTARGETS]; char InitPath[MAX_PATH]; BOOL isUpdated; DEVMODE InitDevMode; @@ -79,6 +79,7 @@ protected: afx_msg void OnViewLog(); afx_msg void OnDeleteLog(); afx_msg void OnDebugView(); + afx_msg void OnSetRegistry(); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnRun(); afx_msg void OnClearAllLogs(); diff --git a/host/resource b/host/resource index b362f0572c77100631f84839ff5afbae8fafc194..47eb586ec14f0397eb96f59c0b409a10dba61792 100644 GIT binary patch delta 171 zcmex1n`za2rVX0}CI@ixOul2LHCcd>jnQ~=pqb+2J{z{pdj!0~Cx75$nQUjl#%#=B zH2JofHc$!6