From 27a7d10a25cf8b35a4ca7ff1168064cce80ae7a2 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sat, 18 Apr 2015 12:40:38 -0400 Subject: [PATCH] v2_03_18_src Former-commit-id: 7c52867ad6c452042b2ec3734cc315859698b95c --- build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- .../Axis & Allies Iron Blitz Edition.dxw | 29 ++++ .../Crusaders of Might and Magic (GOG).dxw | 29 ++++ .../Crusaders of Might and Magic Demo.dxw | 29 ++++ build/exports/Darkened Skye.dxw | 4 +- build/exports/Dune 2000.dxw | 6 +- build/exports/Evolva.dxw | 7 +- build/exports/Forsaken (HW).dxw | 5 +- build/exports/Galapagos.dxw | 29 ++++ build/exports/Horde 2 the Citadel.dxw | 9 +- build/exports/Horde.dxw | 9 +- build/exports/The Mummy.dxw | 29 ++++ build/exports/Ultimate Soccer Manager 98.dxw | 29 ++++ build/exports/dxwnd.ini | 4 +- build/readme-relnotes.txt | 10 +- dll/ddblit.cpp | 22 +-- dll/ddraw.cpp | 26 ++- dll/dxhelper.cpp | 1 + dll/dxhook.cpp | 8 +- dll/dxwcore.cpp | 2 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 101888 -> 112128 bytes dll/kernel32.cpp | 14 +- dll/ole32.cpp | 157 ++++++++++++------ dll/syslibs.h | 3 + dll/user32.cpp | 28 ++++ host/dxwndhost.aps | Bin 155728 -> 129084 bytes host/dxwndhost.vs2008.suo | Bin 197632 -> 203776 bytes 29 files changed, 389 insertions(+), 108 deletions(-) create mode 100644 build/exports/Axis & Allies Iron Blitz Edition.dxw create mode 100644 build/exports/Crusaders of Might and Magic (GOG).dxw create mode 100644 build/exports/Crusaders of Might and Magic Demo.dxw create mode 100644 build/exports/Galapagos.dxw create mode 100644 build/exports/The Mummy.dxw create mode 100644 build/exports/Ultimate Soccer Manager 98.dxw diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 23dac4c..5c3db29 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f437c5d0f51575ce6fd0d3ffcc160d7c5f84f86db47b3af6847427a28466cde4 -size 577024 +oid sha256:2e7c1adfbd594089e1c8eb7040b06037ae1f239498a09399e82ef4e52023c080 +size 576512 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index e67795d..74d412c 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4637fee61c70d8ffa927a88878191e4174bac16129dd30242892a5ad07dcbc6b +oid sha256:a512e18dc9a004e3cb5f8f08eca94a0b06c8e5d935689eac885ba75f5636cde1 size 538624 diff --git a/build/exports/Axis & Allies Iron Blitz Edition.dxw b/build/exports/Axis & Allies Iron Blitz Edition.dxw new file mode 100644 index 0000000..17fa320 --- /dev/null +++ b/build/exports/Axis & Allies Iron Blitz Edition.dxw @@ -0,0 +1,29 @@ +[target] +title0=Axis & Allies Iron Blitz Edition +path0=D:\Games\Axis & Allies Iron Blitz Edition\Axis & Allies\AxisAllies.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=-2013265822 +flagg0=1207959552 +flagh0=20 +flagi0=138412037 +flagj0=128 +tflag0=6402 +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 diff --git a/build/exports/Crusaders of Might and Magic (GOG).dxw b/build/exports/Crusaders of Might and Magic (GOG).dxw new file mode 100644 index 0000000..6038dc4 --- /dev/null +++ b/build/exports/Crusaders of Might and Magic (GOG).dxw @@ -0,0 +1,29 @@ +[target] +title0=Crusaders of Might and Magic (GOG) +path0=D:\Games\Crusaders of Might and Magic (GOG)\crusaders.exe +launchpath0= +module0=gfx_d3d gfx_sw +opengllib0= +notes0=the ddraw.dll hooker in the game folder must be deleted or renamed \nto allow DxWnd to play the game. +ver0=0 +coord0=0 +flag0=-1467989966 +flagg0=1744830472 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=-2147477229 +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 diff --git a/build/exports/Crusaders of Might and Magic Demo.dxw b/build/exports/Crusaders of Might and Magic Demo.dxw new file mode 100644 index 0000000..4016a48 --- /dev/null +++ b/build/exports/Crusaders of Might and Magic Demo.dxw @@ -0,0 +1,29 @@ +[target] +title0=Crusaders of Might and Magic Demo +path0=D:\Games\Crusaders of Might and Magic Demo\crusaders demo.exe +launchpath0= +module0=gfx_d3d gfx_sw +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=-1467989966 +flagg0=1207959560 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=6418 +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 diff --git a/build/exports/Darkened Skye.dxw b/build/exports/Darkened Skye.dxw index a67b3be..ac9f547 100644 --- a/build/exports/Darkened Skye.dxw +++ b/build/exports/Darkened Skye.dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=679493666 +flag0=679493664 flagg0=1207959552 flagh0=65556 flagi0=69206020 @@ -25,5 +25,3 @@ initts0=0 winver0=0 maxres0=-1 launchpath0= -notes0= -flagj0=128 diff --git a/build/exports/Dune 2000.dxw b/build/exports/Dune 2000.dxw index 83abcdc..a90698b 100644 --- a/build/exports/Dune 2000.dxw +++ b/build/exports/Dune 2000.dxw @@ -6,11 +6,11 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=671105312 +flag0=671105058 flagg0=1207959568 flagh0=20 flagi0=4194308 -tflag0=64 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -25,3 +25,5 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +notes0= +flagj0=128 diff --git a/build/exports/Evolva.dxw b/build/exports/Evolva.dxw index 1aa687b..c715fc8 100644 --- a/build/exports/Evolva.dxw +++ b/build/exports/Evolva.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134217760 +flag0=134217762 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=6146 initx0=0 inity0=0 @@ -24,3 +24,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=128 diff --git a/build/exports/Forsaken (HW).dxw b/build/exports/Forsaken (HW).dxw index 025c461..f5ba94d 100644 --- a/build/exports/Forsaken (HW).dxw +++ b/build/exports/Forsaken (HW).dxw @@ -8,7 +8,7 @@ coord0=0 flag0=411058208 flagg0=1207959808 flagh0=20 -flagi0=4 +flagi0=2097156 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=8388736 diff --git a/build/exports/Galapagos.dxw b/build/exports/Galapagos.dxw new file mode 100644 index 0000000..be8b55b --- /dev/null +++ b/build/exports/Galapagos.dxw @@ -0,0 +1,29 @@ +[target] +title0=Galapagos +path0=D:\Games\Galapagos\GALA.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=7 +coord0=0 +flag0=746602528 +flagg0=1207959552 +flagh0=16 +flagi0=138412036 +flagj0=142610600 +tflag0=6402 +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 diff --git a/build/exports/Horde 2 the Citadel.dxw b/build/exports/Horde 2 the Citadel.dxw index 08c8dff..a889d01 100644 --- a/build/exports/Horde 2 the Citadel.dxw +++ b/build/exports/Horde 2 the Citadel.dxw @@ -6,10 +6,10 @@ opengllib0= ver0=0 coord0=0 flag0=134217766 -flagg0=134217728 +flagg0=1207959552 flagh0=20 -flagi0=4 -tflag0=64 +flagi0=4194308 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -24,3 +24,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=128 diff --git a/build/exports/Horde.dxw b/build/exports/Horde.dxw index 881986a..ce5f1c9 100644 --- a/build/exports/Horde.dxw +++ b/build/exports/Horde.dxw @@ -6,10 +6,10 @@ opengllib0= ver0=0 coord0=0 flag0=134217766 -flagg0=134217728 +flagg0=1207959552 flagh0=20 -flagi0=4 -tflag0=64 +flagi0=4194308 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -24,3 +24,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=128 diff --git a/build/exports/The Mummy.dxw b/build/exports/The Mummy.dxw new file mode 100644 index 0000000..67f7cb4 --- /dev/null +++ b/build/exports/The Mummy.dxw @@ -0,0 +1,29 @@ +[target] +title0=The Mummy +path0=D:\Games\The Mummy\MummyPC.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +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 diff --git a/build/exports/Ultimate Soccer Manager 98.dxw b/build/exports/Ultimate Soccer Manager 98.dxw new file mode 100644 index 0000000..512c1af --- /dev/null +++ b/build/exports/Ultimate Soccer Manager 98.dxw @@ -0,0 +1,29 @@ +[target] +title0=Ultimate Soccer Manager 98 +path0=D:\Games\USM98\USM98.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217760 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=266368 +tflag0=-2147477245 +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 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index 1036463..823f159 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1439 -posy=619 +posx=1496 +posy=246 sizx=320 sizy=200 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 013e4df..7f73f80 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -776,4 +776,12 @@ v2.03.16 fix: MapWindowPoints hook - added coordinate scaling (fixes "NBA Live 99" components size and position) fix: using "Suppress D3D8/9 reset" sets the backbuffer area as large as the whole desktop to avoid clipping add: added "Unlock Z-order" flag to avoid window to stay locked on top of z-order (useful for "NBA Live 99") -add: added "EA Sprots hack" flag to suppress some interfering hooks set by EA games internally (useful for "NBA Live 99") \ No newline at end of file +add: added "EA Sprots hack" flag to suppress some interfering hooks set by EA games internally (useful for "NBA Live 99") + +v2.03.18: +fix: eliminated direct output to primary surface, causing more troubles than goods ("Divine Divinity" flickering...) +fix: handled CoCreateInstance calling CoCreateInstanceEx in hot patch mode. +fix: eliminated InvalidateRect calls in ddrow Unlock hooker: this is not the right way to fix "Deadlock II", sorry. +fix: DirectDrawEnumerateEx log +fix: cursor is hidden in fullscreen mode only +fix: CoCreateInstance & CoCreateInstanceEx wrappers. Now "Crusaders of Might & Magic" is playable in window diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index dd776c8..ec66120 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -64,15 +64,16 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest // Wrong guess!!! The cause was not compression, but simply a pixelformat mismatch. Better // configure things properly and avoid this branch. switch(res){ - case DDERR_UNSUPPORTED: - if (dxw.dwFlags1 & EMULATESURFACE){ - RECT targetrect; - if (IsDebug) BlitTrace("UNSUPP", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__); - targetrect=*lpdestrect; - dxw.MapWindowRect(&targetrect); - res=(*pBlt)(lpDDSEmu_Prim, &targetrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx); - } - break; + // commented out: it was the cause of the "Divine Divinity" flickering. + // commented in?: it seems useful in "Axis and Allies".... + //case DDERR_UNSUPPORTED: + // if (dxw.dwFlags1 & EMULATESURFACE){ + // RECT targetrect; + // if (IsDebug) BlitTrace("UNSUPP", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__); + // targetrect = dxw.MapWindowRect(lpdestrect); + // res=(*pBlt)(lpDDSEmu_Prim, &targetrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx); + // } + // break; case DDERR_SURFACEBUSY: (*pUnlockMethod(lpdds))(lpdds, NULL); if (lpddssrc) (*pUnlockMethod(lpddssrc))(lpddssrc, NULL); @@ -261,8 +262,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest RECT targetrect; dxw.ShowOverlay(lpddssrc); if (IsDebug) BlitTrace("UNSUPP", &emurect, &destrect, __LINE__); - targetrect=destrect; - dxw.MapWindowRect(&targetrect); // v2.03.15 + targetrect=dxw.MapWindowRect(&destrect); // v2.03.18 res=(*pBlt)(lpDDSEmu_Prim, &targetrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); } diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index e9a04b9..927cec0 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1760,9 +1760,10 @@ HRESULT WINAPI extInitialize(LPDIRECTDRAW lpdd, GUID FAR *lpguid) res=(*pInitialize)(lpdd, lpPrivGuid); + if(res == DDERR_ALREADYINITIALIZED) res=DD_OK; // v2.03.18: this error could be caused by the CoCreateInstance implementation if(dxw.dwFlags3 & COLORFIX) (((DDRAWI_DIRECTDRAW_INT *)lpdd))->lpLcl->dwAppHackFlags |= 0x800; - if(res) OutTraceE("Initialize ERROR: res=%x(%s)\n", res, ExplainDDError(res)); + return res; } @@ -3716,18 +3717,12 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC } res=(*pUnlock)(lpdds, lprect); + if (IsPrim && res==DD_OK) { + if(dxversion == 1) lprect=NULL; + res=sBlt("Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE); + } if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - if (IsPrim && res==DD_OK) { - if(dxversion == 1){ - res=sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); - (*pInvalidateRect)(dxw.GethWnd(), NULL, FALSE); // to fix "Deadlock II" mouse trails.... - } - else { - res=sBlt("Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE); - (*pInvalidateRect)(dxw.GethWnd(), lprect, FALSE); - } - } if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; @@ -4712,7 +4707,7 @@ HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE lpddPalette) return ref; } -BOOL WINAPI DDEnumerateCallbackFilter(GUID *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext) +BOOL FAR PASCAL DDEnumerateCallbackFilter(GUID FAR *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext) { BOOL res; typedef struct {LPDDENUMCALLBACK lpCallback; LPVOID lpContext;} Context_Type; @@ -4725,7 +4720,7 @@ BOOL WINAPI DDEnumerateCallbackFilter(GUID *lpGuid, LPSTR lpDriverDescription, L return res; } -BOOL WINAPI DDEnumerateCallbackExFilter(GUID *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm) +BOOL FAR PASCAL DDEnumerateCallbackExFilter(GUID FAR *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm) { BOOL res; typedef struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} Context_Type; @@ -4759,15 +4754,16 @@ HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX lpCallback, LPVOID lp { HRESULT ret; OutTraceDDRAW("DirectDrawEnumerateEx: lpCallback=%x lpContext=%x Flags=%x(%s)\n", - lpCallback, lpContext, dxw.dwFlags1, ExplainDDEnumerateFlags(dwFlags)); + lpCallback, lpContext, dwFlags, ExplainDDEnumerateFlags(dwFlags)); if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} myContext; myContext.lpCallback=lpCallback; myContext.lpContext=lpContext; ret=(*pDirectDrawEnumerateEx)(DDEnumerateCallbackExFilter, (LPVOID)&myContext, dwFlags); } - else + else{ ret=(*pDirectDrawEnumerateEx)(lpCallback, lpContext, dwFlags); + } if(ret) OutTraceE("DirectDrawEnumerateEx: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); if(dxw.dwFlags1 & SUPPRESSDXERRORS) ret=0; return ret; diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index 99d2230..c97a6f0 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -936,6 +936,7 @@ char *ExplainSetWindowIndex(DWORD c) case GWL_STYLE: eb="GWL_STYLE"; break; case GWL_USERDATA: eb="GWL_USERDATA"; break; case GWL_WNDPROC: eb="GWL_WNDPROC"; break; + case GWL_HWNDPARENT: eb="GWL_HWNDPARENT"; break; case DWL_DLGPROC: eb="DWL_DLGPROC"; break; case DWL_MSGRESULT: eb="DWL_MSGRESULT"; break; case DWL_USER: eb="DWL_USER"; break; diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index aa95c59..06afaf3 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -598,7 +598,6 @@ void HookWindowProc(HWND hwnd) void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height) { - HRESULT res=0; LONG style; @@ -629,7 +628,7 @@ void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height) // fixing cursor view and clipping region - if (dxw.dwFlags1 & HIDEHWCURSOR) while ((*pShowCursor)(0) >= 0); + if ((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()) while ((*pShowCursor)(0) >= 0); if (dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0); if (dxw.dwFlags1 & CLIPCURSOR) { OutTraceDW("AdjustWindowFrame: setting clip region\n"); @@ -937,7 +936,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp dxw.dwFlags1 |= LOCKWINPOS; dx_UpdatePositionLock(hwnd); } - if(dxw.dwFlags1 & HIDEHWCURSOR) while((*pShowCursor)(0) >= 0); + if((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()) while((*pShowCursor)(0) >= 0); if(dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0); if(dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion); if(dxw.dwFlags2 & REFRESHONRESIZE) dxw.ScreenRefresh(); @@ -974,7 +973,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp if(dxw.Windowize){ prev.x = LOWORD(lparam); prev.y = HIWORD(lparam); - if (dxw.dwFlags1 & HIDEHWCURSOR) { + if ((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()){ (*pGetClientRect)(hwnd, &rect); if(prev.x >= 0 && prev.x < rect.right && prev.y >= 0 && prev.y < rect.bottom) while((*pShowCursor)(0) >= 0); @@ -1681,7 +1680,6 @@ void HookInit(TARGETMAP *target, HWND hwnd) if(dxw.dwFlags5 & GDIMODE) dxw.dwFlags1 |= EMULATESURFACE; if(dxw.dwFlags5 & STRESSRESOURCES) dxw.dwFlags5 |= LIMITRESOURCES; - if(hwnd){ // v2.02.32: skip this when in code injection mode. // v2.1.75: is it correct to set hWnd here? //dxw.SethWnd(hwnd); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 29c7a1e..7958352 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -997,7 +997,7 @@ void dxwCore::ScreenRefresh(void) if (lpDDSPrim) extBlt(lpDDSPrim, NULL, lpDDSPrim, NULL, 0, NULL); // v2.02.44 - used for what? Commenting out seems to fix the palette update glitches - // and make the "Palette updates don't blit"option useless.... + // and make the "Palette updates don't blit" option useless.... //(*pInvalidateRect)(hWnd, NULL, FALSE); } diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index de6e7ab..7b88850 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.16" +#define VERSION "2.03.18" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index cf841b653e25bd122242d8581d2661dd85fce33f..65f237b8c12c25f7b65fd5edbe32411519feedaf 100644 GIT binary patch delta 13613 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 Q%&6d5%oa1Fg4>w=9fQWFfdBvi delta 13515 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 diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index c794fc1..940f747 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -17,6 +17,16 @@ typedef BOOL (WINAPI *CreateProcessA_Type)(LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTE BOOL, DWORD, LPVOID, LPCTSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION); CreateProcessA_Type pCreateProcessA = NULL; +#ifdef NOFREELIBRARY +typedef BOOL (WINAPI *FreeLibrary_Type)(HMODULE); +FreeLibrary_Type pFreeLibrary = NULL; +BOOL WINAPI extFreeLibrary(HMODULE hModule) +{ + OutTrace("FreeLibrary: hModule=%x SUPPRESS\n", hModule); + return TRUE; +} +#endif + // v2.02.96: the GetSystemInfo API is NOT hot patchable on Win7. This can cause problems because it can't be hooked by simply // enabling hot patch. A solution is making all LoadLibrary* calls hot patchable, so that when loading the module, the call // can be hooked by the IAT lookup. This fixes a problem after movie playing in Wind Fantasy SP. @@ -33,6 +43,9 @@ static HookEntry_Type Hooks[]={ {HOOK_IAT_CANDIDATE, "GetLogicalDrives", (FARPROC)NULL, (FARPROC *)&pGetLogicalDrives, (FARPROC)extGetLogicalDrives}, {HOOK_IAT_CANDIDATE, "GetTempFileNameA", (FARPROC)GetTempFileNameA, (FARPROC *)&pGetTempFileName, (FARPROC)extGetTempFileName}, {HOOK_IAT_CANDIDATE, "CreateProcessA", (FARPROC)NULL, (FARPROC *)&pCreateProcessA, (FARPROC)extCreateProcessA}, +#ifdef NOFREELIBRARY + {HOOK_HOT_CANDIDATE, "FreeLibrary", (FARPROC)FreeLibrary, (FARPROC *)&pFreeLibrary, (FARPROC)extFreeLibrary}, +#endif {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -533,7 +546,6 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) } // to do: the else condition: the program COULD load addresses by ordinal value ... done ?? - // to do: CoCreateInstanceEx if((DWORD)proc & 0xFFFF0000){ FARPROC remap; switch(idx){ diff --git a/dll/ole32.cpp b/dll/ole32.cpp index 484e3b5..fd0d8fd 100644 --- a/dll/ole32.cpp +++ b/dll/ole32.cpp @@ -7,10 +7,13 @@ extern void HookModule(HMODULE, int); +static BOOL bRecursedHook = FALSE; + static HookEntry_Type Hooks[]={ {HOOK_HOT_CANDIDATE, "CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance}, {HOOK_HOT_CANDIDATE, "CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx}, - {HOOK_HOT_CANDIDATE, "CoInitialize", NULL, (FARPROC *)&pCoInitialize, (FARPROC)extCoInitialize}, + //{HOOK_HOT_CANDIDATE, "CoInitialize", NULL, (FARPROC *)&pCoInitialize, (FARPROC)extCoInitialize}, + //{HOOK_HOT_CANDIDATE, "CoUninitialize", NULL, (FARPROC *)&pCoUninitialize, (FARPROC)extCoUninitialize}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -29,7 +32,7 @@ FARPROC Remap_ole32_ProcAddress(LPCSTR proc, HMODULE hModule) return NULL; } -// so far, there are 4 additional libraries that could be loaded by meand of a CoCreateInstance call.... +// so far, there are 4 additional libraries that could be loaded by means of a CoCreateInstance call.... #define ADDITIONAL_MODULE_COUNT 4 struct { @@ -61,58 +64,94 @@ static void HookAdditionalModules() // ------------------------------------------------------------------------------------- // Ole32 CoCreateInstance handling: you can create DirectDraw objects through it! -// utilized so far in a single game: Axiz & Allies +// utilized so far in a single game: "Axis & Allies" +// another one: "Crusaders of Might and Magic" .... // ------------------------------------------------------------------------------------- +extern void HookDDSession(LPDIRECTDRAW *, int); +#if 0 +typedef HRESULT (WINAPI *Initialize_Type)(LPDIRECTDRAW, GUID FAR *); +extern Initialize_Type pInitialize; +HRESULT WINAPI extInitialize1(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { OutTrace("1\n"); HookDDSession(&lpdd, 1); return DD_OK; } +HRESULT WINAPI extInitialize2(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { OutTrace("2\n"); HookDDSession(&lpdd, 2); return DD_OK; } +HRESULT WINAPI extInitialize4(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { OutTrace("4\n"); HookDDSession(&lpdd, 4); return DD_OK; } +HRESULT WINAPI extInitialize7(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { OutTrace("7\n"); HookDDSession(&lpdd, 7); return DD_OK; } + +void HookDDSessionInitialize(LPDIRECTDRAW *lplpdd, int dxversion, Initialize_Type extInitialize) +{ + OutTraceDW("Hooking directdraw Init dd=%x dxversion=%d pInit=%x\n", + *lplpdd, dxversion, extInitialize); + SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize, (void **)&pInitialize, "Initialize(D)"); +} +#endif + HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv) { HRESULT res; OutTraceDW("CoCreateInstance: rclsid=%x UnkOuter=%x ClsContext=%x refiid=%x(%s)\n", - rclsid, pUnkOuter, dwClsContext, riid.Data1, ExplainGUID((GUID *)&riid)); + rclsid.Data1, pUnkOuter, dwClsContext, riid.Data1, ExplainGUID((GUID *)&riid)); + bRecursedHook = TRUE; res=(*pCoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv); - if(res) + bRecursedHook = FALSE; + if(res) { OutTraceE("CoCreateInstance: ERROR res=%x\n", res); - else - OutTraceDW("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv); + return res; + } + + OutTraceDW("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv); - if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){ - LPDIRECTDRAW lpOldDDraw; + if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){ // v2.03.18: fixed OutTraceDW("CoCreateInstance: CLSID_DirectDraw object\n"); + HookDDSession((LPDIRECTDRAW *)ppv, 1); switch (*(DWORD *)&riid){ +#if 0 case 0x6C14DB80: - OutTraceDW("DirectDrawCreate: IID_DirectDraw RIID\n"); - res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0); - if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + HookDDSessionInitialize((LPDIRECTDRAW *)ppv, 1, extInitialize1); break; + case 0xB3A6F3E0: + HookDDSessionInitialize((LPDIRECTDRAW *)ppv, 2, extInitialize2); break; + case 0x9C59509A: + HookDDSessionInitialize((LPDIRECTDRAW *)ppv, 4, extInitialize4); break; + case 0x15E65EC0: + HookDDSessionInitialize((LPDIRECTDRAW *)ppv, 7, extInitialize7); break; +#else + LPDIRECTDRAW lpOldDDraw; + case 0x6C14DB80: + OutTraceDW("CoCreateInstance: IID_DirectDraw RIID\n"); + HookDDSession((LPDIRECTDRAW *)ppv, 1); break; case 0xB3A6F3E0: - OutTraceDW("DirectDrawCreate: IID_DirectDraw2 RIID\n"); + OutTraceDW("CoCreateInstance: IID_DirectDraw2 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); - res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv); + res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)ppv); if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); break; - case 0x9c59509a: - OutTraceDW("DirectDrawCreate: IID_DirectDraw4 RIID\n"); + case 0x9C59509A: + OutTraceDW("CoCreateInstance: IID_DirectDraw4 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); - res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv); + res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)ppv); if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); - case 0x15e65ec0: + break; + case 0x15E65EC0: OutTraceDW("CoCreateInstance: IID_DirectDraw7 RIID\n"); - res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0); + res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)ppv, IID_IDirectDraw7, 0); if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); break; - case 0xe436ebb3: + case 0xE436EBB3: break; +#endif } } - else - if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv); + else { + if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv); + } HookAdditionalModules(); + OutTraceDW("CoCreateInstance: res=%x ppv=%x->%x\n", res, *ppv, *(DWORD *)*ppv); return res; } @@ -122,13 +161,14 @@ HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOute DWORD i; OutTraceDW("CoCreateInstanceEx: rclsid=%x UnkOuter=%x ClsContext=%x Count=%d\n", - rclsid, punkOuter, dwClsCtx, dwCount); + rclsid.Data1, punkOuter, dwClsCtx, dwCount); res=(*pCoCreateInstanceEx)(rclsid, punkOuter, dwClsCtx, pServerInfo, dwCount, pResults); if(res) { OutTraceE("CoCreateInstanceEx: ERROR res=%x\n", res); return res; } + if(bRecursedHook) return res; for(i=0; iQueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv); - if(res)OutTraceDW("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res)); - lpOldDDraw->Release(); - break; - case 0x9c59509a: - OutTraceDW("DirectDrawCreateEx: IID_DirectDraw4 RIID\n"); - res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); - if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); - res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv); - if(res)OutTraceDW("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res)); - lpOldDDraw->Release(); - case 0x15e65ec0: - OutTraceDW("CoCreateInstanceEx: IID_DirectDraw7 RIID\n"); - res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0); - if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); - break; - case 0xe436ebb3: - break; + LPDIRECTDRAW lpOldDDraw; + case 0x6C14DB80: + OutTraceDW("CoCreateInstance: IID_DirectDraw RIID\n"); + HookDDSession((LPDIRECTDRAW *)ppv, 1); + break; + case 0xB3A6F3E0: + OutTraceDW("CoCreateInstance: IID_DirectDraw2 RIID\n"); + res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); + if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)ppv); + if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); + lpOldDDraw->Release(); + break; + case 0x9C59509A: + OutTraceDW("CoCreateInstance: IID_DirectDraw4 RIID\n"); + res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); + if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)ppv); + if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); + lpOldDDraw->Release(); + break; + case 0x15E65EC0: + OutTraceDW("CoCreateInstance: IID_DirectDraw7 RIID\n"); + res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)ppv, IID_IDirectDraw7, 0); + if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); + break; + case 0xE436EBB3: + break; } } - else - if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv); + else { + if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv); + } } HookAdditionalModules(); + OutTraceDW("CoCreateInstanceEx: res=%x\n", res); return res; } @@ -197,3 +240,9 @@ HRESULT WINAPI extCoInitialize(LPVOID pvReserved) res=(*pCoInitialize)(pvReserved); return res; } + +void WINAPI extCoUninitialize(void) +{ + OutTraceDW("CoUninitialize\n"); + (*pCoUninitialize)(); +} \ No newline at end of file diff --git a/dll/syslibs.h b/dll/syslibs.h index 2710520..8b35f8e 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -136,6 +136,7 @@ typedef BOOL (WINAPI *GetExitCodeProcess_Type)(HANDLE, LPDWORD); typedef HRESULT (STDAPICALLTYPE *CoCreateInstance_Type)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*); typedef HRESULT (STDAPICALLTYPE *CoCreateInstanceEx_Type)(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, DWORD, MULTI_QI *); typedef HRESULT (STDAPICALLTYPE *CoInitialize_Type)(LPVOID); +typedef void (STDAPICALLTYPE *CoUninitialize_Type)(void); // user32.dll: typedef HDC (WINAPI *BeginPaint_Type)(HWND, LPPAINTSTRUCT); @@ -350,6 +351,7 @@ DXWEXTERN GetExitCodeProcess_Type pGetExitCodeProcess DXWINITIALIZED; DXWEXTERN CoCreateInstance_Type pCoCreateInstance DXWINITIALIZED; DXWEXTERN CoCreateInstanceEx_Type pCoCreateInstanceEx DXWINITIALIZED; DXWEXTERN CoInitialize_Type pCoInitialize DXWINITIALIZED; +DXWEXTERN CoUninitialize_Type pCoUninitialize DXWINITIALIZED; // user32.dll: DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED; @@ -565,6 +567,7 @@ extern BOOL WINAPI extQueryPerformanceCounter(LARGE_INTEGER *); extern HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*); extern HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, DWORD, MULTI_QI *); extern HRESULT STDAPICALLTYPE extCoInitialize(LPVOID); +extern void STDAPICALLTYPE extCoUninitialize(void); // user32.dll: extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT); diff --git a/dll/user32.cpp b/dll/user32.cpp index 861f45e..bc35be4 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -36,6 +36,12 @@ HHOOK WINAPI extSetWindowsHookEx(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL (WINAPI *PostMessageA_Type)(HWND, UINT, WPARAM, LPARAM); PostMessageA_Type pPostMessageA = NULL; BOOL WINAPI extPostMessageA(HWND, UINT, WPARAM, LPARAM); +typedef HRESULT (WINAPI *MessageBoxTimeoutA_Type)(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD); +MessageBoxTimeoutA_Type pMessageBoxTimeoutA = NULL; +HRESULT WINAPI extMessageBoxTimeoutA(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD); +typedef HRESULT (WINAPI *MessageBoxTimeoutW_Type)(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD); +MessageBoxTimeoutW_Type pMessageBoxTimeoutW = NULL; +HRESULT WINAPI extMessageBoxTimeoutW(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD); #ifdef TRACEPALETTE typedef UINT (WINAPI *GetDIBColorTable_Type)(HDC, UINT, UINT, RGBQUAD *); @@ -99,6 +105,9 @@ static HookEntry_Type Hooks[]={ {HOOK_HOT_CANDIDATE, "WindowFromPoint", (FARPROC)WindowFromPoint, (FARPROC *)&pWindowFromPoint, (FARPROC)extWindowFromPoint}, {HOOK_HOT_CANDIDATE, "SetWindowsHookExA", (FARPROC)SetWindowsHookExA, (FARPROC *)&pSetWindowsHookEx, (FARPROC)extSetWindowsHookEx}, + //{HOOK_HOT_CANDIDATE, "MessageBoxTimeoutA", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutA, (FARPROC)extMessageBoxTimeoutA}, + //{HOOK_HOT_CANDIDATE, "MessageBoxTimeoutW", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutW, (FARPROC)extMessageBoxTimeoutW}, + {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -1113,6 +1122,7 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT ret=(*pMapWindowPoints)(hWndFrom, hWndTo, lpPoints, cPoints); // v2.03.16: now must scale every point (fixes "NBA Live 99") + // v2.03.18: in some cases it should not! "New Your Race"... for(pi=0; pi|j$c#8AD8X?##f>pwrm@5K7I zE9Uy=znJTdJLdYQ`I6y(?KIb~s?7C^dP#R+`0ZC@l-@r)W8c%HN5aWOyd#y2hMQW! z=l9pb_YgEyZ;Pv1a}Nak!JrQo8j>1`MN$z%^1~uS3ahHY13=rMsz`St7Vj`K)v(ym zIy&2pOc06;p2!Lzh%YgfM~2lxv8l~X3n@@yYSy@r4@ynpk$E9M*jd=I#8GBgsc^DY zZ`EQkF*{TX4g|Ju*pWx9RsknF>~N#Z^k0^si(PP(_R#gx{-g1DtDa276QZiN20Vru zi?`@qS|n|VwNO4Q&h9a!DBv|@I{$1qr1+qMDNeh+((szKSVR{aqedYm0FSc)XQ^!| z?d-zl653fv3BoeA^;}tGxsew$X*c0iXVR#sg%yUbc83!Qx@#>ZWS;^n4LKR^iii=0 z=z~@4wo@)$ZB?Y(RXT%V1)z#m$Yu5?3`^Wm_M$?*5Io5evfZ)9@Qe*>ZQ=zHm3{@D zVtZxB3dL{}bo*Jy4?a_~t~}%qfS;Y0%P_#cmMdAgtBmd0oGT9L55ijJbv=$X^l4|k zt_2u0&>mL-hS))u(@{G&J*~B?adGpZKsD5{b1oU5X5YA+a=no;ZM`WLPa5YA1mXM0 z!WpNu4%tw~E;S%~BU6TrtlwQGg^~RtBTMU%eUp)~iJfx0P-PjnEJcvjf9{r=k?Eh? zv4vH5To`5RJT99?kLUeE_PiQJ@de-+w%g;jwUTz@P?@2vg%~^Q@knjRVwc@gJF=~p zWhstq;(-K@gv#vaz-b>T+V=XKe7DK>bdgiUyJv5#@D zXHUO5J{4ZCw}rKKF*Xo@fjPBHQzLOht_FQh*4h)DDMMZhgLAT~bwrv{-G)&ELys5% z)ewX5gE=v!v3p+>;3n2sQBpQMr^mGQNs+ErU^B9Y-BU!BV`VvRV}q40+&=kwWkbU}0GPJ1b3@J|iJh_hXmaZtSF^;&^u14;`@mW@Ig7(AZ(oz8 z$JwTR%@$tFezkA4g^Sp{H&>WAZ;5Rw-Mx<`-Y#bPn}t@w#SUZ>=w=sZv4=gjf4P+@ zXD$1eS=h_o%Hns%3Rq^pY#MAGv4XKI8zrXAva`f~WU?_gJ3l6#Iz2pGK6!WSV7>$s z+}9=9a}+4d;ju31iFx@pfC+|oWj>OYa-=C6TXWyZCj`Ej!|EP5`6+>aKaV~0(8;F- z9?a!e(vrt^Iv@DAX~}JSw*a`kTXIX$1^jFdI(ed7%CQ|^2s}-y?UPdAJB5AG$?KMo zeTr|c`J(ne%B9tw-8;g z@*`VN&ZSEkehv6XLOc07_v}Dt9_8TlUJCX}j=U2K0RBqkJ4)D29R@D4`#sv7Z6&&4yxA{M>2Fn3$rT!Vm+xGyJnpMKx6%%J7GTjlrpF zG>Zls#(``6-WAJ8+@jh2Vn<>Ikv~u?qa+5%KfZ%z32pUWuVnU$E=K;*e5+)X$Spy{ zbhQ%s?rgJNL~c4Qr!j#1r&(t^k={N!c)g1J=k*lHr{Xapiv}c_KdhIE^2Be@C#K@F z-OpMB15&B2I)Z%X0F_@Szy+vpratQ=2cI6GM>Iw3sRm-V1zQ?L{;dclG~{-jz(@>v zP=J+fw5bRMM|27vC$>|_#}m|6fanG~s3zJ9|8@uRt3sYgQbz&)kw&g3$X5o*KiP-8 zyps+S9s;=7k9<#;d15Voq}ga~W&{-XAY4WRpOCkR=I(7?St)1rl)fu~pJ;n1D zc%FUpZ)VoEmrphyHx8HkbIEjS$ZL&tc1FF4#!Dy5$siMy0tUsrNeuFnNq%qjCi8o+ zJfF!Ggr?1_XINn%%QT(d6n@V;K-@b}0HLwEyr~5HS~*`GEgtcv384-bk9yMu5E?HY z^BNeqEFBDHay>L=ywhuBSjjK;mHX0}3`4uTCga)jUo_2QK-3lSn(ePHG_x98m^PKp z1m)gbu8(ND+PoQd(nY4>$eD~Jc)3{0y<~HvS6iJZrNV|6s*xmZS%yh6Dk92wq?Cy(9Q}aS5 zrg6cMUm7Sfb(eRrowCL>G#tX{qQ5Ml84)fT^$xYiuQ4+k4r5$$`Cv8)#u?Y@9d6HC zW11R|U>pg{Nh}_Xdq>(k)|kfTqZr8|O84h;g%Y)mMZBZ!Pu7^`Ll!YQk7aSFm=_V4 zNUORyfvK!FC{&=k! z-_|Mpkyw*K_dt&dKHeJj;#KYj)7fN>79`%<=5^We7n>RF$1qwj<&3oX)0lUPmMniFu3dhKo&e=Lt3VK|ft$e4DqV z22m^p`8;}HWV`3v-4~mgrrUl-KMC8i&deB<#A1K-1Jhu$>&*TwK~4K$xpW+jcqx0{ zIyCCB*U(R|-LlTiF=_kqIy1|B#r~glX0GY8V=ghXO~xLKpOgA)dZOiE#ltkPyxAIL zE+1s`gXEW&{i!j#VEwlMcF{wd&9{nu0>o3KGhwKCRIeSHI z!=T^K_tL6jXz0UrZP-fEi}hN67Ko-+&$Ip2Pd-o9xc8HP+R*!H7gbHWLAkvco+1=C{dKQ?2xy|&9l z>P+667tIVT?5r2f5k~yRwv{iMT%El9SYh^tm(1(#dH7$=2k!ZwUN-;Yo=<$m^t$IA zubAW9^W-0ySM+(?o*$VDwC~1k>wba;4)fMe&1V(No}Za?1+(;ZbAJU>|L-PV!K{4K z{11n*fBa>23Xxx#3yppDEpxbbZ~naP)3?mYuBDl@?VG7^lKJw`}DWwnsE!hV>njudc8rf+w;87KZni7f06q7(ez9I*<)USZgtob zUoeN+YhN(8)Bjv;pWkH;oauRMNA2AMoC^Mn)Z3O9&FtYeFN(dHP8Q1jL3W^=&*ca5 z9sygcz~T_J-yib2yeM1*(_#as3Vwg!wR_P>1h8b;@6HXBx^v43)GDBoU+4)+1ZeAG z8ugq2vjg{5=y#^*ND6mSNtB8cM=7^gJtS~mWSUFrqDaF%DMO z`{b92@!rAj!yS<}MW9m&w&=){W9f8$o|z5kA`?BF`4@Vvq( z#QVh{?-zUoNnXSQMLLO)IO+|XQFz-A|Mthfv7{0;8WHu30iyAXoDX_WClh`)5oDkb zOt(KE*rx>ql4ymOLQpCUVZZYWbc?)sySxoSwK~q0=WNdFlqZSS;_}iPWbzO!Hx3y9 zvIqbY-+pR&8BCNZz#!W|D3CjFqSw#%VEM2L@OF<5n;FC4+F`p3xxpd~LllvpaLbW{ z7#`AFZ#3ZafAl*O{|=`qmHSi6NjZk{=sAXUr-{<0WMf3OiQAAY3S~c0N-qN);uoeH zt}%pU8=1IHIwlk8tRb05#*G4w_J!;e>>P&9QmE_}#3T%ztx(x9%E=rC(jJX@!%>7D z%n9!U+DFR5T&6-p+Dkh0JO`uw1VtrT%y%%_Q&3WZ9pqrL$r!f4!DwqK(+j;}-GHz^ z*lbLAFbJWaa_AvT&d@Oo4ViB;>5LgGn2-%8yUwTsDkw7K(RQ8MIDpl74U_dEbH?<| z6?$jpqwPA)@fDO<_Gr7#bs~2bGJDZ>Y*CUzOQnehi&6Lj#!RYU?E7UiehvdCSAao( zzBB}`bn5lCe;BTlS1DvmVOzP~j7mFo7vw=0Go^xYK7;%SqYkW~#Bq=-VZ>BMR19{9 zPJfzb-``?dMqyvrF%N*7(5}kk*i?cmFO;(6qGLGf?u+$%pv?V1>gG?B{ee;r&PiuM z@=cUg>`}mV4mI#jz-0o%UJW7+gifFa-UWDQ0TbmcG9MDyw~`5_WvXca&)7<~cwYqZ zq|1jE!%$J@P|3k^gXvYFA|9alfWZ?gU~#tOei_lgbLIm)43z>&XJJxc_!2Nb*>nm= zS+Zj_hAg!VK|ey4d<8?&qmvy0D%$TXTME>)Hc)lKvT;N2x#R%3Ryyf2KL_9h@B`CC zYs*H|AIK(p39q6(pkgYi!(w`cbf~sn#?Mq5soblL=uFcWAl#uYD{3Gcor4U3X-&=q zGh-@44P+6lQRG3b)K?^&S0b3MR@L|y{r-F=Q1jp6W{bmNu0&ZcG|_cD!2aeK{^Xp>1* zKM6RDbx&uRRMk^S{pCc8^FA|J0TN|Q6{-SEND#Lr~=66IdRn7xCEfkF{s33_pJu^Ue{%_~EE6?=1oVZxf3 z@VUN}BflB+_Xqvx$@ySe##Ea9wJ0JvV&djN&%XA$nQkYqGW*R94TZHS^mMm(z-vXE z2cB$?Tt%Tn)kx$E!LlG*>i3r;EwF-CvsGs)Gb^P_ywi{s;8wDf#SD^I(Fo$&(13|d zI$se1IcFM0Bu|T6BFU4F_Uz-UObdl+#yi0Nbd_lkhJ=(<6}hl{j>&6y0gP4}!LPJs z(E~^;?Hsf6mtMh?sy-DUQ`XFcGN%dKcbb`)40Q^FQ-s~8WE1*!PFWa)5zbL)nJ5H7 z78`+N=G^dPyWuo9waND3(_oUgS6M#4h$SH#;`}VREZG-v$}9q*iX*ZosYN>!qf-$~ zUl6FMp%MXYHRp0`gjg&M*+r+Du`8GfX^IAjpRwc+GTJ$hD@X(zLDuiiaF@>GQqYko z%gW+-%Lc?b-EsEYr<(>@%W?LW)17jW15cE@GwD*Qkn8XE6MYrS)KTN4iUWD5V6jNb z!zoCxq*E24LBf6p6Jagv(6y^d!7t{K?ZSB=ox^N8Bi_Q$GG?IDCG?&fC?IJ_c-6`& zcFEVB+6k-0pd>*^x;qW7Nl`j${4(SQp8_=&uhv;(^LQY!EuE^eVq1!R>Ab>q+6spq zNKIm6)TwJe$^P5d&5Ze>rQ(m z($t5}MHHLPGSW;}ROU|Ll;21DCa!amagdM5`&k^qq7mGFFavbw58_On@bd0jd`-R(HWlr%()bXDR2>5hy#MSK`Y*O5XUisFi-{XKqvKhBu_v?aT0 zOi(HZO#(aik~7VOc_A?~!fjSMGm~|jY&W0j%)x>7xid|ZI1S-2k;@g5oUevz!naEs zgfid%foV3zeu%bXxSt80-3b`37?{h{Kqf<>V0Q*GhqsZ2<12wjB8S^9+$6v*5Z2gv zXPN28aZh9SBI+R{Mr4&xi1a0yp`Gg3aINh>pJnQg=V??!GZ`!~js0)lHdiLYT z%uL*aF>YIx6zJkxk@+@u(b;BZ zg^3kgkp?$5bGGv*lWUhz;^`;?D-7TyDPaW5hZYm@m5xpx7RV~5#ZI5MOz2jU1wL-{_V3}>?mqa5qS4d9?p=OsEUaJ7#dg> zL(D>O)haP0fW?3#xGIdmVUv-+)U6zKQI|Le@i##-odcC!d5+mX!LyN(aCD*DB60J~ zh)!1g=L%_^$ONocE(*gw-1u`d?O?2HO?bmzk+g$)a+#2E_SJJt!(1Lz*!8nM%w!r; z6iXe&{f%eMxu)ry5LLp@_tVuYda9i)nVuptNrX`YBUX!760;;k&06Bjm@N2%VkcY# zH`Shhu4$MP8Zn#0;tG)q+osx0U~4fGiIvah{7k;rr$iK+=t^ou&=o)4o6eBkp(Km_ z!?~t;L8uS7vVlT2%jPRZL^{FocHViWX-SABU4V#N0heNt31@Tp++a|M$(&uHWr95y zy~ud7%9Nlk2n#@E?R9GW`|fn6#+BLDRS&(Y%yD2ZCWIP6xW%BGK=j; zS1vviZs-W&&h^0Q6l5>J8c`5IMzKID>T)BMP7!>G@j?cj@VfhWY3=V;n<>JCNS}ip z34ak=5xH}BY}_cYsEJ&nE})a)QaBLVg_+ieM1QnBuY?GW`hVSUfa`KAbBB z*_-Sq6YL^6nIJBGVN8XaPW6X^pta|-auBS)1axt9Dw}1i@ zzZmFgH`=L6E0%(GeGgsB5Kk%xoXD2GVH(B*qN_d8&O6^s71b0gC=RqYSLzFfNQS5; zVU8x+{Q1sa%EDq3w<7(F0F}sea>5y9AksKMAR$UPouCXr`oMlhb8^vmjj2th5$NPf zgMm+$hT=L3SY+EIgDhXTNNOV**9lXSC{czec#U8RxMhb|S8Yk#wczr{Q5OwPu%Df8 zTF#RBaVOd8Aved4(glJt<&=*kI0rW_4ivcRv7%st#Rnk<6k-()EZjG7BgNx6K2-fWnYFGOlT1g2EM`pn5>i)N#*DJ<6-Prz)pS7? zs3f320Zop%zz>661QPq=q`r3XV1`!F8o8@O1Vo2&oC9ON{ln{2kL! z21NI@C?RGh?mLD8mC!^Ih*)vF&+)lB=7J|#Zni;1Y+`p3jk$EyRJ#ZKi>``Ap&J=2 zC=L|J!+{@{tdgF3ihV;Wd=#XQwk&WXH_+TOGn=EI8K?iatD`qOY>K zVYHA(r^a1yCDi!aj&##Qrm4y;^2)_Lg3E5dK*UG^gnEGoLBc&zC<;#IzX$E?qR4=Bppi@{u>r!1quj_rfxXdnFH zR7sQF`lt^4>Z7VplOEUcj(!|Pk z(6T?kWp%NsriRw5(+Q1|TH5haOUpp6rxoYJlOSUluBnA&CtqZyFA4R5Ns-407uVKe z!BDu!R>q-1+qudIi6ult#kP#8vzLL2c7#EXpki)9RkxK1_Cdp|RkzwLSKeZBRC&uF zuD+E_FI}`VQ|>aF$gmz&(Ey)Z4treY(oLYr{nnuOs?ddK7Oycab83n9D%AziYLw&7 zttHyKW*1bOPzgLwC*o#aQ@ATLqT*ff#hO)9yvu0Opilv?KGa$n($Y9j-PL(FB7{3#M$bUzbW6R_>0c^y%~Q$>XyPlW=;M<{N( zLhZ-=E6hP`QF^aX)AIEz%)EK9F>YDlSE(`OCk-jcX#6|MvzxCl(+&v%9Jz4K4Pee_ zG!VZA;-k1ghXB%pYe0Hd_KPwG+>SOeSE?PJePtzn;0?mAT&OjpB^yWX^5u?P(Clp7 zFnZN54o2`=k0Z?o@<}QjX2yLmS(!iaXP>#!)U%lW?Ml;(qU;J5(kV;+iCZSaE&B@t z=(~WU0pYO0$a2s5XO#EzBo}%1SiJP;i(^z;Wr9{|r9xa(8PVa}1dn)$B!q13{)HCH2dv==E#5^_R^6{rs67{Qf+qE-GpJ2h9%5J(h@CJOfp z1+Gn_;gJ@V&7nAZ_0?uFZ=Bn&)~IGX9==*b#DObwg{x;~I7(|m){RSL8HKCniUApg zL5_AL?7(Pjq%OJf(b#0y;EX9_P~{zVA(diCKYYNjc~EHFgcB+qxyoFl#~pEu3l6Ff z4*vm31}T3a6Q*@Ghz=_hh{`gc!VBURQ%AL*9NC7@V71OeoJbnPcscErDL2k+BKs%& z=MbT!vvhAvCmh02!T>lsWxZ);(H^y4MccPtt@^p^^=xykqj_+>n)g>6>V32#35YYP zgx(Z_(V8|u>Un5GlH zh_(-jdl^e@=8?3dd{Qapav3^vfs;6KZS%i3(-Zur>eyPLEd&)x7M|;aN^U}%h`y{s zbh7zcGj$wwq>f|qwWb-LSX6qW#3m0b#|GC~GAQBu6?Ug_+&X;L$O_YhaV z@mRcS_Se^%M%_PD?NCUTo&D^RLzJz*&NSe=3*ts8oZ@t`;@FcA@<=|Y<4ZnK0&m9a zup2KnP2@K593~8XtF$k2ukV$Fz`lzwqNEa`!~P@mJY$`^N9_oG!t@2qg+61_E?48r zC)efr(DMW9%xnjL1s^)O=l{UhPVRZ^C1#d9ciKbnd@lFd8J^@`UpwtfuZ z_v+B|_bzp^?6eQ!S&of0@<5Wk=0mA{hur65DJF@tQ0a4q&<9g{VZt9xG0Mbk^fEJD z^q|^tPEUwc z9Gy4%`I{|Qxb8NnJPQgc)Wg9|L8&~#|r&K)+>7btV?Kv7IkX(XA5 zlrzC?I5%Oh<7+0+wpET6#RLq!RE#mT8sQoOS5n3VYK76=zg&l#ZSBtP4!?YUooPIE zpMj8iNiXl7F3fNM|pG2B#A zKz8*;GoPE@u+bdC56=T~aHs_;0C712rghIOH*vQS2 zI|#`MWqCB9KcWM!98oSW8_`(h`y(30>>N?ay$zbMf+L{FmDtu62jPMdM4E#I3`Je%{T*qE$ zRj)R=hnK7}_j{|d7=N=S5281#P_j3xP|mwqX*S?tPH05b9u_I0rPw9q4#hup?LTnM zCf=fhMQ%~)mTocgtMO_c!8CQ$J;aB0^b}foha9L3!%HtZ>X3BYr#lbfgL4J71Soh! znPh^FeCVE+;h0(q`m{{2esznu{;PfCsD)KobgRlJbE``BTeqtCZoO3}``oR%a_>3R zqTBF&`P|#g1Xc^YEuPq$wncBopZZt!wI+R z1ffh#M+i;LdePrO!044E3>cK%darBw^6e^`Ki;n9vhfbpjAPwH84qFY)?T@AsURyA z4|p-K51Q=GJIq)X>%ZQi?7i=99XLm}~os+U(Nc7_Vj1QTqXm`yTG7eR90WL^c z!re8?$7mGYC3D$~sC0MD0x~{8dLTtMK{{YpGh8$HU;&XtwF^E+)DS=s=&-$9dI-4= z9Oj98;1f7Zut|<~*D8VHi-}&ufzm;z$1BvZS@+E1&1%U`+N|PRhli?xDbhCrX?KoJ z#ZdT8oA2q(x}Lw>Y!2rh_rFVfJo+wk7(-Uvr8Jk`r8EzM27er+y4{v$Abq>>E;DUE zxykzbUFP7hSuTQt{$+De=MruQu~TAkwhlJ9+brOL&beDhy!mb&=!bW!ntT8nN>xv} zM-{039&;o&T6K@MzUCfnz3m=z1f%}?o}l_{9c9R?lp%p&Bgbc2tPb>uMTDI z!>9Cryw^-&Fy2H8N8M){8PWqt*w!TdTseuLs~gM9(-Qr%*WafdK69U%{9n0;Pwz7e z=T_ubEccd5)r55_mShFB{{6a=EAQ6@_@DPH`&;hUz4nTGc>jJC%%m+Uk8f|mw+~<0 zqG=|2tB3yZb#f{eNW256#9CK9u0uTRuGD_~xT5|9RMln{VF{^-7JrF^d^Jrtz(q@F zGJ>aX!R1sBe8`Eo_Jpr?z)nQAizATFDzyu{;R!RErT@+oxT|>N2{WGGc08eM11u96 z^`t&9;o>LFBqq!~sRH}PlV3EO?h+1koGDBpPr2`GfG_sKL{Ody6uft8*#$*qIw-B! zM;^des!Z(Ur_{iJHPp?iotZ5k$PG7S?EqYt3mbr9B`^R%kWWl!s_+4Qt3@UEv-BY*R> zi1VgxX71w9T&d;;wFXjnMWPDV2e_5Z=X+R;sD(gN`_*k`-t15x#9g^UBPQYwjKk}= zYnz(6ceW|dqn}X`9`=l~o5n-f@R9rFL^h8~`BIE}#WQ9u8I=2<(Yd|i9zJjn6Q9*B z6@At$TvFi>SA%8xI3Pt;+%!kO#-9L*v{g#ZD1w*0cGI&uhi9L4D(VKP+paeE@a?Lm zecN?1Teo8uU%p-Aoa?qLw*bqMy}4bP{A9bXb<+-o9JfRJIBAFWdg%^rb@vWs;bn*V z{SIYe%1$MY?KB6o%un2@#Fy{X=CAHF&GvoUGfIoId$h}_4qmEC!f&I$?x#b z&`0$1)PSL%ZA+)fZ~uJxO}EN#kTm7ynV%l8_hfzA+G$`%o?V@__5_W@4x+vAM`gp@*Bf6?r(b3k9Nb--yPV4@v470 zWZ%C#Fb@69{5$q?)EJUY6?Mm_>;)jvj_ z->=2y>G==;u**Kef-V_lMs6F|Y&QTn>d4W?+K-^PZ;Uo0izYPN*9aOJV@9r-)NJ?A zOMbE$d8nb;*6+bfX{s6dK})lZ(97>;nUNC~HrqVCoHO6p!9D2d<0Fi{h#q<)=$jr+ z>N0j4J?zB8oAj{$1Y`e358qFkkx%;2-=EOM`i!xie=@Ts9Ev~2^!exe;a{7vOa5f0 zje4UW>QA z^pdf+xtD2gnvvD-2%`S~qQyte`xDWGzuOgmMzWWl$BwJBxBXdLkDgIy%k%ZcJF?Es z_zMPG0(Nc#JM*!gqpcY!Z<6Oe>Wq?VqAj1{U2Z%MEldr zFFv-%(7^Qk#sPJ9(G+d{T1%Zhf(9nckB_LcpAbv*^73(Y_E_Sg{`flkYSPTG7ybpc zo_V}o_ZJf#^<4oUW%v9A(%yx)83D{u{a^8R&f+@T_*b-j84sQG(0f9i9i)fHmekqt zy&&8`gm3$G))M&BWS!kc4^IYlc5*-Pdk7y%)!A$4t^RNHmd0BiZxMQX18<9#;w?{a pm-Jx(Y{F49Gj;YNdRUW3-*}iAAE<-I?2msBOv1#x2&C`+`~Ri_Ef4?z diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index eea5c8a21a849bd31cada4bfb50724d075843d01..1a31ec43faca18502b008bc67c961a1fc5c7efcf 100644 GIT binary patch delta 7484 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 D?5Fl(