From 24b2212671e5d1ac7265fbecd14645b6e1fec9a7 Mon Sep 17 00:00:00 2001 From: gho tik Date: Thu, 22 Sep 2016 12:47:19 -0400 Subject: [PATCH] v2_03_87_src Former-commit-id: 58a87d2916d9e1f59755b1578dbc79e53b63a9b6 --- Debug/.gitattributes | 1 - Debug/dxwnd.dll | 3 - build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 161 -------------------------- build/exports/Abuse.dxw | 33 ++++++ build/exports/Apache for Win95.dxw | 33 ++++++ build/exports/Ashes to Ashes.dxw | 33 ++++++ build/exports/Knight Moves.dxw | 33 ++++++ build/exports/Theocracy.dxw | 33 ++++++ build/exports/Vital Device.dxw | 33 ++++++ build/readme-relnotes.txt | 13 +++ dll/advapi.cpp | 9 +- dll/ddraw.cpp | 175 +++++++++++++++++++++-------- dll/ddrawex.cpp | 19 +++- dll/dxhelper.cpp | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.sln | 20 ---- dll/dxwnd.vs2008.suo | Bin 60416 -> 107008 bytes dll/winmm.cpp | 3 +- host/dxwndhost.vs2008.sln | 20 ---- host/dxwndhost.vs2008.suo | Bin 45752 -> 46592 bytes 22 files changed, 370 insertions(+), 261 deletions(-) delete mode 100644 Debug/.gitattributes delete mode 100644 Debug/dxwnd.dll delete mode 100644 build/dxwnd.ini create mode 100644 build/exports/Abuse.dxw create mode 100644 build/exports/Apache for Win95.dxw create mode 100644 build/exports/Ashes to Ashes.dxw create mode 100644 build/exports/Knight Moves.dxw create mode 100644 build/exports/Theocracy.dxw create mode 100644 build/exports/Vital Device.dxw delete mode 100644 dll/dxwnd.vs2008.sln delete mode 100644 host/dxwndhost.vs2008.sln diff --git a/Debug/.gitattributes b/Debug/.gitattributes deleted file mode 100644 index b110a24..0000000 --- a/Debug/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.{dll,exe} filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/Debug/dxwnd.dll b/Debug/dxwnd.dll deleted file mode 100644 index fc12968..0000000 --- a/Debug/dxwnd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:376837a1b95e6e5d26e7b830f9803793e1696e09bcf1a001546221ea7ca36234 -size 1510912 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 7228366..b1103fa 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:abb383260149f633908f2e087c909b6ca3e83cc898ce307e206c535b859b5c20 -size 679424 +oid sha256:b68ac891dc35be7d517bfa66d0fc29b94c29c7c38273d82c8ae56fd2f926de67 +size 680960 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index c878596..85c11b7 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f52a066da9d64089dcf503b41b1682f8dd6e52123d24a62986dd651152c1bdb +oid sha256:013cb94598addc50851bd8ef0dc46a726aabc48cfd154c93b41fd0d7e5bb2e73 size 660480 diff --git a/build/dxwnd.ini b/build/dxwnd.ini deleted file mode 100644 index 1335ec6..0000000 --- a/build/dxwnd.ini +++ /dev/null @@ -1,161 +0,0 @@ -[window] -exportpath=D:\DxWnd\v2_03_86_beta\build\exports\ -posx=-528 -posy=444 -sizx=320 -sizy=200 -exepath=D:\Games\Defiance\ -debug=0 -autohide=0 -checkadmin=0 -namefromfolder=1 -updatepaths=1 -[target] -title0=Imperialism II -path0=D:\Games\Imperialism 2\imperialism II.exe -startfolder0= -launchpath0= -module0= -opengllib0= -notes0= -registry0= -ver0=0 -coord0=0 -flag0=679485474 -flagg0=1209008128 -flagh0=20 -flagi0=4194308 -flagj0=0 -flagk0=32768 -flagl0=4 -flagm0=0 -tflag0=0 -dflag0=0 -posx0=50 -posy0=50 -sizx0=800 -sizy0=600 -maxfps0=0 -initts0=0 -winver0=0 -maxres0=0 -swapeffect0=0 -maxddinterface0=7 -slowratio0=1 -title1=Imperialism -path1=D:\Games\Imperialism\Imperialism.exe -startfolder1= -launchpath1= -module1= -opengllib1= -notes1= -registry1= -ver1=0 -coord1=2 -flag1=1746935843 -flagg1=1209008144 -flagh1=20 -flagi1=4194308 -flagj1=128 -flagk1=0 -flagl1=0 -flagm1=0 -tflag1=-2147477245 -dflag1=0 -posx1=50 -posy1=50 -sizx1=800 -sizy1=600 -maxfps1=0 -initts1=0 -winver1=0 -maxres1=-1 -swapeffect1=0 -maxddinterface1=7 -slowratio1=1 -title2=Defiance (D3D) -path2=D:\Games\Defiance\D3D.EXE -startfolder2= -launchpath2= -module2= -opengllib2= -notes2= -registry2= -ver2=0 -coord2=0 -flag2=136314914 -flagg2=1207959552 -flagh2=20 -flagi2=138412036 -flagj2=4224 -flagk2=65536 -flagl2=0 -flagm2=0 -tflag2=0 -dflag2=0 -posx2=50 -posy2=50 -sizx2=800 -sizy2=600 -maxfps2=0 -initts2=0 -winver2=0 -maxres2=-1 -swapeffect2=0 -maxddinterface2=7 -slowratio2=2 -title3=Defiance -path3=D:\Games\Defiance\DEFIANCE.EXE -startfolder3= -launchpath3= -module3= -opengllib3= -notes3= -registry3= -ver3=0 -coord3=0 -flag3=136314914 -flagg3=1207959552 -flagh3=20 -flagi3=138412036 -flagj3=-2147479424 -flagk3=65536 -flagl3=0 -flagm3=0 -tflag3=-2147477245 -dflag3=0 -posx3=50 -posy3=50 -sizx3=800 -sizy3=600 -maxfps3=0 -initts3=0 -winver3=0 -maxres3=-1 -swapeffect3=0 -maxddinterface3=7 -slowratio3=2 -[texture] -MinTexX=0 -MinTexY=0 -MaxTexX=0 -MaxTexY=0 -[keymapping] -timetoggle= -timefast= -timeslow= -altf4= -cliptoggle= -refresh= -logtoggle= -plogtoggle= -fpstoggle= -printscreen= -corner= -freezetime= -fullscreen= -workarea= -desktop= -minimize= -restore= -kill= diff --git a/build/exports/Abuse.dxw b/build/exports/Abuse.dxw new file mode 100644 index 0000000..d97caa3 --- /dev/null +++ b/build/exports/Abuse.dxw @@ -0,0 +1,33 @@ +[target] +title0=Abuse +path0=D:\Games\Abuse\Abuse32.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Apache for Win95.dxw b/build/exports/Apache for Win95.dxw new file mode 100644 index 0000000..3af66be --- /dev/null +++ b/build/exports/Apache for Win95.dxw @@ -0,0 +1,33 @@ +[target] +title0=Apache for Win95 +path0=D:\Games\APACHE\APACHE95.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=681574434 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Ashes to Ashes.dxw b/build/exports/Ashes to Ashes.dxw new file mode 100644 index 0000000..ff8ccdb --- /dev/null +++ b/build/exports/Ashes to Ashes.dxw @@ -0,0 +1,33 @@ +[target] +title0=Ashes to Ashes +path0=D:\Games\Ashes to Ashes\ASHES.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0=Installer doesn't work, but just copy files from CD to HD.\nNeeds xp fix patch to work. +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Knight Moves.dxw b/build/exports/Knight Moves.dxw new file mode 100644 index 0000000..2d7f336 --- /dev/null +++ b/build/exports/Knight Moves.dxw @@ -0,0 +1,33 @@ +[target] +title0=Knight Moves +path0=D:\Games\Knight Moves\KNIGHT.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=681574434 +flagg0=1212153856 +flagh0=65556 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=32768 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Theocracy.dxw b/build/exports/Theocracy.dxw new file mode 100644 index 0000000..f5a789a --- /dev/null +++ b/build/exports/Theocracy.dxw @@ -0,0 +1,33 @@ +[target] +title0=Theocracy +path0=D:\Games\Theocracy\Theocracy\theocracy-0.6.85.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=1 +monitorid0=-1 +coord0=0 +flag0=681574438 +flagg0=1207959552 +flagh0=20 +flagi0=138936320 +flagj0=128 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Vital Device.dxw b/build/exports/Vital Device.dxw new file mode 100644 index 0000000..3990ba9 --- /dev/null +++ b/build/exports/Vital Device.dxw @@ -0,0 +1,33 @@ +[target] +title0=Vital Device +path0=D:\Games\Vital Device\vitaldevice.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=134222976 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 32b6b43..3aa9cc4 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1249,3 +1249,16 @@ add: added 1280x1024 resolution limit add: mult hooks option now available in global settings panel add: viewfinder to grab coordinates from a window on screen +v2.03.87 +fix: possibility to use @ token instead of "" in fake registry +fix: independent hooking of DirectDraw3 objects, needed for "Theocracy" +fix: eliminated shared hooking of "Compact" ddraw methods +add: improved caps masking in debug mode, now can change any flags +fix: added missing hook for DirectDraw3 in QueryInterface +fix: fixed wrong hook for GetGDISurface in DirectDraw3 interface +fix: eliminated dialog box when hooking ddrawex +fix: eliminated experimental hook to auxGetNumDevs returning 1 available device always. Fixes problems with "Imperialism II" + + + + diff --git a/dll/advapi.cpp b/dll/advapi.cpp index a0ab6f2..7c52c08 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -210,6 +210,10 @@ static LONG SeekValueName(FILE *regf, LPCTSTR lpValueName) fseek(regf, KeySeekPtr, SEEK_SET); return ERROR_SUCCESS; } + if(!lpValueName && (RegBuf[0]=='@')){ + fseek(regf, KeySeekPtr, SEEK_SET); + return ERROR_SUCCESS; + } if(RegBuf[0]=='[') return res; KeySeekPtr = ftell(regf); fgets(RegBuf, 256, regf); @@ -259,7 +263,10 @@ static DWORD GetKeyValue( //OutTrace("GetKeyValue: ValueName=%s\n", lpValueName); fgets(RegBuf, 256, regf); - pData=&RegBuf[strlen(lpValueName)+3]; + if(RegBuf[0]=='@') + pData=&RegBuf[2]; + else + pData=&RegBuf[strlen(lpValueName)+3]; lpb = lpData; if(lpcbData) { cbData = *lpcbData; diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index cd82f3e..2de7aec 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -48,10 +48,12 @@ HRESULT WINAPI extDirectDrawCreateClipper(DWORD, LPDIRECTDRAWCLIPPER *, IUnknown // DirectDraw HRESULT WINAPI extQueryInterfaceD1(void *, REFIID, LPVOID *); HRESULT WINAPI extQueryInterfaceD2(void *, REFIID, LPVOID *); +HRESULT WINAPI extQueryInterfaceD3(void *, REFIID, LPVOID *); HRESULT WINAPI extQueryInterfaceD4(void *, REFIID, LPVOID *); HRESULT WINAPI extQueryInterfaceD7(void *, REFIID, LPVOID *); ULONG WINAPI extReleaseD1(LPDIRECTDRAW); ULONG WINAPI extReleaseD2(LPDIRECTDRAW); +ULONG WINAPI extReleaseD3(LPDIRECTDRAW); ULONG WINAPI extReleaseD4(LPDIRECTDRAW); ULONG WINAPI extReleaseD7(LPDIRECTDRAW); @@ -59,50 +61,62 @@ ULONG WINAPI extReleaseD7(LPDIRECTDRAW); HRESULT WINAPI extCompact(LPDIRECTDRAW); // unimplemented method ??? HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); +HRESULT WINAPI extCreateClipper3(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreateClipper4(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreateClipper7(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreatePalette1(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); HRESULT WINAPI extCreatePalette2(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); +HRESULT WINAPI extCreatePalette3(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); HRESULT WINAPI extCreatePalette4(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); HRESULT WINAPI extCreatePalette7(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *); +HRESULT WINAPI extCreateSurface3(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extFlipToGDISurface1(LPDIRECTDRAW); HRESULT WINAPI extFlipToGDISurface2(LPDIRECTDRAW); +HRESULT WINAPI extFlipToGDISurface3(LPDIRECTDRAW); HRESULT WINAPI extFlipToGDISurface4(LPDIRECTDRAW); HRESULT WINAPI extFlipToGDISurface7(LPDIRECTDRAW); HRESULT WINAPI extGetDisplayMode1(LPDIRECTDRAW, LPDDSURFACEDESC); HRESULT WINAPI extGetDisplayMode2(LPDIRECTDRAW, LPDDSURFACEDESC); +HRESULT WINAPI extGetDisplayMode3(LPDIRECTDRAW, LPDDSURFACEDESC); HRESULT WINAPI extGetDisplayMode4(LPDIRECTDRAW, LPDDSURFACEDESC2); HRESULT WINAPI extGetDisplayMode7(LPDIRECTDRAW, LPDDSURFACEDESC2); HRESULT WINAPI extGetGDISurface1(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extGetGDISurface2(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); +HRESULT WINAPI extGetGDISurface3(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extGetGDISurface4(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extGetGDISurface7(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extEnumDisplayModes1(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK); HRESULT WINAPI extEnumDisplayModes2(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK); +HRESULT WINAPI extEnumDisplayModes3(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK); HRESULT WINAPI extEnumDisplayModes4(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2); HRESULT WINAPI extEnumDisplayModes7(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2); HRESULT WINAPI extInitialize1(LPDIRECTDRAW, FAR GUID *); HRESULT WINAPI extInitialize2(LPDIRECTDRAW, FAR GUID *); +HRESULT WINAPI extInitialize3(LPDIRECTDRAW, FAR GUID *); HRESULT WINAPI extInitialize4(LPDIRECTDRAW, FAR GUID *); HRESULT WINAPI extInitialize7(LPDIRECTDRAW, FAR GUID *); HRESULT WINAPI extSetCooperativeLevel1(LPDIRECTDRAW, HWND, DWORD); HRESULT WINAPI extSetCooperativeLevel2(LPDIRECTDRAW, HWND, DWORD); +HRESULT WINAPI extSetCooperativeLevel3(LPDIRECTDRAW, HWND, DWORD); HRESULT WINAPI extSetCooperativeLevel4(LPDIRECTDRAW, HWND, DWORD); HRESULT WINAPI extSetCooperativeLevel7(LPDIRECTDRAW, HWND, DWORD); HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW, DWORD, DWORD, DWORD); HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); +HRESULT WINAPI extSetDisplayMode3(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); HRESULT WINAPI extSetDisplayMode4(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); HRESULT WINAPI extSetDisplayMode7(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); HRESULT WINAPI extWaitForVerticalBlank1(LPDIRECTDRAW, DWORD, HANDLE); HRESULT WINAPI extWaitForVerticalBlank2(LPDIRECTDRAW, DWORD, HANDLE); +HRESULT WINAPI extWaitForVerticalBlank3(LPDIRECTDRAW, DWORD, HANDLE); HRESULT WINAPI extWaitForVerticalBlank4(LPDIRECTDRAW, DWORD, HANDLE); HRESULT WINAPI extWaitForVerticalBlank7(LPDIRECTDRAW, DWORD, HANDLE); /*** Added in the V2 Interface ***/ HRESULT WINAPI extGetAvailableVidMem2(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD); +HRESULT WINAPI extGetAvailableVidMem3(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD); HRESULT WINAPI extGetAvailableVidMem4(LPDIRECTDRAW, LPDDSCAPS2, LPDWORD, LPDWORD); HRESULT WINAPI extGetAvailableVidMem7(LPDIRECTDRAW, LPDDSCAPS2, LPDWORD, LPDWORD); /*** Added in the V4 Interface ***/ @@ -112,6 +126,7 @@ HRESULT WINAPI extTestCooperativeLevel7(LPDIRECTDRAW); // STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE; HRESULT WINAPI extGetCaps1D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); HRESULT WINAPI extGetCaps2D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +HRESULT WINAPI extGetCaps3D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); HRESULT WINAPI extGetCaps4D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); HRESULT WINAPI extGetCaps7D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); @@ -280,34 +295,34 @@ HandleDDThreadLock_Type pAcquireDDThreadLock = NULL; HandleDDThreadLock_Type pReleaseDDThreadLock = NULL; /* DirectDraw hook pointers */ -QueryInterface_Type pQueryInterfaceD1, pQueryInterfaceD2, pQueryInterfaceD4, pQueryInterfaceD7; +QueryInterface_Type pQueryInterfaceD1, pQueryInterfaceD2, pQueryInterfaceD3, pQueryInterfaceD4, pQueryInterfaceD7; AddRefD_Type pAddRefD; -ReleaseD_Type pReleaseD1, pReleaseD2, pReleaseD4, pReleaseD7; +ReleaseD_Type pReleaseD1, pReleaseD2, pReleaseD3, pReleaseD4, pReleaseD7; Compact_Type pCompact; -CreateClipper_Type pCreateClipper1, pCreateClipper2, pCreateClipper4, pCreateClipper7; -CreatePalette_Type pCreatePalette1, pCreatePalette2, pCreatePalette4, pCreatePalette7; +CreateClipper_Type pCreateClipper1, pCreateClipper2, pCreateClipper3, pCreateClipper4, pCreateClipper7; +CreatePalette_Type pCreatePalette1, pCreatePalette2, pCreatePalette3, pCreatePalette4, pCreatePalette7; CreateSurface1_Type pCreateSurface1, pCreateSurface2, pCreateSurface3, pCreateSurface4, pCreateSurface7; -EnumDisplayModes1_Type pEnumDisplayModes1, pEnumDisplayModes2; +EnumDisplayModes1_Type pEnumDisplayModes1, pEnumDisplayModes2, pEnumDisplayModes3; EnumDisplayModes4_Type pEnumDisplayModes4, pEnumDisplayModes7; EnumSurfaces1_Type pEnumSurfaces1; EnumSurfaces4_Type pEnumSurfaces4; -FlipToGDISurface_Type pFlipToGDISurface1, pFlipToGDISurface2, pFlipToGDISurface4, pFlipToGDISurface7; -GetCapsD_Type pGetCaps1D, pGetCaps2D, pGetCaps4D, pGetCaps7D; -GetDisplayMode_Type pGetDisplayMode1, pGetDisplayMode2; +FlipToGDISurface_Type pFlipToGDISurface1, pFlipToGDISurface2, pFlipToGDISurface3, pFlipToGDISurface4, pFlipToGDISurface7; +GetCapsD_Type pGetCaps1D, pGetCaps2D, pGetCaps3D, pGetCaps4D, pGetCaps7D; +GetDisplayMode_Type pGetDisplayMode1, pGetDisplayMode2, pGetDisplayMode3; GetDisplayMode4_Type pGetDisplayMode4, pGetDisplayMode7; GetFourCCCodes_Type pGetFourCCCodes; -GetGDISurface_Type pGetGDISurface1, pGetGDISurface2, pGetGDISurface4, pGetGDISurface7; +GetGDISurface_Type pGetGDISurface1, pGetGDISurface2, pGetGDISurface3, pGetGDISurface4, pGetGDISurface7; GetMonitorFrequency_Type pGetMonitorFrequency; GetScanLine_Type pGetScanLine; GetVerticalBlankStatus_Type pGetVerticalBlankStatus; -Initialize_Type pInitialize1, pInitialize2, pInitialize4, pInitialize7; +Initialize_Type pInitialize1, pInitialize2, pInitialize3, pInitialize4, pInitialize7; RestoreDisplayMode_Type pRestoreDisplayMode; -SetCooperativeLevel_Type pSetCooperativeLevel1, pSetCooperativeLevel2, pSetCooperativeLevel4, pSetCooperativeLevel7; +SetCooperativeLevel_Type pSetCooperativeLevel1, pSetCooperativeLevel2, pSetCooperativeLevel3, pSetCooperativeLevel4, pSetCooperativeLevel7; SetDisplayMode1_Type pSetDisplayMode1; -SetDisplayMode2_Type pSetDisplayMode2, pSetDisplayMode4, pSetDisplayMode7; -WaitForVerticalBlank_Type pWaitForVerticalBlank1, pWaitForVerticalBlank2, pWaitForVerticalBlank4, pWaitForVerticalBlank7; +SetDisplayMode2_Type pSetDisplayMode2, pSetDisplayMode3, pSetDisplayMode4, pSetDisplayMode7; +WaitForVerticalBlank_Type pWaitForVerticalBlank1, pWaitForVerticalBlank2, pWaitForVerticalBlank3, pWaitForVerticalBlank4, pWaitForVerticalBlank7; GetSurfaceFromDC_Type pGetSurfaceFromDC; -GetAvailableVidMem_Type pGetAvailableVidMem2; +GetAvailableVidMem_Type pGetAvailableVidMem2, pGetAvailableVidMem3; GetAvailableVidMem4_Type pGetAvailableVidMem4, pGetAvailableVidMem7; RestoreAllSurfaces_Type pRestoreAllSurfaces; TestCooperativeLevel_Type pTestCooperativeLevel4, pTestCooperativeLevel7; @@ -446,6 +461,7 @@ static HRESULT myGetDisplayMode(int dxversion, LPDIRECTDRAW lpdd, LPDDSURFACEDES default: case 1: res=(*pGetDisplayMode1)(lpdd, lpdds); break; case 2: res=(*pGetDisplayMode2)(lpdd, lpdds); break; + case 3: res=(*pGetDisplayMode3)(lpdd, lpdds); break; case 4: res=(*pGetDisplayMode4)(lpdd, (LPDDSURFACEDESC2)lpdds); break; case 7: res=(*pGetDisplayMode7)(lpdd, (LPDDSURFACEDESC2)lpdds); break; } @@ -854,6 +870,7 @@ CreatePalette_Type pCreatePaletteMethod(int dxversion) switch(dxversion){ case 1: pCreatePalette = pCreatePalette1; break; case 2: pCreatePalette = pCreatePalette2; break; + case 3: pCreatePalette = pCreatePalette3; break; case 4: pCreatePalette = pCreatePalette4; break; case 7: pCreatePalette = pCreatePalette7; break; } @@ -867,6 +884,7 @@ SetPalette_Type pSetPaletteMethod(int dxversion) switch(dxversion){ case 1: pSetPalette=pSetPalette1; break; case 2: pSetPalette=pSetPalette2; break; + case 3: pSetPalette=pSetPalette3; break; case 4: pSetPalette=pSetPalette4; break; case 7: pSetPalette=pSetPalette7; break; } @@ -1008,6 +1026,7 @@ GetGDISurface_Type pGetGDISurfaceMethod(int dxversion) default: case 1: pGetGDISurface = pGetGDISurface1; break; case 2: pGetGDISurface = pGetGDISurface2; break; + case 3: pGetGDISurface = pGetGDISurface3; break; case 4: pGetGDISurface = pGetGDISurface4; break; case 7: pGetGDISurface = pGetGDISurface7; break; } @@ -1082,7 +1101,6 @@ static void SetPixFmt(LPDDSURFACEDESC2 lpdd) break; } - // remember current virtual settings dxw.VirtualPixelFormat=lpdd->ddpfPixelFormat; OutTraceDW("SetPixFmt: %s\n", DumpPixelFormat(lpdd)); @@ -1118,12 +1136,13 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) OutTraceDW("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n", *lplpdd, dxversion, GetCurrentThreadId()); - SetHook((void *)(**(DWORD **)lplpdd + 12), extCompact, (void **)&pCompact, "Compact"); + // unimplemented, but better not hook it with a single wrapper + //SetHook((void *)(**(DWORD **)lplpdd + 12), extCompact, (void **)&pCompact, "Compact"); switch(dxversion) { case 1: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD1, (void **)&pQueryInterfaceD1, "QueryInterface(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper1, (void **)&pCreateClipper1, "CreateClipper(D1)"); - SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD1, (void **)&pReleaseD1, "Release(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD1, (void **)&pReleaseD1, "Release(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette1, (void **)&pCreatePalette1, "CreatePalette(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface1, (void **)&pCreateSurface1, "CreateSurface(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes1, (void **)&pEnumDisplayModes1, "EnumDisplayModes(D1)"); @@ -1139,10 +1158,10 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) case 2: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD2, (void **)&pQueryInterfaceD2, "QueryInterface(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper2, (void **)&pCreateClipper2, "CreateClipper(D2)"); - SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD2, (void **)&pReleaseD2, "Release(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD2, (void **)&pReleaseD2, "Release(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette2, (void **)&pCreatePalette2, "CreatePalette(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface2, (void **)&pCreateSurface2, "CreateSurface(D2)"); - SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes2, (void **)&pEnumDisplayModes2, "EnumDisplayModes(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes2, (void **)&pEnumDisplayModes2, "EnumDisplayModes(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface2, (void **)&pFlipToGDISurface2, "FlipToGDISurface(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps2D, (void **)&pGetCaps2D, "GetCaps(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode2, (void **)&pGetDisplayMode2, "GetDisplayMode(D2)"); @@ -1154,10 +1173,28 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) // added in v2 interface SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem2, (void **)&pGetAvailableVidMem2, "GetAvailableVidMem(D2)"); break; + case 3: + SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD3, (void **)&pQueryInterfaceD3, "QueryInterface(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper3, (void **)&pCreateClipper3, "CreateClipper(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD3, (void **)&pReleaseD3, "Release(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette3, (void **)&pCreatePalette3, "CreatePalette(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface3, (void **)&pCreateSurface3, "CreateSurface(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes3, (void **)&pEnumDisplayModes3, "EnumDisplayModes(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface3, (void **)&pFlipToGDISurface3, "FlipToGDISurface(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps3D, (void **)&pGetCaps3D, "GetCaps(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode3, (void **)&pGetDisplayMode3, "GetDisplayMode(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface3, (void **)&pGetGDISurface3, "GetGDISurface(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize3, (void **)&pInitialize3, "Initialize(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel3, (void **)&pSetCooperativeLevel3, "SetCooperativeLevel(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode3, (void **)&pSetDisplayMode3, "SetDisplayMode(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlank3, (void **)&pWaitForVerticalBlank3, "WaitForVerticalBlank(D3)"); + // added in v2 interface + SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem3, (void **)&pGetAvailableVidMem3, "GetAvailableVidMem(D3)"); + break; case 4: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD4, (void **)&pQueryInterfaceD4, "QueryInterface(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper4, (void **)&pCreateClipper4, "CreateClipper(D4)"); - SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD4, (void **)&pReleaseD4, "Release(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD4, (void **)&pReleaseD4, "Release(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette4, (void **)&pCreatePalette4, "CreatePalette(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface4, (void **)&pCreateSurface4, "CreateSurface(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes4, (void **)&pEnumDisplayModes4, "EnumDisplayModes(D4)"); @@ -1177,7 +1214,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) case 7: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD7, (void **)&pQueryInterfaceD7, "QueryInterface(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper7, (void **)&pCreateClipper7, "CreateClipper(D7)"); - SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD7, (void **)&pReleaseD7, "Release(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD7, (void **)&pReleaseD7, "Release(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette7, (void **)&pCreatePalette7, "CreatePalette(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface7, (void **)&pCreateSurface7, "CreateSurface(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes7, (void **)&pEnumDisplayModes7, "EnumDisplayModes(D4)"); @@ -1412,9 +1449,7 @@ static void MaskCapsD(LPDDCAPS c1, LPDDCAPS c2) { FILE *capfile; //char sBuf[80+1]; - char token[20+1]; DWORD val; - OutTraceDW("MaskCaps\n"); if(IsDebug){ char CapsBuf[3*sizeof(DDCAPS_DX7)+20]; int i; @@ -1430,17 +1465,32 @@ static void MaskCapsD(LPDDCAPS c1, LPDDCAPS c2) OutTrace("CapsDump(c2:SW)=%s\n", CapsBuf); } } - capfile=fopen("dxwnd.cap", "r"); + capfile=fopen("dxwnd.caps.txt", "r"); if(!capfile) return; - if(c1) { - while(TRUE){ - if(fscanf(capfile, "%s=%x", token, &val)!=2) break; - if(!strcmp(token, "dwCaps")) c1->dwCaps &= val; - if(!strcmp(token, "dwCaps2")) c1->dwCaps2 &= val; - if(!strcmp(token, "dwCKeyCaps")) c1->dwCKeyCaps &= val; - if(!strcmp(token, "dwFXCaps")) c1->dwFXCaps &= val; + + int HwSwCap; + int WordOffset; + char Operator; + LPDDCAPS Caps; + LPDWORD lpDWord; + while(TRUE){ + if(fscanf(capfile, "C%d.%x[%c]=%x\n", &HwSwCap, &WordOffset, &Operator, &val)!=4) break; + OutTrace("MaskCaps: C%d.%x[%c].x%08.8X\n", HwSwCap, WordOffset, Operator, val); + Caps = (HwSwCap == 1) ? c1 : c2; + if(!Caps) continue; + lpDWord = &(Caps->dwSize) + WordOffset; + switch(Operator){ + case '&': *lpDWord &= val; break; + case '|': *lpDWord |= val; break; + case '-': *lpDWord &= (~val); break; + case '=': + default: *lpDWord = val; break; } - OutTraceDW("MaskCaps(D-HW): caps=%x(%s) caps2=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", + } + fclose(capfile); + + if(c1) { + OutTrace("MaskCaps(D-HW): caps=%x(%s) caps2=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", c1->dwCaps, ExplainDDDCaps(c1->dwCaps), c1->dwCaps2, ExplainDDDCaps2(c1->dwCaps2), c1->dwFXCaps, ExplainDDFXCaps(c1->dwFXCaps), @@ -1448,21 +1498,13 @@ static void MaskCapsD(LPDDCAPS c1, LPDDCAPS c2) c1->dwCKeyCaps, ExplainDDCKeyCaps(c1->dwCKeyCaps)); } if(c2) { - while(TRUE){ - if(fscanf(capfile, "%s=%x", token, &val)!=2) break; - if(!strcmp(token, "dwCaps")) c2->dwCaps &= val; - if(!strcmp(token, "dwCaps2")) c2->dwCaps2 &= val; - if(!strcmp(token, "dwCKeyCaps")) c2->dwCKeyCaps &= val; - if(!strcmp(token, "dwFXCaps")) c2->dwFXCaps &= val; - } - OutTraceDW("MaskCaps(D-HW): caps=%x(%s) caps2=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", + OutTrace("MaskCaps(D-SW): caps=%x(%s) caps2=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", c2->dwCaps, ExplainDDDCaps(c2->dwCaps), c2->dwCaps2, ExplainDDDCaps2(c2->dwCaps2), c2->dwFXCaps, ExplainDDFXCaps(c2->dwFXCaps), c2->dwFXAlphaCaps, ExplainDDFXALPHACaps(c2->dwFXAlphaCaps), c2->dwCKeyCaps, ExplainDDCKeyCaps(c2->dwCKeyCaps)); } - fclose(capfile); } /* ------------------------------------------------------------------------------ */ @@ -1579,6 +1621,8 @@ HRESULT WINAPI extGetCaps1D(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) { return extGetCapsD(1, pGetCaps1D, lpdd, c1, c2); } HRESULT WINAPI extGetCaps2D(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) { return extGetCapsD(2, pGetCaps2D, lpdd, c1, c2); } +HRESULT WINAPI extGetCaps3D(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) +{ return extGetCapsD(3, pGetCaps3D, lpdd, c1, c2); } HRESULT WINAPI extGetCaps4D(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) { return extGetCapsD(4, pGetCaps4D, lpdd, c1, c2); } HRESULT WINAPI extGetCaps7D(LPDIRECTDRAW lpdd, LPDDCAPS_DX7 c1, LPDDCAPS_DX7 c2) @@ -1770,6 +1814,8 @@ HRESULT WINAPI extInitialize1(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { return extInitialize(pInitialize1, lpdd, lpguid); } HRESULT WINAPI extInitialize2(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { return extInitialize(pInitialize2, lpdd, lpguid); } +HRESULT WINAPI extInitialize3(LPDIRECTDRAW lpdd, GUID FAR *lpguid) +{ return extInitialize(pInitialize3, lpdd, lpguid); } HRESULT WINAPI extInitialize4(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { return extInitialize(pInitialize4, lpdd, lpguid); } HRESULT WINAPI extInitialize7(LPDIRECTDRAW lpdd, GUID FAR *lpguid) @@ -1799,6 +1845,9 @@ static HRESULT WINAPI extQueryInterfaceD(int dxversion, QueryInterface_Type pQue case 0xB3A6F3E0: //DirectDraw2 dwLocalDDVersion = 2; break; + case 0x618f8ad4: //DirectDraw3 + dwLocalDDVersion = 3; + break; case 0x9c59509a: //DirectDraw4 dwLocalDDVersion = 4; break; @@ -1835,6 +1884,7 @@ static HRESULT WINAPI extQueryInterfaceD(int dxversion, QueryInterface_Type pQue switch (dwLocalDDVersion){ case 1: // you never know .... case 2: + case 3: case 4: // it's not supposed to be written for DDVersion==7, but it works .... case 7: @@ -1863,6 +1913,8 @@ HRESULT WINAPI extQueryInterfaceD1(void *lpdd, REFIID riid, LPVOID *obp) { return extQueryInterfaceD(1, pQueryInterfaceD1, lpdd, riid, obp); } HRESULT WINAPI extQueryInterfaceD2(void *lpdd, REFIID riid, LPVOID *obp) { return extQueryInterfaceD(2, pQueryInterfaceD2, lpdd, riid, obp); } +HRESULT WINAPI extQueryInterfaceD3(void *lpdd, REFIID riid, LPVOID *obp) +{ return extQueryInterfaceD(3, pQueryInterfaceD3, lpdd, riid, obp); } HRESULT WINAPI extQueryInterfaceD4(void *lpdd, REFIID riid, LPVOID *obp) { return extQueryInterfaceD(4, pQueryInterfaceD4, lpdd, riid, obp); } HRESULT WINAPI extQueryInterfaceD7(void *lpdd, REFIID riid, LPVOID *obp) @@ -2103,6 +2155,7 @@ HRESULT WINAPI extSetDisplayMode(int dxversion, LPDIRECTDRAW lpdd, default: case 1: ddsd.dwSize=sizeof(LPDDSURFACEDESC); res=(*pGetDisplayMode1)(lpdd, (LPDDSURFACEDESC)&ddsd); break; case 2: ddsd.dwSize=sizeof(LPDDSURFACEDESC); res=(*pGetDisplayMode2)(lpdd, (LPDDSURFACEDESC)&ddsd); break; + case 3: ddsd.dwSize=sizeof(LPDDSURFACEDESC); res=(*pGetDisplayMode3)(lpdd, (LPDDSURFACEDESC)&ddsd); break; case 4: ddsd.dwSize=sizeof(LPDDSURFACEDESC2); res=(*pGetDisplayMode4)(lpdd, &ddsd); break; case 7: ddsd.dwSize=sizeof(LPDDSURFACEDESC2); res=(*pGetDisplayMode7)(lpdd, &ddsd); break; } @@ -2136,6 +2189,7 @@ HRESULT WINAPI extSetDisplayMode(int dxversion, LPDIRECTDRAW lpdd, default: case 1: res=(*pSetDisplayMode1)(lpdd, dwwidth, dwheight, dwbpp); break; case 2: res=(*pSetDisplayMode2)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); break; + case 3: res=(*pSetDisplayMode3)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); break; case 4: res=(*pSetDisplayMode4)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); break; case 7: res=(*pSetDisplayMode7)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); break; } @@ -2153,6 +2207,8 @@ HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheig { return extSetDisplayMode(1, lpdd, dwwidth, dwheight, dwbpp, 0, 0); } HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) { return extSetDisplayMode(2, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); } +HRESULT WINAPI extSetDisplayMode3(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) +{ return extSetDisplayMode(3, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); } HRESULT WINAPI extSetDisplayMode4(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) { return extSetDisplayMode(4, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); } HRESULT WINAPI extSetDisplayMode7(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) @@ -2199,6 +2255,8 @@ HRESULT WINAPI extGetDisplayMode1(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) { return extGetDisplayMode(pGetDisplayMode1, lpdd, lpddsd); } HRESULT WINAPI extGetDisplayMode2(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) { return extGetDisplayMode(pGetDisplayMode2, lpdd, lpddsd); } +HRESULT WINAPI extGetDisplayMode3(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +{ return extGetDisplayMode(pGetDisplayMode3, lpdd, lpddsd); } HRESULT WINAPI extGetDisplayMode4(LPDIRECTDRAW lpdd, LPDDSURFACEDESC2 lpddsd) { return extGetDisplayMode((GetDisplayMode_Type)pGetDisplayMode4, lpdd, (LPDDSURFACEDESC)lpddsd); } HRESULT WINAPI extGetDisplayMode7(LPDIRECTDRAW lpdd, LPDDSURFACEDESC2 lpddsd) @@ -2217,6 +2275,7 @@ HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pS default: case 1: ddsd.dwSize=sizeof(DDSURFACEDESC); res=(*pGetDisplayMode1)(lpdd, (LPDDSURFACEDESC)&ddsd); break; case 2: ddsd.dwSize=sizeof(DDSURFACEDESC); res=(*pGetDisplayMode2)(lpdd, (LPDDSURFACEDESC)&ddsd); break; + case 3: ddsd.dwSize=sizeof(DDSURFACEDESC); res=(*pGetDisplayMode3)(lpdd, (LPDDSURFACEDESC)&ddsd); break; case 4: ddsd.dwSize=sizeof(DDSURFACEDESC2); res=(*pGetDisplayMode4)(lpdd, &ddsd); break; case 7: ddsd.dwSize=sizeof(DDSURFACEDESC2); res=(*pGetDisplayMode7)(lpdd, &ddsd); break; } @@ -2311,6 +2370,8 @@ HRESULT WINAPI extSetCooperativeLevel1(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwfla { return extSetCooperativeLevel(1, pSetCooperativeLevel1, lpdd, hwnd, dwflags); } HRESULT WINAPI extSetCooperativeLevel2(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) { return extSetCooperativeLevel(2, pSetCooperativeLevel2, lpdd, hwnd, dwflags); } +HRESULT WINAPI extSetCooperativeLevel3(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) +{ return extSetCooperativeLevel(3, pSetCooperativeLevel3, lpdd, hwnd, dwflags); } HRESULT WINAPI extSetCooperativeLevel4(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) { return extSetCooperativeLevel(4, pSetCooperativeLevel4, lpdd, hwnd, dwflags); } HRESULT WINAPI extSetCooperativeLevel7(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) @@ -2674,6 +2735,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf default: case 1: pGetGDISurface = pGetGDISurface1; break; case 2: pGetGDISurface = pGetGDISurface2; break; + case 3: pGetGDISurface = pGetGDISurface3; break; case 4: pGetGDISurface = pGetGDISurface4; break; case 7: pGetGDISurface = pGetGDISurface7; break; } @@ -2902,6 +2964,7 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS default: case 1: pGetGDISurface = pGetGDISurface1; break; case 2: pGetGDISurface = pGetGDISurface2; break; + case 3: pGetGDISurface = pGetGDISurface3; break; case 4: pGetGDISurface = pGetGDISurface4; break; case 7: pGetGDISurface = pGetGDISurface7; break; } @@ -3274,6 +3337,8 @@ HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIR { return extCreateSurface(1, (CreateSurface_Type)pCreateSurface1, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { return extCreateSurface(2, (CreateSurface_Type)pCreateSurface2, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } +HRESULT WINAPI extCreateSurface3(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ return extCreateSurface(3, (CreateSurface_Type)pCreateSurface3, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { return extCreateSurface(4, (CreateSurface_Type)pCreateSurface4, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) @@ -4050,6 +4115,8 @@ HRESULT WINAPI extWaitForVerticalBlank1(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE { return extWaitForVerticalBlank(pWaitForVerticalBlank1, lpdd, dwflags, hevent); } HRESULT WINAPI extWaitForVerticalBlank2(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) { return extWaitForVerticalBlank(pWaitForVerticalBlank2, lpdd, dwflags, hevent); } +HRESULT WINAPI extWaitForVerticalBlank3(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) +{ return extWaitForVerticalBlank(pWaitForVerticalBlank3, lpdd, dwflags, hevent); } HRESULT WINAPI extWaitForVerticalBlank4(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) { return extWaitForVerticalBlank(pWaitForVerticalBlank4, lpdd, dwflags, hevent); } HRESULT WINAPI extWaitForVerticalBlank7(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) @@ -4081,6 +4148,8 @@ HRESULT WINAPI extCreatePalette1(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTR { return extCreatePalette(1, (CreatePalette_Type)pCreatePalette1, lpdd, dwflags, lpddpa, lplpddp, pu); } HRESULT WINAPI extCreatePalette2(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) { return extCreatePalette(2, (CreatePalette_Type)pCreatePalette2, lpdd, dwflags, lpddpa, lplpddp, pu); } +HRESULT WINAPI extCreatePalette3(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) +{ return extCreatePalette(3, (CreatePalette_Type)pCreatePalette3, lpdd, dwflags, lpddpa, lplpddp, pu); } HRESULT WINAPI extCreatePalette4(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) { return extCreatePalette(4, (CreatePalette_Type)pCreatePalette4, lpdd, dwflags, lpddpa, lplpddp, pu); } HRESULT WINAPI extCreatePalette7(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) @@ -4347,6 +4416,7 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR switch(dxversion){ case 1: pBlt=pBlt1; pGetGDISurface=pGetGDISurface1; break; case 2: pBlt=pBlt2; pGetGDISurface=pGetGDISurface2; break; + case 3: pBlt=pBlt3; pGetGDISurface=pGetGDISurface3; break; case 4: pBlt=pBlt4; pGetGDISurface=pGetGDISurface4; break; case 7: pBlt=pBlt7; pGetGDISurface=pGetGDISurface7; break; } @@ -4582,7 +4652,7 @@ static HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECT default: case 1: pGetGDISurface = pGetGDISurface1; pBlt = pBlt1; break; case 2: pGetGDISurface = pGetGDISurface2; pBlt = pBlt2; break; - case 3: pGetGDISurface = pGetGDISurface2; pBlt = pBlt3; break; + case 3: pGetGDISurface = pGetGDISurface3; pBlt = pBlt3; break; case 4: pGetGDISurface = pGetGDISurface4; pBlt = pBlt4; break; case 7: pGetGDISurface = pGetGDISurface7; pBlt = pBlt7; break; } @@ -4699,7 +4769,7 @@ HRESULT WINAPI extReleaseDC(int dxversion, ReleaseDC_Type pReleaseDC, LPDIRECTDR default: case 1: pGetGDISurface = pGetGDISurface1; pBlt = pBlt1; break; case 2: pGetGDISurface = pGetGDISurface2; pBlt = pBlt2; break; - case 3: pGetGDISurface = pGetGDISurface2; pBlt = pBlt3; break; + case 3: pGetGDISurface = pGetGDISurface3; pBlt = pBlt3; break; case 4: pGetGDISurface = pGetGDISurface4; pBlt = pBlt4; break; case 7: pGetGDISurface = pGetGDISurface7; pBlt = pBlt7; break; } @@ -4741,6 +4811,8 @@ HRESULT WINAPI extFlipToGDISurface1(LPDIRECTDRAW lpdd) { return extFlipToGDISurface(pFlipToGDISurface1, lpdd); } HRESULT WINAPI extFlipToGDISurface2(LPDIRECTDRAW lpdd) { return extFlipToGDISurface(pFlipToGDISurface2, lpdd); } +HRESULT WINAPI extFlipToGDISurface3(LPDIRECTDRAW lpdd) +{ return extFlipToGDISurface(pFlipToGDISurface3, lpdd); } HRESULT WINAPI extFlipToGDISurface4(LPDIRECTDRAW lpdd) { return extFlipToGDISurface(pFlipToGDISurface4, lpdd); } HRESULT WINAPI extFlipToGDISurface7(LPDIRECTDRAW lpdd) @@ -4771,13 +4843,12 @@ HRESULT WINAPI extGetGDISurface(GetGDISurface_Type pGetGDISurface, LPDIRECTDRAW HRESULT WINAPI extGetGDISurface1(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) { return extGetGDISurface(pGetGDISurface1, lpdd, w); } - HRESULT WINAPI extGetGDISurface2(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) { return extGetGDISurface(pGetGDISurface2, lpdd, w); } - +HRESULT WINAPI extGetGDISurface3(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) +{ return extGetGDISurface(pGetGDISurface3, lpdd, w); } HRESULT WINAPI extGetGDISurface4(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) { return extGetGDISurface(pGetGDISurface4, lpdd, w); } - HRESULT WINAPI extGetGDISurface7(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) { return extGetGDISurface(pGetGDISurface7, lpdd, w); } @@ -4974,6 +5045,8 @@ HRESULT WINAPI extEnumDisplayModes1(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFAC { return extEnumDisplayModes(1, pEnumDisplayModes1, lpdd, dwflags, lpddsd, lpContext, cb); } HRESULT WINAPI extEnumDisplayModes2(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) { return extEnumDisplayModes(2, pEnumDisplayModes2, lpdd, dwflags, lpddsd, lpContext, cb); } +HRESULT WINAPI extEnumDisplayModes3(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) +{ return extEnumDisplayModes(3, pEnumDisplayModes3, lpdd, dwflags, lpddsd, lpContext, cb); } HRESULT WINAPI extEnumDisplayModes4(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC2 lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK2 cb) { return extEnumDisplayModes(4, (EnumDisplayModes1_Type)pEnumDisplayModes4, lpdd, dwflags, (LPDDSURFACEDESC)lpddsd, lpContext, (LPDDENUMMODESCALLBACK)cb); } HRESULT WINAPI extEnumDisplayModes7(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC2 lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK2 cb) @@ -5417,9 +5490,9 @@ static ULONG WINAPI extReleaseD(int dxversion, ReleaseD_Type pReleaseD, LPDIRECT //extern void SwitchTo16BPP(); //if((ActualRef==0) && (dxw.dwFlags3 & FORCE16BPP)) SwitchTo16BPP(); - OutTraceDDRAW("Release(D): lpdd=%x ref=%x\n", lpdd, VirtualRef); + if(dxw.dwFlags4 & RETURNNULLREF) VirtualRef = 0; - if(dxw.dwFlags4 & RETURNNULLREF) return 0; + OutTraceDDRAW("Release(D): lpdd=%x ref=%x\n", lpdd, VirtualRef); return (ULONG)VirtualRef; } @@ -5427,6 +5500,8 @@ ULONG WINAPI extReleaseD1(LPDIRECTDRAW lpdd) { return extReleaseD(1, pReleaseD1, lpdd); } ULONG WINAPI extReleaseD2(LPDIRECTDRAW lpdd) { return extReleaseD(2, pReleaseD2, lpdd); } +ULONG WINAPI extReleaseD3(LPDIRECTDRAW lpdd) +{ return extReleaseD(3, pReleaseD3, lpdd); } ULONG WINAPI extReleaseD4(LPDIRECTDRAW lpdd) { return extReleaseD(4, pReleaseD4, lpdd); } ULONG WINAPI extReleaseD7(LPDIRECTDRAW lpdd) @@ -5450,6 +5525,8 @@ HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWC { return extCreateClipper(pCreateClipper1, lpdd, dwflags, lplpDDClipper, pUnkOuter); } HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) { return extCreateClipper(pCreateClipper2, lpdd, dwflags, lplpDDClipper, pUnkOuter); } +HRESULT WINAPI extCreateClipper3(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) +{ return extCreateClipper(pCreateClipper3, lpdd, dwflags, lplpDDClipper, pUnkOuter); } HRESULT WINAPI extCreateClipper4(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) { return extCreateClipper(pCreateClipper4, lpdd, dwflags, lplpDDClipper, pUnkOuter); } HRESULT WINAPI extCreateClipper7(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) @@ -5878,6 +5955,8 @@ static HRESULT WINAPI extGetAvailableVidMem(int dxversion, GetAvailableVidMem4_T HRESULT WINAPI extGetAvailableVidMem2(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) { return extGetAvailableVidMem(2, (GetAvailableVidMem4_Type)pGetAvailableVidMem2, lpdd, (LPDDSCAPS2)lpDDSCaps, lpdwTotal, lpdwFree); } +HRESULT WINAPI extGetAvailableVidMem3(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) +{ return extGetAvailableVidMem(3, (GetAvailableVidMem4_Type)pGetAvailableVidMem3, lpdd, (LPDDSCAPS2)lpDDSCaps, lpdwTotal, lpdwFree); } HRESULT WINAPI extGetAvailableVidMem4(LPDIRECTDRAW lpdd, LPDDSCAPS2 lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) { return extGetAvailableVidMem(4, pGetAvailableVidMem4, lpdd, lpDDSCaps, lpdwTotal, lpdwFree); } HRESULT WINAPI extGetAvailableVidMem7(LPDIRECTDRAW lpdd, LPDDSCAPS2 lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) diff --git a/dll/ddrawex.cpp b/dll/ddrawex.cpp index 3e1593f..633baa5 100644 --- a/dll/ddrawex.cpp +++ b/dll/ddrawex.cpp @@ -127,6 +127,18 @@ created by DirectDraw. Applications should blit only between similar surfaces. © 1997 Microsoft Corporation. All rights reserved. Terms of Use. */ +// from ddrawex.h +//DECLARE_INTERFACE_(IDirectDrawFactory, IUnknown) +//{ +// /*** IUnknown methods ***/ +// STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; +// STDMETHOD_(ULONG,AddRef) (THIS) PURE; +// STDMETHOD_(ULONG,Release) (THIS) PURE; +// /*** IDirectDrawFactory methods ***/ +// STDMETHOD(CreateDirectDraw) (THIS_ GUID * pGUID, HWND hWnd, DWORD dwCoopLevelFlags, DWORD dwReserved, IUnknown *pUnkOuter, IDirectDraw **ppDirectDraw) PURE; +// STDMETHOD(DirectDrawEnumerate) (THIS_ LPDDENUMCALLBACK lpCallback, LPVOID lpContext) PURE; +//}; + // DirectDrawEx API (undocumented) HRESULT WINAPI extDllCanUnloadNow(void); HRESULT WINAPI extDllGetClassObject(REFCLSID, REFIID, void **); @@ -185,8 +197,10 @@ void HookDirectDrawFactoryLib(HMODULE module) void HookDirectDrawFactory(void *obj) { - MessageBox(0,"Hooking IID_DirectDrawFactory object", "DxWnd", MB_OK); + //MessageBox(0,"Hooking IID_DirectDrawFactory object", "DxWnd", MB_OK); OutTrace("Hooking IID_DirectDrawFactory object\n"); + //SetHook((void *)(**(DWORD **)obj ), extQueryInterfaceD1, (void **)&pQueryInterfaceD1, "QueryInterface(D1)"); + //SetHook((void *)(**(DWORD **)obj + 8), extReleaseD1, (void **)&pReleaseD1, "Release(D1)"); SetHook((void *)(**(DWORD **)obj + 12), extCreateDirectDrawEX, (void **)&pCreateDirectDrawEX, "CreateDirectDraw(ex)"); SetHook((void *)(**(DWORD **)obj + 16), extDirectDrawEnumerateEX, (void **)&pDirectDrawEnumerateEX, "DirectDrawEnumerate(ex)"); } @@ -238,6 +252,7 @@ HRESULT WINAPI extCreateDirectDrawEX(void *ddf, GUID *pGUID, HWND hWnd, DWORD dw OutTrace("CreateDirectDraw(EX): factory=%x guid=%s hwnd=%x coopflags=%x(%s)\n", ddf, sGUID(pGUID), hWnd, dwCoopLevelFlags, ExplainCoopFlags(dwCoopLevelFlags)); } + res = (*pCreateDirectDrawEX)(ddf, pGUID, hWnd, dwCoopLevelFlags, dwReserved, pUnkOuter, ppDirectDraw); if(res){ OutTraceE("CreateDirectDraw(EX) ERROR: res=%x\n"); @@ -248,7 +263,7 @@ HRESULT WINAPI extCreateDirectDrawEX(void *ddf, GUID *pGUID, HWND hWnd, DWORD dw return res; } - + HRESULT WINAPI extDirectDrawEnumerateEX(void *ddf, LPDDENUMCALLBACK lpCallback, LPVOID lpContext) { HRESULT res; diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index aa5be42..779d410 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -972,6 +972,7 @@ char *ExplainGUID(GUID FAR *lpguid) case 0x00000000: sguid="IID_IUnknown"; break; case 0x6C14DB80: sguid="IID_IDirectDraw"; break; case 0xB3A6F3E0: sguid="IID_IDirectDraw2"; break; + case 0x618f8ad4: sguid="IID_IDirectDraw3"; break; case 0x9c59509a: sguid="IID_IDirectDraw4"; break; case 0x15e65ec0: sguid="IID_IDirectDraw7"; break; case 0x6C14DB81: sguid="IID_IDirectDrawSurface"; break; diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 08f538c..0146e2e 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.86" +#define VERSION "2.03.87" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.sln b/dll/dxwnd.vs2008.sln deleted file mode 100644 index 0d2e531..0000000 --- a/dll/dxwnd.vs2008.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwnd", "dxwnd.vs2008.vcproj", "{579E7FE7-2745-4100-A802-23511711FCDE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.ActiveCfg = Debug|Win32 - {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.Build.0 = Debug|Win32 - {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.ActiveCfg = Release|Win32 - {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 7d673cee2073993f9185516c0d75aa0c39e80af9..fa9a5a3f92ec5fd31c0813a78c93afc5af9ba1f2 100644 GIT binary patch literal 107008 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 delta 2528 zcma)-dr(wW9LLYuy?c3x>$0r0DC{nffFmfNC?LwlZjJ+*=r|}T2;&1|O4nja2?IvN zX(EOFHC@L)vdn3w$tSmIrkN&D7&22)w6ceRW=)SNO|kbt-*fk_A^p*wozI@%`QCHS z<9B|)bDMhPrYpww^hC}W6KKW4m;r_ahDSz5H0}7(qrAf>`3+u4XtdC9*(MCZ=t7ys zgB|PA{n8>HLy3~pd|_tt_J!7dZp1L|+!jxxaN&1iNH&pmN>3Xi#Y{&H_gtG>@rLlKR$Qw!`(B&LY#iel z;SL5cK+Zw8b8pSE-W>jUMCfANI1oEV-;WI)2hmJDWyv&1v+!J*Sj~&c9n<8ud8pf* zrTP2@ZL<~2JQ~j(!5wf1-L>_ZlA(nMweg8)-2z&nW^18wsf*DG=N#&CNYuVjB6n;G zbvf@W)URebk!t*G3y0#W}zOH$MM)Tr4 zO6hv;_D?!31&@e^CbbwkO=|t*Vop8gOd5(`BE!FoB?K2tbqQ_Mj6>eqXHnjLf-g%A z@c@(~6?~cE^YK+wRU1#YDx$>e8ETi)Egi4kkBG1COzDbOj;-S}QbRmY<+6-2+IH}>iEa7T42y;RoHco)KH z@F6$@J_2XKIdC5IfeYXw=m(d;W$-ch1bhmvfX~3^;0y32xC*`k17Hwb1J}XV;2UrU ze2WxPRwSm~ge}727jPSh)eq_Quc&|1Z5muLSZGIMbo8!76x4vEF?tIQekTx-J*q#= zi=Ilitp$@Af{C$hK$IOogp&!h&})ulJsOj!C2p!2Vj=iRJY`HBDQ`AXSDf4La3ENd z{FSYZBB;c(tLP#!ZxFQ@&jJ2|{TS-Mbxqs{Tn^-$QN|M4oQNv?2W}6>UcfW)?ljPg zcSJd$YcANY!xrVRt}SM)ksZ;+{!twVV3(ldpsoq~lHSh{7MLUtnh~}r6Lf7ZY>Tcv zplf0=c3n$A9oTRd)B?7U(dpP+YN+&fuCa3JUo)NjwWVr%_1l5Os$086<`#4{2NO#j zTH9u%>rMx4aP-iVo+N~^i|QRwJd8Gbrl1u|uJQspR$fXMD&iGq1-H^J_;r5u>^Sb4fKu!kopOKNy_$dh8Z4!_T9N`VudK_^n3?=qhfY^ily+N_FeJ>R1{ zNN#Lk4eVK#%Zk`c{AcTAu-ULPK?cjh&kHi}ESJrJngIg81)7orH4lBV*>=pGl^vp+ zL=FTmEOC@!{#LI^BwWP5>ur^|VG*PHU9F0%hS%hW;6pL2;J$KO`zozjun|e~3=rR; zQ5lcqU~D%Sa}%&1MUo-?X6yagQ~1I(&_k7Twc9l<)UB!`&p&LUvIkL=E4IgG<+fabBoXW99#G zhh6cl=86`g28R~hWrm#D)Eu5ido8YMr?BhuV5~Q~p$!1UWYBw*_(P8W@g_amt(3kg MoYJJI17}_T0Ps6~-T(jq diff --git a/dll/winmm.cpp b/dll/winmm.cpp index d302388..224b52f 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -41,7 +41,7 @@ static HookEntryEx_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0, "mciSendCommandW", NULL, (FARPROC *)&pmciSendCommandW, (FARPROC)extmciSendCommandW}, {HOOK_HOT_CANDIDATE, 0, "mciGetDeviceIDA", NULL, (FARPROC *)&pmciGetDeviceIDA, (FARPROC)extmciGetDeviceIDA}, {HOOK_HOT_CANDIDATE, 0, "mciGetDeviceIDW", NULL, (FARPROC *)&pmciGetDeviceIDW, (FARPROC)extmciGetDeviceIDW}, - {HOOK_IAT_CANDIDATE, 0, "auxGetNumDevs", NULL, (FARPROC *)&pauxGetNumDevs, (FARPROC)extauxGetNumDevs}, + //{HOOK_IAT_CANDIDATE, 0, "auxGetNumDevs", NULL, (FARPROC *)&pauxGetNumDevs, (FARPROC)extauxGetNumDevs}, {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -480,6 +480,7 @@ static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) DeleteDC(hdcMem); } +// dangerous thing to do: it interferes with "Imperialism II" !!! MMRESULT WINAPI extauxGetNumDevs(void) { OutTraceDW("auxGetNumDevs: returning fake 1\n"); diff --git a/host/dxwndhost.vs2008.sln b/host/dxwndhost.vs2008.sln deleted file mode 100644 index 5bf4fb1..0000000 --- a/host/dxwndhost.vs2008.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwndhost", "dxwndhost.vs2008.vcproj", "{FD0B0234-8EC5-43C0-A384-1B881DD3D925}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Debug|Win32.ActiveCfg = Debug|Win32 - {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Debug|Win32.Build.0 = Debug|Win32 - {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.ActiveCfg = Release|Win32 - {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 206bb71c8dfe6238d15279a23784f85f75f4c370..7109da86a00f67093cc9d398dd4341bf54b49107 100644 GIT binary patch delta 979 zcmY+DO-vI(6vt<_yGsiJO0#@_b@@<~7z!<+AdsyT3`oKPCB~#;RWzJ5U}Jy-uHcDC zf_)bg69xQC@PoJ>xEO0R#*iQdYw%#ii#NS!W8z1^H*INjlHbn%y?O8Lo1LAd&z$y! zTb$+S5g4k^rdwCK7ue%kfbXQGAQxLxH?BH1rFCi`geXoJ z%x^^9^k=X>b>vaSq~=3V>JA?W7d<*B>aeWu(dvVRGv2h>m2gpO@5&K0TMMB6LvW~n( z!pKJiJoRP5CW=p(HaXv5fMAmXvsN3}l$k)YTPVjhQ>^`FRVYAA^V0noZmfvF=OW|Rids&imb zJ)UYOwWOZxBM#C^9D%_pfo+YzYF8F~%gqOEf4`7~@9KeznT2|=O`&i?vcXKF2p;um z+Q2_Yd&Y|~^8cOiwc9J-!Fo`F^YYZ=3MENbx)ly=ya;VoV*yVKyeO##zef}9;7exU zXHhv8=oVxM7VySB=wt1$+ax|gZy*7y$!^@MD%@PJ2HIdU Mxb2OJb=6e!7i)Ak&j0`b delta 2056 zcmcJQUu;uV9LLW&yS^>K}dAy zfXRxQm>4j!pAWt{2FgGG%v~P#WVXnIApr~4NPP3bH>1Rq7h_hxr+1sqDcPdlo6kMJ z-|zg+xxaJH?{{zhM=|q*n3@nYp=yVAFvjM~<#HR^AP9j@po0i_0V`rLVkSHU6QPRErS z_D3Niq%vi)TPSZ=Xv9`jZpsNVs?U83LKA2PGV&I*aup#uqi%DYgS5C7*=v5O{>E)G z>NI`tZl`&>VH)eAocEf?s`n`NR`e{rt5o}j*jYoz>rV1v@;bs~I5e;~F|E8Ts-@$7 z!8k_9EBfraiX|bIoRr0q&QxY+KhOVEUWD#CJa&$uGFr3b$W&DwScqs;)9WB(XLERt zu&0^RoYP(xHW^kO-S%&z;f9Q@9s@P0sa{B1IQ`miM))}uoPB(hoQX&1ZOsGel)rl{ z$6jPd*K4xRGAw--ils|kN@kSSoYW39T ztvBCGyv6CYo|816N(L}QUMrKC{gKR;3v2$TWZRFdeFX{e|D{ND3T7C59Y_Gw`)?6wNSi`E9Z~~B;`7~u z3XWn}52`kR9vyNRQWDQFo&h{l@X+Cr#N;~UAY`k)*A(=_GG&(1#vF4Q9KVOZIkQ!- zcg5E&(ce!mxU=as#kDLfyt{JwR%UY|I4CDKf}#I7>QmWD)Vmj>Mga21ApZxyK)w%T z+1|XW*Du%!F*DE5-1Kg`J{YIMbke*&Sjznl06M^e