From d38799715a19fa881d967eb6a73868be6b61114a Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 22 Dec 2013 11:38:36 -0500 Subject: [PATCH] v2_02_49_src Former-commit-id: 5c236b9df56bdded7a137dc0a99efa043028ac41 --- Include/dxwnd.h | 14 +- build/d3d9.dll | 3 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 1245 ++++++++---- build/dxwnd_manual.pdf | Bin 332899 -> 0 bytes build/exports/KnightShift.dxw | 24 + build/exports/Knights Of Honor.dxw | 24 + build/exports/Kohan II Kings of War.dxw | 24 + build/exports/Lost Valley.dxw | 24 + .../{Empire Earth.dxw => Project IGI.dxw} | 14 +- build/exports/State of Emergency.dxw | 24 + build/exports/Take no Prisoners.dxw | 24 + build/exports/Worms Pinball.dxw | 24 + build/issues.txt | 4 - build/readme-relnotes.txt | 15 +- d3d9proxy/d3d9.h | 1667 +++++++++++++++++ d3d9proxy/d3dx9.h | 71 + d3d9proxy/d3dx9.lib | Bin 0 -> 87600 bytes d3d9proxy/myIDirect3D9.cpp | 154 ++ d3d9proxy/myIDirect3D9.h | 31 + d3d9proxy/myIDirect3DDevice9.cpp | 776 ++++++++ d3d9proxy/myIDirect3DDevice9.h | 136 ++ d3d9proxy/proxydll.cpp | 116 ++ d3d9proxy/proxydll.def | 4 + d3d9proxy/proxydll.h | 10 + d3d9proxy/proxydll.sln | 19 + d3d9proxy/proxydll.suo | Bin 0 -> 29184 bytes d3d9proxy/proxydll.suo.old | Bin 0 -> 10752 bytes d3d9proxy/proxydll.vcproj | 253 +++ d3d9proxy/stdafx.cpp | 2 + d3d9proxy/stdafx.h | 10 + dll/advapi.cpp | 14 +- dll/ddproxy.cpp | 10 +- dll/ddraw.cpp | 461 ++--- dll/dinput.cpp | 26 +- dll/dxdiaghook.cpp | 38 +- dll/dxemublt.cpp | 72 +- dll/dxhook.cpp | 182 +- dll/dxwcore.cpp | 38 +- dll/dxwnd.cpp | 4 +- dll/dxwnd.vs2008.suo | Bin 448512 -> 476672 bytes dll/gdi32.cpp | 299 +-- dll/hd3d.cpp | 522 +++--- dll/hd3d7.cpp | 127 +- dll/imelib.cpp | 16 +- dll/kernel32.cpp | 112 +- dll/msvfw.cpp | 4 +- dll/ole32.cpp | 82 +- dll/opengl.cpp | 36 +- dll/smack.cpp | 8 +- dll/syslibs.h | 19 +- dll/user32.cpp | 435 +++-- dll/winmm.cpp | 14 +- dll/wintrust.cpp | 4 +- dll/wndproc.cpp | 6 +- host/Resource.h | 25 +- host/TabCompat.cpp | 1 + host/TabDirectX.cpp | 1 + host/TabLogs.cpp | 6 +- host/TargetDlg.cpp | 8 +- host/TargetDlg.h | 8 +- host/dxwndhost.aps | Bin 168012 -> 146084 bytes host/dxwndhost.cpp | 2 +- host/dxwndhost.rc | 31 +- host/dxwndhost.vs2008.suo | Bin 374272 -> 83968 bytes host/dxwndhostView.cpp | 86 +- host/dxwndhostView.h | 4 + 68 files changed, 5882 insertions(+), 1539 deletions(-) create mode 100644 build/d3d9.dll delete mode 100644 build/dxwnd_manual.pdf create mode 100644 build/exports/KnightShift.dxw create mode 100644 build/exports/Knights Of Honor.dxw create mode 100644 build/exports/Kohan II Kings of War.dxw create mode 100644 build/exports/Lost Valley.dxw rename build/exports/{Empire Earth.dxw => Project IGI.dxw} (54%) create mode 100644 build/exports/State of Emergency.dxw create mode 100644 build/exports/Take no Prisoners.dxw create mode 100644 build/exports/Worms Pinball.dxw delete mode 100644 build/issues.txt create mode 100644 d3d9proxy/d3d9.h create mode 100644 d3d9proxy/d3dx9.h create mode 100644 d3d9proxy/d3dx9.lib create mode 100644 d3d9proxy/myIDirect3D9.cpp create mode 100644 d3d9proxy/myIDirect3D9.h create mode 100644 d3d9proxy/myIDirect3DDevice9.cpp create mode 100644 d3d9proxy/myIDirect3DDevice9.h create mode 100644 d3d9proxy/proxydll.cpp create mode 100644 d3d9proxy/proxydll.def create mode 100644 d3d9proxy/proxydll.h create mode 100644 d3d9proxy/proxydll.sln create mode 100644 d3d9proxy/proxydll.suo create mode 100644 d3d9proxy/proxydll.suo.old create mode 100644 d3d9proxy/proxydll.vcproj create mode 100644 d3d9proxy/stdafx.cpp create mode 100644 d3d9proxy/stdafx.h diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 4c9c641..b93d3fc 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -122,19 +122,23 @@ #define ZBUFFERALWAYS 0x00000040 // Forces ZBUFFER D3DCMP_ALWAYS condition to show all planes.... #define DISABLEFOGGING 0x00000080 // Disable D3D fogging #define NOPOWER2FIX 0x00000100 // Handle textures whose size is not a power of 2 (32, 64, 128 ...) +#define NOPERFCOUNTER 0x00000200 // Disables the GetPerfCounter performance metrics API,as if it was not supported.... +#define ADDPROXYLIBS 0x00000400 // Add proxy libs to otherwise hook-resilient system libraries (e.g. d3d9.dll) // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general #define OUTDDRAWTRACE 0x00000002 // traces DxWnd directdraw screen handling #define OUTWINMESSAGES 0x00000004 // traces windows messages #define OUTCURSORTRACE 0x00000008 // traces cursor positions & operations -#define OUTPROXYTRACE 0x00000010 // warning: it also enables proxy functions !!!! +#define OUTPROXYTRACE 0x00000010 // enables all operations through proxy functions #define DXPROXED 0x00000020 // hook DX proxy methods to log each call in original behaviour #define ASSERTDIALOG 0x00000040 // show assert messages in Dialog Box #define OUTIMPORTTABLE 0x00000080 // dump import table contents #define OUTDEBUG 0x00000100 // detailed debugging indormation #define OUTREGISTRY 0x00000200 // log registry operations #define TRACEHOOKS 0x00000400 // log hook operations +#define OUTD3DTRACE 0x00000800 // traces DxWnd direct3d screen handling +#define OUTDXWINTRACE 0x00001000 // traces DxWnd internal operations #define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE | LOCKEDSURFACE) #define HANDLEFPS (SHOWFPS | SHOWFPSOVERLAY | LIMITFPS | SKIPFPS) @@ -206,7 +210,9 @@ LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM); #define OutTraceW if(dxw.dwTFlags & OUTWINMESSAGES) OutTrace #define OutTraceX if(dxw.dwTFlags & OUTPROXYTRACE) OutTrace -#define OutTraceD if(dxw.dwTFlags & OUTDDRAWTRACE) OutTrace +#define OutTraceDW if(dxw.dwTFlags & OUTDXWINTRACE) OutTrace +#define OutTraceDDRAW if(dxw.dwTFlags & OUTDDRAWTRACE) OutTrace +#define OutTraceD3D if(dxw.dwTFlags & OUTD3DTRACE) OutTrace #define OutTraceC if(dxw.dwTFlags & OUTCURSORTRACE) OutTrace #define OutTraceB if(dxw.dwTFlags & OUTDEBUG) OutTrace #define OutTraceR if(dxw.dwTFlags & OUTREGISTRY) OutTrace @@ -216,7 +222,9 @@ LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM); #define IsTraceW (dxw.dwTFlags & OUTWINMESSAGES) #define IsTraceX (dxw.dwTFlags & OUTPROXYTRACE) -#define IsTraceD (dxw.dwTFlags & OUTDDRAWTRACE) +#define IsTraceDW (dxw.dwTFlags & OUTDXWINTRACE) +#define IsTraceDDRAW (dxw.dwTFlags & OUTDDRAWTRACE) +#define IsTraceD3D (dxw.dwTFlags & OUTD3DTRACE) #define IsTraceC (dxw.dwTFlags & OUTCURSORTRACE) #define IsTraceR (dxw.dwTFlags & OUTREGISTRY) #define IsTraceH (dxw.dwTFlags & TRACEHOOKS) diff --git a/build/d3d9.dll b/build/d3d9.dll new file mode 100644 index 0000000..358b5d6 --- /dev/null +++ b/build/d3d9.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbba59e9978c6b6bbab608afb2d58ca5946c5a5dd80760539334f53b7f42f2ef +size 108544 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 96ef9a7..0c7e910 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57ef9c7d9946325fb6dd60e4af9dc304c495324ecae9a692cf86f91992cebbfb -size 431616 +oid sha256:86344285657229fd81bf32b0431d3b4834a62cf91d50f521dd84035670bd8c9d +size 435200 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index e721987..8316ab5 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a4a4d772a6ec7426fd16e1891cfb4b0bc0f853cbb5a6cdcaa080f131bdd340e -size 531968 +oid sha256:344f365f6f431bb76c4c42f14654160bdc40c065462b4c8c45a0f3c2ab266a70 +size 533504 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index c3fe53f..b450b3a 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -137,17 +137,17 @@ sizx5=800 sizy5=600 maxfps5=0 initts5=0 -title6=Beavis & Butthead Do U. -path6=D:\Games\B_b\BEAVIS.EXE +title6=Army Men RTS +path6=D:\Games\Army Men RTS\amrts.exe module6= opengllib6= ver6=0 coord6=0 -flag6=671090722 +flag6=671105060 flagg6=1207959552 -flagh6=32788 -flagi6=0 -tflag6=2 +flagh6=20 +flagi6=4 +tflag6=0 initx6=0 inity6=0 minx6=0 @@ -160,17 +160,17 @@ sizx6=800 sizy6=600 maxfps6=0 initts6=0 -title7=Black & White -path7=D:\Games\Black & White\runblack.exe +title7=Beavis & Butthead Do U. +path7=D:\Games\B_b\BEAVIS.EXE module7= opengllib7= ver7=0 -coord7=1 -flag7=679477280 -flagg7=1207959568 -flagh7=20 -flagi7=4 -tflag7=258 +coord7=0 +flag7=671090722 +flagg7=1207959552 +flagh7=32788 +flagi7=0 +tflag7=2 initx7=0 inity7=0 minx7=0 @@ -183,15 +183,15 @@ sizx7=800 sizy7=600 maxfps7=0 initts7=0 -title8=Bunnies must die -path8=D:\Games\Bunnies must die\bmd.exe +title8=Black & White +path8=D:\Games\Black & White\runblack.exe module8= opengllib8= -ver8=1 -coord8=0 -flag8=142606370 -flagg8=1744830465 -flagh8=65556 +ver8=0 +coord8=1 +flag8=679477280 +flagg8=1207959568 +flagh8=20 flagi8=4 tflag8=258 initx8=0 @@ -206,17 +206,17 @@ sizx8=800 sizy8=600 maxfps8=0 initts8=0 -title9=Carmageddon 2 (GLIDE) -path9=D:\Games\Carmageddon_2\carma2_HW.exe +title9=Bunnies must die +path9=D:\Games\Bunnies must die\bmd.exe module9= opengllib9= -ver9=0 +ver9=1 coord9=0 -flag9=134217730 -flagg9=1208025088 -flagh9=20 -flagi9=12 -tflag9=0 +flag9=142606370 +flagg9=1744830465 +flagh9=65556 +flagi9=4 +tflag9=258 initx9=0 inity9=0 minx9=0 @@ -229,15 +229,15 @@ sizx9=800 sizy9=600 maxfps9=0 initts9=0 -title10=Carmageddon 2 (SW) -path10=D:\Games\Carmageddon_2\carma2_SW.exe +title10=Carmageddon 2 (GLIDE) +path10=D:\Games\Carmageddon_2\carma2_HW.exe module10= opengllib10= ver10=0 coord10=0 -flag10=671088674 +flag10=134217730 flagg10=1208025088 -flagh10=33562644 +flagh10=20 flagi10=12 tflag10=0 initx10=0 @@ -252,16 +252,16 @@ sizx10=800 sizy10=600 maxfps10=0 initts10=0 -title11=Cave Story -path11=D:\Games\Cave Story\Doukutsu.exe +title11=Carmageddon 2 (SW) +path11=D:\Games\Carmageddon_2\carma2_SW.exe module11= opengllib11= ver11=0 coord11=0 -flag11=134217762 -flagg11=1207959552 -flagh11=20 -flagi11=4 +flag11=671088674 +flagg11=1208025088 +flagh11=33562644 +flagi11=12 tflag11=0 initx11=0 inity11=0 @@ -275,17 +275,17 @@ sizx11=800 sizy11=600 maxfps11=0 initts11=0 -title12=Crimson Skies -path12=D:\Games\Crimson_Skies\crimson.exe +title12=Cave Story +path12=D:\Games\Cave Story\Doukutsu.exe module12= opengllib12= -ver12=7 +ver12=0 coord12=0 -flag12=155205668 -flagg12=1207959568 +flag12=134217762 +flagg12=1207959552 flagh12=20 -flagi12=292 -tflag12=258 +flagi12=4 +tflag12=0 initx12=0 inity12=0 minx12=0 @@ -298,17 +298,17 @@ sizx12=800 sizy12=600 maxfps12=0 initts12=0 -title13=Daikatana -path13=D:\Games\Daikatana\daikatana.exe +title13=Crimson Skies +path13=D:\Games\Crimson_Skies\crimson.exe module13= opengllib13= -ver13=12 +ver13=7 coord13=0 -flag13=269492742 -flagg13=537002497 +flag13=134234148 +flagg13=-939524096 flagh13=20 -flagi13=0 -tflag13=2 +flagi13=36 +tflag13=259 initx13=0 inity13=0 minx13=0 @@ -321,17 +321,17 @@ sizx13=800 sizy13=600 maxfps13=0 initts13=0 -title14=Devastation -path14=D:\Games\Devastation\System\Devastation.exe +title14=Daikatana +path14=D:\Games\Daikatana\daikatana.exe module14= opengllib14= -ver14=0 +ver14=12 coord14=0 -flag14=167772198 -flagg14=1209008128 -flagh14=65556 -flagi14=2 -tflag14=322 +flag14=269492742 +flagg14=537002497 +flagh14=20 +flagi14=0 +tflag14=2 initx14=0 inity14=0 minx14=0 @@ -340,21 +340,21 @@ maxx14=0 maxy14=0 posx14=50 posy14=50 -sizx14=320 -sizy14=240 +sizx14=800 +sizy14=600 maxfps14=0 initts14=0 -title15=Doom Shareware for Windows 95 -path15=D:\Games\Doom Shareware for Windows 95\Doom95.exe +title15=Devastation +path15=D:\Games\Devastation\System\Devastation.exe module15= opengllib15= ver15=0 -coord15=2 -flag15=134217762 -flagg15=1207959568 -flagh15=20 -flagi15=0 -tflag15=0 +coord15=0 +flag15=167772198 +flagg15=1209008128 +flagh15=65556 +flagi15=2 +tflag15=322 initx15=0 inity15=0 minx15=0 @@ -363,21 +363,21 @@ maxx15=0 maxy15=0 posx15=50 posy15=50 -sizx15=800 -sizy15=600 +sizx15=320 +sizy15=240 maxfps15=0 initts15=0 -title16=Duckman -path16=D:\Games\Duckman\DUCKMAN.EXE +title16=Doom Shareware for Windows 95 +path16=D:\Games\Doom Shareware for Windows 95\Doom95.exe module16= opengllib16= ver16=0 -coord16=0 +coord16=2 flag16=134217762 -flagg16=1209008128 +flagg16=1207959568 flagh16=20 -flagi16=4 -tflag16=258 +flagi16=0 +tflag16=0 initx16=0 inity16=0 minx16=0 @@ -390,17 +390,17 @@ sizx16=800 sizy16=600 maxfps16=0 initts16=0 -title17=Dungeon Keeper 2 (GOG) -path17=D:\Games\Dungeon Keeper 2 (GOG)\DKII.EXE +title17=Duckman +path17=D:\Games\Duckman\DUCKMAN.EXE module17= opengllib17= ver17=0 coord17=0 -flag17=136331298 -flagg17=1241513984 -flagh17=20 -flagi17=0 -tflag17=258 +flag17=134217762 +flagg17=1209008128 +flagh17=33554452 +flagi17=4 +tflag17=3 initx17=0 inity17=0 minx17=0 @@ -413,17 +413,17 @@ sizx17=800 sizy17=600 maxfps17=0 initts17=0 -title18=Empire Earth -path18=D:\Games\Empire Earth\Empire Earth.exe +title18=Dungeon Keeper 2 (GOG) +path18=D:\Games\Dungeon Keeper 2 (GOG)\DKII.EXE module18= opengllib18= ver18=0 coord18=0 -flag18=-1459617632 -flagg18=201326848 -flagh18=84 +flag18=136331298 +flagg18=1241513984 +flagh18=20 flagi18=0 -tflag18=262 +tflag18=258 initx18=0 inity18=0 minx18=0 @@ -432,21 +432,21 @@ maxx18=0 maxy18=0 posx18=50 posy18=50 -sizx18=0 -sizy18=0 +sizx18=800 +sizy18=600 maxfps18=0 initts18=0 -title19=F-16 Fighting Falcon -path19=D:\Games\F16\f1695.exe +title19=Empire Earth +path19=D:\Games\Empire Earth\Empire Earth.exe module19= opengllib19= ver19=0 coord19=0 -flag19=134217826 -flagg19=1209008128 -flagh19=20 -flagi19=4 -tflag19=258 +flag19=-1459617632 +flagg19=201326848 +flagh19=84 +flagi19=0 +tflag19=262 initx19=0 inity19=0 minx19=0 @@ -455,21 +455,21 @@ maxx19=0 maxy19=0 posx19=50 posy19=50 -sizx19=800 -sizy19=600 +sizx19=0 +sizy19=0 maxfps19=0 initts19=0 -title20=Fate -path20=D:\Games\Fate\Fate.exe +title20=F-16 Fighting Falcon +path20=D:\Games\F16\f1695.exe module20= opengllib20= ver20=0 coord20=0 -flag20=134217762 -flagg20=1207959552 +flag20=134217826 +flagg20=1209008128 flagh20=20 flagi20=4 -tflag20=0 +tflag20=258 initx20=0 inity20=0 minx20=0 @@ -482,14 +482,14 @@ sizx20=800 sizy20=600 maxfps20=0 initts20=0 -title21=Grand Prix Legends -path21=D:\Games\gpl\gpl.exe +title21=Fate +path21=D:\Games\Fate\Fate.exe module21= opengllib21= ver21=0 coord21=0 -flag21=679485472 -flagg21=-939524096 +flag21=134217762 +flagg21=1207959552 flagh21=20 flagi21=4 tflag21=0 @@ -505,15 +505,15 @@ sizx21=800 sizy21=600 maxfps21=0 initts21=0 -title22=Grand Prix World -path22=D:\Games\Grand Prix World\gpw.exe +title22=Gangsters +path22=D:\Games\Gangsters\gangsters.exe module22= opengllib22= ver22=0 coord22=0 -flag22=134217762 -flagg22=1207959680 -flagh22=84 +flag22=1208483874 +flagg22=1209008128 +flagh22=20 flagi22=4 tflag22=0 initx22=0 @@ -528,17 +528,17 @@ sizx22=800 sizy22=600 maxfps22=0 initts22=0 -title23=GTA 3 -path23=D:\Games\GTA3\gta3.exe +title23=Grand Prix Legends +path23=D:\Games\gpl\gpl.exe module23= opengllib23= ver23=0 coord23=0 -flag23=134217762 -flagg23=1207959552 +flag23=679485472 +flagg23=-939524096 flagh23=20 flagi23=4 -tflag23=258 +tflag23=0 initx23=0 inity23=0 minx23=0 @@ -551,17 +551,17 @@ sizx23=800 sizy23=600 maxfps23=0 initts23=0 -title24=Hearts of Iron 2 -path24=D:\Games\Hearts of Iron 2\HoI2.exe +title24=GTA 3 +path24=D:\Games\GTA3\gta3.exe module24= opengllib24= ver24=0 -coord24=2 -flag24=939526179 -flagg24=1207959568 -flagh24=32788 -flagi24=2 -tflag24=2 +coord24=0 +flag24=134217762 +flagg24=1207959552 +flagh24=20 +flagi24=4 +tflag24=258 initx24=0 inity24=0 minx24=0 @@ -574,17 +574,17 @@ sizx24=800 sizy24=600 maxfps24=0 initts24=0 -title25=Heroes of Might and Magic IV -path25=D:\Games\Heroes of Might and Magic IV\heroes4.exe +title25=Hearts of Iron 2 +path25=D:\Games\Hearts of Iron 2\HoI2.exe module25= opengllib25= ver25=0 coord25=2 -flag25=671350818 +flag25=939526179 flagg25=1207959568 -flagh25=-2147418092 -flagi25=1 -tflag25=258 +flagh25=32788 +flagi25=2 +tflag25=2 initx25=0 inity25=0 minx25=0 @@ -597,17 +597,17 @@ sizx25=800 sizy25=600 maxfps25=0 initts25=0 -title26=Hitman - Codename 47 -path26=D:\Games\Hitman - Codename 47\Hitman.Exe +title26=Heroes of Might and Magic IV +path26=D:\Games\Heroes of Might and Magic IV\heroes4.exe module26= opengllib26= -ver26=1 -coord26=0 -flag26=134234144 -flagg26=1207959808 -flagh26=20 -flagi26=4 -tflag26=2 +ver26=0 +coord26=2 +flag26=671350818 +flagg26=1207959568 +flagh26=-2147418092 +flagi26=1 +tflag26=258 initx26=0 inity26=0 minx26=0 @@ -620,17 +620,17 @@ sizx26=800 sizy26=600 maxfps26=0 initts26=0 -title27=Hitman 2 Silent Assassin -path27=D:\Games\Hitman 2 Silent Assassin\hitman2.exe +title27=Hitman - Codename 47 +path27=D:\Games\Hitman - Codename 47\Hitman.Exe module27= opengllib27= -ver27=0 -coord27=2 -flag27=134234150 -flagg27=1207959568 +ver27=1 +coord27=0 +flag27=134234144 +flagg27=1207959808 flagh27=20 flagi27=4 -tflag27=0 +tflag27=2 initx27=0 inity27=0 minx27=0 @@ -643,16 +643,16 @@ sizx27=800 sizy27=600 maxfps27=0 initts27=0 -title28=Homeworld 2 -path28=D:\Games\Homeworld2\Bin\Release\Homeworld2.exe +title28=Hitman 2 Silent Assassin +path28=D:\Games\Hitman 2 Silent Assassin\hitman2.exe module28= opengllib28= ver28=0 -coord28=0 -flag28=671154178 -flagg28=134217728 -flagh28=285 -flagi28=0 +coord28=2 +flag28=134234150 +flagg28=1207959568 +flagh28=20 +flagi28=4 tflag28=0 initx28=0 inity28=0 @@ -666,16 +666,16 @@ sizx28=800 sizy28=600 maxfps28=0 initts28=0 -title29=Imperialism -path29=D:\Games\Imperialism\Imperialism.exe +title29=Homeworld 2 +path29=D:\Games\Homeworld2\Bin\Release\Homeworld2.exe module29= opengllib29= ver29=0 coord29=0 -flag29=-1467998174 -flagg29=1209008128 -flagh29=20 -flagi29=4 +flag29=671154178 +flagg29=134217728 +flagh29=285 +flagi29=0 tflag29=0 initx29=0 inity29=0 @@ -689,13 +689,13 @@ sizx29=800 sizy29=600 maxfps29=0 initts29=0 -title30=Imperialism II -path30=D:\Games\Imperialism 2\imperialism II.exe +title30=Imperialism +path30=D:\Games\Imperialism\Imperialism.exe module30= opengllib30= ver30=0 coord30=0 -flag30=679485474 +flag30=-1467998174 flagg30=1209008128 flagh30=20 flagi30=4 @@ -712,17 +712,17 @@ sizx30=800 sizy30=600 maxfps30=0 initts30=0 -title31=International Football 2000 -path31=D:\Games\International Football 2000\MSIF2000.ICD +title31=Imperialism II +path31=D:\Games\Imperialism 2\imperialism II.exe module31= opengllib31= ver31=0 coord31=0 -flag31=150994976 -flagg31=1207959552 +flag31=679485474 +flagg31=1209008128 flagh31=20 flagi31=4 -tflag31=258 +tflag31=0 initx31=0 inity31=0 minx31=0 @@ -735,17 +735,17 @@ sizx31=800 sizy31=600 maxfps31=0 initts31=0 -title32=Jet Moto -path32=D:\Games\Jet_Moto\JETMOTO.EXE +title32=International Football 2000 +path32=D:\Games\International Football 2000\MSIF2000.ICD module32= opengllib32= ver32=0 coord32=0 -flag32=671088674 -flagg32=1207959568 +flag32=150994976 +flagg32=1207959552 flagh32=20 -flagi32=0 -tflag32=0 +flagi32=4 +tflag32=258 initx32=0 inity32=0 minx32=0 @@ -758,17 +758,17 @@ sizx32=800 sizy32=600 maxfps32=0 initts32=0 -title33=Kiss Psycho Circus -path33=D:\Games\Kiss\client.exe +title33=Jet Moto +path33=D:\Games\Jet_Moto\JETMOTO.EXE module33= opengllib33= ver33=0 coord33=0 -flag33=134234148 -flagg33=-939523840 +flag33=671088674 +flagg33=1207959568 flagh33=20 -flagi33=16 -tflag33=2 +flagi33=0 +tflag33=0 initx33=0 inity33=0 minx33=0 @@ -781,17 +781,17 @@ sizx33=800 sizy33=600 maxfps33=0 initts33=0 -title34=Kohan II Kings of War -path34=D:\Games\Kohan II Kings of War\k2.exe +title34=KISS Pinball +path34=D:\Games\KISS Pinball\kisspin.exe module34= opengllib34= -ver34=0 +ver34=1 coord34=0 -flag34=134217762 +flag34=679616546 flagg34=1207959552 -flagh34=20 +flagh34=98324 flagi34=4 -tflag34=0 +tflag34=259 initx34=0 inity34=0 minx34=0 @@ -804,17 +804,17 @@ sizx34=800 sizy34=600 maxfps34=0 initts34=0 -title35=L.E.D. Wars (not working) -path35=D:\Games\l.e.d._wars\LED.EXE +title35=Kiss Psycho Circus +path35=D:\Games\Kiss\client.exe module35= opengllib35= ver35=0 coord35=0 -flag35=713039906 -flagg35=1207959569 -flagh35=65556 -flagi35=4 -tflag35=258 +flag35=134234148 +flagg35=-939523840 +flagh35=20 +flagi35=16 +tflag35=2 initx35=0 inity35=0 minx35=0 @@ -827,17 +827,17 @@ sizx35=800 sizy35=600 maxfps35=0 initts35=0 -title36=Land of the Dead -path36=D:\Games\Land of the Dead\System\LOTD.exe +title36=Knights Of Honor +path36=D:\Games\Knights Of Honor\KoH.exe module36= opengllib36= ver36=0 -coord36=2 -flag36=134217766 -flagg36=1207959568 -flagh36=20 -flagi36=0 -tflag36=64 +coord36=0 +flag36=-402382814 +flagg36=1207959552 +flagh36=65556 +flagi36=4 +tflag36=6431 initx36=0 inity36=0 minx36=0 @@ -850,17 +850,17 @@ sizx36=800 sizy36=600 maxfps36=0 initts36=0 -title37=Last Bronx -path37=D:\Games\Last_Bronx\LB.EXE +title37=KnightShift +path37=D:\Games\knightshift\KnightShift.ex1 module37= opengllib37= -ver37=0 +ver37=8 coord37=0 -flag37=134217762 -flagg37=-939520000 +flag37=134217760 +flagg37=1207959552 flagh37=20 flagi37=4 -tflag37=0 +tflag37=3 initx37=0 inity37=0 minx37=0 @@ -871,10 +871,10 @@ posx37=50 posy37=50 sizx37=800 sizy37=600 -maxfps37=20 -initts37=4 -title38=LEGOŽ Marvel Super Heroes Demo -path38=C:\Program Files (x86)\Warner Bros. Interactive Entertainment\LEGOŽ Marvel Super Heroes Demo\LEGOMarvelDemo.exe +maxfps37=0 +initts37=0 +title38=Kohan II Kings of War +path38=D:\Games\Kohan II Kings of War\k2.exe module38= opengllib38= ver38=0 @@ -882,8 +882,8 @@ coord38=0 flag38=134217762 flagg38=1207959552 flagh38=20 -flagi38=4 -tflag38=0 +flagi38=1028 +tflag38=6163 initx38=0 inity38=0 minx38=0 @@ -896,17 +896,17 @@ sizx38=800 sizy38=600 maxfps38=0 initts38=0 -title39=Lords of the Realm 2 -path39=D:\Games\Lords of the Realm 2\LORDS2.EXE +title39=L.E.D. Wars (not working) +path39=D:\Games\l.e.d._wars\LED.EXE module39= opengllib39= ver39=0 coord39=0 -flag39=134217762 -flagg39=1209008128 +flag39=713039906 +flagg39=1744830481 flagh39=65556 flagi39=4 -tflag39=0 +tflag39=258 initx39=0 inity39=0 minx39=0 @@ -919,17 +919,17 @@ sizx39=800 sizy39=600 maxfps39=0 initts39=0 -title40=Mageslayer -path40=D:\Games\MAGE\MAGESLAY.EXE +title40=Land of the Dead +path40=D:\Games\Land of the Dead\System\LOTD.exe module40= opengllib40= ver40=0 -coord40=0 -flag40=134217762 -flagg40=1207959584 +coord40=2 +flag40=134217766 +flagg40=1207959568 flagh40=20 flagi40=0 -tflag40=67 +tflag40=64 initx40=0 inity40=0 minx40=0 @@ -942,14 +942,14 @@ sizx40=800 sizy40=600 maxfps40=0 initts40=0 -title41=Magic & Mayhem -path41=D:\Games\Magic_&_Mayhem\Chaos.exe +title41=Last Bronx +path41=D:\Games\Last_Bronx\LB.EXE module41= opengllib41= ver41=0 coord41=0 flag41=134217762 -flagg41=1207959552 +flagg41=-939520000 flagh41=20 flagi41=4 tflag41=0 @@ -963,18 +963,18 @@ posx41=50 posy41=50 sizx41=800 sizy41=600 -maxfps41=0 -initts41=0 -title42=Motocross Madness (DEMO) -path42=D:\Games\Motocross Madness Trial\mcm.exe +maxfps41=20 +initts41=4 +title42=LEGOŽ Marvel Super Heroes Demo +path42=C:\Program Files (x86)\Warner Bros. Interactive Entertainment\LEGOŽ Marvel Super Heroes Demo\LEGOMarvelDemo.exe module42= opengllib42= ver42=0 coord42=0 -flag42=134217760 +flag42=134217762 flagg42=1207959552 flagh42=20 -flagi42=0 +flagi42=4 tflag42=0 initx42=0 inity42=0 @@ -988,15 +988,15 @@ sizx42=800 sizy42=600 maxfps42=0 initts42=0 -title43=Pandemonium 2 (GLIDE) -path43=D:\Games\Pandemonium 2\pandy.exe +title43=Lords of the Realm 2 +path43=D:\Games\Lords of the Realm 2\LORDS2.EXE module43= opengllib43= ver43=0 coord43=0 flag43=134217762 -flagg43=1207959552 -flagh43=20 +flagg43=1209008128 +flagh43=65556 flagi43=4 tflag43=0 initx43=0 @@ -1011,17 +1011,17 @@ sizx43=800 sizy43=600 maxfps43=0 initts43=0 -title44=Panzer Dragoon -path44=D:\Games\Panzer Dragoon\game\PANZERDG.EXE +title44=Mageslayer +path44=D:\Games\MAGE\MAGESLAY.EXE module44= opengllib44= ver44=0 coord44=0 -flag44=134217762 -flagg44=1207959552 +flag44=136314914 +flagg44=1476395008 flagh44=20 -flagi44=4 -tflag44=67 +flagi44=1 +tflag44=83 initx44=0 inity44=0 minx44=0 @@ -1034,17 +1034,17 @@ sizx44=800 sizy44=600 maxfps44=0 initts44=0 -title45=Praetorians -path45=D:\games\Praetorians\Praetorians.exe +title45=Magic & Mayhem +path45=D:\Games\Magic_&_Mayhem\Chaos.exe module45= opengllib45= ver45=0 -coord45=2 -flag45=134217760 -flagg45=1209008144 -flagh45=22 +coord45=0 +flag45=134217762 +flagg45=1207959552 +flagh45=20 flagi45=4 -tflag45=2 +tflag45=0 initx45=0 inity45=0 minx45=0 @@ -1057,17 +1057,17 @@ sizx45=800 sizy45=600 maxfps45=0 initts45=0 -title46=Praetorians (DEMO) -path46=D:\Games\Praetorians Demo\Praetorians.exe +title46=Motocross Madness (DEMO) +path46=D:\Games\Motocross Madness Trial\mcm.exe module46= opengllib46= ver46=0 coord46=0 flag46=134217760 flagg46=1207959552 -flagh46=65556 -flagi46=4 -tflag46=2 +flagh46=20 +flagi46=0 +tflag46=0 initx46=0 inity46=0 minx46=0 @@ -1080,17 +1080,17 @@ sizx46=800 sizy46=600 maxfps46=0 initts46=0 -title47=Project Nomads (DEMO) -path47=D:\Games\Project Nomads Demo\bin\win32\nomads.exe +title47=Pandemonium 2 (GLIDE) +path47=D:\Games\Pandemonium 2\pandy.exe module47= opengllib47= -ver47=8 +ver47=0 coord47=0 -flag47=-1476394974 -flagg47=1207959808 -flagh47=4 -flagi47=0 -tflag47=274 +flag47=134217762 +flagg47=1207959552 +flagh47=20 +flagi47=4 +tflag47=0 initx47=0 inity47=0 minx47=0 @@ -1103,17 +1103,17 @@ sizx47=800 sizy47=600 maxfps47=0 initts47=0 -title48=Rayman 2 Demo -path48=D:\Games\Rayman2Demo\Rayman2Demo.exe +title48=Panzer Dragoon +path48=D:\Games\Panzer Dragoon\game\PANZERDG.EXE module48= opengllib48= -ver48=7 +ver48=0 coord48=0 -flag48=402653219 -flagg48=1208025088 -flagh48=2097172 -flagi48=0 -tflag48=258 +flag48=134217762 +flagg48=1207959552 +flagh48=20 +flagi48=4 +tflag48=67 initx48=0 inity48=0 minx48=0 @@ -1125,18 +1125,18 @@ posy48=50 sizx48=800 sizy48=600 maxfps48=0 -initts48=4 -title49=Shadows of the Empire (DEMO) -path49=D:\Games\Shadows of the Empire\shadows.exe +initts48=0 +title49=Praetorians +path49=D:\games\Praetorians\Praetorians.exe module49= opengllib49= ver49=0 coord49=2 -flag49=134479906 -flagg49=1207959568 -flagh49=33554452 -flagi49=0 -tflag49=274 +flag49=134217760 +flagg49=1209008144 +flagh49=22 +flagi49=4 +tflag49=2 initx49=0 inity49=0 minx49=0 @@ -1149,17 +1149,17 @@ sizx49=800 sizy49=600 maxfps49=0 initts49=0 -title50=Star Wars Episode I Racer -path50=D:\Games\Star Wars Episode 1 racer\SWEP1RCR.EXE +title50=Praetorians (DEMO) +path50=D:\Games\Praetorians Demo\Praetorians.exe module50= opengllib50= ver50=0 coord50=0 -flag50=679493669 -flagg50=1210056720 -flagh50=8212 -flagi50=20 -tflag50=67 +flag50=150994976 +flagg50=1209008128 +flagh50=65556 +flagi50=4 +tflag50=6419 initx50=0 inity50=0 minx50=0 @@ -1172,20 +1172,20 @@ sizx50=800 sizy50=600 maxfps50=0 initts50=0 -title51=StarCraft +title51=Primitive Wars module51= opengllib51= -title52=Tomb Raider 4 (DEMO) +title52=Project IGI module52= opengllib52= -path51=D:\Games\Starcraft\StarCraft.exe +path51=D:\Games\Primitive Wars\Pw.exe ver51=0 coord51=0 -flag51=134217762 -flagg51=134283264 +flag51=671088674 +flagg51=134217728 flagh51=20 -flagi51=8 -tflag51=64 +flagi51=0 +tflag51=0 initx51=0 inity51=0 minx51=0 @@ -1198,14 +1198,14 @@ sizx51=800 sizy51=600 maxfps51=0 initts51=0 -path52=D:\Games\Tomb Raider - The Last Revelation (Demo)\tomb4.exe -ver52=7 +path52=D:\Games\Project IGI\pc\IGI.exe +ver52=0 coord52=0 -flag52=134217760 -flagg52=1207959552 +flag52=671105060 +flagg52=-939524096 flagh52=20 -flagi52=0 -tflag52=258 +flagi52=4 +tflag52=67 initx52=0 inity52=0 minx52=0 @@ -1218,17 +1218,17 @@ sizx52=800 sizy52=600 maxfps52=0 initts52=0 -title53=Tomb Raider II -path53=D:\Games\Tomb Raider II\Tomb2.exe +title53=Project Nomads (DEMO) +path53=D:\Games\Project Nomads Demo\bin\win32\nomads.exe module53= opengllib53= -ver53=0 +ver53=8 coord53=0 -flag53=671088674 -flagg53=1207959552 -flagh53=20 +flag53=-1476394974 +flagg53=1207959808 +flagh53=4 flagi53=0 -tflag53=0 +tflag53=274 initx53=0 inity53=0 minx53=0 @@ -1241,17 +1241,17 @@ sizx53=800 sizy53=600 maxfps53=0 initts53=0 -title54=Tomb Raider II Gold (DEMO) -path54=D:\Games\Tomb Raider II Gold (Demo)\Tomb2.exe +title54=Rayman 2 Demo +path54=D:\Games\Rayman2Demo\Rayman2Demo.exe module54= opengllib54= -ver54=0 -coord54=2 -flag54=671088674 -flagg54=1224736784 -flagh54=20 +ver54=7 +coord54=0 +flag54=402653217 +flagg54=1208025088 +flagh54=2097172 flagi54=0 -tflag54=258 +tflag54=6419 initx54=0 inity54=0 minx54=0 @@ -1263,18 +1263,18 @@ posy54=50 sizx54=800 sizy54=600 maxfps54=0 -initts54=0 -title55=Tomb Raider III -path55=D:\Games\Tomb Raider III\tomb3.exe +initts54=4 +title55=Shadows of the Empire (DEMO) +path55=D:\Games\Shadows of the Empire\shadows.exe module55= opengllib55= ver55=0 coord55=2 -flag55=134217760 -flagg55=1241514000 -flagh55=20 +flag55=134479906 +flagg55=1207959568 +flagh55=33554452 flagi55=0 -tflag55=322 +tflag55=274 initx55=0 inity55=0 minx55=0 @@ -1287,17 +1287,17 @@ sizx55=800 sizy55=600 maxfps55=0 initts55=0 -title56=Virtua Fighter 2 (DEMO) -path56=D:\Games\vf2_demo\VF2DEMO.EXE +title56=Star Wars Episode I Racer +path56=D:\Games\Star Wars Episode 1 racer\SWEP1RCR.EXE module56= opengllib56= ver56=0 coord56=0 -flag56=939524131 -flagg56=1207959664 -flagh56=20 -flagi56=0 -tflag56=0 +flag56=679493669 +flagg56=1210056720 +flagh56=8212 +flagi56=20 +tflag56=65 initx56=0 inity56=0 minx56=0 @@ -1310,17 +1310,17 @@ sizx56=800 sizy56=600 maxfps56=0 initts56=0 -title57=Virtua Fighter PC -path57=D:\Games\Virtua Fighter\VFPC.EXE +title57=StarCraft +path57=D:\Games\Starcraft\StarCraft.exe module57= opengllib57= ver57=0 coord57=0 -flag57=402653218 -flagg57=1224736784 -flagh57=33562644 -flagi57=0 -tflag57=258 +flag57=134217762 +flagg57=134283264 +flagh57=20 +flagi57=8 +tflag57=64 initx57=0 inity57=0 minx57=0 @@ -1333,17 +1333,17 @@ sizx57=800 sizy57=600 maxfps57=0 initts57=0 -title58=Warcraft 2 Battlenet Ed -path58=D:\Games\Warcraft 2 Battlenet Ed\Warcraft II BNE.exe +title58=State of Emergency +path58=D:\Games\State of Emergency\KaosPC.exe module58= opengllib58= -ver58=0 +ver58=8 coord58=0 -flag58=134217762 -flagg58=1210122240 -flagh58=148 +flag58=671088676 +flagg58=1208025088 +flagh58=20 flagi58=12 -tflag58=0 +tflag58=7315 initx58=0 inity58=0 minx58=0 @@ -1354,19 +1354,19 @@ posx58=50 posy58=50 sizx58=800 sizy58=600 -maxfps58=0 -initts58=0 -title59=Wargasm -path59=D:\Games\Wargasm\tank.exe +maxfps58=50 +initts58=4 +title59=Take no Prisoners +path59=D:\Games\Take no Prisoners\TNP.EXE module59= opengllib59= ver59=0 -coord59=2 -flag59=671088672 -flagg59=1207959696 -flagh59=65556 -flagi59=0 -tflag59=3 +coord59=0 +flag59=134217762 +flagg59=134217860 +flagh59=20 +flagi59=512 +tflag59=259 initx59=0 inity59=0 minx59=0 @@ -1379,15 +1379,15 @@ sizx59=800 sizy59=600 maxfps59=0 initts59=0 -title60=Warlords Battlecry II (DEMO) -path60=D:\Games\Warlords Battlecry II Demo\Battlecry II Demo.exe +title60=Tomb Raider 4 (DEMO) +path60=D:\Games\Tomb Raider - The Last Revelation (Demo)\tomb4.exe module60= opengllib60= -ver60=0 -coord60=2 -flag60=134217762 -flagg60=1207959568 -flagh60=22 +ver60=7 +coord60=0 +flag60=134217760 +flagg60=1207959552 +flagh60=20 flagi60=0 tflag60=258 initx60=0 @@ -1402,17 +1402,17 @@ sizx60=800 sizy60=600 maxfps60=0 initts60=0 -title61=Whiteout -path61=D:\Games\Whiteout\Whiteout.exe +title61=Tomb Raider II +path61=D:\Games\Tomb Raider II\Tomb2.exe module61= opengllib61= ver61=0 coord61=0 -flag61=402653217 +flag61=671088674 flagg61=1207959552 flagh61=20 flagi61=0 -tflag61=66 +tflag61=0 initx61=0 inity61=0 minx61=0 @@ -1421,21 +1421,21 @@ maxx61=0 maxy61=0 posx61=50 posy61=50 -sizx61=640 -sizy61=480 +sizx61=800 +sizy61=600 maxfps61=0 initts61=0 -title62=Wildfire -path62=D:\Games\Wildfire\Wildfire.exe +title62=Tomb Raider II Gold (DEMO) +path62=D:\Games\Tomb Raider II Gold (Demo)\Tomb2.exe module62= opengllib62= ver62=0 -coord62=0 -flag62=-1476392958 -flagg62=1210122240 +coord62=2 +flag62=671088674 +flagg62=1224736784 flagh62=20 -flagi62=12 -tflag62=0 +flagi62=0 +tflag62=258 initx62=0 inity62=0 minx62=0 @@ -1448,17 +1448,17 @@ sizx62=800 sizy62=600 maxfps62=0 initts62=0 -title63=Worms Pinball -path63=D:\Games\Worms Pinball\WPIB.exe +title63=Tomb Raider III +path63=D:\Games\Tomb Raider III\tomb3.exe module63= opengllib63= ver63=0 coord63=2 -flag63=679477282 -flagg63=1744830480 +flag63=134217760 +flagg63=1241514000 flagh63=20 -flagi63=4 -tflag63=258 +flagi63=0 +tflag63=322 initx63=0 inity63=0 minx63=0 @@ -1471,16 +1471,16 @@ sizx63=800 sizy63=600 maxfps63=0 initts63=0 -title64=Zanzarah -path64=D:\Games\Zanzarah\System\zanthp.exe +title64=Total Annihilation Kingdoms +path64=D:\Games\Total Annihilation Kingdoms\Kingdoms.exe module64= opengllib64= -ver64=0 +ver64=7 coord64=0 -flag64=679477280 +flag64=134234146 flagg64=1207959552 flagh64=20 -flagi64=0 +flagi64=4 tflag64=0 initx64=0 inity64=0 @@ -1494,17 +1494,17 @@ sizx64=800 sizy64=600 maxfps64=0 initts64=0 -title65=Zax the Alien Hunter (DEMO) -path65=D:\Games\ZaxDemo\Zax.exe +title65=Virtua Fighter 2 (DEMO) +path65=D:\Games\vf2_demo\VF2DEMO.EXE module65= opengllib65= ver65=0 -coord65=2 -flag65=-2011168734 -flagg65=1209008144 +coord65=0 +flag65=939524131 +flagg65=1207959664 flagh65=20 flagi65=0 -tflag65=258 +tflag65=0 initx65=0 inity65=0 minx65=0 @@ -1517,17 +1517,17 @@ sizx65=800 sizy65=600 maxfps65=0 initts65=0 -title66=ZPC Zero Population Count -path66=D:\Games\ZPC\ZPC.EXE +title66=Virtua Fighter PC +path66=D:\Games\Virtua Fighter\VFPC.EXE module66= opengllib66= ver66=0 coord66=0 -flag66=134217762 -flagg66=1207959552 -flagh66=20 -flagi66=4 -tflag66=0 +flag66=402653218 +flagg66=1224736784 +flagh66=33562644 +flagi66=0 +tflag66=291 initx66=0 inity66=0 minx66=0 @@ -1540,8 +1540,445 @@ sizx66=800 sizy66=600 maxfps66=0 initts66=0 +title67=Warcraft 2 Battlenet Ed +path67=D:\Games\Warcraft 2 Battlenet Ed\Warcraft II BNE.exe +module67= +opengllib67= +ver67=0 +coord67=0 +flag67=134217762 +flagg67=1210122240 +flagh67=148 +flagi67=12 +tflag67=0 +initx67=0 +inity67=0 +minx67=0 +miny67=0 +maxx67=0 +maxy67=0 +posx67=50 +posy67=50 +sizx67=800 +sizy67=600 +maxfps67=0 +initts67=0 +title68=Wargasm +path68=D:\Games\Wargasm\tank.exe +module68= +opengllib68= +ver68=0 +coord68=2 +flag68=671088672 +flagg68=1207959696 +flagh68=65556 +flagi68=0 +tflag68=6163 +initx68=0 +inity68=0 +minx68=0 +miny68=0 +maxx68=0 +maxy68=0 +posx68=50 +posy68=50 +sizx68=800 +sizy68=600 +maxfps68=0 +initts68=0 +title69=Warlords Battlecry II (DEMO) +path69=D:\Games\Warlords Battlecry II Demo\Battlecry II Demo.exe +module69= +opengllib69= +ver69=0 +coord69=2 +flag69=134217762 +flagg69=1207959568 +flagh69=22 +flagi69=0 +tflag69=258 +initx69=0 +inity69=0 +minx69=0 +miny69=0 +maxx69=0 +maxy69=0 +posx69=50 +posy69=50 +sizx69=800 +sizy69=600 +maxfps69=0 +initts69=0 +title70=Whiteout +path70=D:\Games\Whiteout\Whiteout.exe +module70= +opengllib70= +ver70=0 +coord70=0 +flag70=402653217 +flagg70=1207959552 +flagh70=20 +flagi70=0 +tflag70=66 +initx70=0 +inity70=0 +minx70=0 +miny70=0 +maxx70=0 +maxy70=0 +posx70=50 +posy70=50 +sizx70=640 +sizy70=480 +maxfps70=0 +initts70=0 +title71=Wildfire +path71=D:\Games\Wildfire\Wildfire.exe +module71= +opengllib71= +ver71=0 +coord71=0 +flag71=-1476392958 +flagg71=1210122240 +flagh71=20 +flagi71=12 +tflag71=0 +initx71=0 +inity71=0 +minx71=0 +miny71=0 +maxx71=0 +maxy71=0 +posx71=50 +posy71=50 +sizx71=800 +sizy71=600 +maxfps71=0 +initts71=0 +title72=Worms Pinball +path72=D:\Games\Worms Pinball\WPIB.exe +module72= +opengllib72= +ver72=1 +coord72=0 +flag72=134217762 +flagg72=1207959568 +flagh72=20 +flagi72=4 +tflag72=0 +initx72=0 +inity72=0 +minx72=0 +miny72=0 +maxx72=0 +maxy72=0 +posx72=50 +posy72=50 +sizx72=800 +sizy72=600 +maxfps72=0 +initts72=0 +title73=Zanzarah +path73=D:\Games\Zanzarah\System\zanthp.exe +module73= +opengllib73= +ver73=0 +coord73=0 +flag73=679477280 +flagg73=1207959552 +flagh73=20 +flagi73=0 +tflag73=0 +initx73=0 +inity73=0 +minx73=0 +miny73=0 +maxx73=0 +maxy73=0 +posx73=50 +posy73=50 +sizx73=800 +sizy73=600 +maxfps73=0 +initts73=0 +title74=Zax the Alien Hunter (DEMO) +path74=D:\Games\ZaxDemo\Zax.exe +module74= +opengllib74= +ver74=0 +coord74=2 +flag74=-2011168734 +flagg74=1209008144 +flagh74=20 +flagi74=0 +tflag74=258 +initx74=0 +inity74=0 +minx74=0 +miny74=0 +maxx74=0 +maxy74=0 +posx74=50 +posy74=50 +sizx74=800 +sizy74=600 +maxfps74=0 +initts74=0 +title75=ZPC Zero Population Count +path75=D:\Games\ZPC\ZPC.EXE +module75= +opengllib75= +ver75=0 +coord75=0 +flag75=134217762 +flagg75=1207959552 +flagh75=20 +flagi75=4 +tflag75=0 +initx75=0 +inity75=0 +minx75=0 +miny75=0 +maxx75=0 +maxy75=0 +posx75=50 +posy75=50 +sizx75=800 +sizy75=600 +maxfps75=0 +initts75=0 +title76=Lost Valley +module76= +opengllib76= +path76=D:\Games\Lost Valley\lost valley\lost valley data.exe +ver76=0 +coord76=0 +flag76=142614562 +flagg76=1207959552 +flagh76=-2080374764 +flagi76=0 +tflag76=0 +initx76=0 +inity76=0 +minx76=0 +miny76=0 +maxx76=0 +maxy76=0 +posx76=50 +posy76=50 +sizx76=800 +sizy76=600 +maxfps76=0 +initts76=0 +title77=Grand Prix World +path77=D:\Games\Grand Prix World\gpwxp2.exe +module77= +opengllib77= +ver77=0 +coord77=0 +flag77=134217762 +flagg77=135266432 +flagh77=20 +flagi77=0 +tflag77=0 +initx77=0 +inity77=0 +minx77=0 +miny77=0 +maxx77=0 +maxy77=0 +posx77=50 +posy77=50 +sizx77=800 +sizy77=600 +maxfps77=0 +initts77=0 +title78=Premier Manager 98 +path78=D:\Games\Premier Manager 98\MANAGER.EXE +module78= +opengllib78= +ver78=0 +coord78=0 +flag78=671092770 +flagg78=1207959552 +flagh78=16 +flagi78=0 +tflag78=0 +initx78=0 +inity78=0 +minx78=0 +miny78=0 +maxx78=0 +maxy78=0 +posx78=50 +posy78=50 +sizx78=800 +sizy78=600 +maxfps78=0 +initts78=0 +title79=Fighting Force +path79=D:\Games\Fighting Force\game\fforce.exe +module79= +opengllib79= +ver79=0 +coord79=0 +flag79=134217824 +flagg79=1207959552 +flagh79=20 +flagi79=4 +tflag79=6163 +initx79=0 +inity79=0 +minx79=0 +miny79=0 +maxx79=0 +maxy79=0 +posx79=50 +posy79=50 +sizx79=800 +sizy79=600 +maxfps79=0 +initts79=0 +title80=The Bard's Tale (GOG) +path80=D:\Games\The Bard's Tale\The Bard's Tale - Copia.exe +module80= +opengllib80= +ver80=9 +coord80=0 +flag80=679485472 +flagg80=138412032 +flagh80=20 +flagi80=1024 +tflag80=6163 +initx80=0 +inity80=0 +minx80=0 +miny80=0 +maxx80=0 +maxy80=0 +posx80=50 +posy80=50 +sizx80=800 +sizy80=600 +maxfps80=0 +initts80=0 +title81=Need for Speed Underground 2 +path81=D:\Games\Need for Speed Underground 2\SPEED2.EXE +module81= +opengllib81= +ver81=9 +coord81=0 +flag81=134217762 +flagg81=1207959552 +flagh81=20 +flagi81=4 +tflag81=0 +initx81=0 +inity81=0 +minx81=0 +miny81=0 +maxx81=0 +maxy81=0 +posx81=50 +posy81=50 +sizx81=800 +sizy81=600 +maxfps81=0 +initts81=0 +title82=Need For Speed Underground +path82=D:\Games\Need For Speed Underground\speed.exe +module82= +opengllib82= +ver82=9 +coord82=0 +flag82=134217762 +flagg82=1207959552 +flagh82=20 +flagi82=1028 +tflag82=0 +initx82=0 +inity82=0 +minx82=0 +miny82=0 +maxx82=0 +maxy82=0 +posx82=50 +posy82=50 +sizx82=800 +sizy82=600 +maxfps82=0 +initts82=0 +title83=Need for Speed 2SE (3dfx) +path83=D:\Games\Need for Speed 2SE\nfs2sea.exe +module83= +opengllib83= +ver83=0 +coord83=0 +flag83=134217760 +flagg83=1207959552 +flagh83=20 +flagi83=4 +tflag83=6147 +initx83=0 +inity83=0 +minx83=0 +miny83=0 +maxx83=0 +maxy83=0 +posx83=50 +posy83=50 +sizx83=800 +sizy83=600 +maxfps83=0 +initts83=0 +title84=Need for Speed 2SE +path84=D:\Games\Need for Speed 2SE\NFS2SEN.EXE +module84= +opengllib84= +ver84=0 +coord84=0 +flag84=134217826 +flagg84=1480589312 +flagh84=20 +flagi84=4 +tflag84=6163 +initx84=0 +inity84=0 +minx84=0 +miny84=0 +maxx84=0 +maxy84=0 +posx84=50 +posy84=50 +sizx84=800 +sizy84=600 +maxfps84=0 +initts84=0 +title85=Need for Speed 3 +path85=D:\Games\Need for Speed 3\nfs3.exe +module85= +opengllib85= +ver85=1 +coord85=0 +flag85=134217762 +flagg85=1207959552 +flagh85=20 +flagi85=4 +tflag85=0 +initx85=0 +inity85=0 +minx85=0 +miny85=0 +maxx85=0 +maxy85=0 +posx85=50 +posy85=50 +sizx85=800 +sizy85=600 +maxfps85=0 +initts85=0 [window] -posx=953 -posy=245 +posx=1162 +posy=187 sizx=638 -sizy=670 +sizy=673 diff --git a/build/dxwnd_manual.pdf b/build/dxwnd_manual.pdf deleted file mode 100644 index e9a606b1c54b77a96dad0cce1df0bb97186030aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332899 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�@&#mreQ- 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 x$I`xL;{TnvYYFaihfeBa52I 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 0x0900) + + +/* This identifier is passed to Direct3DCreate9 in order to ensure that an + * application was built against the correct header files. This number is + * incremented whenever a header (or other) change would require applications + * to be rebuilt. If the version doesn't match, Direct3DCreate9 will fail. + * (The number itself has no meaning.)*/ + +#define D3D_SDK_VERSION 31 + + +#include + +#define COM_NO_WINDOWS_H +#include + +#include + +#if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500) + #define HMONITOR_DECLARED + DECLARE_HANDLE(HMONITOR); +#endif + +#define D3DAPI WINAPI + +/* + * Interface IID's + */ +#if defined( _WIN32 ) && !defined( _NO_COM) + +/* IID_IDirect3D9 */ +/* {81BDCBCA-64D4-426d-AE8D-AD0147F4275C} */ +DEFINE_GUID(IID_IDirect3D9, 0x81bdcbca, 0x64d4, 0x426d, 0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c); + +/* IID_IDirect3DDevice9 */ +// {D0223B96-BF7A-43fd-92BD-A43B0D82B9EB} */ +DEFINE_GUID(IID_IDirect3DDevice9, 0xd0223b96, 0xbf7a, 0x43fd, 0x92, 0xbd, 0xa4, 0x3b, 0xd, 0x82, 0xb9, 0xeb); + +/* IID_IDirect3DResource9 */ +// {05EEC05D-8F7D-4362-B999-D1BAF357C704} +DEFINE_GUID(IID_IDirect3DResource9, 0x5eec05d, 0x8f7d, 0x4362, 0xb9, 0x99, 0xd1, 0xba, 0xf3, 0x57, 0xc7, 0x4); + +/* IID_IDirect3DBaseTexture9 */ +/* {580CA87E-1D3C-4d54-991D-B7D3E3C298CE} */ +DEFINE_GUID(IID_IDirect3DBaseTexture9, 0x580ca87e, 0x1d3c, 0x4d54, 0x99, 0x1d, 0xb7, 0xd3, 0xe3, 0xc2, 0x98, 0xce); + +/* IID_IDirect3DTexture9 */ +/* {85C31227-3DE5-4f00-9B3A-F11AC38C18B5} */ +DEFINE_GUID(IID_IDirect3DTexture9, 0x85c31227, 0x3de5, 0x4f00, 0x9b, 0x3a, 0xf1, 0x1a, 0xc3, 0x8c, 0x18, 0xb5); + +/* IID_IDirect3DCubeTexture9 */ +/* {FFF32F81-D953-473a-9223-93D652ABA93F} */ +DEFINE_GUID(IID_IDirect3DCubeTexture9, 0xfff32f81, 0xd953, 0x473a, 0x92, 0x23, 0x93, 0xd6, 0x52, 0xab, 0xa9, 0x3f); + +/* IID_IDirect3DVolumeTexture9 */ +/* {2518526C-E789-4111-A7B9-47EF328D13E6} */ +DEFINE_GUID(IID_IDirect3DVolumeTexture9, 0x2518526c, 0xe789, 0x4111, 0xa7, 0xb9, 0x47, 0xef, 0x32, 0x8d, 0x13, 0xe6); + +/* IID_IDirect3DVertexBuffer9 */ +/* {B64BB1B5-FD70-4df6-BF91-19D0A12455E3} */ +DEFINE_GUID(IID_IDirect3DVertexBuffer9, 0xb64bb1b5, 0xfd70, 0x4df6, 0xbf, 0x91, 0x19, 0xd0, 0xa1, 0x24, 0x55, 0xe3); + +/* IID_IDirect3DIndexBuffer9 */ +/* {7C9DD65E-D3F7-4529-ACEE-785830ACDE35} */ +DEFINE_GUID(IID_IDirect3DIndexBuffer9, 0x7c9dd65e, 0xd3f7, 0x4529, 0xac, 0xee, 0x78, 0x58, 0x30, 0xac, 0xde, 0x35); + +/* IID_IDirect3DSurface9 */ +/* {0CFBAF3A-9FF6-429a-99B3-A2796AF8B89B} */ +DEFINE_GUID(IID_IDirect3DSurface9, 0xcfbaf3a, 0x9ff6, 0x429a, 0x99, 0xb3, 0xa2, 0x79, 0x6a, 0xf8, 0xb8, 0x9b); + +/* IID_IDirect3DVolume9 */ +/* {24F416E6-1F67-4aa7-B88E-D33F6F3128A1} */ +DEFINE_GUID(IID_IDirect3DVolume9, 0x24f416e6, 0x1f67, 0x4aa7, 0xb8, 0x8e, 0xd3, 0x3f, 0x6f, 0x31, 0x28, 0xa1); + +/* IID_IDirect3DSwapChain9 */ +/* {794950F2-ADFC-458a-905E-10A10B0B503B} */ +DEFINE_GUID(IID_IDirect3DSwapChain9, 0x794950f2, 0xadfc, 0x458a, 0x90, 0x5e, 0x10, 0xa1, 0xb, 0xb, 0x50, 0x3b); + +/* IID_IDirect3DVertexDeclaration9 */ +/* {DD13C59C-36FA-4098-A8FB-C7ED39DC8546} */ +DEFINE_GUID(IID_IDirect3DVertexDeclaration9, 0xdd13c59c, 0x36fa, 0x4098, 0xa8, 0xfb, 0xc7, 0xed, 0x39, 0xdc, 0x85, 0x46); + +/* IID_IDirect3DVertexShader9 */ +/* {EFC5557E-6265-4613-8A94-43857889EB36} */ +DEFINE_GUID(IID_IDirect3DVertexShader9, 0xefc5557e, 0x6265, 0x4613, 0x8a, 0x94, 0x43, 0x85, 0x78, 0x89, 0xeb, 0x36); + +/* IID_IDirect3DPixelShader9 */ +/* {6D3BDBDC-5B02-4415-B852-CE5E8BCCB289} */ +DEFINE_GUID(IID_IDirect3DPixelShader9, 0x6d3bdbdc, 0x5b02, 0x4415, 0xb8, 0x52, 0xce, 0x5e, 0x8b, 0xcc, 0xb2, 0x89); + +/* IID_IDirect3DStateBlock9 */ +/* {B07C4FE5-310D-4ba8-A23C-4F0F206F218B} */ +DEFINE_GUID(IID_IDirect3DStateBlock9, 0xb07c4fe5, 0x310d, 0x4ba8, 0xa2, 0x3c, 0x4f, 0xf, 0x20, 0x6f, 0x21, 0x8b); + +/* IID_IDirect3DQuery9 */ +/* {d9771460-a695-4f26-bbd3-27b840b541cc} */ +DEFINE_GUID(IID_IDirect3DQuery9, 0xd9771460, 0xa695, 0x4f26, 0xbb, 0xd3, 0x27, 0xb8, 0x40, 0xb5, 0x41, 0xcc); + + +#endif + +#ifdef __cplusplus + +#ifndef DECLSPEC_UUID +#if _MSC_VER >= 1100 +#define DECLSPEC_UUID(x) __declspec(uuid(x)) +#else +#define DECLSPEC_UUID(x) +#endif +#endif + +interface DECLSPEC_UUID("81BDCBCA-64D4-426d-AE8D-AD0147F4275C") IDirect3D9; +interface DECLSPEC_UUID("D0223B96-BF7A-43fd-92BD-A43B0D82B9EB") IDirect3DDevice9; + +interface DECLSPEC_UUID("B07C4FE5-310D-4ba8-A23C-4F0F206F218B") IDirect3DStateBlock9; +interface DECLSPEC_UUID("05EEC05D-8F7D-4362-B999-D1BAF357C704") IDirect3DResource9; +interface DECLSPEC_UUID("DD13C59C-36FA-4098-A8FB-C7ED39DC8546") IDirect3DVertexDeclaration9; +interface DECLSPEC_UUID("EFC5557E-6265-4613-8A94-43857889EB36") IDirect3DVertexShader9; +interface DECLSPEC_UUID("6D3BDBDC-5B02-4415-B852-CE5E8BCCB289") IDirect3DPixelShader9; +interface DECLSPEC_UUID("580CA87E-1D3C-4d54-991D-B7D3E3C298CE") IDirect3DBaseTexture9; +interface DECLSPEC_UUID("85C31227-3DE5-4f00-9B3A-F11AC38C18B5") IDirect3DTexture9; +interface DECLSPEC_UUID("2518526C-E789-4111-A7B9-47EF328D13E6") IDirect3DVolumeTexture9; +interface DECLSPEC_UUID("FFF32F81-D953-473a-9223-93D652ABA93F") IDirect3DCubeTexture9; + +interface DECLSPEC_UUID("B64BB1B5-FD70-4df6-BF91-19D0A12455E3") IDirect3DVertexBuffer9; +interface DECLSPEC_UUID("7C9DD65E-D3F7-4529-ACEE-785830ACDE35") IDirect3DIndexBuffer9; + +interface DECLSPEC_UUID("0CFBAF3A-9FF6-429a-99B3-A2796AF8B89B") IDirect3DSurface9; +interface DECLSPEC_UUID("24F416E6-1F67-4aa7-B88E-D33F6F3128A1") IDirect3DVolume9; + +interface DECLSPEC_UUID("794950F2-ADFC-458a-905E-10A10B0B503B") IDirect3DSwapChain9; +interface DECLSPEC_UUID("d9771460-a695-4f26-bbd3-27b840b541cc") IDirect3DQuery9; + + +#if defined(_COM_SMARTPTR_TYPEDEF) +_COM_SMARTPTR_TYPEDEF(IDirect3D9, __uuidof(IDirect3D9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DDevice9, __uuidof(IDirect3DDevice9)); + +_COM_SMARTPTR_TYPEDEF(IDirect3DStateBlock9, __uuidof(IDirect3DStateBlock9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DResource9, __uuidof(IDirect3DResource9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DVertexDeclaration9, __uuidof(IDirect3DVertexDeclaration9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DVertexShader9, __uuidof(IDirect3DVertexShader9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DPixelShader9, __uuidof(IDirect3DPixelShader9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DBaseTexture9, __uuidof(IDirect3DBaseTexture9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DTexture9, __uuidof(IDirect3DTexture9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DVolumeTexture9, __uuidof(IDirect3DVolumeTexture9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DCubeTexture9, __uuidof(IDirect3DCubeTexture9)); + +_COM_SMARTPTR_TYPEDEF(IDirect3DVertexBuffer9, __uuidof(IDirect3DVertexBuffer9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DIndexBuffer9, __uuidof(IDirect3DIndexBuffer9)); + +_COM_SMARTPTR_TYPEDEF(IDirect3DSurface9, __uuidof(IDirect3DSurface9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DVolume9, __uuidof(IDirect3DVolume9)); + +_COM_SMARTPTR_TYPEDEF(IDirect3DSwapChain9, __uuidof(IDirect3DSwapChain9)); +_COM_SMARTPTR_TYPEDEF(IDirect3DQuery9, __uuidof(IDirect3DQuery9)); + +#endif +#endif + + +typedef interface IDirect3D9 IDirect3D9; +typedef interface IDirect3DDevice9 IDirect3DDevice9; +typedef interface IDirect3DStateBlock9 IDirect3DStateBlock9; +typedef interface IDirect3DVertexDeclaration9 IDirect3DVertexDeclaration9; +typedef interface IDirect3DVertexShader9 IDirect3DVertexShader9; +typedef interface IDirect3DPixelShader9 IDirect3DPixelShader9; +typedef interface IDirect3DResource9 IDirect3DResource9; +typedef interface IDirect3DBaseTexture9 IDirect3DBaseTexture9; +typedef interface IDirect3DTexture9 IDirect3DTexture9; +typedef interface IDirect3DVolumeTexture9 IDirect3DVolumeTexture9; +typedef interface IDirect3DCubeTexture9 IDirect3DCubeTexture9; +typedef interface IDirect3DVertexBuffer9 IDirect3DVertexBuffer9; +typedef interface IDirect3DIndexBuffer9 IDirect3DIndexBuffer9; +typedef interface IDirect3DSurface9 IDirect3DSurface9; +typedef interface IDirect3DVolume9 IDirect3DVolume9; +typedef interface IDirect3DSwapChain9 IDirect3DSwapChain9; +typedef interface IDirect3DQuery9 IDirect3DQuery9; + + +#include "d3d9types.h" +#include "d3d9caps.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * DLL Function for creating a Direct3D9 object. This object supports + * enumeration and allows the creation of Direct3DDevice9 objects. + * Pass the value of the constant D3D_SDK_VERSION to this function, so + * that the run-time can validate that your application was compiled + * against the right headers. + */ + +IDirect3D9 * WINAPI Direct3DCreate9(UINT SDKVersion); + + +/* + * Direct3D interfaces + */ + + + + + +#undef INTERFACE +#define INTERFACE IDirect3D9 + +DECLARE_INTERFACE_(IDirect3D9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3D9 methods ***/ + STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE; + STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE; + STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) PURE; + STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter,D3DFORMAT Format) PURE; + STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) PURE; + STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE; + STDMETHOD(CheckDeviceType)(THIS_ UINT iAdapter,D3DDEVTYPE DevType,D3DFORMAT DisplayFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) PURE; + STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE; + STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) PURE; + STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE; + STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) PURE; + STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) PURE; + STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE; + STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE; +}; + +typedef struct IDirect3D9 *LPDIRECT3D9, *PDIRECT3D9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3D9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3D9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3D9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3D9_RegisterSoftwareDevice(p,a) (p)->lpVtbl->RegisterSoftwareDevice(p,a) +#define IDirect3D9_GetAdapterCount(p) (p)->lpVtbl->GetAdapterCount(p) +#define IDirect3D9_GetAdapterIdentifier(p,a,b,c) (p)->lpVtbl->GetAdapterIdentifier(p,a,b,c) +#define IDirect3D9_GetAdapterModeCount(p,a,b) (p)->lpVtbl->GetAdapterModeCount(p,a,b) +#define IDirect3D9_EnumAdapterModes(p,a,b,c,d) (p)->lpVtbl->EnumAdapterModes(p,a,b,c,d) +#define IDirect3D9_GetAdapterDisplayMode(p,a,b) (p)->lpVtbl->GetAdapterDisplayMode(p,a,b) +#define IDirect3D9_CheckDeviceType(p,a,b,c,d,e) (p)->lpVtbl->CheckDeviceType(p,a,b,c,d,e) +#define IDirect3D9_CheckDeviceFormat(p,a,b,c,d,e,f) (p)->lpVtbl->CheckDeviceFormat(p,a,b,c,d,e,f) +#define IDirect3D9_CheckDeviceMultiSampleType(p,a,b,c,d,e,f) (p)->lpVtbl->CheckDeviceMultiSampleType(p,a,b,c,d,e,f) +#define IDirect3D9_CheckDepthStencilMatch(p,a,b,c,d,e) (p)->lpVtbl->CheckDepthStencilMatch(p,a,b,c,d,e) +#define IDirect3D9_CheckDeviceFormatConversion(p,a,b,c,d) (p)->lpVtbl->CheckDeviceFormatConversion(p,a,b,c,d) +#define IDirect3D9_GetDeviceCaps(p,a,b,c) (p)->lpVtbl->GetDeviceCaps(p,a,b,c) +#define IDirect3D9_GetAdapterMonitor(p,a) (p)->lpVtbl->GetAdapterMonitor(p,a) +#define IDirect3D9_CreateDevice(p,a,b,c,d,e,f) (p)->lpVtbl->CreateDevice(p,a,b,c,d,e,f) +#else +#define IDirect3D9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3D9_AddRef(p) (p)->AddRef() +#define IDirect3D9_Release(p) (p)->Release() +#define IDirect3D9_RegisterSoftwareDevice(p,a) (p)->RegisterSoftwareDevice(a) +#define IDirect3D9_GetAdapterCount(p) (p)->GetAdapterCount() +#define IDirect3D9_GetAdapterIdentifier(p,a,b,c) (p)->GetAdapterIdentifier(a,b,c) +#define IDirect3D9_GetAdapterModeCount(p,a,b) (p)->GetAdapterModeCount(a,b) +#define IDirect3D9_EnumAdapterModes(p,a,b,c,d) (p)->EnumAdapterModes(a,b,c,d) +#define IDirect3D9_GetAdapterDisplayMode(p,a,b) (p)->GetAdapterDisplayMode(a,b) +#define IDirect3D9_CheckDeviceType(p,a,b,c,d,e) (p)->CheckDeviceType(a,b,c,d,e) +#define IDirect3D9_CheckDeviceFormat(p,a,b,c,d,e,f) (p)->CheckDeviceFormat(a,b,c,d,e,f) +#define IDirect3D9_CheckDeviceMultiSampleType(p,a,b,c,d,e,f) (p)->CheckDeviceMultiSampleType(a,b,c,d,e,f) +#define IDirect3D9_CheckDepthStencilMatch(p,a,b,c,d,e) (p)->CheckDepthStencilMatch(a,b,c,d,e) +#define IDirect3D9_CheckDeviceFormatConversion(p,a,b,c,d) (p)->CheckDeviceFormatConversion(a,b,c,d) +#define IDirect3D9_GetDeviceCaps(p,a,b,c) (p)->GetDeviceCaps(a,b,c) +#define IDirect3D9_GetAdapterMonitor(p,a) (p)->GetAdapterMonitor(a) +#define IDirect3D9_CreateDevice(p,a,b,c,d,e,f) (p)->CreateDevice(a,b,c,d,e,f) +#endif + + + + + + + +/* SwapChain */ + + + + + + + + + + + + + + + +#undef INTERFACE +#define INTERFACE IDirect3DDevice9 + +DECLARE_INTERFACE_(IDirect3DDevice9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DDevice9 methods ***/ + STDMETHOD(TestCooperativeLevel)(THIS) PURE; + STDMETHOD_(UINT, GetAvailableTextureMem)(THIS) PURE; + STDMETHOD(EvictManagedResources)(THIS) PURE; + STDMETHOD(GetDirect3D)(THIS_ IDirect3D9** ppD3D9) PURE; + STDMETHOD(GetDeviceCaps)(THIS_ D3DCAPS9* pCaps) PURE; + STDMETHOD(GetDisplayMode)(THIS_ UINT iSwapChain,D3DDISPLAYMODE* pMode) PURE; + STDMETHOD(GetCreationParameters)(THIS_ D3DDEVICE_CREATION_PARAMETERS *pParameters) PURE; + STDMETHOD(SetCursorProperties)(THIS_ UINT XHotSpot,UINT YHotSpot,IDirect3DSurface9* pCursorBitmap) PURE; + STDMETHOD_(void, SetCursorPosition)(THIS_ int X,int Y,DWORD Flags) PURE; + STDMETHOD_(BOOL, ShowCursor)(THIS_ BOOL bShow) PURE; + STDMETHOD(CreateAdditionalSwapChain)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DSwapChain9** pSwapChain) PURE; + STDMETHOD(GetSwapChain)(THIS_ UINT iSwapChain,IDirect3DSwapChain9** pSwapChain) PURE; + STDMETHOD_(UINT, GetNumberOfSwapChains)(THIS) PURE; + STDMETHOD(Reset)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters) PURE; + STDMETHOD(Present)(THIS_ CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) PURE; + STDMETHOD(GetBackBuffer)(THIS_ UINT iSwapChain,UINT iBackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface9** ppBackBuffer) PURE; + STDMETHOD(GetRasterStatus)(THIS_ UINT iSwapChain,D3DRASTER_STATUS* pRasterStatus) PURE; + STDMETHOD(SetDialogBoxMode)(THIS_ BOOL bEnableDialogs) PURE; + STDMETHOD_(void, SetGammaRamp)(THIS_ UINT iSwapChain,DWORD Flags,CONST D3DGAMMARAMP* pRamp) PURE; + STDMETHOD_(void, GetGammaRamp)(THIS_ UINT iSwapChain,D3DGAMMARAMP* pRamp) PURE; + STDMETHOD(CreateTexture)(THIS_ UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture9** ppTexture,HANDLE* pSharedHandle) PURE; + STDMETHOD(CreateVolumeTexture)(THIS_ UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture9** ppVolumeTexture,HANDLE* pSharedHandle) PURE; + STDMETHOD(CreateCubeTexture)(THIS_ UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture9** ppCubeTexture,HANDLE* pSharedHandle) PURE; + STDMETHOD(CreateVertexBuffer)(THIS_ UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer9** ppVertexBuffer,HANDLE* pSharedHandle) PURE; + STDMETHOD(CreateIndexBuffer)(THIS_ UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer9** ppIndexBuffer,HANDLE* pSharedHandle) PURE; + STDMETHOD(CreateRenderTarget)(THIS_ UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle) PURE; + STDMETHOD(CreateDepthStencilSurface)(THIS_ UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle) PURE; + STDMETHOD(UpdateSurface)(THIS_ IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestinationSurface,CONST POINT* pDestPoint) PURE; + STDMETHOD(UpdateTexture)(THIS_ IDirect3DBaseTexture9* pSourceTexture,IDirect3DBaseTexture9* pDestinationTexture) PURE; + STDMETHOD(GetRenderTargetData)(THIS_ IDirect3DSurface9* pRenderTarget,IDirect3DSurface9* pDestSurface) PURE; + STDMETHOD(GetFrontBufferData)(THIS_ UINT iSwapChain,IDirect3DSurface9* pDestSurface) PURE; + STDMETHOD(StretchRect)(THIS_ IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestSurface,CONST RECT* pDestRect,D3DTEXTUREFILTERTYPE Filter) PURE; + STDMETHOD(ColorFill)(THIS_ IDirect3DSurface9* pSurface,CONST RECT* pRect,D3DCOLOR color) PURE; + STDMETHOD(CreateOffscreenPlainSurface)(THIS_ UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle) PURE; + STDMETHOD(SetRenderTarget)(THIS_ DWORD RenderTargetIndex,IDirect3DSurface9* pRenderTarget) PURE; + STDMETHOD(GetRenderTarget)(THIS_ DWORD RenderTargetIndex,IDirect3DSurface9** ppRenderTarget) PURE; + STDMETHOD(SetDepthStencilSurface)(THIS_ IDirect3DSurface9* pNewZStencil) PURE; + STDMETHOD(GetDepthStencilSurface)(THIS_ IDirect3DSurface9** ppZStencilSurface) PURE; + STDMETHOD(BeginScene)(THIS) PURE; + STDMETHOD(EndScene)(THIS) PURE; + STDMETHOD(Clear)(THIS_ DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil) PURE; + STDMETHOD(SetTransform)(THIS_ D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix) PURE; + STDMETHOD(GetTransform)(THIS_ D3DTRANSFORMSTATETYPE State,D3DMATRIX* pMatrix) PURE; + STDMETHOD(MultiplyTransform)(THIS_ D3DTRANSFORMSTATETYPE,CONST D3DMATRIX*) PURE; + STDMETHOD(SetViewport)(THIS_ CONST D3DVIEWPORT9* pViewport) PURE; + STDMETHOD(GetViewport)(THIS_ D3DVIEWPORT9* pViewport) PURE; + STDMETHOD(SetMaterial)(THIS_ CONST D3DMATERIAL9* pMaterial) PURE; + STDMETHOD(GetMaterial)(THIS_ D3DMATERIAL9* pMaterial) PURE; + STDMETHOD(SetLight)(THIS_ DWORD Index,CONST D3DLIGHT9*) PURE; + STDMETHOD(GetLight)(THIS_ DWORD Index,D3DLIGHT9*) PURE; + STDMETHOD(LightEnable)(THIS_ DWORD Index,BOOL Enable) PURE; + STDMETHOD(GetLightEnable)(THIS_ DWORD Index,BOOL* pEnable) PURE; + STDMETHOD(SetClipPlane)(THIS_ DWORD Index,CONST float* pPlane) PURE; + STDMETHOD(GetClipPlane)(THIS_ DWORD Index,float* pPlane) PURE; + STDMETHOD(SetRenderState)(THIS_ D3DRENDERSTATETYPE State,DWORD Value) PURE; + STDMETHOD(GetRenderState)(THIS_ D3DRENDERSTATETYPE State,DWORD* pValue) PURE; + STDMETHOD(CreateStateBlock)(THIS_ D3DSTATEBLOCKTYPE Type,IDirect3DStateBlock9** ppSB) PURE; + STDMETHOD(BeginStateBlock)(THIS) PURE; + STDMETHOD(EndStateBlock)(THIS_ IDirect3DStateBlock9** ppSB) PURE; + STDMETHOD(SetClipStatus)(THIS_ CONST D3DCLIPSTATUS9* pClipStatus) PURE; + STDMETHOD(GetClipStatus)(THIS_ D3DCLIPSTATUS9* pClipStatus) PURE; + STDMETHOD(GetTexture)(THIS_ DWORD Stage,IDirect3DBaseTexture9** ppTexture) PURE; + STDMETHOD(SetTexture)(THIS_ DWORD Stage,IDirect3DBaseTexture9* pTexture) PURE; + STDMETHOD(GetTextureStageState)(THIS_ DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue) PURE; + STDMETHOD(SetTextureStageState)(THIS_ DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value) PURE; + STDMETHOD(GetSamplerState)(THIS_ DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD* pValue) PURE; + STDMETHOD(SetSamplerState)(THIS_ DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value) PURE; + STDMETHOD(ValidateDevice)(THIS_ DWORD* pNumPasses) PURE; + STDMETHOD(SetPaletteEntries)(THIS_ UINT PaletteNumber,CONST PALETTEENTRY* pEntries) PURE; + STDMETHOD(GetPaletteEntries)(THIS_ UINT PaletteNumber,PALETTEENTRY* pEntries) PURE; + STDMETHOD(SetCurrentTexturePalette)(THIS_ UINT PaletteNumber) PURE; + STDMETHOD(GetCurrentTexturePalette)(THIS_ UINT *PaletteNumber) PURE; + STDMETHOD(SetScissorRect)(THIS_ CONST RECT* pRect) PURE; + STDMETHOD(GetScissorRect)(THIS_ RECT* pRect) PURE; + STDMETHOD(SetSoftwareVertexProcessing)(THIS_ BOOL bSoftware) PURE; + STDMETHOD_(BOOL, GetSoftwareVertexProcessing)(THIS) PURE; + STDMETHOD(SetNPatchMode)(THIS_ float nSegments) PURE; + STDMETHOD_(float, GetNPatchMode)(THIS) PURE; + STDMETHOD(DrawPrimitive)(THIS_ D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount) PURE; + STDMETHOD(DrawIndexedPrimitive)(THIS_ D3DPRIMITIVETYPE,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount) PURE; + STDMETHOD(DrawPrimitiveUP)(THIS_ D3DPRIMITIVETYPE PrimitiveType,UINT PrimitiveCount,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) PURE; + STDMETHOD(DrawIndexedPrimitiveUP)(THIS_ D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) PURE; + STDMETHOD(ProcessVertices)(THIS_ UINT SrcStartIndex,UINT DestIndex,UINT VertexCount,IDirect3DVertexBuffer9* pDestBuffer,IDirect3DVertexDeclaration9* pVertexDecl,DWORD Flags) PURE; + STDMETHOD(CreateVertexDeclaration)(THIS_ CONST D3DVERTEXELEMENT9* pVertexElements,IDirect3DVertexDeclaration9** ppDecl) PURE; + STDMETHOD(SetVertexDeclaration)(THIS_ IDirect3DVertexDeclaration9* pDecl) PURE; + STDMETHOD(GetVertexDeclaration)(THIS_ IDirect3DVertexDeclaration9** ppDecl) PURE; + STDMETHOD(SetFVF)(THIS_ DWORD FVF) PURE; + STDMETHOD(GetFVF)(THIS_ DWORD* pFVF) PURE; + STDMETHOD(CreateVertexShader)(THIS_ CONST DWORD* pFunction,IDirect3DVertexShader9** ppShader) PURE; + STDMETHOD(SetVertexShader)(THIS_ IDirect3DVertexShader9* pShader) PURE; + STDMETHOD(GetVertexShader)(THIS_ IDirect3DVertexShader9** ppShader) PURE; + STDMETHOD(SetVertexShaderConstantF)(THIS_ UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount) PURE; + STDMETHOD(GetVertexShaderConstantF)(THIS_ UINT StartRegister,float* pConstantData,UINT Vector4fCount) PURE; + STDMETHOD(SetVertexShaderConstantI)(THIS_ UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount) PURE; + STDMETHOD(GetVertexShaderConstantI)(THIS_ UINT StartRegister,int* pConstantData,UINT Vector4iCount) PURE; + STDMETHOD(SetVertexShaderConstantB)(THIS_ UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount) PURE; + STDMETHOD(GetVertexShaderConstantB)(THIS_ UINT StartRegister,BOOL* pConstantData,UINT BoolCount) PURE; + STDMETHOD(SetStreamSource)(THIS_ UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride) PURE; + STDMETHOD(GetStreamSource)(THIS_ UINT StreamNumber,IDirect3DVertexBuffer9** ppStreamData,UINT* OffsetInBytes,UINT* pStride) PURE; + STDMETHOD(SetStreamSourceFreq)(THIS_ UINT StreamNumber,UINT Divider) PURE; + STDMETHOD(GetStreamSourceFreq)(THIS_ UINT StreamNumber,UINT* Divider) PURE; + STDMETHOD(SetIndices)(THIS_ IDirect3DIndexBuffer9* pIndexData) PURE; + STDMETHOD(GetIndices)(THIS_ IDirect3DIndexBuffer9** ppIndexData) PURE; + STDMETHOD(CreatePixelShader)(THIS_ CONST DWORD* pFunction,IDirect3DPixelShader9** ppShader) PURE; + STDMETHOD(SetPixelShader)(THIS_ IDirect3DPixelShader9* pShader) PURE; + STDMETHOD(GetPixelShader)(THIS_ IDirect3DPixelShader9** ppShader) PURE; + STDMETHOD(SetPixelShaderConstantF)(THIS_ UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount) PURE; + STDMETHOD(GetPixelShaderConstantF)(THIS_ UINT StartRegister,float* pConstantData,UINT Vector4fCount) PURE; + STDMETHOD(SetPixelShaderConstantI)(THIS_ UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount) PURE; + STDMETHOD(GetPixelShaderConstantI)(THIS_ UINT StartRegister,int* pConstantData,UINT Vector4iCount) PURE; + STDMETHOD(SetPixelShaderConstantB)(THIS_ UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount) PURE; + STDMETHOD(GetPixelShaderConstantB)(THIS_ UINT StartRegister,BOOL* pConstantData,UINT BoolCount) PURE; + STDMETHOD(DrawRectPatch)(THIS_ UINT Handle,CONST float* pNumSegs,CONST D3DRECTPATCH_INFO* pRectPatchInfo) PURE; + STDMETHOD(DrawTriPatch)(THIS_ UINT Handle,CONST float* pNumSegs,CONST D3DTRIPATCH_INFO* pTriPatchInfo) PURE; + STDMETHOD(DeletePatch)(THIS_ UINT Handle) PURE; + STDMETHOD(CreateQuery)(THIS_ D3DQUERYTYPE Type,IDirect3DQuery9** ppQuery) PURE; +}; + +typedef struct IDirect3DDevice9 *LPDIRECT3DDEVICE9, *PDIRECT3DDEVICE9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DDevice9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DDevice9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DDevice9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DDevice9_TestCooperativeLevel(p) (p)->lpVtbl->TestCooperativeLevel(p) +#define IDirect3DDevice9_GetAvailableTextureMem(p) (p)->lpVtbl->GetAvailableTextureMem(p) +#define IDirect3DDevice9_EvictManagedResources(p) (p)->lpVtbl->EvictManagedResources(p) +#define IDirect3DDevice9_GetDirect3D(p,a) (p)->lpVtbl->GetDirect3D(p,a) +#define IDirect3DDevice9_GetDeviceCaps(p,a) (p)->lpVtbl->GetDeviceCaps(p,a) +#define IDirect3DDevice9_GetDisplayMode(p,a,b) (p)->lpVtbl->GetDisplayMode(p,a,b) +#define IDirect3DDevice9_GetCreationParameters(p,a) (p)->lpVtbl->GetCreationParameters(p,a) +#define IDirect3DDevice9_SetCursorProperties(p,a,b,c) (p)->lpVtbl->SetCursorProperties(p,a,b,c) +#define IDirect3DDevice9_SetCursorPosition(p,a,b,c) (p)->lpVtbl->SetCursorPosition(p,a,b,c) +#define IDirect3DDevice9_ShowCursor(p,a) (p)->lpVtbl->ShowCursor(p,a) +#define IDirect3DDevice9_CreateAdditionalSwapChain(p,a,b) (p)->lpVtbl->CreateAdditionalSwapChain(p,a,b) +#define IDirect3DDevice9_GetSwapChain(p,a,b) (p)->lpVtbl->GetSwapChain(p,a,b) +#define IDirect3DDevice9_GetNumberOfSwapChains(p) (p)->lpVtbl->GetNumberOfSwapChains(p) +#define IDirect3DDevice9_Reset(p,a) (p)->lpVtbl->Reset(p,a) +#define IDirect3DDevice9_Present(p,a,b,c,d) (p)->lpVtbl->Present(p,a,b,c,d) +#define IDirect3DDevice9_GetBackBuffer(p,a,b,c,d) (p)->lpVtbl->GetBackBuffer(p,a,b,c,d) +#define IDirect3DDevice9_GetRasterStatus(p,a,b) (p)->lpVtbl->GetRasterStatus(p,a,b) +#define IDirect3DDevice9_SetDialogBoxMode(p,a) (p)->lpVtbl->SetDialogBoxMode(p,a) +#define IDirect3DDevice9_SetGammaRamp(p,a,b,c) (p)->lpVtbl->SetGammaRamp(p,a,b,c) +#define IDirect3DDevice9_GetGammaRamp(p,a,b) (p)->lpVtbl->GetGammaRamp(p,a,b) +#define IDirect3DDevice9_CreateTexture(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->CreateTexture(p,a,b,c,d,e,f,g,h) +#define IDirect3DDevice9_CreateVolumeTexture(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->CreateVolumeTexture(p,a,b,c,d,e,f,g,h,i) +#define IDirect3DDevice9_CreateCubeTexture(p,a,b,c,d,e,f,g) (p)->lpVtbl->CreateCubeTexture(p,a,b,c,d,e,f,g) +#define IDirect3DDevice9_CreateVertexBuffer(p,a,b,c,d,e,f) (p)->lpVtbl->CreateVertexBuffer(p,a,b,c,d,e,f) +#define IDirect3DDevice9_CreateIndexBuffer(p,a,b,c,d,e,f) (p)->lpVtbl->CreateIndexBuffer(p,a,b,c,d,e,f) +#define IDirect3DDevice9_CreateRenderTarget(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->CreateRenderTarget(p,a,b,c,d,e,f,g,h) +#define IDirect3DDevice9_CreateDepthStencilSurface(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->CreateDepthStencilSurface(p,a,b,c,d,e,f,g,h) +#define IDirect3DDevice9_UpdateSurface(p,a,b,c,d) (p)->lpVtbl->UpdateSurface(p,a,b,c,d) +#define IDirect3DDevice9_UpdateTexture(p,a,b) (p)->lpVtbl->UpdateTexture(p,a,b) +#define IDirect3DDevice9_GetRenderTargetData(p,a,b) (p)->lpVtbl->GetRenderTargetData(p,a,b) +#define IDirect3DDevice9_GetFrontBufferData(p,a,b) (p)->lpVtbl->GetFrontBufferData(p,a,b) +#define IDirect3DDevice9_StretchRect(p,a,b,c,d,e) (p)->lpVtbl->StretchRect(p,a,b,c,d,e) +#define IDirect3DDevice9_ColorFill(p,a,b,c) (p)->lpVtbl->ColorFill(p,a,b,c) +#define IDirect3DDevice9_CreateOffscreenPlainSurface(p,a,b,c,d,e,f) (p)->lpVtbl->CreateOffscreenPlainSurface(p,a,b,c,d,e,f) +#define IDirect3DDevice9_SetRenderTarget(p,a,b) (p)->lpVtbl->SetRenderTarget(p,a,b) +#define IDirect3DDevice9_GetRenderTarget(p,a,b) (p)->lpVtbl->GetRenderTarget(p,a,b) +#define IDirect3DDevice9_SetDepthStencilSurface(p,a) (p)->lpVtbl->SetDepthStencilSurface(p,a) +#define IDirect3DDevice9_GetDepthStencilSurface(p,a) (p)->lpVtbl->GetDepthStencilSurface(p,a) +#define IDirect3DDevice9_BeginScene(p) (p)->lpVtbl->BeginScene(p) +#define IDirect3DDevice9_EndScene(p) (p)->lpVtbl->EndScene(p) +#define IDirect3DDevice9_Clear(p,a,b,c,d,e,f) (p)->lpVtbl->Clear(p,a,b,c,d,e,f) +#define IDirect3DDevice9_SetTransform(p,a,b) (p)->lpVtbl->SetTransform(p,a,b) +#define IDirect3DDevice9_GetTransform(p,a,b) (p)->lpVtbl->GetTransform(p,a,b) +#define IDirect3DDevice9_MultiplyTransform(p,a,b) (p)->lpVtbl->MultiplyTransform(p,a,b) +#define IDirect3DDevice9_SetViewport(p,a) (p)->lpVtbl->SetViewport(p,a) +#define IDirect3DDevice9_GetViewport(p,a) (p)->lpVtbl->GetViewport(p,a) +#define IDirect3DDevice9_SetMaterial(p,a) (p)->lpVtbl->SetMaterial(p,a) +#define IDirect3DDevice9_GetMaterial(p,a) (p)->lpVtbl->GetMaterial(p,a) +#define IDirect3DDevice9_SetLight(p,a,b) (p)->lpVtbl->SetLight(p,a,b) +#define IDirect3DDevice9_GetLight(p,a,b) (p)->lpVtbl->GetLight(p,a,b) +#define IDirect3DDevice9_LightEnable(p,a,b) (p)->lpVtbl->LightEnable(p,a,b) +#define IDirect3DDevice9_GetLightEnable(p,a,b) (p)->lpVtbl->GetLightEnable(p,a,b) +#define IDirect3DDevice9_SetClipPlane(p,a,b) (p)->lpVtbl->SetClipPlane(p,a,b) +#define IDirect3DDevice9_GetClipPlane(p,a,b) (p)->lpVtbl->GetClipPlane(p,a,b) +#define IDirect3DDevice9_SetRenderState(p,a,b) (p)->lpVtbl->SetRenderState(p,a,b) +#define IDirect3DDevice9_GetRenderState(p,a,b) (p)->lpVtbl->GetRenderState(p,a,b) +#define IDirect3DDevice9_CreateStateBlock(p,a,b) (p)->lpVtbl->CreateStateBlock(p,a,b) +#define IDirect3DDevice9_BeginStateBlock(p) (p)->lpVtbl->BeginStateBlock(p) +#define IDirect3DDevice9_EndStateBlock(p,a) (p)->lpVtbl->EndStateBlock(p,a) +#define IDirect3DDevice9_SetClipStatus(p,a) (p)->lpVtbl->SetClipStatus(p,a) +#define IDirect3DDevice9_GetClipStatus(p,a) (p)->lpVtbl->GetClipStatus(p,a) +#define IDirect3DDevice9_GetTexture(p,a,b) (p)->lpVtbl->GetTexture(p,a,b) +#define IDirect3DDevice9_SetTexture(p,a,b) (p)->lpVtbl->SetTexture(p,a,b) +#define IDirect3DDevice9_GetTextureStageState(p,a,b,c) (p)->lpVtbl->GetTextureStageState(p,a,b,c) +#define IDirect3DDevice9_SetTextureStageState(p,a,b,c) (p)->lpVtbl->SetTextureStageState(p,a,b,c) +#define IDirect3DDevice9_GetSamplerState(p,a,b,c) (p)->lpVtbl->GetSamplerState(p,a,b,c) +#define IDirect3DDevice9_SetSamplerState(p,a,b,c) (p)->lpVtbl->SetSamplerState(p,a,b,c) +#define IDirect3DDevice9_ValidateDevice(p,a) (p)->lpVtbl->ValidateDevice(p,a) +#define IDirect3DDevice9_SetPaletteEntries(p,a,b) (p)->lpVtbl->SetPaletteEntries(p,a,b) +#define IDirect3DDevice9_GetPaletteEntries(p,a,b) (p)->lpVtbl->GetPaletteEntries(p,a,b) +#define IDirect3DDevice9_SetCurrentTexturePalette(p,a) (p)->lpVtbl->SetCurrentTexturePalette(p,a) +#define IDirect3DDevice9_GetCurrentTexturePalette(p,a) (p)->lpVtbl->GetCurrentTexturePalette(p,a) +#define IDirect3DDevice9_SetScissorRect(p,a) (p)->lpVtbl->SetScissorRect(p,a) +#define IDirect3DDevice9_GetScissorRect(p,a) (p)->lpVtbl->GetScissorRect(p,a) +#define IDirect3DDevice9_SetSoftwareVertexProcessing(p,a) (p)->lpVtbl->SetSoftwareVertexProcessing(p,a) +#define IDirect3DDevice9_GetSoftwareVertexProcessing(p) (p)->lpVtbl->GetSoftwareVertexProcessing(p) +#define IDirect3DDevice9_SetNPatchMode(p,a) (p)->lpVtbl->SetNPatchMode(p,a) +#define IDirect3DDevice9_GetNPatchMode(p) (p)->lpVtbl->GetNPatchMode(p) +#define IDirect3DDevice9_DrawPrimitive(p,a,b,c) (p)->lpVtbl->DrawPrimitive(p,a,b,c) +#define IDirect3DDevice9_DrawIndexedPrimitive(p,a,b,c,d,e,f) (p)->lpVtbl->DrawIndexedPrimitive(p,a,b,c,d,e,f) +#define IDirect3DDevice9_DrawPrimitiveUP(p,a,b,c,d) (p)->lpVtbl->DrawPrimitiveUP(p,a,b,c,d) +#define IDirect3DDevice9_DrawIndexedPrimitiveUP(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->DrawIndexedPrimitiveUP(p,a,b,c,d,e,f,g,h) +#define IDirect3DDevice9_ProcessVertices(p,a,b,c,d,e,f) (p)->lpVtbl->ProcessVertices(p,a,b,c,d,e,f) +#define IDirect3DDevice9_CreateVertexDeclaration(p,a,b) (p)->lpVtbl->CreateVertexDeclaration(p,a,b) +#define IDirect3DDevice9_SetVertexDeclaration(p,a) (p)->lpVtbl->SetVertexDeclaration(p,a) +#define IDirect3DDevice9_GetVertexDeclaration(p,a) (p)->lpVtbl->GetVertexDeclaration(p,a) +#define IDirect3DDevice9_SetFVF(p,a) (p)->lpVtbl->SetFVF(p,a) +#define IDirect3DDevice9_GetFVF(p,a) (p)->lpVtbl->GetFVF(p,a) +#define IDirect3DDevice9_CreateVertexShader(p,a,b) (p)->lpVtbl->CreateVertexShader(p,a,b) +#define IDirect3DDevice9_SetVertexShader(p,a) (p)->lpVtbl->SetVertexShader(p,a) +#define IDirect3DDevice9_GetVertexShader(p,a) (p)->lpVtbl->GetVertexShader(p,a) +#define IDirect3DDevice9_SetVertexShaderConstantF(p,a,b,c) (p)->lpVtbl->SetVertexShaderConstantF(p,a,b,c) +#define IDirect3DDevice9_GetVertexShaderConstantF(p,a,b,c) (p)->lpVtbl->GetVertexShaderConstantF(p,a,b,c) +#define IDirect3DDevice9_SetVertexShaderConstantI(p,a,b,c) (p)->lpVtbl->SetVertexShaderConstantI(p,a,b,c) +#define IDirect3DDevice9_GetVertexShaderConstantI(p,a,b,c) (p)->lpVtbl->GetVertexShaderConstantI(p,a,b,c) +#define IDirect3DDevice9_SetVertexShaderConstantB(p,a,b,c) (p)->lpVtbl->SetVertexShaderConstantB(p,a,b,c) +#define IDirect3DDevice9_GetVertexShaderConstantB(p,a,b,c) (p)->lpVtbl->GetVertexShaderConstantB(p,a,b,c) +#define IDirect3DDevice9_SetStreamSource(p,a,b,c,d) (p)->lpVtbl->SetStreamSource(p,a,b,c,d) +#define IDirect3DDevice9_GetStreamSource(p,a,b,c,d) (p)->lpVtbl->GetStreamSource(p,a,b,c,d) +#define IDirect3DDevice9_SetStreamSourceFreq(p,a,b) (p)->lpVtbl->SetStreamSourceFreq(p,a,b) +#define IDirect3DDevice9_GetStreamSourceFreq(p,a,b) (p)->lpVtbl->GetStreamSourceFreq(p,a,b) +#define IDirect3DDevice9_SetIndices(p,a) (p)->lpVtbl->SetIndices(p,a) +#define IDirect3DDevice9_GetIndices(p,a) (p)->lpVtbl->GetIndices(p,a) +#define IDirect3DDevice9_CreatePixelShader(p,a,b) (p)->lpVtbl->CreatePixelShader(p,a,b) +#define IDirect3DDevice9_SetPixelShader(p,a) (p)->lpVtbl->SetPixelShader(p,a) +#define IDirect3DDevice9_GetPixelShader(p,a) (p)->lpVtbl->GetPixelShader(p,a) +#define IDirect3DDevice9_SetPixelShaderConstantF(p,a,b,c) (p)->lpVtbl->SetPixelShaderConstantF(p,a,b,c) +#define IDirect3DDevice9_GetPixelShaderConstantF(p,a,b,c) (p)->lpVtbl->GetPixelShaderConstantF(p,a,b,c) +#define IDirect3DDevice9_SetPixelShaderConstantI(p,a,b,c) (p)->lpVtbl->SetPixelShaderConstantI(p,a,b,c) +#define IDirect3DDevice9_GetPixelShaderConstantI(p,a,b,c) (p)->lpVtbl->GetPixelShaderConstantI(p,a,b,c) +#define IDirect3DDevice9_SetPixelShaderConstantB(p,a,b,c) (p)->lpVtbl->SetPixelShaderConstantB(p,a,b,c) +#define IDirect3DDevice9_GetPixelShaderConstantB(p,a,b,c) (p)->lpVtbl->GetPixelShaderConstantB(p,a,b,c) +#define IDirect3DDevice9_DrawRectPatch(p,a,b,c) (p)->lpVtbl->DrawRectPatch(p,a,b,c) +#define IDirect3DDevice9_DrawTriPatch(p,a,b,c) (p)->lpVtbl->DrawTriPatch(p,a,b,c) +#define IDirect3DDevice9_DeletePatch(p,a) (p)->lpVtbl->DeletePatch(p,a) +#define IDirect3DDevice9_CreateQuery(p,a,b) (p)->lpVtbl->CreateQuery(p,a,b) +#else +#define IDirect3DDevice9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DDevice9_AddRef(p) (p)->AddRef() +#define IDirect3DDevice9_Release(p) (p)->Release() +#define IDirect3DDevice9_TestCooperativeLevel(p) (p)->TestCooperativeLevel() +#define IDirect3DDevice9_GetAvailableTextureMem(p) (p)->GetAvailableTextureMem() +#define IDirect3DDevice9_EvictManagedResources(p) (p)->EvictManagedResources() +#define IDirect3DDevice9_GetDirect3D(p,a) (p)->GetDirect3D(a) +#define IDirect3DDevice9_GetDeviceCaps(p,a) (p)->GetDeviceCaps(a) +#define IDirect3DDevice9_GetDisplayMode(p,a,b) (p)->GetDisplayMode(a,b) +#define IDirect3DDevice9_GetCreationParameters(p,a) (p)->GetCreationParameters(a) +#define IDirect3DDevice9_SetCursorProperties(p,a,b,c) (p)->SetCursorProperties(a,b,c) +#define IDirect3DDevice9_SetCursorPosition(p,a,b,c) (p)->SetCursorPosition(a,b,c) +#define IDirect3DDevice9_ShowCursor(p,a) (p)->ShowCursor(a) +#define IDirect3DDevice9_CreateAdditionalSwapChain(p,a,b) (p)->CreateAdditionalSwapChain(a,b) +#define IDirect3DDevice9_GetSwapChain(p,a,b) (p)->GetSwapChain(a,b) +#define IDirect3DDevice9_GetNumberOfSwapChains(p) (p)->GetNumberOfSwapChains() +#define IDirect3DDevice9_Reset(p,a) (p)->Reset(a) +#define IDirect3DDevice9_Present(p,a,b,c,d) (p)->Present(a,b,c,d) +#define IDirect3DDevice9_GetBackBuffer(p,a,b,c,d) (p)->GetBackBuffer(a,b,c,d) +#define IDirect3DDevice9_GetRasterStatus(p,a,b) (p)->GetRasterStatus(a,b) +#define IDirect3DDevice9_SetDialogBoxMode(p,a) (p)->SetDialogBoxMode(a) +#define IDirect3DDevice9_SetGammaRamp(p,a,b,c) (p)->SetGammaRamp(a,b,c) +#define IDirect3DDevice9_GetGammaRamp(p,a,b) (p)->GetGammaRamp(a,b) +#define IDirect3DDevice9_CreateTexture(p,a,b,c,d,e,f,g,h) (p)->CreateTexture(a,b,c,d,e,f,g,h) +#define IDirect3DDevice9_CreateVolumeTexture(p,a,b,c,d,e,f,g,h,i) (p)->CreateVolumeTexture(a,b,c,d,e,f,g,h,i) +#define IDirect3DDevice9_CreateCubeTexture(p,a,b,c,d,e,f,g) (p)->CreateCubeTexture(a,b,c,d,e,f,g) +#define IDirect3DDevice9_CreateVertexBuffer(p,a,b,c,d,e,f) (p)->CreateVertexBuffer(a,b,c,d,e,f) +#define IDirect3DDevice9_CreateIndexBuffer(p,a,b,c,d,e,f) (p)->CreateIndexBuffer(a,b,c,d,e,f) +#define IDirect3DDevice9_CreateRenderTarget(p,a,b,c,d,e,f,g,h) (p)->CreateRenderTarget(a,b,c,d,e,f,g,h) +#define IDirect3DDevice9_CreateDepthStencilSurface(p,a,b,c,d,e,f,g,h) (p)->CreateDepthStencilSurface(a,b,c,d,e,f,g,h) +#define IDirect3DDevice9_UpdateSurface(p,a,b,c,d) (p)->UpdateSurface(a,b,c,d) +#define IDirect3DDevice9_UpdateTexture(p,a,b) (p)->UpdateTexture(a,b) +#define IDirect3DDevice9_GetRenderTargetData(p,a,b) (p)->GetRenderTargetData(a,b) +#define IDirect3DDevice9_GetFrontBufferData(p,a,b) (p)->GetFrontBufferData(a,b) +#define IDirect3DDevice9_StretchRect(p,a,b,c,d,e) (p)->StretchRect(a,b,c,d,e) +#define IDirect3DDevice9_ColorFill(p,a,b,c) (p)->ColorFill(a,b,c) +#define IDirect3DDevice9_CreateOffscreenPlainSurface(p,a,b,c,d,e,f) (p)->CreateOffscreenPlainSurface(a,b,c,d,e,f) +#define IDirect3DDevice9_SetRenderTarget(p,a,b) (p)->SetRenderTarget(a,b) +#define IDirect3DDevice9_GetRenderTarget(p,a,b) (p)->GetRenderTarget(a,b) +#define IDirect3DDevice9_SetDepthStencilSurface(p,a) (p)->SetDepthStencilSurface(a) +#define IDirect3DDevice9_GetDepthStencilSurface(p,a) (p)->GetDepthStencilSurface(a) +#define IDirect3DDevice9_BeginScene(p) (p)->BeginScene() +#define IDirect3DDevice9_EndScene(p) (p)->EndScene() +#define IDirect3DDevice9_Clear(p,a,b,c,d,e,f) (p)->Clear(a,b,c,d,e,f) +#define IDirect3DDevice9_SetTransform(p,a,b) (p)->SetTransform(a,b) +#define IDirect3DDevice9_GetTransform(p,a,b) (p)->GetTransform(a,b) +#define IDirect3DDevice9_MultiplyTransform(p,a,b) (p)->MultiplyTransform(a,b) +#define IDirect3DDevice9_SetViewport(p,a) (p)->SetViewport(a) +#define IDirect3DDevice9_GetViewport(p,a) (p)->GetViewport(a) +#define IDirect3DDevice9_SetMaterial(p,a) (p)->SetMaterial(a) +#define IDirect3DDevice9_GetMaterial(p,a) (p)->GetMaterial(a) +#define IDirect3DDevice9_SetLight(p,a,b) (p)->SetLight(a,b) +#define IDirect3DDevice9_GetLight(p,a,b) (p)->GetLight(a,b) +#define IDirect3DDevice9_LightEnable(p,a,b) (p)->LightEnable(a,b) +#define IDirect3DDevice9_GetLightEnable(p,a,b) (p)->GetLightEnable(a,b) +#define IDirect3DDevice9_SetClipPlane(p,a,b) (p)->SetClipPlane(a,b) +#define IDirect3DDevice9_GetClipPlane(p,a,b) (p)->GetClipPlane(a,b) +#define IDirect3DDevice9_SetRenderState(p,a,b) (p)->SetRenderState(a,b) +#define IDirect3DDevice9_GetRenderState(p,a,b) (p)->GetRenderState(a,b) +#define IDirect3DDevice9_CreateStateBlock(p,a,b) (p)->CreateStateBlock(a,b) +#define IDirect3DDevice9_BeginStateBlock(p) (p)->BeginStateBlock() +#define IDirect3DDevice9_EndStateBlock(p,a) (p)->EndStateBlock(a) +#define IDirect3DDevice9_SetClipStatus(p,a) (p)->SetClipStatus(a) +#define IDirect3DDevice9_GetClipStatus(p,a) (p)->GetClipStatus(a) +#define IDirect3DDevice9_GetTexture(p,a,b) (p)->GetTexture(a,b) +#define IDirect3DDevice9_SetTexture(p,a,b) (p)->SetTexture(a,b) +#define IDirect3DDevice9_GetTextureStageState(p,a,b,c) (p)->GetTextureStageState(a,b,c) +#define IDirect3DDevice9_SetTextureStageState(p,a,b,c) (p)->SetTextureStageState(a,b,c) +#define IDirect3DDevice9_GetSamplerState(p,a,b,c) (p)->GetSamplerState(a,b,c) +#define IDirect3DDevice9_SetSamplerState(p,a,b,c) (p)->SetSamplerState(a,b,c) +#define IDirect3DDevice9_ValidateDevice(p,a) (p)->ValidateDevice(a) +#define IDirect3DDevice9_SetPaletteEntries(p,a,b) (p)->SetPaletteEntries(a,b) +#define IDirect3DDevice9_GetPaletteEntries(p,a,b) (p)->GetPaletteEntries(a,b) +#define IDirect3DDevice9_SetCurrentTexturePalette(p,a) (p)->SetCurrentTexturePalette(a) +#define IDirect3DDevice9_GetCurrentTexturePalette(p,a) (p)->GetCurrentTexturePalette(a) +#define IDirect3DDevice9_SetScissorRect(p,a) (p)->SetScissorRect(a) +#define IDirect3DDevice9_GetScissorRect(p,a) (p)->GetScissorRect(a) +#define IDirect3DDevice9_SetSoftwareVertexProcessing(p,a) (p)->SetSoftwareVertexProcessing(a) +#define IDirect3DDevice9_GetSoftwareVertexProcessing(p) (p)->GetSoftwareVertexProcessing() +#define IDirect3DDevice9_SetNPatchMode(p,a) (p)->SetNPatchMode(a) +#define IDirect3DDevice9_GetNPatchMode(p) (p)->GetNPatchMode() +#define IDirect3DDevice9_DrawPrimitive(p,a,b,c) (p)->DrawPrimitive(a,b,c) +#define IDirect3DDevice9_DrawIndexedPrimitive(p,a,b,c,d,e,f) (p)->DrawIndexedPrimitive(a,b,c,d,e,f) +#define IDirect3DDevice9_DrawPrimitiveUP(p,a,b,c,d) (p)->DrawPrimitiveUP(a,b,c,d) +#define IDirect3DDevice9_DrawIndexedPrimitiveUP(p,a,b,c,d,e,f,g,h) (p)->DrawIndexedPrimitiveUP(a,b,c,d,e,f,g,h) +#define IDirect3DDevice9_ProcessVertices(p,a,b,c,d,e,f) (p)->ProcessVertices(a,b,c,d,e,f) +#define IDirect3DDevice9_CreateVertexDeclaration(p,a,b) (p)->CreateVertexDeclaration(a,b) +#define IDirect3DDevice9_SetVertexDeclaration(p,a) (p)->SetVertexDeclaration(a) +#define IDirect3DDevice9_GetVertexDeclaration(p,a) (p)->GetVertexDeclaration(a) +#define IDirect3DDevice9_SetFVF(p,a) (p)->SetFVF(a) +#define IDirect3DDevice9_GetFVF(p,a) (p)->GetFVF(a) +#define IDirect3DDevice9_CreateVertexShader(p,a,b) (p)->CreateVertexShader(a,b) +#define IDirect3DDevice9_SetVertexShader(p,a) (p)->SetVertexShader(a) +#define IDirect3DDevice9_GetVertexShader(p,a) (p)->GetVertexShader(a) +#define IDirect3DDevice9_SetVertexShaderConstantF(p,a,b,c) (p)->SetVertexShaderConstantF(a,b,c) +#define IDirect3DDevice9_GetVertexShaderConstantF(p,a,b,c) (p)->GetVertexShaderConstantF(a,b,c) +#define IDirect3DDevice9_SetVertexShaderConstantI(p,a,b,c) (p)->SetVertexShaderConstantI(a,b,c) +#define IDirect3DDevice9_GetVertexShaderConstantI(p,a,b,c) (p)->GetVertexShaderConstantI(a,b,c) +#define IDirect3DDevice9_SetVertexShaderConstantB(p,a,b,c) (p)->SetVertexShaderConstantB(a,b,c) +#define IDirect3DDevice9_GetVertexShaderConstantB(p,a,b,c) (p)->GetVertexShaderConstantB(a,b,c) +#define IDirect3DDevice9_SetStreamSource(p,a,b,c,d) (p)->SetStreamSource(a,b,c,d) +#define IDirect3DDevice9_GetStreamSource(p,a,b,c,d) (p)->GetStreamSource(a,b,c,d) +#define IDirect3DDevice9_SetStreamSourceFreq(p,a,b) (p)->SetStreamSourceFreq(a,b) +#define IDirect3DDevice9_GetStreamSourceFreq(p,a,b) (p)->GetStreamSourceFreq(a,b) +#define IDirect3DDevice9_SetIndices(p,a) (p)->SetIndices(a) +#define IDirect3DDevice9_GetIndices(p,a) (p)->GetIndices(a) +#define IDirect3DDevice9_CreatePixelShader(p,a,b) (p)->CreatePixelShader(a,b) +#define IDirect3DDevice9_SetPixelShader(p,a) (p)->SetPixelShader(a) +#define IDirect3DDevice9_GetPixelShader(p,a) (p)->GetPixelShader(a) +#define IDirect3DDevice9_SetPixelShaderConstantF(p,a,b,c) (p)->SetPixelShaderConstantF(a,b,c) +#define IDirect3DDevice9_GetPixelShaderConstantF(p,a,b,c) (p)->GetPixelShaderConstantF(a,b,c) +#define IDirect3DDevice9_SetPixelShaderConstantI(p,a,b,c) (p)->SetPixelShaderConstantI(a,b,c) +#define IDirect3DDevice9_GetPixelShaderConstantI(p,a,b,c) (p)->GetPixelShaderConstantI(a,b,c) +#define IDirect3DDevice9_SetPixelShaderConstantB(p,a,b,c) (p)->SetPixelShaderConstantB(a,b,c) +#define IDirect3DDevice9_GetPixelShaderConstantB(p,a,b,c) (p)->GetPixelShaderConstantB(a,b,c) +#define IDirect3DDevice9_DrawRectPatch(p,a,b,c) (p)->DrawRectPatch(a,b,c) +#define IDirect3DDevice9_DrawTriPatch(p,a,b,c) (p)->DrawTriPatch(a,b,c) +#define IDirect3DDevice9_DeletePatch(p,a) (p)->DeletePatch(a) +#define IDirect3DDevice9_CreateQuery(p,a,b) (p)->CreateQuery(a,b) +#endif + + +#undef INTERFACE +#define INTERFACE IDirect3DStateBlock9 + +DECLARE_INTERFACE_(IDirect3DStateBlock9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DStateBlock9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(Capture)(THIS) PURE; + STDMETHOD(Apply)(THIS) PURE; +}; + +typedef struct IDirect3DStateBlock9 *LPDIRECT3DSTATEBLOCK9, *PDIRECT3DSTATEBLOCK9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DStateBlock9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DStateBlock9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DStateBlock9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DStateBlock9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DStateBlock9_Capture(p) (p)->lpVtbl->Capture(p) +#define IDirect3DStateBlock9_Apply(p) (p)->lpVtbl->Apply(p) +#else +#define IDirect3DStateBlock9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DStateBlock9_AddRef(p) (p)->AddRef() +#define IDirect3DStateBlock9_Release(p) (p)->Release() +#define IDirect3DStateBlock9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DStateBlock9_Capture(p) (p)->Capture() +#define IDirect3DStateBlock9_Apply(p) (p)->Apply() +#endif + + + +#undef INTERFACE +#define INTERFACE IDirect3DSwapChain9 + +DECLARE_INTERFACE_(IDirect3DSwapChain9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DSwapChain9 methods ***/ + STDMETHOD(Present)(THIS_ CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion,DWORD dwFlags) PURE; + STDMETHOD(GetFrontBufferData)(THIS_ IDirect3DSurface9* pDestSurface) PURE; + STDMETHOD(GetBackBuffer)(THIS_ UINT iBackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface9** ppBackBuffer) PURE; + STDMETHOD(GetRasterStatus)(THIS_ D3DRASTER_STATUS* pRasterStatus) PURE; + STDMETHOD(GetDisplayMode)(THIS_ D3DDISPLAYMODE* pMode) PURE; + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(GetPresentParameters)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters) PURE; +}; + +typedef struct IDirect3DSwapChain9 *LPDIRECT3DSWAPCHAIN9, *PDIRECT3DSWAPCHAIN9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DSwapChain9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DSwapChain9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DSwapChain9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DSwapChain9_Present(p,a,b,c,d,e) (p)->lpVtbl->Present(p,a,b,c,d,e) +#define IDirect3DSwapChain9_GetFrontBufferData(p,a) (p)->lpVtbl->GetFrontBufferData(p,a) +#define IDirect3DSwapChain9_GetBackBuffer(p,a,b,c) (p)->lpVtbl->GetBackBuffer(p,a,b,c) +#define IDirect3DSwapChain9_GetRasterStatus(p,a) (p)->lpVtbl->GetRasterStatus(p,a) +#define IDirect3DSwapChain9_GetDisplayMode(p,a) (p)->lpVtbl->GetDisplayMode(p,a) +#define IDirect3DSwapChain9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DSwapChain9_GetPresentParameters(p,a) (p)->lpVtbl->GetPresentParameters(p,a) +#else +#define IDirect3DSwapChain9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DSwapChain9_AddRef(p) (p)->AddRef() +#define IDirect3DSwapChain9_Release(p) (p)->Release() +#define IDirect3DSwapChain9_Present(p,a,b,c,d,e) (p)->Present(a,b,c,d,e) +#define IDirect3DSwapChain9_GetFrontBufferData(p,a) (p)->GetFrontBufferData(a) +#define IDirect3DSwapChain9_GetBackBuffer(p,a,b,c) (p)->GetBackBuffer(a,b,c) +#define IDirect3DSwapChain9_GetRasterStatus(p,a) (p)->GetRasterStatus(a) +#define IDirect3DSwapChain9_GetDisplayMode(p,a) (p)->GetDisplayMode(a) +#define IDirect3DSwapChain9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DSwapChain9_GetPresentParameters(p,a) (p)->GetPresentParameters(a) +#endif + + + +#undef INTERFACE +#define INTERFACE IDirect3DResource9 + +DECLARE_INTERFACE_(IDirect3DResource9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DResource9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; + STDMETHOD_(DWORD, GetPriority)(THIS) PURE; + STDMETHOD_(void, PreLoad)(THIS) PURE; + STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; +}; + +typedef struct IDirect3DResource9 *LPDIRECT3DRESOURCE9, *PDIRECT3DRESOURCE9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DResource9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DResource9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DResource9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DResource9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DResource9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DResource9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DResource9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DResource9_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirect3DResource9_GetPriority(p) (p)->lpVtbl->GetPriority(p) +#define IDirect3DResource9_PreLoad(p) (p)->lpVtbl->PreLoad(p) +#define IDirect3DResource9_GetType(p) (p)->lpVtbl->GetType(p) +#else +#define IDirect3DResource9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DResource9_AddRef(p) (p)->AddRef() +#define IDirect3DResource9_Release(p) (p)->Release() +#define IDirect3DResource9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DResource9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DResource9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DResource9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DResource9_SetPriority(p,a) (p)->SetPriority(a) +#define IDirect3DResource9_GetPriority(p) (p)->GetPriority() +#define IDirect3DResource9_PreLoad(p) (p)->PreLoad() +#define IDirect3DResource9_GetType(p) (p)->GetType() +#endif + + + +#undef INTERFACE +#define INTERFACE IDirect3DVertexDeclaration9 + +DECLARE_INTERFACE_(IDirect3DVertexDeclaration9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DVertexDeclaration9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9*,UINT* pNumElements) PURE; +}; + +typedef struct IDirect3DVertexDeclaration9 *LPDIRECT3DVERTEXDECLARATION9, *PDIRECT3DVERTEXDECLARATION9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DVertexDeclaration9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DVertexDeclaration9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DVertexDeclaration9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DVertexDeclaration9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DVertexDeclaration9_GetDeclaration(p,a,b) (p)->lpVtbl->GetDeclaration(p,a,b) +#else +#define IDirect3DVertexDeclaration9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DVertexDeclaration9_AddRef(p) (p)->AddRef() +#define IDirect3DVertexDeclaration9_Release(p) (p)->Release() +#define IDirect3DVertexDeclaration9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DVertexDeclaration9_GetDeclaration(p,a,b) (p)->GetDeclaration(a,b) +#endif + + + +#undef INTERFACE +#define INTERFACE IDirect3DVertexShader9 + +DECLARE_INTERFACE_(IDirect3DVertexShader9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DVertexShader9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(GetFunction)(THIS_ void*,UINT* pSizeOfData) PURE; +}; + +typedef struct IDirect3DVertexShader9 *LPDIRECT3DVERTEXSHADER9, *PDIRECT3DVERTEXSHADER9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DVertexShader9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DVertexShader9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DVertexShader9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DVertexShader9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DVertexShader9_GetFunction(p,a,b) (p)->lpVtbl->GetFunction(p,a,b) +#else +#define IDirect3DVertexShader9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DVertexShader9_AddRef(p) (p)->AddRef() +#define IDirect3DVertexShader9_Release(p) (p)->Release() +#define IDirect3DVertexShader9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DVertexShader9_GetFunction(p,a,b) (p)->GetFunction(a,b) +#endif + + + +#undef INTERFACE +#define INTERFACE IDirect3DPixelShader9 + +DECLARE_INTERFACE_(IDirect3DPixelShader9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DPixelShader9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(GetFunction)(THIS_ void*,UINT* pSizeOfData) PURE; +}; + +typedef struct IDirect3DPixelShader9 *LPDIRECT3DPIXELSHADER9, *PDIRECT3DPIXELSHADER9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DPixelShader9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DPixelShader9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DPixelShader9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DPixelShader9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DPixelShader9_GetFunction(p,a,b) (p)->lpVtbl->GetFunction(p,a,b) +#else +#define IDirect3DPixelShader9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DPixelShader9_AddRef(p) (p)->AddRef() +#define IDirect3DPixelShader9_Release(p) (p)->Release() +#define IDirect3DPixelShader9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DPixelShader9_GetFunction(p,a,b) (p)->GetFunction(a,b) +#endif + + + + +#undef INTERFACE +#define INTERFACE IDirect3DBaseTexture9 + +DECLARE_INTERFACE_(IDirect3DBaseTexture9, IDirect3DResource9) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DResource9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; + STDMETHOD_(DWORD, GetPriority)(THIS) PURE; + STDMETHOD_(void, PreLoad)(THIS) PURE; + STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; + STDMETHOD_(DWORD, SetLOD)(THIS_ DWORD LODNew) PURE; + STDMETHOD_(DWORD, GetLOD)(THIS) PURE; + STDMETHOD_(DWORD, GetLevelCount)(THIS) PURE; + STDMETHOD(SetAutoGenFilterType)(THIS_ D3DTEXTUREFILTERTYPE FilterType) PURE; + STDMETHOD_(D3DTEXTUREFILTERTYPE, GetAutoGenFilterType)(THIS) PURE; + STDMETHOD_(void, GenerateMipSubLevels)(THIS) PURE; +}; + +typedef struct IDirect3DBaseTexture9 *LPDIRECT3DBASETEXTURE9, *PDIRECT3DBASETEXTURE9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DBaseTexture9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DBaseTexture9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DBaseTexture9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DBaseTexture9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DBaseTexture9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DBaseTexture9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DBaseTexture9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DBaseTexture9_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirect3DBaseTexture9_GetPriority(p) (p)->lpVtbl->GetPriority(p) +#define IDirect3DBaseTexture9_PreLoad(p) (p)->lpVtbl->PreLoad(p) +#define IDirect3DBaseTexture9_GetType(p) (p)->lpVtbl->GetType(p) +#define IDirect3DBaseTexture9_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) +#define IDirect3DBaseTexture9_GetLOD(p) (p)->lpVtbl->GetLOD(p) +#define IDirect3DBaseTexture9_GetLevelCount(p) (p)->lpVtbl->GetLevelCount(p) +#define IDirect3DBaseTexture9_SetAutoGenFilterType(p,a) (p)->lpVtbl->SetAutoGenFilterType(p,a) +#define IDirect3DBaseTexture9_GetAutoGenFilterType(p) (p)->lpVtbl->GetAutoGenFilterType(p) +#define IDirect3DBaseTexture9_GenerateMipSubLevels(p) (p)->lpVtbl->GenerateMipSubLevels(p) +#else +#define IDirect3DBaseTexture9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DBaseTexture9_AddRef(p) (p)->AddRef() +#define IDirect3DBaseTexture9_Release(p) (p)->Release() +#define IDirect3DBaseTexture9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DBaseTexture9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DBaseTexture9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DBaseTexture9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DBaseTexture9_SetPriority(p,a) (p)->SetPriority(a) +#define IDirect3DBaseTexture9_GetPriority(p) (p)->GetPriority() +#define IDirect3DBaseTexture9_PreLoad(p) (p)->PreLoad() +#define IDirect3DBaseTexture9_GetType(p) (p)->GetType() +#define IDirect3DBaseTexture9_SetLOD(p,a) (p)->SetLOD(a) +#define IDirect3DBaseTexture9_GetLOD(p) (p)->GetLOD() +#define IDirect3DBaseTexture9_GetLevelCount(p) (p)->GetLevelCount() +#define IDirect3DBaseTexture9_SetAutoGenFilterType(p,a) (p)->SetAutoGenFilterType(a) +#define IDirect3DBaseTexture9_GetAutoGenFilterType(p) (p)->GetAutoGenFilterType() +#define IDirect3DBaseTexture9_GenerateMipSubLevels(p) (p)->GenerateMipSubLevels() +#endif + + + + + +#undef INTERFACE +#define INTERFACE IDirect3DTexture9 + +DECLARE_INTERFACE_(IDirect3DTexture9, IDirect3DBaseTexture9) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DBaseTexture9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; + STDMETHOD_(DWORD, GetPriority)(THIS) PURE; + STDMETHOD_(void, PreLoad)(THIS) PURE; + STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; + STDMETHOD_(DWORD, SetLOD)(THIS_ DWORD LODNew) PURE; + STDMETHOD_(DWORD, GetLOD)(THIS) PURE; + STDMETHOD_(DWORD, GetLevelCount)(THIS) PURE; + STDMETHOD(SetAutoGenFilterType)(THIS_ D3DTEXTUREFILTERTYPE FilterType) PURE; + STDMETHOD_(D3DTEXTUREFILTERTYPE, GetAutoGenFilterType)(THIS) PURE; + STDMETHOD_(void, GenerateMipSubLevels)(THIS) PURE; + STDMETHOD(GetLevelDesc)(THIS_ UINT Level,D3DSURFACE_DESC *pDesc) PURE; + STDMETHOD(GetSurfaceLevel)(THIS_ UINT Level,IDirect3DSurface9** ppSurfaceLevel) PURE; + STDMETHOD(LockRect)(THIS_ UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) PURE; + STDMETHOD(UnlockRect)(THIS_ UINT Level) PURE; + STDMETHOD(AddDirtyRect)(THIS_ CONST RECT* pDirtyRect) PURE; +}; + +typedef struct IDirect3DTexture9 *LPDIRECT3DTEXTURE9, *PDIRECT3DTEXTURE9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DTexture9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DTexture9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DTexture9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DTexture9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DTexture9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DTexture9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DTexture9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DTexture9_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirect3DTexture9_GetPriority(p) (p)->lpVtbl->GetPriority(p) +#define IDirect3DTexture9_PreLoad(p) (p)->lpVtbl->PreLoad(p) +#define IDirect3DTexture9_GetType(p) (p)->lpVtbl->GetType(p) +#define IDirect3DTexture9_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) +#define IDirect3DTexture9_GetLOD(p) (p)->lpVtbl->GetLOD(p) +#define IDirect3DTexture9_GetLevelCount(p) (p)->lpVtbl->GetLevelCount(p) +#define IDirect3DTexture9_SetAutoGenFilterType(p,a) (p)->lpVtbl->SetAutoGenFilterType(p,a) +#define IDirect3DTexture9_GetAutoGenFilterType(p) (p)->lpVtbl->GetAutoGenFilterType(p) +#define IDirect3DTexture9_GenerateMipSubLevels(p) (p)->lpVtbl->GenerateMipSubLevels(p) +#define IDirect3DTexture9_GetLevelDesc(p,a,b) (p)->lpVtbl->GetLevelDesc(p,a,b) +#define IDirect3DTexture9_GetSurfaceLevel(p,a,b) (p)->lpVtbl->GetSurfaceLevel(p,a,b) +#define IDirect3DTexture9_LockRect(p,a,b,c,d) (p)->lpVtbl->LockRect(p,a,b,c,d) +#define IDirect3DTexture9_UnlockRect(p,a) (p)->lpVtbl->UnlockRect(p,a) +#define IDirect3DTexture9_AddDirtyRect(p,a) (p)->lpVtbl->AddDirtyRect(p,a) +#else +#define IDirect3DTexture9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DTexture9_AddRef(p) (p)->AddRef() +#define IDirect3DTexture9_Release(p) (p)->Release() +#define IDirect3DTexture9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DTexture9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DTexture9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DTexture9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DTexture9_SetPriority(p,a) (p)->SetPriority(a) +#define IDirect3DTexture9_GetPriority(p) (p)->GetPriority() +#define IDirect3DTexture9_PreLoad(p) (p)->PreLoad() +#define IDirect3DTexture9_GetType(p) (p)->GetType() +#define IDirect3DTexture9_SetLOD(p,a) (p)->SetLOD(a) +#define IDirect3DTexture9_GetLOD(p) (p)->GetLOD() +#define IDirect3DTexture9_GetLevelCount(p) (p)->GetLevelCount() +#define IDirect3DTexture9_SetAutoGenFilterType(p,a) (p)->SetAutoGenFilterType(a) +#define IDirect3DTexture9_GetAutoGenFilterType(p) (p)->GetAutoGenFilterType() +#define IDirect3DTexture9_GenerateMipSubLevels(p) (p)->GenerateMipSubLevels() +#define IDirect3DTexture9_GetLevelDesc(p,a,b) (p)->GetLevelDesc(a,b) +#define IDirect3DTexture9_GetSurfaceLevel(p,a,b) (p)->GetSurfaceLevel(a,b) +#define IDirect3DTexture9_LockRect(p,a,b,c,d) (p)->LockRect(a,b,c,d) +#define IDirect3DTexture9_UnlockRect(p,a) (p)->UnlockRect(a) +#define IDirect3DTexture9_AddDirtyRect(p,a) (p)->AddDirtyRect(a) +#endif + + + + + +#undef INTERFACE +#define INTERFACE IDirect3DVolumeTexture9 + +DECLARE_INTERFACE_(IDirect3DVolumeTexture9, IDirect3DBaseTexture9) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DBaseTexture9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; + STDMETHOD_(DWORD, GetPriority)(THIS) PURE; + STDMETHOD_(void, PreLoad)(THIS) PURE; + STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; + STDMETHOD_(DWORD, SetLOD)(THIS_ DWORD LODNew) PURE; + STDMETHOD_(DWORD, GetLOD)(THIS) PURE; + STDMETHOD_(DWORD, GetLevelCount)(THIS) PURE; + STDMETHOD(SetAutoGenFilterType)(THIS_ D3DTEXTUREFILTERTYPE FilterType) PURE; + STDMETHOD_(D3DTEXTUREFILTERTYPE, GetAutoGenFilterType)(THIS) PURE; + STDMETHOD_(void, GenerateMipSubLevels)(THIS) PURE; + STDMETHOD(GetLevelDesc)(THIS_ UINT Level,D3DVOLUME_DESC *pDesc) PURE; + STDMETHOD(GetVolumeLevel)(THIS_ UINT Level,IDirect3DVolume9** ppVolumeLevel) PURE; + STDMETHOD(LockBox)(THIS_ UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags) PURE; + STDMETHOD(UnlockBox)(THIS_ UINT Level) PURE; + STDMETHOD(AddDirtyBox)(THIS_ CONST D3DBOX* pDirtyBox) PURE; +}; + +typedef struct IDirect3DVolumeTexture9 *LPDIRECT3DVOLUMETEXTURE9, *PDIRECT3DVOLUMETEXTURE9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DVolumeTexture9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DVolumeTexture9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DVolumeTexture9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DVolumeTexture9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DVolumeTexture9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DVolumeTexture9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DVolumeTexture9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DVolumeTexture9_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirect3DVolumeTexture9_GetPriority(p) (p)->lpVtbl->GetPriority(p) +#define IDirect3DVolumeTexture9_PreLoad(p) (p)->lpVtbl->PreLoad(p) +#define IDirect3DVolumeTexture9_GetType(p) (p)->lpVtbl->GetType(p) +#define IDirect3DVolumeTexture9_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) +#define IDirect3DVolumeTexture9_GetLOD(p) (p)->lpVtbl->GetLOD(p) +#define IDirect3DVolumeTexture9_GetLevelCount(p) (p)->lpVtbl->GetLevelCount(p) +#define IDirect3DVolumeTexture9_SetAutoGenFilterType(p,a) (p)->lpVtbl->SetAutoGenFilterType(p,a) +#define IDirect3DVolumeTexture9_GetAutoGenFilterType(p) (p)->lpVtbl->GetAutoGenFilterType(p) +#define IDirect3DVolumeTexture9_GenerateMipSubLevels(p) (p)->lpVtbl->GenerateMipSubLevels(p) +#define IDirect3DVolumeTexture9_GetLevelDesc(p,a,b) (p)->lpVtbl->GetLevelDesc(p,a,b) +#define IDirect3DVolumeTexture9_GetVolumeLevel(p,a,b) (p)->lpVtbl->GetVolumeLevel(p,a,b) +#define IDirect3DVolumeTexture9_LockBox(p,a,b,c,d) (p)->lpVtbl->LockBox(p,a,b,c,d) +#define IDirect3DVolumeTexture9_UnlockBox(p,a) (p)->lpVtbl->UnlockBox(p,a) +#define IDirect3DVolumeTexture9_AddDirtyBox(p,a) (p)->lpVtbl->AddDirtyBox(p,a) +#else +#define IDirect3DVolumeTexture9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DVolumeTexture9_AddRef(p) (p)->AddRef() +#define IDirect3DVolumeTexture9_Release(p) (p)->Release() +#define IDirect3DVolumeTexture9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DVolumeTexture9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DVolumeTexture9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DVolumeTexture9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DVolumeTexture9_SetPriority(p,a) (p)->SetPriority(a) +#define IDirect3DVolumeTexture9_GetPriority(p) (p)->GetPriority() +#define IDirect3DVolumeTexture9_PreLoad(p) (p)->PreLoad() +#define IDirect3DVolumeTexture9_GetType(p) (p)->GetType() +#define IDirect3DVolumeTexture9_SetLOD(p,a) (p)->SetLOD(a) +#define IDirect3DVolumeTexture9_GetLOD(p) (p)->GetLOD() +#define IDirect3DVolumeTexture9_GetLevelCount(p) (p)->GetLevelCount() +#define IDirect3DVolumeTexture9_SetAutoGenFilterType(p,a) (p)->SetAutoGenFilterType(a) +#define IDirect3DVolumeTexture9_GetAutoGenFilterType(p) (p)->GetAutoGenFilterType() +#define IDirect3DVolumeTexture9_GenerateMipSubLevels(p) (p)->GenerateMipSubLevels() +#define IDirect3DVolumeTexture9_GetLevelDesc(p,a,b) (p)->GetLevelDesc(a,b) +#define IDirect3DVolumeTexture9_GetVolumeLevel(p,a,b) (p)->GetVolumeLevel(a,b) +#define IDirect3DVolumeTexture9_LockBox(p,a,b,c,d) (p)->LockBox(a,b,c,d) +#define IDirect3DVolumeTexture9_UnlockBox(p,a) (p)->UnlockBox(a) +#define IDirect3DVolumeTexture9_AddDirtyBox(p,a) (p)->AddDirtyBox(a) +#endif + + + + + +#undef INTERFACE +#define INTERFACE IDirect3DCubeTexture9 + +DECLARE_INTERFACE_(IDirect3DCubeTexture9, IDirect3DBaseTexture9) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DBaseTexture9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; + STDMETHOD_(DWORD, GetPriority)(THIS) PURE; + STDMETHOD_(void, PreLoad)(THIS) PURE; + STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; + STDMETHOD_(DWORD, SetLOD)(THIS_ DWORD LODNew) PURE; + STDMETHOD_(DWORD, GetLOD)(THIS) PURE; + STDMETHOD_(DWORD, GetLevelCount)(THIS) PURE; + STDMETHOD(SetAutoGenFilterType)(THIS_ D3DTEXTUREFILTERTYPE FilterType) PURE; + STDMETHOD_(D3DTEXTUREFILTERTYPE, GetAutoGenFilterType)(THIS) PURE; + STDMETHOD_(void, GenerateMipSubLevels)(THIS) PURE; + STDMETHOD(GetLevelDesc)(THIS_ UINT Level,D3DSURFACE_DESC *pDesc) PURE; + STDMETHOD(GetCubeMapSurface)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface) PURE; + STDMETHOD(LockRect)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) PURE; + STDMETHOD(UnlockRect)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level) PURE; + STDMETHOD(AddDirtyRect)(THIS_ D3DCUBEMAP_FACES FaceType,CONST RECT* pDirtyRect) PURE; +}; + +typedef struct IDirect3DCubeTexture9 *LPDIRECT3DCUBETEXTURE9, *PDIRECT3DCUBETEXTURE9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DCubeTexture9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DCubeTexture9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DCubeTexture9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DCubeTexture9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DCubeTexture9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DCubeTexture9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DCubeTexture9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DCubeTexture9_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirect3DCubeTexture9_GetPriority(p) (p)->lpVtbl->GetPriority(p) +#define IDirect3DCubeTexture9_PreLoad(p) (p)->lpVtbl->PreLoad(p) +#define IDirect3DCubeTexture9_GetType(p) (p)->lpVtbl->GetType(p) +#define IDirect3DCubeTexture9_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) +#define IDirect3DCubeTexture9_GetLOD(p) (p)->lpVtbl->GetLOD(p) +#define IDirect3DCubeTexture9_GetLevelCount(p) (p)->lpVtbl->GetLevelCount(p) +#define IDirect3DCubeTexture9_SetAutoGenFilterType(p,a) (p)->lpVtbl->SetAutoGenFilterType(p,a) +#define IDirect3DCubeTexture9_GetAutoGenFilterType(p) (p)->lpVtbl->GetAutoGenFilterType(p) +#define IDirect3DCubeTexture9_GenerateMipSubLevels(p) (p)->lpVtbl->GenerateMipSubLevels(p) +#define IDirect3DCubeTexture9_GetLevelDesc(p,a,b) (p)->lpVtbl->GetLevelDesc(p,a,b) +#define IDirect3DCubeTexture9_GetCubeMapSurface(p,a,b,c) (p)->lpVtbl->GetCubeMapSurface(p,a,b,c) +#define IDirect3DCubeTexture9_LockRect(p,a,b,c,d,e) (p)->lpVtbl->LockRect(p,a,b,c,d,e) +#define IDirect3DCubeTexture9_UnlockRect(p,a,b) (p)->lpVtbl->UnlockRect(p,a,b) +#define IDirect3DCubeTexture9_AddDirtyRect(p,a,b) (p)->lpVtbl->AddDirtyRect(p,a,b) +#else +#define IDirect3DCubeTexture9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DCubeTexture9_AddRef(p) (p)->AddRef() +#define IDirect3DCubeTexture9_Release(p) (p)->Release() +#define IDirect3DCubeTexture9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DCubeTexture9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DCubeTexture9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DCubeTexture9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DCubeTexture9_SetPriority(p,a) (p)->SetPriority(a) +#define IDirect3DCubeTexture9_GetPriority(p) (p)->GetPriority() +#define IDirect3DCubeTexture9_PreLoad(p) (p)->PreLoad() +#define IDirect3DCubeTexture9_GetType(p) (p)->GetType() +#define IDirect3DCubeTexture9_SetLOD(p,a) (p)->SetLOD(a) +#define IDirect3DCubeTexture9_GetLOD(p) (p)->GetLOD() +#define IDirect3DCubeTexture9_GetLevelCount(p) (p)->GetLevelCount() +#define IDirect3DCubeTexture9_SetAutoGenFilterType(p,a) (p)->SetAutoGenFilterType(a) +#define IDirect3DCubeTexture9_GetAutoGenFilterType(p) (p)->GetAutoGenFilterType() +#define IDirect3DCubeTexture9_GenerateMipSubLevels(p) (p)->GenerateMipSubLevels() +#define IDirect3DCubeTexture9_GetLevelDesc(p,a,b) (p)->GetLevelDesc(a,b) +#define IDirect3DCubeTexture9_GetCubeMapSurface(p,a,b,c) (p)->GetCubeMapSurface(a,b,c) +#define IDirect3DCubeTexture9_LockRect(p,a,b,c,d,e) (p)->LockRect(a,b,c,d,e) +#define IDirect3DCubeTexture9_UnlockRect(p,a,b) (p)->UnlockRect(a,b) +#define IDirect3DCubeTexture9_AddDirtyRect(p,a,b) (p)->AddDirtyRect(a,b) +#endif + + + + +#undef INTERFACE +#define INTERFACE IDirect3DVertexBuffer9 + +DECLARE_INTERFACE_(IDirect3DVertexBuffer9, IDirect3DResource9) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DResource9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; + STDMETHOD_(DWORD, GetPriority)(THIS) PURE; + STDMETHOD_(void, PreLoad)(THIS) PURE; + STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; + STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE; + STDMETHOD(Unlock)(THIS) PURE; + STDMETHOD(GetDesc)(THIS_ D3DVERTEXBUFFER_DESC *pDesc) PURE; +}; + +typedef struct IDirect3DVertexBuffer9 *LPDIRECT3DVERTEXBUFFER9, *PDIRECT3DVERTEXBUFFER9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DVertexBuffer9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DVertexBuffer9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DVertexBuffer9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DVertexBuffer9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DVertexBuffer9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DVertexBuffer9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DVertexBuffer9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DVertexBuffer9_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirect3DVertexBuffer9_GetPriority(p) (p)->lpVtbl->GetPriority(p) +#define IDirect3DVertexBuffer9_PreLoad(p) (p)->lpVtbl->PreLoad(p) +#define IDirect3DVertexBuffer9_GetType(p) (p)->lpVtbl->GetType(p) +#define IDirect3DVertexBuffer9_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) +#define IDirect3DVertexBuffer9_Unlock(p) (p)->lpVtbl->Unlock(p) +#define IDirect3DVertexBuffer9_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) +#else +#define IDirect3DVertexBuffer9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DVertexBuffer9_AddRef(p) (p)->AddRef() +#define IDirect3DVertexBuffer9_Release(p) (p)->Release() +#define IDirect3DVertexBuffer9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DVertexBuffer9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DVertexBuffer9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DVertexBuffer9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DVertexBuffer9_SetPriority(p,a) (p)->SetPriority(a) +#define IDirect3DVertexBuffer9_GetPriority(p) (p)->GetPriority() +#define IDirect3DVertexBuffer9_PreLoad(p) (p)->PreLoad() +#define IDirect3DVertexBuffer9_GetType(p) (p)->GetType() +#define IDirect3DVertexBuffer9_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) +#define IDirect3DVertexBuffer9_Unlock(p) (p)->Unlock() +#define IDirect3DVertexBuffer9_GetDesc(p,a) (p)->GetDesc(a) +#endif + + + + +#undef INTERFACE +#define INTERFACE IDirect3DIndexBuffer9 + +DECLARE_INTERFACE_(IDirect3DIndexBuffer9, IDirect3DResource9) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DResource9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; + STDMETHOD_(DWORD, GetPriority)(THIS) PURE; + STDMETHOD_(void, PreLoad)(THIS) PURE; + STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; + STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE; + STDMETHOD(Unlock)(THIS) PURE; + STDMETHOD(GetDesc)(THIS_ D3DINDEXBUFFER_DESC *pDesc) PURE; +}; + +typedef struct IDirect3DIndexBuffer9 *LPDIRECT3DINDEXBUFFER9, *PDIRECT3DINDEXBUFFER9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DIndexBuffer9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DIndexBuffer9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DIndexBuffer9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DIndexBuffer9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DIndexBuffer9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DIndexBuffer9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DIndexBuffer9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DIndexBuffer9_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirect3DIndexBuffer9_GetPriority(p) (p)->lpVtbl->GetPriority(p) +#define IDirect3DIndexBuffer9_PreLoad(p) (p)->lpVtbl->PreLoad(p) +#define IDirect3DIndexBuffer9_GetType(p) (p)->lpVtbl->GetType(p) +#define IDirect3DIndexBuffer9_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) +#define IDirect3DIndexBuffer9_Unlock(p) (p)->lpVtbl->Unlock(p) +#define IDirect3DIndexBuffer9_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) +#else +#define IDirect3DIndexBuffer9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DIndexBuffer9_AddRef(p) (p)->AddRef() +#define IDirect3DIndexBuffer9_Release(p) (p)->Release() +#define IDirect3DIndexBuffer9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DIndexBuffer9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DIndexBuffer9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DIndexBuffer9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DIndexBuffer9_SetPriority(p,a) (p)->SetPriority(a) +#define IDirect3DIndexBuffer9_GetPriority(p) (p)->GetPriority() +#define IDirect3DIndexBuffer9_PreLoad(p) (p)->PreLoad() +#define IDirect3DIndexBuffer9_GetType(p) (p)->GetType() +#define IDirect3DIndexBuffer9_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) +#define IDirect3DIndexBuffer9_Unlock(p) (p)->Unlock() +#define IDirect3DIndexBuffer9_GetDesc(p,a) (p)->GetDesc(a) +#endif + + + + +#undef INTERFACE +#define INTERFACE IDirect3DSurface9 + +DECLARE_INTERFACE_(IDirect3DSurface9, IDirect3DResource9) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DResource9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE; + STDMETHOD_(DWORD, GetPriority)(THIS) PURE; + STDMETHOD_(void, PreLoad)(THIS) PURE; + STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE; + STDMETHOD(GetContainer)(THIS_ REFIID riid,void** ppContainer) PURE; + STDMETHOD(GetDesc)(THIS_ D3DSURFACE_DESC *pDesc) PURE; + STDMETHOD(LockRect)(THIS_ D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) PURE; + STDMETHOD(UnlockRect)(THIS) PURE; + STDMETHOD(GetDC)(THIS_ HDC *phdc) PURE; + STDMETHOD(ReleaseDC)(THIS_ HDC hdc) PURE; +}; + +typedef struct IDirect3DSurface9 *LPDIRECT3DSURFACE9, *PDIRECT3DSURFACE9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DSurface9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DSurface9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DSurface9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DSurface9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DSurface9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DSurface9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DSurface9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DSurface9_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirect3DSurface9_GetPriority(p) (p)->lpVtbl->GetPriority(p) +#define IDirect3DSurface9_PreLoad(p) (p)->lpVtbl->PreLoad(p) +#define IDirect3DSurface9_GetType(p) (p)->lpVtbl->GetType(p) +#define IDirect3DSurface9_GetContainer(p,a,b) (p)->lpVtbl->GetContainer(p,a,b) +#define IDirect3DSurface9_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) +#define IDirect3DSurface9_LockRect(p,a,b,c) (p)->lpVtbl->LockRect(p,a,b,c) +#define IDirect3DSurface9_UnlockRect(p) (p)->lpVtbl->UnlockRect(p) +#define IDirect3DSurface9_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) +#define IDirect3DSurface9_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) +#else +#define IDirect3DSurface9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DSurface9_AddRef(p) (p)->AddRef() +#define IDirect3DSurface9_Release(p) (p)->Release() +#define IDirect3DSurface9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DSurface9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DSurface9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DSurface9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DSurface9_SetPriority(p,a) (p)->SetPriority(a) +#define IDirect3DSurface9_GetPriority(p) (p)->GetPriority() +#define IDirect3DSurface9_PreLoad(p) (p)->PreLoad() +#define IDirect3DSurface9_GetType(p) (p)->GetType() +#define IDirect3DSurface9_GetContainer(p,a,b) (p)->GetContainer(a,b) +#define IDirect3DSurface9_GetDesc(p,a) (p)->GetDesc(a) +#define IDirect3DSurface9_LockRect(p,a,b,c) (p)->LockRect(a,b,c) +#define IDirect3DSurface9_UnlockRect(p) (p)->UnlockRect() +#define IDirect3DSurface9_GetDC(p,a) (p)->GetDC(a) +#define IDirect3DSurface9_ReleaseDC(p,a) (p)->ReleaseDC(a) +#endif + + + + +#undef INTERFACE +#define INTERFACE IDirect3DVolume9 + +DECLARE_INTERFACE_(IDirect3DVolume9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DVolume9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE; + STDMETHOD(GetContainer)(THIS_ REFIID riid,void** ppContainer) PURE; + STDMETHOD(GetDesc)(THIS_ D3DVOLUME_DESC *pDesc) PURE; + STDMETHOD(LockBox)(THIS_ D3DLOCKED_BOX * pLockedVolume,CONST D3DBOX* pBox,DWORD Flags) PURE; + STDMETHOD(UnlockBox)(THIS) PURE; +}; + +typedef struct IDirect3DVolume9 *LPDIRECT3DVOLUME9, *PDIRECT3DVOLUME9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DVolume9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DVolume9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DVolume9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DVolume9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DVolume9_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirect3DVolume9_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirect3DVolume9_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirect3DVolume9_GetContainer(p,a,b) (p)->lpVtbl->GetContainer(p,a,b) +#define IDirect3DVolume9_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) +#define IDirect3DVolume9_LockBox(p,a,b,c) (p)->lpVtbl->LockBox(p,a,b,c) +#define IDirect3DVolume9_UnlockBox(p) (p)->lpVtbl->UnlockBox(p) +#else +#define IDirect3DVolume9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DVolume9_AddRef(p) (p)->AddRef() +#define IDirect3DVolume9_Release(p) (p)->Release() +#define IDirect3DVolume9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DVolume9_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirect3DVolume9_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirect3DVolume9_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirect3DVolume9_GetContainer(p,a,b) (p)->GetContainer(a,b) +#define IDirect3DVolume9_GetDesc(p,a) (p)->GetDesc(a) +#define IDirect3DVolume9_LockBox(p,a,b,c) (p)->LockBox(a,b,c) +#define IDirect3DVolume9_UnlockBox(p) (p)->UnlockBox() +#endif + + + +#undef INTERFACE +#define INTERFACE IDirect3DQuery9 + +DECLARE_INTERFACE_(IDirect3DQuery9, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirect3DQuery9 methods ***/ + STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE; + STDMETHOD_(D3DQUERYTYPE, GetType)(THIS) PURE; + STDMETHOD_(DWORD, GetDataSize)(THIS) PURE; + STDMETHOD(Issue)(THIS_ DWORD dwIssueFlags) PURE; + STDMETHOD(GetData)(THIS_ void* pData,DWORD dwSize,DWORD dwGetDataFlags) PURE; +}; + +typedef struct IDirect3DQuery9 *LPDIRECT3DQUERY9, *PDIRECT3DQUERY9; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirect3DQuery9_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirect3DQuery9_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirect3DQuery9_Release(p) (p)->lpVtbl->Release(p) +#define IDirect3DQuery9_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) +#define IDirect3DQuery9_GetType(p) (p)->lpVtbl->GetType(p) +#define IDirect3DQuery9_GetDataSize(p) (p)->lpVtbl->GetDataSize(p) +#define IDirect3DQuery9_Issue(p,a) (p)->lpVtbl->Issue(p,a) +#define IDirect3DQuery9_GetData(p,a,b,c) (p)->lpVtbl->GetData(p,a,b,c) +#else +#define IDirect3DQuery9_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirect3DQuery9_AddRef(p) (p)->AddRef() +#define IDirect3DQuery9_Release(p) (p)->Release() +#define IDirect3DQuery9_GetDevice(p,a) (p)->GetDevice(a) +#define IDirect3DQuery9_GetType(p) (p)->GetType() +#define IDirect3DQuery9_GetDataSize(p) (p)->GetDataSize() +#define IDirect3DQuery9_Issue(p,a) (p)->Issue(a) +#define IDirect3DQuery9_GetData(p,a,b,c) (p)->GetData(a,b,c) +#endif + + +/**************************************************************************** + * Flags for SetPrivateData method on all D3D9 interfaces + * + * The passed pointer is an IUnknown ptr. The SizeOfData argument to SetPrivateData + * must be set to sizeof(IUnknown*). Direct3D will call AddRef through this + * pointer and Release when the private data is destroyed. The data will be + * destroyed when another SetPrivateData with the same GUID is set, when + * FreePrivateData is called, or when the D3D9 object is freed. + ****************************************************************************/ +#define D3DSPD_IUNKNOWN 0x00000001L + +/**************************************************************************** + * + * Flags for IDirect3D9::CreateDevice's BehaviorFlags + * + ****************************************************************************/ + +#define D3DCREATE_FPU_PRESERVE 0x00000002L +#define D3DCREATE_MULTITHREADED 0x00000004L + +#define D3DCREATE_PUREDEVICE 0x00000010L +#define D3DCREATE_SOFTWARE_VERTEXPROCESSING 0x00000020L +#define D3DCREATE_HARDWARE_VERTEXPROCESSING 0x00000040L +#define D3DCREATE_MIXED_VERTEXPROCESSING 0x00000080L + +#define D3DCREATE_DISABLE_DRIVER_MANAGEMENT 0x00000100L +#define D3DCREATE_ADAPTERGROUP_DEVICE 0x00000200L + + +/**************************************************************************** + * + * Parameter for IDirect3D9::CreateDevice's iAdapter + * + ****************************************************************************/ + +#define D3DADAPTER_DEFAULT 0 + +/**************************************************************************** + * + * Flags for IDirect3D9::EnumAdapters + * + ****************************************************************************/ + +#define D3DENUM_WHQL_LEVEL 0x00000002L + +/**************************************************************************** + * + * Maximum number of back-buffers supported in DX8 + * + ****************************************************************************/ + +#define D3DPRESENT_BACK_BUFFERS_MAX 3L + +/**************************************************************************** + * + * Flags for IDirect3DDevice9::SetGammaRamp + * + ****************************************************************************/ + +#define D3DSGR_NO_CALIBRATION 0x00000000L +#define D3DSGR_CALIBRATE 0x00000001L + +/**************************************************************************** + * + * Flags for IDirect3DDevice9::SetCursorPosition + * + ****************************************************************************/ + +#define D3DCURSOR_IMMEDIATE_UPDATE 0x00000001L + +/**************************************************************************** + * + * Flags for IDirect3DSwapChain9::Present + * + ****************************************************************************/ + +#define D3DPRESENT_DONOTWAIT 0x00000001L +#define D3DPRESENT_LINEAR_CONTENT 0x00000002L + +/**************************************************************************** + * + * Flags for DrawPrimitive/DrawIndexedPrimitive + * Also valid for Begin/BeginIndexed + * Also valid for VertexBuffer::CreateVertexBuffer + ****************************************************************************/ + + +/* + * DirectDraw error codes + */ +#define _FACD3D 0x876 +#define MAKE_D3DHRESULT( code ) MAKE_HRESULT( 1, _FACD3D, code ) +#define MAKE_D3DSTATUS( code ) MAKE_HRESULT( 0, _FACD3D, code ) + +/* + * Direct3D Errors + */ +#define D3D_OK S_OK + +#define D3DERR_WRONGTEXTUREFORMAT MAKE_D3DHRESULT(2072) +#define D3DERR_UNSUPPORTEDCOLOROPERATION MAKE_D3DHRESULT(2073) +#define D3DERR_UNSUPPORTEDCOLORARG MAKE_D3DHRESULT(2074) +#define D3DERR_UNSUPPORTEDALPHAOPERATION MAKE_D3DHRESULT(2075) +#define D3DERR_UNSUPPORTEDALPHAARG MAKE_D3DHRESULT(2076) +#define D3DERR_TOOMANYOPERATIONS MAKE_D3DHRESULT(2077) +#define D3DERR_CONFLICTINGTEXTUREFILTER MAKE_D3DHRESULT(2078) +#define D3DERR_UNSUPPORTEDFACTORVALUE MAKE_D3DHRESULT(2079) +#define D3DERR_CONFLICTINGRENDERSTATE MAKE_D3DHRESULT(2081) +#define D3DERR_UNSUPPORTEDTEXTUREFILTER MAKE_D3DHRESULT(2082) +#define D3DERR_CONFLICTINGTEXTUREPALETTE MAKE_D3DHRESULT(2086) +#define D3DERR_DRIVERINTERNALERROR MAKE_D3DHRESULT(2087) + +#define D3DERR_NOTFOUND MAKE_D3DHRESULT(2150) +#define D3DERR_MOREDATA MAKE_D3DHRESULT(2151) +#define D3DERR_DEVICELOST MAKE_D3DHRESULT(2152) +#define D3DERR_DEVICENOTRESET MAKE_D3DHRESULT(2153) +#define D3DERR_NOTAVAILABLE MAKE_D3DHRESULT(2154) +#define D3DERR_OUTOFVIDEOMEMORY MAKE_D3DHRESULT(380) +#define D3DERR_INVALIDDEVICE MAKE_D3DHRESULT(2155) +#define D3DERR_INVALIDCALL MAKE_D3DHRESULT(2156) +#define D3DERR_DRIVERINVALIDCALL MAKE_D3DHRESULT(2157) +#define D3DERR_WASSTILLDRAWING MAKE_D3DHRESULT(540) +#define D3DOK_NOAUTOGEN MAKE_D3DSTATUS(2159) + + +#ifdef __cplusplus +}; +#endif + +#endif /* (DIRECT3D_VERSION >= 0x0900) */ +#endif /* _D3D_H_ */ + diff --git a/d3d9proxy/d3dx9.h b/d3d9proxy/d3dx9.h new file mode 100644 index 0000000..cbaabcf --- /dev/null +++ b/d3d9proxy/d3dx9.h @@ -0,0 +1,71 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) Microsoft Corporation. All Rights Reserved. +// +// File: d3dx9.h +// Content: D3DX utility library +// +////////////////////////////////////////////////////////////////////////////// + +#ifdef __D3DX_INTERNAL__ +#error Incorrect D3DX header used +#endif + +#ifndef __D3DX9_H__ +#define __D3DX9_H__ + + +// Defines +#include + +#define D3DX_DEFAULT ((UINT) -1) +#define D3DX_DEFAULT_NONPOW2 ((UINT) -2) +#define D3DX_DEFAULT_FLOAT FLT_MAX + +#ifndef D3DXINLINE +#ifdef _MSC_VER + #if (_MSC_VER >= 1200) + #define D3DXINLINE __forceinline + #else + #define D3DXINLINE __inline + #endif +#else + #ifdef __cplusplus + #define D3DXINLINE inline + #else + #define D3DXINLINE + #endif +#endif +#endif + + +// Includes +#include "d3d9.h" +#include "d3dx9math.h" +#include "d3dx9core.h" +#include "d3dx9mesh.h" +#include "d3dx9tex.h" +#include "d3dx9shader.h" +#include "d3dx9effect.h" +#include "d3dx9shape.h" +#include "d3dx9anim.h" + + +// Errors +#define _FACDD 0x876 +#define MAKE_DDHRESULT( code ) MAKE_HRESULT( 1, _FACDD, code ) + +enum _D3DXERR { + D3DXERR_CANNOTMODIFYINDEXBUFFER = MAKE_DDHRESULT(2900), + D3DXERR_INVALIDMESH = MAKE_DDHRESULT(2901), + D3DXERR_CANNOTATTRSORT = MAKE_DDHRESULT(2902), + D3DXERR_SKINNINGNOTSUPPORTED = MAKE_DDHRESULT(2903), + D3DXERR_TOOMANYINFLUENCES = MAKE_DDHRESULT(2904), + D3DXERR_INVALIDDATA = MAKE_DDHRESULT(2905), + D3DXERR_LOADEDMESHASNODATA = MAKE_DDHRESULT(2906), + D3DXERR_DUPLICATENAMEDFRAGMENT = MAKE_DDHRESULT(2907), +}; + + +#endif //__D3DX9_H__ + diff --git a/d3d9proxy/d3dx9.lib b/d3d9proxy/d3dx9.lib new file mode 100644 index 0000000000000000000000000000000000000000..11853bf0acdaa8f9014a2f665c08ba453f32bf9c GIT binary patch literal 87600 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 zoQueryInterface(riid, ppvObj); + + if (hRes == NOERROR) // if OK, send our "fake" address + { + *ppvObj = this; + } + + return hRes; +} + +ULONG __stdcall myIDirect3D9::AddRef(void) +{ + return(m_pIDirect3D9->AddRef()); +} + +ULONG __stdcall myIDirect3D9::Release(void) +{ + extern myIDirect3D9* gl_pmyIDirect3D9; + + // call original routine + ULONG count = m_pIDirect3D9->Release(); + + // in case no further Ref is there, the Original Object has deleted itself + // so do we here + if (count == 0){ + gl_pmyIDirect3D9 = NULL; + delete(this); + } + + return(count); +} + +HRESULT __stdcall myIDirect3D9::RegisterSoftwareDevice(void* pInitializeFunction) +{ + trace(log, "IDirect3D9::RegisterSoftwareDevice\n"); + return(m_pIDirect3D9->RegisterSoftwareDevice(pInitializeFunction)); +} + +UINT __stdcall myIDirect3D9::GetAdapterCount(void) +{ + trace(log, "IDirect3D9::GetAdapterCount\n"); + return(m_pIDirect3D9->GetAdapterCount()); +} + +HRESULT __stdcall myIDirect3D9::GetAdapterIdentifier(UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) +{ + trace(log, "IDirect3D9::GetAdapterIdentifier\n"); + return(m_pIDirect3D9->GetAdapterIdentifier(Adapter,Flags,pIdentifier)); +} + +UINT __stdcall myIDirect3D9::GetAdapterModeCount(UINT Adapter, D3DFORMAT Format) +{ + trace(log, "IDirect3D9::GetAdapterModeCount\n"); + return(m_pIDirect3D9->GetAdapterModeCount(Adapter, Format)); +} + +HRESULT __stdcall myIDirect3D9::EnumAdapterModes(UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) +{ + trace(log, "IDirect3D9::EnumAdapterModes\n"); + return(m_pIDirect3D9->EnumAdapterModes(Adapter,Format,Mode,pMode)); +} + +HRESULT __stdcall myIDirect3D9::GetAdapterDisplayMode( UINT Adapter,D3DDISPLAYMODE* pMode) +{ + trace(log, "IDirect3D9::GetAdapterDisplayMode\n"); + return(m_pIDirect3D9->GetAdapterDisplayMode(Adapter,pMode)); +} + +HRESULT __stdcall myIDirect3D9::CheckDeviceType(UINT iAdapter,D3DDEVTYPE DevType,D3DFORMAT DisplayFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) +{ + trace(log, "IDirect3D9::CheckDeviceType\n"); + return(m_pIDirect3D9->CheckDeviceType(iAdapter,DevType,DisplayFormat,BackBufferFormat,bWindowed)); +} + +HRESULT __stdcall myIDirect3D9::CheckDeviceFormat(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) +{ + trace(log, "IDirect3D9::CheckDeviceFormat\n"); + return(m_pIDirect3D9->CheckDeviceFormat(Adapter,DeviceType,AdapterFormat,Usage,RType,CheckFormat)); +} + +HRESULT __stdcall myIDirect3D9::CheckDeviceMultiSampleType(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) +{ + trace(log, "IDirect3D9::CheckDeviceMultiSampleType\n"); + return(m_pIDirect3D9->CheckDeviceMultiSampleType(Adapter,DeviceType,SurfaceFormat,Windowed,MultiSampleType,pQualityLevels)); +} + +HRESULT __stdcall myIDirect3D9::CheckDepthStencilMatch(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) +{ + trace(log, "IDirect3D9::CheckDepthStencilMatch\n"); + return(m_pIDirect3D9->CheckDepthStencilMatch(Adapter,DeviceType,AdapterFormat,RenderTargetFormat,DepthStencilFormat)); +} + +HRESULT __stdcall myIDirect3D9::CheckDeviceFormatConversion(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) +{ + trace(log, "IDirect3D9::CheckDeviceFormatConversion\n"); + return(m_pIDirect3D9->CheckDeviceFormatConversion(Adapter,DeviceType,SourceFormat,TargetFormat)); +} + +HRESULT __stdcall myIDirect3D9::GetDeviceCaps(UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) +{ + trace(log, "IDirect3D9::GetDeviceCaps\n"); + return(m_pIDirect3D9->GetDeviceCaps(Adapter,DeviceType,pCaps)); +} + +HMONITOR __stdcall myIDirect3D9::GetAdapterMonitor(UINT Adapter) +{ + trace(log, "IDirect3D9::GetAdapterMonitor\n"); + return(m_pIDirect3D9->GetAdapterMonitor(Adapter)); +} + +HRESULT __stdcall myIDirect3D9::CreateDevice(UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) +{ + trace(log, "IDirect3D9::CreateDevice\n"); + // global var + extern myIDirect3DDevice9* gl_pmyIDirect3DDevice9; + + // we intercept this call and provide our own "fake" Device Object + HRESULT hres = m_pIDirect3D9->CreateDevice( Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface); + + // Create our own Device object and store it in global pointer + // note: the object will delete itself once Ref count is zero (similar to COM objects) + gl_pmyIDirect3DDevice9 = new myIDirect3DDevice9(*ppReturnedDeviceInterface); + + // store our pointer (the fake one) for returning it to the calling progam + *ppReturnedDeviceInterface = gl_pmyIDirect3DDevice9; + + return(hres); +} + diff --git a/d3d9proxy/myIDirect3D9.h b/d3d9proxy/myIDirect3D9.h new file mode 100644 index 0000000..11ef823 --- /dev/null +++ b/d3d9proxy/myIDirect3D9.h @@ -0,0 +1,31 @@ +#pragma once + +class myIDirect3D9 : public IDirect3D9 +{ +public: + myIDirect3D9(IDirect3D9 *pOriginal); + virtual ~myIDirect3D9(void); + + // The original DX9 function definitions + HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObj); + ULONG __stdcall AddRef(void); + ULONG __stdcall Release(void); + HRESULT __stdcall RegisterSoftwareDevice(void* pInitializeFunction); + UINT __stdcall GetAdapterCount(void); + HRESULT __stdcall GetAdapterIdentifier(UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) ; + UINT __stdcall GetAdapterModeCount(UINT Adapter, D3DFORMAT Format); + HRESULT __stdcall EnumAdapterModes(UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) ; + HRESULT __stdcall GetAdapterDisplayMode( UINT Adapter,D3DDISPLAYMODE* pMode) ; + HRESULT __stdcall CheckDeviceType(UINT iAdapter,D3DDEVTYPE DevType,D3DFORMAT DisplayFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) ; + HRESULT __stdcall CheckDeviceFormat(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) ; + HRESULT __stdcall CheckDeviceMultiSampleType(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) ; + HRESULT __stdcall CheckDepthStencilMatch(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) ; + HRESULT __stdcall CheckDeviceFormatConversion(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat); + HRESULT __stdcall GetDeviceCaps(UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) ; + HMONITOR __stdcall GetAdapterMonitor(UINT Adapter) ; + HRESULT __stdcall CreateDevice(UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) ; + // The original DX9 function definitions + +private: + IDirect3D9 *m_pIDirect3D9; +}; diff --git a/d3d9proxy/myIDirect3DDevice9.cpp b/d3d9proxy/myIDirect3DDevice9.cpp new file mode 100644 index 0000000..876b25a --- /dev/null +++ b/d3d9proxy/myIDirect3DDevice9.cpp @@ -0,0 +1,776 @@ +#include "StdAfx.h" +#include "myIDirect3DDevice9.h" +#include "stdio.h" + +#define trace if(log) fprintf + +extern FILE *log; + +myIDirect3DDevice9::myIDirect3DDevice9(IDirect3DDevice9* pOriginal) +{ + m_pIDirect3DDevice9 = pOriginal; // store the pointer to original object +} + +myIDirect3DDevice9::~myIDirect3DDevice9(void) +{ +} + +HRESULT myIDirect3DDevice9::QueryInterface (REFIID riid, void** ppvObj) +{ + trace(log, "IDirect3DDevice9::QueryInterface\n"); + // check if original dll can provide interface. then send *our* address + *ppvObj = NULL; + + HRESULT hRes = m_pIDirect3DDevice9->QueryInterface(riid, ppvObj); + + if (hRes == NOERROR) + { + *ppvObj = this; + } + + return hRes; +} + +ULONG myIDirect3DDevice9::AddRef(void) +{ + trace(log, "IDirect3DDevice9::AddRef\n"); + return(m_pIDirect3DDevice9->AddRef()); +} + +ULONG myIDirect3DDevice9::Release(void) +{ + trace(log, "IDirect3DDevice9::Release\n"); + // ATTENTION: This is a booby-trap ! Watch out ! + // If we create our own sprites, surfaces, etc. (thus increasing the ref counter + // by external action), we need to delete that objects before calling the original + // Release function + + // global var + extern myIDirect3DDevice9* gl_pmyIDirect3DDevice9; + + // release/delete own objects + // ..... + + // Calling original function now + ULONG count = m_pIDirect3DDevice9->Release(); + + // now, the Original Object has deleted itself, so do we here + if(count == 0){ + gl_pmyIDirect3DDevice9 = NULL; + delete(this); // destructor will be called automatically + } + + return (count); +} + +HRESULT myIDirect3DDevice9::TestCooperativeLevel(void) +{ + trace(log, "IDirect3DDevice9::TestCooperativeLevel\n"); + return(m_pIDirect3DDevice9->TestCooperativeLevel()); +} + +UINT myIDirect3DDevice9::GetAvailableTextureMem(void) +{ + trace(log, "IDirect3DDevice9::GetAvailableTextureMem\n"); + return(m_pIDirect3DDevice9->GetAvailableTextureMem()); +} + +HRESULT myIDirect3DDevice9::EvictManagedResources(void) +{ + trace(log, "IDirect3DDevice9::EvictManagedResources\n"); + return(m_pIDirect3DDevice9->EvictManagedResources()); +} + +HRESULT myIDirect3DDevice9::GetDirect3D(IDirect3D9** ppD3D9) +{ + trace(log, "IDirect3DDevice9::GetDirect3D\n"); + return(m_pIDirect3DDevice9->GetDirect3D(ppD3D9)); +} + +HRESULT myIDirect3DDevice9::GetDeviceCaps(D3DCAPS9* pCaps) +{ + trace(log, "IDirect3DDevice9::GetDeviceCaps\n"); + return(m_pIDirect3DDevice9->GetDeviceCaps(pCaps)); +} + +HRESULT myIDirect3DDevice9::GetDisplayMode(UINT iSwapChain,D3DDISPLAYMODE* pMode) +{ + trace(log, "IDirect3DDevice9::GetDisplayMode\n"); + return(m_pIDirect3DDevice9->GetDisplayMode(iSwapChain, pMode)); +} + +HRESULT myIDirect3DDevice9::GetCreationParameters(D3DDEVICE_CREATION_PARAMETERS *pParameters) +{ + trace(log, "IDirect3DDevice9::GetCreationParameters\n"); + return(m_pIDirect3DDevice9->GetCreationParameters(pParameters)); +} + +HRESULT myIDirect3DDevice9::SetCursorProperties(UINT XHotSpot,UINT YHotSpot,IDirect3DSurface9* pCursorBitmap) +{ + trace(log, "IDirect3DDevice9::SetCursorProperties\n"); + return(m_pIDirect3DDevice9->SetCursorProperties(XHotSpot,YHotSpot,pCursorBitmap)); +} + +void myIDirect3DDevice9::SetCursorPosition(int X,int Y,DWORD Flags) +{ + trace(log, "IDirect3DDevice9::SetCursorPosition\n"); + return(m_pIDirect3DDevice9->SetCursorPosition(X,Y,Flags)); +} + +BOOL myIDirect3DDevice9::ShowCursor(BOOL bShow) +{ + trace(log, "IDirect3DDevice9::ShowCursor\n"); + return(m_pIDirect3DDevice9->ShowCursor(bShow)); +} + +HRESULT myIDirect3DDevice9::CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DSwapChain9** pSwapChain) +{ + trace(log, "IDirect3DDevice9::CreateAdditionalSwapChain\n"); + return(m_pIDirect3DDevice9->CreateAdditionalSwapChain(pPresentationParameters,pSwapChain)); +} + +HRESULT myIDirect3DDevice9::GetSwapChain(UINT iSwapChain,IDirect3DSwapChain9** pSwapChain) +{ + trace(log, "IDirect3DDevice9::GetSwapChain\n"); + return(m_pIDirect3DDevice9->GetSwapChain(iSwapChain,pSwapChain)); +} + +UINT myIDirect3DDevice9::GetNumberOfSwapChains(void) +{ + trace(log, "IDirect3DDevice9::GetNumberOfSwapChains\n"); + return(m_pIDirect3DDevice9->GetNumberOfSwapChains()); +} + +HRESULT myIDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPresentationParameters) +{ + trace(log, "IDirect3DDevice9::Reset\n"); + return(m_pIDirect3DDevice9->Reset(pPresentationParameters)); +} + +HRESULT myIDirect3DDevice9::Present(CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) +{ + trace(log, "IDirect3DDevice9::Present\n"); + // we may want to draw own things here before flipping surfaces + // ... draw own stuff ... + // this->ShowWeAreHere(); + + // call original routine + HRESULT hres = m_pIDirect3DDevice9->Present( pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); + + return (hres); +} + +HRESULT myIDirect3DDevice9::GetBackBuffer(UINT iSwapChain,UINT iBackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface9** ppBackBuffer) +{ + trace(log, "IDirect3DDevice9::GetBackBuffer\n"); + return(m_pIDirect3DDevice9->GetBackBuffer(iSwapChain,iBackBuffer,Type,ppBackBuffer)); +} + +HRESULT myIDirect3DDevice9::GetRasterStatus(UINT iSwapChain,D3DRASTER_STATUS* pRasterStatus) +{ + trace(log, "IDirect3DDevice9::GetRasterStatus\n"); + return(m_pIDirect3DDevice9->GetRasterStatus(iSwapChain,pRasterStatus)); +} + +HRESULT myIDirect3DDevice9::SetDialogBoxMode(BOOL bEnableDialogs) +{ + trace(log, "IDirect3DDevice9::SetDialogBoxMode\n"); + return(m_pIDirect3DDevice9->SetDialogBoxMode(bEnableDialogs)); +} + +void myIDirect3DDevice9::SetGammaRamp(UINT iSwapChain,DWORD Flags,CONST D3DGAMMARAMP* pRamp) +{ + trace(log, "IDirect3DDevice9::SetGammaRamp\n"); + return(m_pIDirect3DDevice9->SetGammaRamp(iSwapChain,Flags,pRamp)); +} + +void myIDirect3DDevice9::GetGammaRamp(UINT iSwapChain,D3DGAMMARAMP* pRamp) +{ + trace(log, "IDirect3DDevice9::GetGammaRamp\n"); + return(m_pIDirect3DDevice9->GetGammaRamp(iSwapChain,pRamp)); +} + +HRESULT myIDirect3DDevice9::CreateTexture(UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture9** ppTexture,HANDLE* pSharedHandle) +{ + trace(log, "IDirect3DDevice9::CreateTexture\n"); + return(m_pIDirect3DDevice9->CreateTexture(Width,Height,Levels,Usage,Format,Pool,ppTexture,pSharedHandle)); +} + +HRESULT myIDirect3DDevice9::CreateVolumeTexture(UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture9** ppVolumeTexture,HANDLE* pSharedHandle) +{ + trace(log, "IDirect3DDevice9::CreateVolumeTexture\n"); + return(m_pIDirect3DDevice9->CreateVolumeTexture(Width,Height,Depth,Levels,Usage,Format,Pool,ppVolumeTexture,pSharedHandle)); +} + +HRESULT myIDirect3DDevice9::CreateCubeTexture(UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture9** ppCubeTexture,HANDLE* pSharedHandle) +{ + trace(log, "IDirect3DDevice9::CreateCubeTexture\n"); + return(m_pIDirect3DDevice9->CreateCubeTexture(EdgeLength,Levels,Usage,Format,Pool,ppCubeTexture,pSharedHandle)); +} + +HRESULT myIDirect3DDevice9::CreateVertexBuffer(UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer9** ppVertexBuffer,HANDLE* pSharedHandle) +{ + trace(log, "IDirect3DDevice9::CreateVertexBuffer\n"); + return(m_pIDirect3DDevice9->CreateVertexBuffer(Length,Usage,FVF,Pool,ppVertexBuffer,pSharedHandle)); +} + +HRESULT myIDirect3DDevice9::CreateIndexBuffer(UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer9** ppIndexBuffer,HANDLE* pSharedHandle) +{ + trace(log, "IDirect3DDevice9::CreateIndexBuffer\n"); + return(m_pIDirect3DDevice9->CreateIndexBuffer(Length,Usage,Format,Pool,ppIndexBuffer,pSharedHandle)); +} + +HRESULT myIDirect3DDevice9::CreateRenderTarget(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle) +{ + trace(log, "IDirect3DDevice9::CreateRenderTarget\n"); + return(m_pIDirect3DDevice9->CreateRenderTarget(Width,Height,Format,MultiSample,MultisampleQuality,Lockable,ppSurface,pSharedHandle)); +} + +HRESULT myIDirect3DDevice9::CreateDepthStencilSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle) +{ + trace(log, "IDirect3DDevice9::CreateDepthStencilSurface\n"); + return(m_pIDirect3DDevice9->CreateDepthStencilSurface(Width,Height,Format,MultiSample,MultisampleQuality,Discard,ppSurface,pSharedHandle)); +} + +HRESULT myIDirect3DDevice9::UpdateSurface(IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestinationSurface,CONST POINT* pDestPoint) +{ + trace(log, "IDirect3DDevice9::UpdateSurface\n"); + return(m_pIDirect3DDevice9->UpdateSurface(pSourceSurface,pSourceRect,pDestinationSurface,pDestPoint)); +} + +HRESULT myIDirect3DDevice9::UpdateTexture(IDirect3DBaseTexture9* pSourceTexture,IDirect3DBaseTexture9* pDestinationTexture) +{ + trace(log, "IDirect3DDevice9::UpdateTexture\n"); + return(m_pIDirect3DDevice9->UpdateTexture(pSourceTexture,pDestinationTexture)); +} + +HRESULT myIDirect3DDevice9::GetRenderTargetData(IDirect3DSurface9* pRenderTarget,IDirect3DSurface9* pDestSurface) +{ + trace(log, "IDirect3DDevice9::GetRenderTargetData\n"); + return(m_pIDirect3DDevice9->GetRenderTargetData(pRenderTarget,pDestSurface)); +} + +HRESULT myIDirect3DDevice9::GetFrontBufferData(UINT iSwapChain,IDirect3DSurface9* pDestSurface) +{ + trace(log, "IDirect3DDevice9::GetFrontBufferData\n"); + return(m_pIDirect3DDevice9->GetFrontBufferData(iSwapChain,pDestSurface)); +} + +HRESULT myIDirect3DDevice9::StretchRect(IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestSurface,CONST RECT* pDestRect,D3DTEXTUREFILTERTYPE Filter) +{ + trace(log, "IDirect3DDevice9::StretchRect\n"); + return(m_pIDirect3DDevice9->StretchRect(pSourceSurface,pSourceRect,pDestSurface,pDestRect,Filter)); +} + +HRESULT myIDirect3DDevice9::ColorFill(IDirect3DSurface9* pSurface,CONST RECT* pRect,D3DCOLOR color) +{ + trace(log, "IDirect3DDevice9::ColorFill\n"); + return(m_pIDirect3DDevice9->ColorFill(pSurface,pRect,color)); +} + +HRESULT myIDirect3DDevice9::CreateOffscreenPlainSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle) +{ + trace(log, "IDirect3DDevice9::CreateOffscreenPlainSurface\n"); + return(m_pIDirect3DDevice9->CreateOffscreenPlainSurface(Width,Height,Format,Pool,ppSurface,pSharedHandle)); +} + +HRESULT myIDirect3DDevice9::SetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9* pRenderTarget) +{ + trace(log, "IDirect3DDevice9::SetRenderTarget\n"); + return(m_pIDirect3DDevice9->SetRenderTarget(RenderTargetIndex,pRenderTarget)); +} + +HRESULT myIDirect3DDevice9::GetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9** ppRenderTarget) +{ + trace(log, "IDirect3DDevice9::GetRenderTarget\n"); + return(m_pIDirect3DDevice9->GetRenderTarget(RenderTargetIndex,ppRenderTarget)); +} + +HRESULT myIDirect3DDevice9::SetDepthStencilSurface(IDirect3DSurface9* pNewZStencil) +{ + trace(log, "IDirect3DDevice9::SetDepthStencilSurface\n"); + return(m_pIDirect3DDevice9->SetDepthStencilSurface(pNewZStencil)); +} + +HRESULT myIDirect3DDevice9::GetDepthStencilSurface(IDirect3DSurface9** ppZStencilSurface) +{ + trace(log, "IDirect3DDevice9::GetDepthStencilSurface\n"); + return(m_pIDirect3DDevice9->GetDepthStencilSurface(ppZStencilSurface)); +} + +HRESULT myIDirect3DDevice9::BeginScene(void) +{ + trace(log, "IDirect3DDevice9::BeginScene\n"); + return(m_pIDirect3DDevice9->BeginScene()); +} + +HRESULT myIDirect3DDevice9::EndScene(void) +{ + trace(log, "IDirect3DDevice9::EndScene\n"); + return(m_pIDirect3DDevice9->EndScene()); +} + +HRESULT myIDirect3DDevice9::Clear(DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil) +{ + trace(log, "IDirect3DDevice9::Clear\n"); + return(m_pIDirect3DDevice9->Clear(Count,pRects,Flags,Color,Z,Stencil)); +} + +HRESULT myIDirect3DDevice9::SetTransform(D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix) +{ + trace(log, "IDirect3DDevice9::SetTransform\n"); + return(m_pIDirect3DDevice9->SetTransform(State,pMatrix)); +} + +HRESULT myIDirect3DDevice9::GetTransform(D3DTRANSFORMSTATETYPE State,D3DMATRIX* pMatrix) +{ + trace(log, "IDirect3DDevice9::GetTransform\n"); + return(m_pIDirect3DDevice9->GetTransform(State,pMatrix)); +} + +HRESULT myIDirect3DDevice9::MultiplyTransform(D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix) +{ + trace(log, "IDirect3DDevice9::MultiplyTransform\n"); + return(m_pIDirect3DDevice9->MultiplyTransform(State,pMatrix)); +} + +HRESULT myIDirect3DDevice9::SetViewport(CONST D3DVIEWPORT9* pViewport) +{ + trace(log, "IDirect3DDevice9::SetViewport\n"); + return(m_pIDirect3DDevice9->SetViewport(pViewport)); +} + +HRESULT myIDirect3DDevice9::GetViewport(D3DVIEWPORT9* pViewport) +{ + trace(log, "IDirect3DDevice9::GetViewport\n"); + return(m_pIDirect3DDevice9->GetViewport(pViewport)); +} + +HRESULT myIDirect3DDevice9::SetMaterial(CONST D3DMATERIAL9* pMaterial) +{ + trace(log, "IDirect3DDevice9::SetMaterial\n"); + return(m_pIDirect3DDevice9->SetMaterial(pMaterial)); +} + +HRESULT myIDirect3DDevice9::GetMaterial(D3DMATERIAL9* pMaterial) +{ + trace(log, "IDirect3DDevice9::GetMaterial\n"); + return(m_pIDirect3DDevice9->GetMaterial(pMaterial)); +} + +HRESULT myIDirect3DDevice9::SetLight(DWORD Index,CONST D3DLIGHT9* pLight) +{ + trace(log, "IDirect3DDevice9::SetLight\n"); + return(m_pIDirect3DDevice9->SetLight(Index,pLight)); +} + +HRESULT myIDirect3DDevice9::GetLight(DWORD Index,D3DLIGHT9* pLight) +{ + trace(log, "IDirect3DDevice9::GetLight\n"); + return(m_pIDirect3DDevice9->GetLight(Index,pLight)); +} + +HRESULT myIDirect3DDevice9::LightEnable(DWORD Index,BOOL Enable) +{ + trace(log, "IDirect3DDevice9::LightEnable\n"); + return(m_pIDirect3DDevice9->LightEnable(Index,Enable)); +} + +HRESULT myIDirect3DDevice9::GetLightEnable(DWORD Index,BOOL* pEnable) +{ + trace(log, "IDirect3DDevice9::GetLightEnable\n"); + return(m_pIDirect3DDevice9->GetLightEnable(Index, pEnable)); +} + +HRESULT myIDirect3DDevice9::SetClipPlane(DWORD Index,CONST float* pPlane) +{ + trace(log, "IDirect3DDevice9::SetClipPlane\n"); + return(m_pIDirect3DDevice9->SetClipPlane(Index, pPlane)); +} + +HRESULT myIDirect3DDevice9::GetClipPlane(DWORD Index,float* pPlane) +{ + trace(log, "IDirect3DDevice9::GetClipPlane\n"); + return(m_pIDirect3DDevice9->GetClipPlane(Index,pPlane)); +} + +HRESULT myIDirect3DDevice9::SetRenderState(D3DRENDERSTATETYPE State,DWORD Value) +{ + //trace(log, "IDirect3DDevice9::SetRenderState\n"); + return(m_pIDirect3DDevice9->SetRenderState(State, Value)); +} + +HRESULT myIDirect3DDevice9::GetRenderState(D3DRENDERSTATETYPE State,DWORD* pValue) +{ + trace(log, "IDirect3DDevice9::GetRenderState\n"); + return(m_pIDirect3DDevice9->GetRenderState(State, pValue)); +} + +HRESULT myIDirect3DDevice9::CreateStateBlock(D3DSTATEBLOCKTYPE Type,IDirect3DStateBlock9** ppSB) +{ + trace(log, "IDirect3DDevice9::CreateStateBlock\n"); + return(m_pIDirect3DDevice9->CreateStateBlock(Type,ppSB)); +} + +HRESULT myIDirect3DDevice9::BeginStateBlock(void) +{ + trace(log, "IDirect3DDevice9::BeginStateBlock\n"); + return(m_pIDirect3DDevice9->BeginStateBlock()); +} + +HRESULT myIDirect3DDevice9::EndStateBlock(IDirect3DStateBlock9** ppSB) +{ + trace(log, "IDirect3DDevice9::EndStateBlock\n"); + return(m_pIDirect3DDevice9->EndStateBlock(ppSB)); +} + +HRESULT myIDirect3DDevice9::SetClipStatus(CONST D3DCLIPSTATUS9* pClipStatus) +{ + trace(log, "IDirect3DDevice9::SetClipStatus\n"); + return(m_pIDirect3DDevice9->SetClipStatus(pClipStatus)); +} + +HRESULT myIDirect3DDevice9::GetClipStatus(D3DCLIPSTATUS9* pClipStatus) +{ + trace(log, "IDirect3DDevice9::GetClipStatus\n"); + return(m_pIDirect3DDevice9->GetClipStatus( pClipStatus)); +} + +HRESULT myIDirect3DDevice9::GetTexture(DWORD Stage,IDirect3DBaseTexture9** ppTexture) +{ + trace(log, "IDirect3DDevice9::GetTexture\n"); + return(m_pIDirect3DDevice9->GetTexture(Stage,ppTexture)); +} + +HRESULT myIDirect3DDevice9::SetTexture(DWORD Stage,IDirect3DBaseTexture9* pTexture) +{ + trace(log, "IDirect3DDevice9::SetTexture\n"); + return(m_pIDirect3DDevice9->SetTexture(Stage,pTexture)); +} + +HRESULT myIDirect3DDevice9::GetTextureStageState(DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue) +{ + trace(log, "IDirect3DDevice9::GetTextureStageState\n"); + return(m_pIDirect3DDevice9->GetTextureStageState(Stage,Type, pValue)); +} + +HRESULT myIDirect3DDevice9::SetTextureStageState(DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value) +{ + trace(log, "IDirect3DDevice9::SetTextureStageState\n"); + return(m_pIDirect3DDevice9->SetTextureStageState(Stage,Type,Value)); +} + +HRESULT myIDirect3DDevice9::GetSamplerState(DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD* pValue) +{ + trace(log, "IDirect3DDevice9::GetSamplerState\n"); + return(m_pIDirect3DDevice9->GetSamplerState(Sampler,Type, pValue)); +} + +HRESULT myIDirect3DDevice9::SetSamplerState(DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value) +{ + trace(log, "IDirect3DDevice9::SetSamplerState\n"); + return(m_pIDirect3DDevice9->SetSamplerState(Sampler,Type,Value)); +} + +HRESULT myIDirect3DDevice9::ValidateDevice(DWORD* pNumPasses) +{ + trace(log, "IDirect3DDevice9::ValidateDevice\n"); + return(m_pIDirect3DDevice9->ValidateDevice( pNumPasses)); +} + +HRESULT myIDirect3DDevice9::SetPaletteEntries(UINT PaletteNumber,CONST PALETTEENTRY* pEntries) +{ + trace(log, "IDirect3DDevice9::SetPaletteEntries\n"); + return(m_pIDirect3DDevice9->SetPaletteEntries(PaletteNumber, pEntries)); +} + +HRESULT myIDirect3DDevice9::GetPaletteEntries(UINT PaletteNumber,PALETTEENTRY* pEntries) +{ + trace(log, "IDirect3DDevice9::GetPaletteEntries\n"); + return(m_pIDirect3DDevice9->GetPaletteEntries(PaletteNumber, pEntries)); +} + +HRESULT myIDirect3DDevice9::SetCurrentTexturePalette(UINT PaletteNumber) +{ + trace(log, "IDirect3DDevice9::SetCurrentTexturePalette\n"); + return(m_pIDirect3DDevice9->SetCurrentTexturePalette(PaletteNumber)); +} + +HRESULT myIDirect3DDevice9::GetCurrentTexturePalette(UINT *PaletteNumber) +{ + trace(log, "IDirect3DDevice9::GetCurrentTexturePalette\n"); + return(m_pIDirect3DDevice9->GetCurrentTexturePalette(PaletteNumber)); +} + +HRESULT myIDirect3DDevice9::SetScissorRect(CONST RECT* pRect) +{ + trace(log, "IDirect3DDevice9::SetScissorRect\n"); + return(m_pIDirect3DDevice9->SetScissorRect( pRect)); +} + +HRESULT myIDirect3DDevice9::GetScissorRect( RECT* pRect) +{ + trace(log, "IDirect3DDevice9::GetScissorRect\n"); + return(m_pIDirect3DDevice9->GetScissorRect( pRect)); +} + +HRESULT myIDirect3DDevice9::SetSoftwareVertexProcessing(BOOL bSoftware) +{ + trace(log, "IDirect3DDevice9::SetSoftwareVertexProcessing\n"); + return(m_pIDirect3DDevice9->SetSoftwareVertexProcessing(bSoftware)); +} + +BOOL myIDirect3DDevice9::GetSoftwareVertexProcessing(void) +{ + trace(log, "IDirect3DDevice9::GetSoftwareVertexProcessing\n"); + return(m_pIDirect3DDevice9->GetSoftwareVertexProcessing()); +} + +HRESULT myIDirect3DDevice9::SetNPatchMode(float nSegments) +{ + trace(log, "IDirect3DDevice9::SetNPatchMode\n"); + return(m_pIDirect3DDevice9->SetNPatchMode(nSegments)); +} + +float myIDirect3DDevice9::GetNPatchMode(void) +{ + trace(log, "IDirect3DDevice9::GetNPatchMode\n"); + return(m_pIDirect3DDevice9->GetNPatchMode()); +} + +HRESULT myIDirect3DDevice9::DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount) +{ + trace(log, "IDirect3DDevice9::DrawPrimitive\n"); + return(m_pIDirect3DDevice9->DrawPrimitive(PrimitiveType,StartVertex,PrimitiveCount)); +} + +HRESULT myIDirect3DDevice9::DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount) +{ + trace(log, "IDirect3DDevice9::DrawIndexedPrimitive\n"); + return(m_pIDirect3DDevice9->DrawIndexedPrimitive(PrimitiveType,BaseVertexIndex,MinVertexIndex,NumVertices,startIndex,primCount)); +} + +HRESULT myIDirect3DDevice9::DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT PrimitiveCount,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) +{ + trace(log, "IDirect3DDevice9::DrawPrimitiveUP\n"); + return(m_pIDirect3DDevice9->DrawPrimitiveUP(PrimitiveType,PrimitiveCount,pVertexStreamZeroData,VertexStreamZeroStride)); +} + +HRESULT myIDirect3DDevice9::DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) +{ + trace(log, "IDirect3DDevice9::DrawIndexedPrimitiveUP\n"); + return(m_pIDirect3DDevice9->DrawIndexedPrimitiveUP(PrimitiveType,MinVertexIndex,NumVertices,PrimitiveCount, pIndexData, IndexDataFormat, pVertexStreamZeroData,VertexStreamZeroStride)); +} + +HRESULT myIDirect3DDevice9::ProcessVertices(UINT SrcStartIndex,UINT DestIndex,UINT VertexCount,IDirect3DVertexBuffer9* pDestBuffer,IDirect3DVertexDeclaration9* pVertexDecl,DWORD Flags) +{ + trace(log, "IDirect3DDevice9::ProcessVertices\n"); + return(m_pIDirect3DDevice9->ProcessVertices( SrcStartIndex, DestIndex, VertexCount, pDestBuffer, pVertexDecl, Flags)); +} + +HRESULT myIDirect3DDevice9::CreateVertexDeclaration(CONST D3DVERTEXELEMENT9* pVertexElements,IDirect3DVertexDeclaration9** ppDecl) +{ + trace(log, "IDirect3DDevice9::CreateVertexDeclaration\n"); + return(m_pIDirect3DDevice9->CreateVertexDeclaration( pVertexElements,ppDecl)); +} + +HRESULT myIDirect3DDevice9::SetVertexDeclaration(IDirect3DVertexDeclaration9* pDecl) +{ + trace(log, "IDirect3DDevice9::SetVertexDeclaration\n"); + return(m_pIDirect3DDevice9->SetVertexDeclaration(pDecl)); +} + +HRESULT myIDirect3DDevice9::GetVertexDeclaration(IDirect3DVertexDeclaration9** ppDecl) +{ + trace(log, "IDirect3DDevice9::GetVertexDeclaration\n"); + return(m_pIDirect3DDevice9->GetVertexDeclaration(ppDecl)); +} + +HRESULT myIDirect3DDevice9::SetFVF(DWORD FVF) +{ + trace(log, "IDirect3DDevice9::SetFVF\n"); + return(m_pIDirect3DDevice9->SetFVF(FVF)); +} + +HRESULT myIDirect3DDevice9::GetFVF(DWORD* pFVF) +{ + trace(log, "IDirect3DDevice9::GetFVF\n"); + return(m_pIDirect3DDevice9->GetFVF(pFVF)); +} + +HRESULT myIDirect3DDevice9::CreateVertexShader(CONST DWORD* pFunction,IDirect3DVertexShader9** ppShader) +{ + trace(log, "IDirect3DDevice9::CreateVertexShader\n"); + return(m_pIDirect3DDevice9->CreateVertexShader(pFunction,ppShader)); +} + +HRESULT myIDirect3DDevice9::SetVertexShader(IDirect3DVertexShader9* pShader) +{ + trace(log, "IDirect3DDevice9::SetVertexShader\n"); + return(m_pIDirect3DDevice9->SetVertexShader(pShader)); +} + +HRESULT myIDirect3DDevice9::GetVertexShader(IDirect3DVertexShader9** ppShader) +{ + trace(log, "IDirect3DDevice9::GetVertexShader\n"); + return(m_pIDirect3DDevice9->GetVertexShader(ppShader)); +} + +HRESULT myIDirect3DDevice9::SetVertexShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount) +{ + trace(log, "IDirect3DDevice9::SetVertexShaderConstantF\n"); + return(m_pIDirect3DDevice9->SetVertexShaderConstantF(StartRegister,pConstantData, Vector4fCount)); +} + +HRESULT myIDirect3DDevice9::GetVertexShaderConstantF(UINT StartRegister,float* pConstantData,UINT Vector4fCount) +{ + trace(log, "IDirect3DDevice9::GetVertexShaderConstantF\n"); + return(m_pIDirect3DDevice9->GetVertexShaderConstantF(StartRegister,pConstantData,Vector4fCount)); +} + +HRESULT myIDirect3DDevice9::SetVertexShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount) +{ + trace(log, "IDirect3DDevice9::SetVertexShaderConstantI\n"); + return(m_pIDirect3DDevice9->SetVertexShaderConstantI(StartRegister,pConstantData,Vector4iCount)); +} + +HRESULT myIDirect3DDevice9::GetVertexShaderConstantI(UINT StartRegister,int* pConstantData,UINT Vector4iCount) +{ + trace(log, "IDirect3DDevice9::GetVertexShaderConstantI\n"); + return(m_pIDirect3DDevice9->GetVertexShaderConstantI(StartRegister,pConstantData,Vector4iCount)); +} + +HRESULT myIDirect3DDevice9::SetVertexShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount) +{ + trace(log, "IDirect3DDevice9::SetVertexShaderConstantB\n"); + return(m_pIDirect3DDevice9->SetVertexShaderConstantB(StartRegister,pConstantData,BoolCount)); +} + +HRESULT myIDirect3DDevice9::GetVertexShaderConstantB(UINT StartRegister,BOOL* pConstantData,UINT BoolCount) +{ + trace(log, "IDirect3DDevice9::GetVertexShaderConstantB\n"); + return(m_pIDirect3DDevice9->GetVertexShaderConstantB(StartRegister,pConstantData,BoolCount)); +} + +HRESULT myIDirect3DDevice9::SetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride) +{ + trace(log, "IDirect3DDevice9::SetStreamSource\n"); + return(m_pIDirect3DDevice9->SetStreamSource(StreamNumber,pStreamData,OffsetInBytes,Stride)); +} + +HRESULT myIDirect3DDevice9::GetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9** ppStreamData,UINT* OffsetInBytes,UINT* pStride) +{ + trace(log, "IDirect3DDevice9::GetStreamSource\n"); + return(m_pIDirect3DDevice9->GetStreamSource(StreamNumber,ppStreamData,OffsetInBytes,pStride)); +} + +HRESULT myIDirect3DDevice9::SetStreamSourceFreq(UINT StreamNumber,UINT Divider) +{ + trace(log, "IDirect3DDevice9::SetStreamSourceFreq\n"); + return(m_pIDirect3DDevice9->SetStreamSourceFreq(StreamNumber,Divider)); +} + +HRESULT myIDirect3DDevice9::GetStreamSourceFreq(UINT StreamNumber,UINT* Divider) +{ + trace(log, "IDirect3DDevice9::GetStreamSourceFreq\n"); + return(m_pIDirect3DDevice9->GetStreamSourceFreq(StreamNumber,Divider)); +} + +HRESULT myIDirect3DDevice9::SetIndices(IDirect3DIndexBuffer9* pIndexData) +{ + trace(log, "IDirect3DDevice9::SetIndices\n"); + return(m_pIDirect3DDevice9->SetIndices(pIndexData)); +} + +HRESULT myIDirect3DDevice9::GetIndices(IDirect3DIndexBuffer9** ppIndexData) +{ + trace(log, "IDirect3DDevice9::GetIndices\n"); + return(m_pIDirect3DDevice9->GetIndices(ppIndexData)); +} + +HRESULT myIDirect3DDevice9::CreatePixelShader(CONST DWORD* pFunction,IDirect3DPixelShader9** ppShader) +{ + trace(log, "IDirect3DDevice9::CreatePixelShader\n"); + return(m_pIDirect3DDevice9->CreatePixelShader(pFunction,ppShader)); +} + +HRESULT myIDirect3DDevice9::SetPixelShader(IDirect3DPixelShader9* pShader) +{ + trace(log, "IDirect3DDevice9::SetPixelShader\n"); + return(m_pIDirect3DDevice9->SetPixelShader(pShader)); +} + +HRESULT myIDirect3DDevice9::GetPixelShader(IDirect3DPixelShader9** ppShader) +{ + trace(log, "IDirect3DDevice9::GetPixelShader\n"); + return(m_pIDirect3DDevice9->GetPixelShader(ppShader)); +} + +HRESULT myIDirect3DDevice9::SetPixelShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount) +{ + trace(log, "IDirect3DDevice9::SetPixelShaderConstantF\n"); + return(m_pIDirect3DDevice9->SetPixelShaderConstantF(StartRegister,pConstantData,Vector4fCount)); +} + +HRESULT myIDirect3DDevice9::GetPixelShaderConstantF(UINT StartRegister,float* pConstantData,UINT Vector4fCount) +{ + trace(log, "IDirect3DDevice9::GetPixelShaderConstantF\n"); + return(m_pIDirect3DDevice9->GetPixelShaderConstantF(StartRegister,pConstantData,Vector4fCount)); +} + +HRESULT myIDirect3DDevice9::SetPixelShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount) +{ + trace(log, "IDirect3DDevice9::SetPixelShaderConstantI\n"); + return(m_pIDirect3DDevice9->SetPixelShaderConstantI(StartRegister,pConstantData,Vector4iCount)); +} + +HRESULT myIDirect3DDevice9::GetPixelShaderConstantI(UINT StartRegister,int* pConstantData,UINT Vector4iCount) +{ + trace(log, "IDirect3DDevice9::GetPixelShaderConstantI\n"); + return(m_pIDirect3DDevice9->GetPixelShaderConstantI(StartRegister,pConstantData,Vector4iCount)); +} + +HRESULT myIDirect3DDevice9::SetPixelShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount) +{ + trace(log, "IDirect3DDevice9::SetPixelShaderConstantB\n"); + return(m_pIDirect3DDevice9->SetPixelShaderConstantB(StartRegister,pConstantData,BoolCount)); +} + +HRESULT myIDirect3DDevice9::GetPixelShaderConstantB(UINT StartRegister,BOOL* pConstantData,UINT BoolCount) +{ + trace(log, "IDirect3DDevice9::GetPixelShaderConstantB\n"); + return(m_pIDirect3DDevice9->GetPixelShaderConstantB(StartRegister,pConstantData,BoolCount)); +} + +HRESULT myIDirect3DDevice9::DrawRectPatch(UINT Handle,CONST float* pNumSegs,CONST D3DRECTPATCH_INFO* pRectPatchInfo) +{ + trace(log, "IDirect3DDevice9::DrawRectPatch\n"); + return(m_pIDirect3DDevice9->DrawRectPatch(Handle,pNumSegs, pRectPatchInfo)); +} + +HRESULT myIDirect3DDevice9::DrawTriPatch(UINT Handle,CONST float* pNumSegs,CONST D3DTRIPATCH_INFO* pTriPatchInfo) +{ + trace(log, "IDirect3DDevice9::DrawTriPatch\n"); + return(m_pIDirect3DDevice9->DrawTriPatch(Handle, pNumSegs, pTriPatchInfo)); +} + +HRESULT myIDirect3DDevice9::DeletePatch(UINT Handle) +{ + trace(log, "IDirect3DDevice9::DeletePatch\n"); + return(m_pIDirect3DDevice9->DeletePatch(Handle)); +} + +HRESULT myIDirect3DDevice9::CreateQuery(D3DQUERYTYPE Type,IDirect3DQuery9** ppQuery) +{ + trace(log, "IDirect3DDevice9::CreateQuery\n"); + return(m_pIDirect3DDevice9->CreateQuery(Type,ppQuery)); +} + +// This is our test function +void myIDirect3DDevice9::ShowWeAreHere(void) +{ + D3DRECT rec = {1,1,50,50}; + m_pIDirect3DDevice9->Clear(1, &rec, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255,255,255,0),0 ,0); +} + + diff --git a/d3d9proxy/myIDirect3DDevice9.h b/d3d9proxy/myIDirect3DDevice9.h new file mode 100644 index 0000000..29e29ed --- /dev/null +++ b/d3d9proxy/myIDirect3DDevice9.h @@ -0,0 +1,136 @@ +#pragma once + +class myIDirect3DDevice9 : public IDirect3DDevice9 +{ +public: + myIDirect3DDevice9(IDirect3DDevice9* pOriginal); + virtual ~myIDirect3DDevice9(void); + + // START: The original DX9 function definitions + HRESULT __stdcall QueryInterface (REFIID riid, void** ppvObj); + ULONG __stdcall AddRef(void); + ULONG __stdcall Release(void); + HRESULT __stdcall TestCooperativeLevel(void); + UINT __stdcall GetAvailableTextureMem(void); + HRESULT __stdcall EvictManagedResources(void); + HRESULT __stdcall GetDirect3D(IDirect3D9** ppD3D9); + HRESULT __stdcall GetDeviceCaps(D3DCAPS9* pCaps); + HRESULT __stdcall GetDisplayMode(UINT iSwapChain,D3DDISPLAYMODE* pMode); + HRESULT __stdcall GetCreationParameters(D3DDEVICE_CREATION_PARAMETERS *pParameters); + HRESULT __stdcall SetCursorProperties(UINT XHotSpot,UINT YHotSpot,IDirect3DSurface9* pCursorBitmap); + void __stdcall SetCursorPosition(int X,int Y,DWORD Flags); + BOOL __stdcall ShowCursor(BOOL bShow); + HRESULT __stdcall CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DSwapChain9** pSwapChain) ; + HRESULT __stdcall GetSwapChain(UINT iSwapChain,IDirect3DSwapChain9** pSwapChain); + UINT __stdcall GetNumberOfSwapChains(void); + HRESULT __stdcall Reset(D3DPRESENT_PARAMETERS* pPresentationParameters); + HRESULT __stdcall Present(CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion); + HRESULT __stdcall GetBackBuffer(UINT iSwapChain,UINT iBackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface9** ppBackBuffer); + HRESULT __stdcall GetRasterStatus(UINT iSwapChain,D3DRASTER_STATUS* pRasterStatus); + HRESULT __stdcall SetDialogBoxMode(BOOL bEnableDialogs); + void __stdcall SetGammaRamp(UINT iSwapChain,DWORD Flags,CONST D3DGAMMARAMP* pRamp); + void __stdcall GetGammaRamp(UINT iSwapChain,D3DGAMMARAMP* pRamp); + HRESULT __stdcall CreateTexture(UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture9** ppTexture,HANDLE* pSharedHandle); + HRESULT __stdcall CreateVolumeTexture(UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture9** ppVolumeTexture,HANDLE* pSharedHandle); + HRESULT __stdcall CreateCubeTexture(UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture9** ppCubeTexture,HANDLE* pSharedHandle); + HRESULT __stdcall CreateVertexBuffer(UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer9** ppVertexBuffer,HANDLE* pSharedHandle); + HRESULT __stdcall CreateIndexBuffer(UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer9** ppIndexBuffer,HANDLE* pSharedHandle); + HRESULT __stdcall CreateRenderTarget(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle); + HRESULT __stdcall CreateDepthStencilSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle); + HRESULT __stdcall UpdateSurface(IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestinationSurface,CONST POINT* pDestPoint); + HRESULT __stdcall UpdateTexture(IDirect3DBaseTexture9* pSourceTexture,IDirect3DBaseTexture9* pDestinationTexture); + HRESULT __stdcall GetRenderTargetData(IDirect3DSurface9* pRenderTarget,IDirect3DSurface9* pDestSurface); + HRESULT __stdcall GetFrontBufferData(UINT iSwapChain,IDirect3DSurface9* pDestSurface); + HRESULT __stdcall StretchRect(IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestSurface,CONST RECT* pDestRect,D3DTEXTUREFILTERTYPE Filter); + HRESULT __stdcall ColorFill(IDirect3DSurface9* pSurface,CONST RECT* pRect,D3DCOLOR color); + HRESULT __stdcall CreateOffscreenPlainSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,IDirect3DSurface9** ppSurface,HANDLE* pSharedHandle); + HRESULT __stdcall SetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9* pRenderTarget); + HRESULT __stdcall GetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9** ppRenderTarget); + HRESULT __stdcall SetDepthStencilSurface(IDirect3DSurface9* pNewZStencil); + HRESULT __stdcall GetDepthStencilSurface(IDirect3DSurface9** ppZStencilSurface); + HRESULT __stdcall BeginScene(void); + HRESULT __stdcall EndScene(void); + HRESULT __stdcall Clear(DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil); + HRESULT __stdcall SetTransform(D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix); + HRESULT __stdcall GetTransform(D3DTRANSFORMSTATETYPE State,D3DMATRIX* pMatrix); + HRESULT __stdcall MultiplyTransform(D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix); + HRESULT __stdcall SetViewport(CONST D3DVIEWPORT9* pViewport); + HRESULT __stdcall GetViewport(D3DVIEWPORT9* pViewport); + HRESULT __stdcall SetMaterial(CONST D3DMATERIAL9* pMaterial); + HRESULT __stdcall GetMaterial(D3DMATERIAL9* pMaterial); + HRESULT __stdcall SetLight(DWORD Index,CONST D3DLIGHT9* pLight); + HRESULT __stdcall GetLight(DWORD Index,D3DLIGHT9* pLight); + HRESULT __stdcall LightEnable(DWORD Index,BOOL Enable); + HRESULT __stdcall GetLightEnable(DWORD Index,BOOL* pEnable); + HRESULT __stdcall SetClipPlane(DWORD Index,CONST float* pPlane); + HRESULT __stdcall GetClipPlane(DWORD Index,float* pPlane); + HRESULT __stdcall SetRenderState(D3DRENDERSTATETYPE State,DWORD Value); + HRESULT __stdcall GetRenderState(D3DRENDERSTATETYPE State,DWORD* pValue); + HRESULT __stdcall CreateStateBlock(D3DSTATEBLOCKTYPE Type,IDirect3DStateBlock9** ppSB); + HRESULT __stdcall BeginStateBlock(void); + HRESULT __stdcall EndStateBlock(IDirect3DStateBlock9** ppSB); + HRESULT __stdcall SetClipStatus(CONST D3DCLIPSTATUS9* pClipStatus); + HRESULT __stdcall GetClipStatus(D3DCLIPSTATUS9* pClipStatus); + HRESULT __stdcall GetTexture(DWORD Stage,IDirect3DBaseTexture9** ppTexture); + HRESULT __stdcall SetTexture(DWORD Stage,IDirect3DBaseTexture9* pTexture); + HRESULT __stdcall GetTextureStageState(DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue); + HRESULT __stdcall SetTextureStageState(DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value); + HRESULT __stdcall GetSamplerState(DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD* pValue); + HRESULT __stdcall SetSamplerState(DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value); + HRESULT __stdcall ValidateDevice(DWORD* pNumPasses); + HRESULT __stdcall SetPaletteEntries(UINT PaletteNumber,CONST PALETTEENTRY* pEntries); + HRESULT __stdcall GetPaletteEntries(UINT PaletteNumber,PALETTEENTRY* pEntries); + HRESULT __stdcall SetCurrentTexturePalette(UINT PaletteNumber); + HRESULT __stdcall GetCurrentTexturePalette(UINT *PaletteNumber); + HRESULT __stdcall SetScissorRect(CONST RECT* pRect); + HRESULT __stdcall GetScissorRect( RECT* pRect); + HRESULT __stdcall SetSoftwareVertexProcessing(BOOL bSoftware); + BOOL __stdcall GetSoftwareVertexProcessing(void); + HRESULT __stdcall SetNPatchMode(float nSegments); + float __stdcall GetNPatchMode(void); + HRESULT __stdcall DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount); + HRESULT __stdcall DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount); + HRESULT __stdcall DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT PrimitiveCount,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride); + HRESULT __stdcall DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride); + HRESULT __stdcall ProcessVertices(UINT SrcStartIndex,UINT DestIndex,UINT VertexCount,IDirect3DVertexBuffer9* pDestBuffer,IDirect3DVertexDeclaration9* pVertexDecl,DWORD Flags); + HRESULT __stdcall CreateVertexDeclaration(CONST D3DVERTEXELEMENT9* pVertexElements,IDirect3DVertexDeclaration9** ppDecl); + HRESULT __stdcall SetVertexDeclaration(IDirect3DVertexDeclaration9* pDecl); + HRESULT __stdcall GetVertexDeclaration(IDirect3DVertexDeclaration9** ppDecl); + HRESULT __stdcall SetFVF(DWORD FVF); + HRESULT __stdcall GetFVF(DWORD* pFVF); + HRESULT __stdcall CreateVertexShader(CONST DWORD* pFunction,IDirect3DVertexShader9** ppShader); + HRESULT __stdcall SetVertexShader(IDirect3DVertexShader9* pShader); + HRESULT __stdcall GetVertexShader(IDirect3DVertexShader9** ppShader); + HRESULT __stdcall SetVertexShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount); + HRESULT __stdcall GetVertexShaderConstantF(UINT StartRegister,float* pConstantData,UINT Vector4fCount); + HRESULT __stdcall SetVertexShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount); + HRESULT __stdcall GetVertexShaderConstantI(UINT StartRegister,int* pConstantData,UINT Vector4iCount); + HRESULT __stdcall SetVertexShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount); + HRESULT __stdcall GetVertexShaderConstantB(UINT StartRegister,BOOL* pConstantData,UINT BoolCount); + HRESULT __stdcall SetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride); + HRESULT __stdcall GetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9** ppStreamData,UINT* OffsetInBytes,UINT* pStride); + HRESULT __stdcall SetStreamSourceFreq(UINT StreamNumber,UINT Divider); + HRESULT __stdcall GetStreamSourceFreq(UINT StreamNumber,UINT* Divider); + HRESULT __stdcall SetIndices(IDirect3DIndexBuffer9* pIndexData); + HRESULT __stdcall GetIndices(IDirect3DIndexBuffer9** ppIndexData); + HRESULT __stdcall CreatePixelShader(CONST DWORD* pFunction,IDirect3DPixelShader9** ppShader); + HRESULT __stdcall SetPixelShader(IDirect3DPixelShader9* pShader); + HRESULT __stdcall GetPixelShader(IDirect3DPixelShader9** ppShader); + HRESULT __stdcall SetPixelShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount); + HRESULT __stdcall GetPixelShaderConstantF(UINT StartRegister,float* pConstantData,UINT Vector4fCount); + HRESULT __stdcall SetPixelShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount); + HRESULT __stdcall GetPixelShaderConstantI(UINT StartRegister,int* pConstantData,UINT Vector4iCount); + HRESULT __stdcall SetPixelShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount); + HRESULT __stdcall GetPixelShaderConstantB(UINT StartRegister,BOOL* pConstantData,UINT BoolCount); + HRESULT __stdcall DrawRectPatch(UINT Handle,CONST float* pNumSegs,CONST D3DRECTPATCH_INFO* pRectPatchInfo); + HRESULT __stdcall DrawTriPatch(UINT Handle,CONST float* pNumSegs,CONST D3DTRIPATCH_INFO* pTriPatchInfo); + HRESULT __stdcall DeletePatch(UINT Handle); + HRESULT __stdcall CreateQuery(D3DQUERYTYPE Type,IDirect3DQuery9** ppQuery); + // END: The original DX9 function definitions + +private: + IDirect3DDevice9 *m_pIDirect3DDevice9; + + // This is our test function + void ShowWeAreHere(void); +}; diff --git a/d3d9proxy/proxydll.cpp b/d3d9proxy/proxydll.cpp new file mode 100644 index 0000000..3767409 --- /dev/null +++ b/d3d9proxy/proxydll.cpp @@ -0,0 +1,116 @@ +// proxydll.cpp +#include "stdafx.h" +#include "proxydll.h" +#include "stdio.h" + +// global variables +#pragma data_seg (".d3d9_shared") +myIDirect3DDevice9* gl_pmyIDirect3DDevice9; +myIDirect3D9* gl_pmyIDirect3D9; +HINSTANCE gl_hOriginalDll; +HINSTANCE gl_hThisInstance; +FILE *log; +#pragma data_seg () + +#define trace if(log) fprintf + +BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) +{ + // to avoid compiler lvl4 warnings + LPVOID lpDummy = lpReserved; + lpDummy = NULL; + + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: InitInstance(hModule); break; + case DLL_PROCESS_DETACH: ExitInstance(); break; + + case DLL_THREAD_ATTACH: break; + case DLL_THREAD_DETACH: break; + } + return TRUE; +} + +// Exported function (faking d3d9.dll's one-and-only export) +IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) +{ + trace(log, "Direct3DCreate9\n"); + + if (!gl_hOriginalDll) LoadOriginalDll(); // looking for the "right d3d9.dll" + + // Hooking IDirect3D Object from Original Library + typedef IDirect3D9 *(WINAPI* D3D9_Type)(UINT SDKVersion); + D3D9_Type D3DCreate9_fn = (D3D9_Type) GetProcAddress( gl_hOriginalDll, "Direct3DCreate9"); + + // Debug + if (!D3DCreate9_fn) + { + OutputDebugString("PROXYDLL: Pointer to original D3DCreate9 function not received ERROR ****\r\n"); + ::ExitProcess(0); // exit the hard way + } + + // Request pointer from Original Dll. + IDirect3D9 *pIDirect3D9_orig = D3DCreate9_fn(SDKVersion); + + // Create my IDirect3D8 object and store pointer to original object there. + // note: the object will delete itself once Ref count is zero (similar to COM objects) + gl_pmyIDirect3D9 = new myIDirect3D9(pIDirect3D9_orig); + + // Return pointer to hooking Object instead of "real one" + return (gl_pmyIDirect3D9); +} + +void InitInstance(HANDLE hModule) +{ + char *logpath; + OutputDebugString("PROXYDLL: InitInstance called.\r\n"); + + // Initialisation + gl_hOriginalDll = NULL; + gl_hThisInstance = NULL; + gl_pmyIDirect3D9 = NULL; + gl_pmyIDirect3DDevice9 = NULL; + + // Storing Instance handle into global var + gl_hThisInstance = (HINSTANCE) hModule; + + log=NULL; + logpath=getenv("d3d9log"); + if(logpath) log=fopen(logpath, "a+"); +} + +void LoadOriginalDll(void) +{ + char buffer[MAX_PATH]; + + // Getting path to system dir and to d3d8.dll + ::GetSystemDirectory(buffer,MAX_PATH); + + // Append dll name + strcat(buffer,"\\d3d9.dll"); + + // try to load the system's d3d9.dll, if pointer empty + if (!gl_hOriginalDll) gl_hOriginalDll = ::LoadLibrary(buffer); + + // Debug + if (!gl_hOriginalDll) + { + OutputDebugString("PROXYDLL: Original d3d9.dll not loaded ERROR ****\r\n"); + ::ExitProcess(0); // exit the hard way + } +} + +void ExitInstance() +{ + OutputDebugString("PROXYDLL: ExitInstance called.\r\n"); + + // Release the system's d3d9.dll + if (gl_hOriginalDll) + { + ::FreeLibrary(gl_hOriginalDll); + gl_hOriginalDll = NULL; + } + + fclose(log); +} + diff --git a/d3d9proxy/proxydll.def b/d3d9proxy/proxydll.def new file mode 100644 index 0000000..d74db14 --- /dev/null +++ b/d3d9proxy/proxydll.def @@ -0,0 +1,4 @@ +LIBRARY "d3d9" + +EXPORTS + Direct3DCreate9 @1 diff --git a/d3d9proxy/proxydll.h b/d3d9proxy/proxydll.h new file mode 100644 index 0000000..5a4528b --- /dev/null +++ b/d3d9proxy/proxydll.h @@ -0,0 +1,10 @@ +// proxydll.h +#pragma once + +// Exported function +IDirect3D9* WINAPI Direct3DCreate9 (UINT SDKVersion); + +// regular functions +void InitInstance(HANDLE hModule); +void ExitInstance(void); +void LoadOriginalDll(void); \ No newline at end of file diff --git a/d3d9proxy/proxydll.sln b/d3d9proxy/proxydll.sln new file mode 100644 index 0000000..c88932b --- /dev/null +++ b/d3d9proxy/proxydll.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "proxydll", "proxydll.vcproj", "{02EB97D5-B1C5-411E-8274-83A95985DE6F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {02EB97D5-B1C5-411E-8274-83A95985DE6F}.Debug|Win32.ActiveCfg = Debug|Win32 + {02EB97D5-B1C5-411E-8274-83A95985DE6F}.Debug|Win32.Build.0 = Debug|Win32 + {02EB97D5-B1C5-411E-8274-83A95985DE6F}.Release|Win32.ActiveCfg = Release|Win32 + {02EB97D5-B1C5-411E-8274-83A95985DE6F}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/d3d9proxy/proxydll.suo b/d3d9proxy/proxydll.suo new file mode 100644 index 0000000000000000000000000000000000000000..9d4a040b08aff81bae5d19de12be79b35162bb9c GIT binary patch literal 29184 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/d3d9proxy/stdafx.cpp b/d3d9proxy/stdafx.cpp new file mode 100644 index 0000000..2a015f2 --- /dev/null +++ b/d3d9proxy/stdafx.cpp @@ -0,0 +1,2 @@ +// stdafx.cpp +#include "stdafx.h" \ No newline at end of file diff --git a/d3d9proxy/stdafx.h b/d3d9proxy/stdafx.h new file mode 100644 index 0000000..7202acc --- /dev/null +++ b/d3d9proxy/stdafx.h @@ -0,0 +1,10 @@ +// stdafx.h +#pragma once + + +#define WIN32_LEAN_AND_MEAN +#include + +#include "d3d9.h" +#include "myIDirect3D9.h" +#include "myIDirect3DDevice9.h" diff --git a/dll/advapi.cpp b/dll/advapi.cpp index 7f9444b..3ea6f4b 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -72,7 +72,7 @@ LONG WINAPI extRegOpenKeyEx( FILE *regf; char sKey[256+1]; sprintf(sKey,"%s\\%s", hKey2String(hKey), lpSubKey); - OutTraceD("RegOpenKeyEx: searching for key=\"%s\"\n", sKey); + OutTraceDW("RegOpenKeyEx: searching for key=\"%s\"\n", sKey); regf=fopen("dxwnd.reg","r"); if(regf==NULL) return ERROR_FILE_NOT_FOUND; fgets(RegBuf, 256, regf); @@ -150,7 +150,7 @@ LONG WINAPI extRegQueryValueEx( else { if(hCurKey==hKey){ - //OutTraceD("loop: \"%s\"\n", RegBuf); + //OutTraceDW("loop: \"%s\"\n", RegBuf); if((RegBuf[0]=='"') && !strncmp(lpValueName, &RegBuf[1], strlen(lpValueName)) && (RegBuf[strlen(lpValueName)+1]=='"') && @@ -172,7 +172,7 @@ LONG WINAPI extRegQueryValueEx( } if(lpType) *lpType=REG_SZ; // - OutTraceD("RegQueryValueEx: Data=\"%s\" type=REG_SZ\n", lpData); + OutTraceDW("RegQueryValueEx: Data=\"%s\" type=REG_SZ\n", lpData); res=ERROR_SUCCESS; } if(!strncmp(pData,"dword:",strlen("dword:"))){ //dword value @@ -182,7 +182,7 @@ LONG WINAPI extRegQueryValueEx( memcpy(lpData, &val, sizeof(DWORD)); if(lpType) *lpType=REG_DWORD; *lpcbData=sizeof(DWORD); - OutTraceD("RegQueryValueEx: Data=0x%x type=REG_DWORD\n", val); + OutTraceDW("RegQueryValueEx: Data=0x%x type=REG_DWORD\n", val); res=ERROR_SUCCESS; } if(!strncmp(pData,"hex:",strlen("hex:"))){ //dword value @@ -190,15 +190,15 @@ LONG WINAPI extRegQueryValueEx( lpData[strlen((char *)lpData)-1]=0; // eliminates \n if(lpType) *lpType=REG_BINARY; *lpcbData=0; - OutTraceD("RegQueryValueEx: Data="); + OutTraceDW("RegQueryValueEx: Data="); while(strlen(pData)>1){ sscanf(pData, "%x,", (char *)lpData); - OutTraceD("%02.2x,", *(unsigned char *)lpData); + OutTraceDW("%02.2x,", *(unsigned char *)lpData); pData+=3; lpData++; (*lpcbData)++; } - OutTraceD(" type=REG_BINARY cbData=%d\n", *lpcbData); + OutTraceDW(" type=REG_BINARY cbData=%d\n", *lpcbData); res=ERROR_SUCCESS; } fclose(regf); diff --git a/dll/ddproxy.cpp b/dll/ddproxy.cpp index 7c24b63..018e671 100644 --- a/dll/ddproxy.cpp +++ b/dll/ddproxy.cpp @@ -666,7 +666,7 @@ HRESULT WINAPI extInitializeProxy(LPDIRECTDRAW lpdd, GUID FAR *lpguid) HRESULT res; GUID FAR *lpPrivGuid = lpguid; - OutTraceD("Initialize: lpdd=%x guid=%x(%s)\n", lpdd, lpguid, ExplainGUID(lpguid)); + OutTraceDW("Initialize: lpdd=%x guid=%x(%s)\n", lpdd, lpguid, ExplainGUID(lpguid)); res=(*pInitialize)(lpdd, lpPrivGuid); @@ -2072,18 +2072,18 @@ int WINAPI extGetDeviceCapsProxy(HDC hdc, int nindex) DWORD res; res = (*pGDIGetDeviceCaps)(hdc, nindex); - OutTraceD("GetDeviceCaps: hdc=%x index=%x(%s) res=%x\n", + OutTraceDW("GetDeviceCaps: hdc=%x index=%x(%s) res=%x\n", hdc, nindex, ExplainDeviceCaps(nindex), res); switch(nindex){ case VERTRES: - OutTraceD("GetDeviceCaps: VERTRES=%d\n", res); + OutTraceDW("GetDeviceCaps: VERTRES=%d\n", res); break; case HORZRES: - OutTraceD("GetDeviceCaps: HORZRES=%d\n", res); + OutTraceDW("GetDeviceCaps: HORZRES=%d\n", res); break; case RASTERCAPS: - OutTraceD("GetDeviceCaps: RASTERCAPS=%x(%s)\n",res, ExplainRasterCaps(res)); + OutTraceDW("GetDeviceCaps: RASTERCAPS=%x(%s)\n",res, ExplainRasterCaps(res)); break; } return res; diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index ff6737f..3cc7c50 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -44,6 +44,9 @@ HRESULT WINAPI extSetCooperativeLevel(void *, HWND, DWORD); HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW, DWORD, DWORD, DWORD); HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW, DWORD, HANDLE); + /*** Added in the V2 Interface ***/ +HRESULT WINAPI extGetAvailableVidMem2(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD); +HRESULT WINAPI extGetAvailableVidMem4(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD); /*** Added in the V4 Interface ***/ HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW); // STDMETHOD(StartModeTest)(THIS_ LPSIZE, DWORD, DWORD ) PURE; @@ -147,6 +150,8 @@ SetDisplayMode2_Type pSetDisplayMode2; WaitForVerticalBlank_Type pWaitForVerticalBlank; GetSurfaceFromDC_Type pGetSurfaceFromDC; GetAvailableVidMem_Type pGetAvailableVidMem; +GetAvailableVidMem_Type pGetAvailableVidMem2; +GetAvailableVidMem_Type pGetAvailableVidMem4; RestoreAllSurfaces_Type pRestoreAllSurfaces; TestCooperativeLevel_Type pTestCooperativeLevel; GetDeviceIdentifier_Type pGetDeviceIdentifier; @@ -373,7 +378,7 @@ static char *DumpPixelFormat(LPDDSURFACEDESC2 lpddsd) static void LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) { - if(!IsTraceD) return; + if(!IsTraceDDRAW) return; OutTrace("SurfaceDesc: %s Flags=%x(%s)", label, lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags)); @@ -401,7 +406,7 @@ static void LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) static void DumpPixFmt(LPDDSURFACEDESC2 lpdds) { - OutTraceD("PixelFormat: lpddsd=%x %s\n", DumpPixelFormat(lpdds)); + OutTrace("PixelFormat: lpddsd=%x %s\n", DumpPixelFormat(lpdds)); } static void DumpSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) @@ -448,22 +453,6 @@ void mySetPalette(int dwstart, int dwcount, LPPALETTEENTRY lpentries) for(int idx=0; idxPalette[dwstart+idx]= lpentries[idx]; -#if 0 - typedef struct { - WORD palVersion; - WORD palNumEntries; - PALETTEENTRY palPalEntry[256]; - } LOGPALETTE256; - LOGPALETTE256 GDIPalette; - HPALETTE pal; - GDIPalette.palNumEntries=256; - GDIPalette.palVersion=0; - memcpy(GDIPalette.palPalEntry, lpentries, 256*sizeof(PALETTEENTRY)); - pal=CreatePalette((LOGPALETTE *)&GDIPalette); - SelectPalette(GetDC(dxw.GethWnd()), pal, 0); - RealizePalette(GetDC(dxw.GethWnd())); -#endif - for(i = 0; i < dwcount; i ++){ PALETTEENTRY PalColor; PalColor = lpentries[i]; @@ -487,7 +476,7 @@ void mySetPalette(int dwstart, int dwcount, LPPALETTEENTRY lpentries) (((DWORD)PalColor.peRed & 0xF8) << 8) + (((DWORD)PalColor.peGreen & 0xF8) << 3) + (((DWORD)PalColor.peBlue &0xF8) >> 3); break; default: - OutTraceD("ASSERT: unsupported Color BPP=%d\n", dxw.ActualPixelFormat.dwRGBBitCount); + OutTraceDW("ASSERT: unsupported Color BPP=%d\n", dxw.ActualPixelFormat.dwRGBBitCount); break; } } @@ -505,7 +494,7 @@ void InitDDScreenParameters(LPDIRECTDRAW lpdd) return; } - OutTraceD("InitDDScreenParameters: Actual %s\n", DumpPixelFormat((LPDDSURFACEDESC2)&ddsd)); + OutTraceDW("InitDDScreenParameters: Actual %s\n", DumpPixelFormat((LPDDSURFACEDESC2)&ddsd)); dxw.ActualPixelFormat=ddsd.ddpfPixelFormat; if(dxw.VirtualPixelFormat.dwRGBBitCount==0) dxw.VirtualPixelFormat=ddsd.ddpfPixelFormat; SetBltTransformations(); @@ -524,7 +513,7 @@ void InitDSScreenParameters(LPDIRECTDRAWSURFACE lpdds) } ddsd.ddpfPixelFormat = p; - OutTraceD("InitDSScreenParameters: Actual %s\n", DumpPixelFormat(&ddsd)); + OutTraceDW("InitDSScreenParameters: Actual %s\n", DumpPixelFormat(&ddsd)); dxw.ActualPixelFormat = p; SetBltTransformations(); return; @@ -555,7 +544,7 @@ void InitScreenParameters() // initialize to default null values, but dwRGBBitCount dxw.ActualPixelFormat.dwRGBBitCount=CurrDevMode.dmBitsPerPel; dxw.VirtualPixelFormat.dwRGBBitCount=CurrDevMode.dmBitsPerPel; // until set differently - OutTraceD("InitScreenParameters: RGBBitCount=%d\n", CurrDevMode.dmBitsPerPel); + OutTraceDW("InitScreenParameters: RGBBitCount=%d\n", CurrDevMode.dmBitsPerPel); SetBltTransformations(); return; @@ -622,7 +611,7 @@ int HookDirectDraw(HMODULE module, int version) pSetAppCompatData=(SetAppCompatData_Type)(*pGetProcAddress)(hinst, "SetAppCompatData"); if(pSetAppCompatData) { res=(*pSetAppCompatData)(2, 0); - OutTraceD("HookDirectDraw: SetAppCompatData(2,0) ret=%x(%s)\n", res, ExplainDDError(res)); + OutTraceDW("HookDirectDraw: SetAppCompatData(2,0) ret=%x(%s)\n", res, ExplainDDError(res)); } FreeLibrary(hinst); } @@ -712,7 +701,7 @@ Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE lpdds) if(extUnlock==(void *)extUnlockDir1) return (Unlock4_Type)pUnlock1; if(extUnlock==(void *)extUnlockDir4) return (Unlock4_Type)pUnlock4; sprintf_s(sMsg, 80, "pUnlockMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceD(sMsg); + OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "pUnlockMethod", MB_OK | MB_ICONEXCLAMATION); if (pUnlock4) return pUnlock4; return (Unlock4_Type)pUnlock1; @@ -728,7 +717,7 @@ CreateSurface2_Type pCreateSurfaceMethod(LPDIRECTDRAWSURFACE lpdds) if(extUnlock==(void *)extUnlockDir1) return (CreateSurface2_Type)pCreateSurface1; if(extUnlock==(void *)extUnlockDir4) return (CreateSurface2_Type)pCreateSurface4; sprintf_s(sMsg, 80, "pCreateSurfaceMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceD(sMsg); + OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "pCreateSurfaceMethod", MB_OK | MB_ICONEXCLAMATION); if (pCreateSurface4) return pCreateSurface4; return (CreateSurface2_Type)pCreateSurface1; @@ -744,7 +733,7 @@ int SurfaceDescrSize(LPDIRECTDRAWSURFACE lpdds) if(extUnlock==(void *)extUnlockDir1) return sizeof(DDSURFACEDESC); if(extUnlock==(void *)extUnlockDir4) return sizeof(DDSURFACEDESC2); sprintf_s(sMsg, 80, "pCreateSurfaceMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceD(sMsg); + OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "SurfaceDescrSize", MB_OK | MB_ICONEXCLAMATION); return sizeof(DDSURFACEDESC); } @@ -766,7 +755,7 @@ int lpddsHookedVersion(LPDIRECTDRAWSURFACE lpdds) if(extGetCaps==(void *)extGetCaps4S) return 4; if(extGetCaps==(void *)extGetCaps7S) return 7; sprintf_s(sMsg, 80, "lpddsHookedVersion(%x) can't match %x\n", lpdds, extGetCaps); - OutTraceD(sMsg); + OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "lpddsHookedVersion", MB_OK | MB_ICONEXCLAMATION); return 0; } @@ -787,7 +776,7 @@ int lpddHookedVersion(LPDIRECTDRAW lpdd) if(extCreateSurface==(void *)extCreateSurface2) return 2; if(extCreateSurface==(void *)extCreateSurface1) return 1; sprintf_s(sMsg, 80, "lpddHookedVersion(%x) can't match %x\n", lpdd, extCreateSurface); - OutTraceD(sMsg); + OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "lpddHookedVersion", MB_OK | MB_ICONEXCLAMATION); return 0; } @@ -799,7 +788,7 @@ int lpddHookedVersion(LPDIRECTDRAW lpdd) static void SetPixFmt(LPDDSURFACEDESC2 lpdd) { - OutTraceD("SetPixFmt: BPP=%d Use565=%d NoAlpha=%d\n", + OutTraceDW("SetPixFmt: BPP=%d Use565=%d NoAlpha=%d\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.dwFlags1 & USERGB565 ? 1:0, dxw.dwFlags4 & NOALPHACHANNEL ? 1:0); @@ -823,7 +812,7 @@ static void SetPixFmt(LPDDSURFACEDESC2 lpdd) // remember current virtual settings dxw.VirtualPixelFormat=lpdd->ddpfPixelFormat; - OutTraceD("SetPixFmt: %s\n", DumpPixelFormat(lpdd)); + OutTraceDW("SetPixFmt: %s\n", DumpPixelFormat(lpdd)); } // retrieves the stored pixel format @@ -831,7 +820,7 @@ static void SetPixFmt(LPDDSURFACEDESC2 lpdd) static void GetPixFmt(LPDDSURFACEDESC2 lpdd) { lpdd->ddpfPixelFormat = dxw.VirtualPixelFormat; - OutTraceD("GetPixFmt: %s\n", DumpPixelFormat(lpdd)); + OutTraceDW("GetPixFmt: %s\n", DumpPixelFormat(lpdd)); } /* ------------------------------------------------------------------ */ @@ -859,7 +848,7 @@ int Set_dwSize_From_DDraw(LPDIRECTDRAW lpdd) static void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) { - OutTraceD("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n", + OutTraceDW("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n", *lplpdd, dxversion, GetCurrentThreadId()); // IDIrectDraw::QueryInterface @@ -915,6 +904,11 @@ static void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode1, (void **)&pSetDisplayMode1, "SetDisplayMode(D1)"); // IDIrectDraw::WaitForVerticalBlank SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlank, (void **)&pWaitForVerticalBlank, "WaitForVerticalBlank(D)"); + // IDIrectDraw::GetAvailableVidMem + if (dxversion == 2) + SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem2, (void **)&pGetAvailableVidMem2, "GetAvailableVidMem(D2)"); + if (dxversion == 4) + SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem4, (void **)&pGetAvailableVidMem4, "GetAvailableVidMem(D4)"); // IDIrectDraw::TestCooperativeLevel if (dxversion >= 4) SetHook((void *)(**(DWORD **)lplpdd + 104), extTestCooperativeLevel, (void **)&pTestCooperativeLevel, "TestCooperativeLevel(D)"); @@ -943,9 +937,6 @@ static void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) SetHook((void *)(**(DWORD **)lplpdd + 68), extGetVerticalBlankStatusProxy, (void **)&pGetVerticalBlankStatus, "GetVerticalBlankStatus(D)"); // IDIrectDraw::RestoreDisplayMode SetHook((void *)(**(DWORD **)lplpdd + 76), extRestoreDisplayModeProxy, (void **)&pRestoreDisplayMode, "RestoreDisplayMode(D)"); - // IDIrectDraw::GetAvailableVidMem - if (dxversion >= 2) - SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMemProxy, (void **)&pGetAvailableVidMem, "GetAvailableVidMem(D)"); if (dxversion >= 4){ // IDIrectDraw::GetSurfaceFromDC SetHook((void *)(**(DWORD **)lplpdd + 96), extGetSurfaceFromDCProxy, (void **)&pGetSurfaceFromDC, "GetSurfaceFromDC(D)"); @@ -958,7 +949,7 @@ static void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper) { - OutTraceD("Hooking directdraw clipper dd=%x\n", *lplpDDClipper); + OutTraceDW("Hooking directdraw clipper dd=%x\n", *lplpDDClipper); // IDirectDrawClipper::Release SetHook((void *)(**(DWORD **)lplpDDClipper + 8), extReleaseC, (void **)&pReleaseC, "Release(C)"); @@ -988,7 +979,7 @@ static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper) static void HookDDPalette(LPDIRECTDRAWPALETTE FAR* lplpDDPalette) { - OutTraceD("Hooking directdraw palette dd=%x\n", *lplpDDPalette); + OutTraceDW("Hooking directdraw palette dd=%x\n", *lplpDDPalette); /*** IDirectDrawPalette methods ***/ // IDirectDrawPalette::Release @@ -1012,7 +1003,7 @@ static void HookDDPalette(LPDIRECTDRAWPALETTE FAR* lplpDDPalette) static void HookDDSurfacePrim(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) { - OutTraceD("Hooking surface as primary dds=%x dxversion=%d thread_id=%x\n", + OutTraceDW("Hooking surface as primary dds=%x dxversion=%d thread_id=%x\n", *lplpdds, dxversion, GetCurrentThreadId()); // IDirectDrawSurface::Query @@ -1143,7 +1134,7 @@ static void HookDDSurfacePrim(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) { - OutTraceD("Hooking surface as generic dds=%x dxversion=%d thread_id=%x\n", + OutTraceDW("Hooking surface as generic dds=%x dxversion=%d thread_id=%x\n", *lplpdds, dxversion, GetCurrentThreadId()); // IDirectDrawSurface::QueryInterface @@ -1163,8 +1154,8 @@ static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) // IDirectDrawSurface::GetAttachedSurface switch(dxversion) { case 1: - case 2: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)"); + case 2: + SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)"); break; case 3: SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)"); @@ -1300,7 +1291,7 @@ static void MaskCapsD(LPDDCAPS c1, LPDDCAPS c2) //char sBuf[80+1]; char token[20+1]; DWORD val; - OutTraceD("MaskCaps\n"); + OutTraceDW("MaskCaps\n"); capfile=fopen("dxwnd.cap", "r"); if(!capfile) return; while(TRUE){ @@ -1310,7 +1301,7 @@ static void MaskCapsD(LPDDCAPS c1, LPDDCAPS c2) if(!strcmp(token, "dwCKeyCaps")) c1->dwCKeyCaps &= val; if(!strcmp(token, "dwFXCaps")) c1->dwFXCaps &= val; } - OutTraceD("MaskCaps(D-HW): caps=%x(%s) caps2=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", + OutTraceDW("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), @@ -1326,19 +1317,19 @@ static void MaskCapsD(LPDDCAPS c1, LPDDCAPS c2) HRESULT WINAPI extGetCapsD(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) { HRESULT res; - OutTraceD("GetCaps(D): PROXED lpdd=%x\n", lpdd); + OutTraceDDRAW("GetCaps(D): lpdd=%x\n", lpdd); res=(*pGetCapsD)(lpdd, c1, c2); if(res) OutTraceE("GetCaps(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); else { - if (c1) OutTraceD("GetCaps(D-HW): caps=%x(%s) caps2=%x(%s) palcaps=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", + if (c1) OutTraceDDRAW("GetCaps(D-HW): caps=%x(%s) caps2=%x(%s) palcaps=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", c1->dwCaps, ExplainDDDCaps(c1->dwCaps), c1->dwCaps2, ExplainDDDCaps2(c1->dwCaps2), c1->dwPalCaps, ExplainDDPalCaps(c1->dwPalCaps), c1->dwFXCaps, ExplainDDFXCaps(c1->dwFXCaps), c1->dwFXAlphaCaps, ExplainDDFXALPHACaps(c1->dwFXAlphaCaps), c1->dwCKeyCaps, ExplainDDCKeyCaps(c1->dwCKeyCaps)); - if (c2) OutTraceD("GetCaps(D-SW): caps=%x(%s) caps2=%x(%s) palcaps=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", + if (c2) OutTraceDDRAW("GetCaps(D-SW): caps=%x(%s) caps2=%x(%s) palcaps=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", c2->dwCaps, ExplainDDDCaps(c2->dwCaps), c2->dwCaps2, ExplainDDDCaps2(c2->dwCaps2), c2->dwPalCaps, ExplainDDPalCaps(c2->dwPalCaps), @@ -1373,7 +1364,7 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I HRESULT res; GUID FAR *lpPrivGuid = lpguid; - OutTraceD("DirectDrawCreate: guid=%x(%s)\n", lpguid, ExplainGUID(lpguid)); + OutTraceDDRAW("DirectDrawCreate: guid=%x(%s)\n", lpguid, ExplainGUID(lpguid)); if(!pDirectDrawCreate){ // not hooked yet.... HINSTANCE hinst; @@ -1385,7 +1376,7 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I else{ char sMsg[81]; sprintf_s(sMsg, 80, "DirectDrawCreate hook failed: error=%d\n", GetLastError()); - OutTraceD(sMsg); + OutTraceDW(sMsg); if(IsAssertEnabled) MessageBox(0, sMsg, "Hook", MB_OK | MB_ICONEXCLAMATION); return DDERR_GENERIC; // is there a better one? } @@ -1417,7 +1408,7 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I } break; } - OutTraceD("DirectDrawCreate: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); + OutTraceDDRAW("DirectDrawCreate: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); HookDDSession(lplpdd, dxw.dwDDVersion); @@ -1440,7 +1431,7 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, HRESULT res; GUID FAR *lpPrivGuid = lpguid; - OutTraceD("DirectDrawCreateEx: guid=%x(%s) refiid=%x\n", lpguid, ExplainGUID(lpguid), iid); + OutTraceDDRAW("DirectDrawCreateEx: guid=%x(%s) refiid=%x\n", lpguid, ExplainGUID(lpguid), iid); // v2.1.70: auto-hooking (just in case...) if(!pDirectDrawCreateEx){ // not hooked yet.... @@ -1456,7 +1447,7 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, else{ char sMsg[81]; sprintf_s(sMsg, 80, "DirectDrawCreateEx hook failed: error=%d\n", GetLastError()); - OutTraceD(sMsg); + OutTraceDW(sMsg); if(IsAssertEnabled) MessageBox(0, sMsg, "Hook", MB_OK | MB_ICONEXCLAMATION); return DDERR_GENERIC; // is there a better one? } @@ -1466,7 +1457,7 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, res = (*pDirectDrawCreateEx)(lpPrivGuid, lplpdd, iid, pu); if (res){ - OutTraceD("DirectDrawCreateEx: res=%x(%s)\n",res, ExplainDDError(res)); + OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n",res, ExplainDDError(res)); return res; } @@ -1488,7 +1479,7 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, } break; } - OutTraceD("DirectDrawCreateEx: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); + OutTraceDDRAW("DirectDrawCreateEx: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); HookDDSession(lplpdd,dxw.dwDDVersion); @@ -1500,7 +1491,7 @@ HRESULT WINAPI extInitialize(LPDIRECTDRAW lpdd, GUID FAR *lpguid) HRESULT res; GUID FAR *lpPrivGuid = lpguid; - OutTraceD("Initialize: lpdd=%x guid=%x(%s)\n", lpdd, lpguid, ExplainGUID(lpguid)); + OutTraceDDRAW("Initialize: lpdd=%x guid=%x(%s)\n", lpdd, lpguid, ExplainGUID(lpguid)); if((dxw.dwFlags3 & FORCESHEL) && (lpguid==NULL)) lpPrivGuid=(GUID FAR *)DDCREATE_EMULATIONONLY; @@ -1519,7 +1510,7 @@ HRESULT WINAPI extQueryInterfaceD(void *lpdd, REFIID riid, LPVOID *obp) unsigned int dwLocalD3DVersion; res = (*pQueryInterfaceD)(lpdd, riid, obp); - OutTraceD("QueryInterface(D): lpdd=%x REFIID=%x(%s) obp=%x ret=%x at %d\n", + OutTraceDDRAW("QueryInterface(D): lpdd=%x REFIID=%x(%s) obp=%x ret=%x at %d\n", lpdd, riid.Data1, ExplainGUID((GUID *)&riid), *obp, res, __LINE__); if(res) return res; @@ -1553,15 +1544,15 @@ HRESULT WINAPI extQueryInterfaceD(void *lpdd, REFIID riid, LPVOID *obp) break; } if (! *obp) { - OutTraceD("QueryInterface(D): Interface for DX version %d not found\n", dwLocalDDVersion); + OutTraceDDRAW("QueryInterface(D): Interface for DX version %d not found\n", dwLocalDDVersion); return(0); } - if(dwLocalDDVersion) OutTraceD("QueryInterface(D): Got interface for DX version %d\n", dwLocalDDVersion); - if(dwLocalD3DVersion) OutTraceD("QueryInterface(D): Got interface for D3D version %d\n", dwLocalD3DVersion); + if(dwLocalDDVersion) OutTraceDW("QueryInterface(D): Got interface for DX version %d\n", dwLocalDDVersion); + if(dwLocalD3DVersion) OutTraceDW("QueryInterface(D): Got interface for D3D version %d\n", dwLocalD3DVersion); if (dwLocalDDVersion > dxw.dwMaxDDVersion) { *obp = NULL; - OutTraceD("QueryInterface(D): lpdd=%x REFIID=%x obp=(NULL) ret=%x at %d\n", + OutTraceDW("QueryInterface(D): lpdd=%x REFIID=%x obp=(NULL) ret=%x at %d\n", lpdd, riid.Data1, res, __LINE__); return(0); } @@ -1587,7 +1578,7 @@ HRESULT WINAPI extQueryInterfaceD(void *lpdd, REFIID riid, LPVOID *obp) break; } - OutTraceD("QueryInterface(D): lpdd=%x REFIID=%x obp=%x DDVersion=%d ret=0\n", + OutTraceDDRAW("QueryInterface(D): lpdd=%x REFIID=%x obp=%x DDVersion=%d ret=0\n", lpdd, riid.Data1, *obp, dxw.dwDDVersion); return 0; @@ -1604,7 +1595,7 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) BOOL IsGammaRamp; unsigned int dwLocalDDVersion; - OutTraceD("QueryInterface(S): lpdds=%x REFIID=%x(%s) obp=%x\n", + OutTraceDDRAW("QueryInterface(S): lpdds=%x REFIID=%x(%s) obp=%x\n", lpdds, riid.Data1, ExplainGUID((GUID *)&riid), *obp); IsPrim=dxw.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); @@ -1629,35 +1620,36 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) dwLocalDDVersion = 7; break; case 0x84e63de0: + OutTraceDW("QueryInterface: IID_IDirect3DHALDevice\n"); if (dxw.dwFlags3 & DISABLEHAL){ // IID_IDirect3DHALDevice - Dark Vengeance // this is odd: this piece of code returns the very same error code returned by the actual // QueryInterface call, but avoid a memory corruption and makes the game working.... // there must be something wrong behind it. - OutTraceD("QueryInterface: suppress IID_IDirect3DHALDevice interface res=DDERR_GENERIC\n"); + OutTraceDW("QueryInterface: suppress IID_IDirect3DHALDevice interface res=DDERR_GENERIC\n"); return DDERR_GENERIC; } break; case 0xA4665C60: // IID_IDirect3DRGBDevice - OutTraceD("QueryInterface: IID_IDirect3DRGBDevice\n"); + OutTraceDW("QueryInterface: IID_IDirect3DRGBDevice\n"); break; case 0xF2086B20: // IID_IDirect3DRampDevice - OutTraceD("QueryInterface: IID_IDirect3DRampDevice\n"); + OutTraceDW("QueryInterface: IID_IDirect3DRampDevice\n"); break; case 0x881949a1: // IID_IDirect3DMMXDevice - OutTraceD("QueryInterface: IID_IDirect3DMMXDevice\n"); + OutTraceDW("QueryInterface: IID_IDirect3DMMXDevice\n"); break; case 0x4B9F0EE0: - OutTraceD("QueryInterface: IID_IDirectDrawColorControl\n"); + OutTraceDW("QueryInterface: IID_IDirectDrawColorControl\n"); break; case 0x69C11C3E: - OutTraceD("QueryInterface: IID_IDirectDrawGammaControl\n"); + OutTraceDW("QueryInterface: IID_IDirectDrawGammaControl\n"); IsGammaRamp=TRUE; break; } if (dwLocalDDVersion > dxw.dwMaxDDVersion) { *obp = NULL; - OutTraceD("QueryInterface(S): DDVersion=%d SUPPRESSED lpdds=%x(%s) REFIID=%x obp=(NULL) ret=0 at %d\n", + OutTraceDW("QueryInterface(S): DDVersion=%d SUPPRESSED lpdds=%x(%s) REFIID=%x obp=(NULL) ret=0 at %d\n", dwLocalDDVersion, lpdds, IsPrim?"":"(PRIM)", riid.Data1, __LINE__); return(0); } @@ -1666,18 +1658,18 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) if(res) // added trace { - OutTraceD("QueryInterface(S): ERROR lpdds=%x%s REFIID=%x obp=%x ret=%x(%s) at %d\n", + OutTraceDW("QueryInterface(S): ERROR lpdds=%x%s REFIID=%x obp=%x ret=%x(%s) at %d\n", lpdds, IsPrim?"(PRIM)":"", riid.Data1, *obp, res, ExplainDDError(res), __LINE__); return res; } if (! *obp) { - OutTraceD("QueryInterface(S): Interface for DX version %d not found\n", dwLocalDDVersion); + OutTraceDW("QueryInterface(S): Interface for DX version %d not found\n", dwLocalDDVersion); return(0); } // added trace - OutTraceD("QueryInterface(S): lpdds=%x%s REFIID=%x obp=%x DDVersion=%d ret=0\n", + OutTraceDDRAW("QueryInterface(S): lpdds=%x%s REFIID=%x obp=%x DDVersion=%d ret=0\n", lpdds, IsPrim?"(PRIM)":"", riid.Data1, *obp, dwLocalDDVersion); switch (dwLocalDDVersion){ @@ -1688,7 +1680,7 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) case 7: dxw.dwDDVersion=dwLocalDDVersion; if(IsPrim){ - OutTraceD("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); + OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); dxw.MarkPrimarySurface((LPDIRECTDRAWSURFACE)*obp); HookDDSurfacePrim((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion); } @@ -1711,7 +1703,7 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) if((lpdds == lpDDSBack) && dwLocalDDVersion) { // assume that you always use the newer interface version, if available. if(dwLocalDDVersion > (UINT)iBakBufferVersion){ - OutTraceD("QueryInterface(S): switching backbuffer %x -> %x\n", lpDDSBack, *obp); + OutTraceDW("QueryInterface(S): switching backbuffer %x -> %x\n", lpDDSBack, *obp); lpDDSBack = (LPDIRECTDRAWSURFACE)*obp; iBakBufferVersion = dwLocalDDVersion; } @@ -1726,7 +1718,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, DDSURFACEDESC2 ddsd; HRESULT res = 0; - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("SetDisplayMode: version=%d dwWidth=%i dwHeight=%i dwBPP=%i", version, dwwidth, dwheight, dwbpp); if (version==2) OutTrace(" dwRefresh=%i dwFlags=%x\n", dwrefreshrate, dwflags); @@ -1745,11 +1737,11 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, ddsd.dwSize=sizeof(ddsd); SetPixFmt(&ddsd); SetBltTransformations(); - OutTraceD("SetDisplayMode: mode=EMULATE %s ret=OK\n", DumpPixelFormat(&ddsd)); + OutTraceDW("SetDisplayMode: mode=EMULATE %s ret=OK\n", DumpPixelFormat(&ddsd)); return DD_OK; } - OutTraceD("SetDisplayMode: mode=STANDARD BPP=%d\n", dwbpp); + OutTraceDW("SetDisplayMode: mode=STANDARD BPP=%d\n", dwbpp); dxw.ActualPixelFormat.dwRGBBitCount = dwbpp; ZeroMemory(&ddsd, sizeof(ddsd)); @@ -1764,7 +1756,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, else res = (*pSetDisplayMode2)(lpdd, ddsd.dwWidth, ddsd.dwHeight, dwbpp, ddsd.dwRefreshRate, 0); - OutTraceD("SetDisplayMode: fixing colordepth current=%d required=%d size=(%dx%d)\n", + OutTraceDW("SetDisplayMode: fixing colordepth current=%d required=%d size=(%dx%d)\n", ddsd.ddpfPixelFormat.dwRGBBitCount, dwbpp, ddsd.dwWidth, ddsd.dwHeight); return 0; @@ -1784,7 +1776,7 @@ HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW lpdd, HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) { - OutTraceD("GetDisplayMode\n"); + OutTraceDDRAW("GetDisplayMode: lpdd=%x lpddsd=%s\n", lpdd, lpddsd); (*pGetDisplayMode)(lpdd, lpddsd); if(dxw.dwFlags1 & EMULATESURFACE) { @@ -1798,10 +1790,10 @@ HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &lpddsd->ddpfPixelFormat); if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &lpddsd->ddpfPixelFormat); - OutTraceD("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount); + OutTraceDW("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount); } - //OutTraceD("GetDisplayMode: returning WxH=(%dx%d) PixelFormat Flags=%x(%s) RGBBitCount=%d RGBAmask=(%x,%x,%x,%x) Caps=%x(%s)\n", + //OutTraceDW("GetDisplayMode: returning WxH=(%dx%d) PixelFormat Flags=%x(%s) RGBBitCount=%d RGBAmask=(%x,%x,%x,%x) Caps=%x(%s)\n", // lpddsd->dwWidth, lpddsd->dwHeight, // lpddsd->ddpfPixelFormat.dwFlags, ExplainPixelFormatFlags(lpddsd->ddpfPixelFormat.dwFlags), // lpddsd->ddpfPixelFormat.dwRGBBitCount, @@ -1809,7 +1801,7 @@ HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) // lpddsd->ddpfPixelFormat.dwRGBAlphaBitMask, // lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); - OutTraceD("GetDisplayMode: returning size=(%dx%d) %s\n", lpddsd->dwWidth, lpddsd->dwHeight, DumpPixelFormat((LPDDSURFACEDESC2)lpddsd)); + OutTraceDDRAW("GetDisplayMode: returning size=(%dx%d) %s\n", lpddsd->dwWidth, lpddsd->dwHeight, DumpPixelFormat((LPDDSURFACEDESC2)lpddsd)); return 0; } @@ -1818,7 +1810,7 @@ void FixWindowFrame(HWND hwnd) { LONG nOldStyle; - OutTraceD("FixWindowFrame: hwnd=%x\n", hwnd); + OutTraceDW("FixWindowFrame: hwnd=%x\n", hwnd); nOldStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); if (!nOldStyle){ @@ -1826,7 +1818,7 @@ void FixWindowFrame(HWND hwnd) return; } - OutTraceD("FixWindowFrame: style=%x(%s)\n",nOldStyle,ExplainStyle(nOldStyle)); + OutTraceDW("FixWindowFrame: style=%x(%s)\n",nOldStyle,ExplainStyle(nOldStyle)); // fix style if (!(*pSetWindowLong)(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW)){ @@ -1848,7 +1840,7 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) { HRESULT res; - OutTraceD("SetCooperativeLevel: hwnd=%x dwFlags=%x(%s)\n", + OutTraceDDRAW("SetCooperativeLevel: hwnd=%x dwFlags=%x(%s)\n", hwnd, dwflags,ExplainCoopFlags(dwflags)); InitDDScreenParameters((LPDIRECTDRAW)lpdd); @@ -1863,7 +1855,7 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) // that is legitimate, but setting against desktop window gives an error code - so // the zero hwnd redirection had to be moved within the FULLSCREEN if case. if(dxw.IsRealDesktop(hwnd)){ - OutTraceD("SetCooperativeLevel: desktop hwnd=%x -> %x\n", hwnd, dxw.GethWnd()); + OutTraceDW("SetCooperativeLevel: desktop hwnd=%x -> %x\n", hwnd, dxw.GethWnd()); hwnd=dxw.GethWnd(); } dxw.SetFullScreen(TRUE); @@ -2175,7 +2167,7 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) if(!(lpddsd->dwFlags & DDSD_CAPS)) lpddsd->ddsCaps.dwCaps = 0; - OutTraceD("FixSurfaceCaps: Flags=%x(%s) Caps=%x(%s)\n", + OutTraceDW("FixSurfaceCaps: Flags=%x(%s) Caps=%x(%s)\n", lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags), lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); if(dxw.dwFlags3 & ANALYTICMODE) return FixSurfaceCapsAnalytic(lpddsd, dxversion); @@ -2272,7 +2264,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf // then save it dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; - OutTraceD("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); + OutTraceDW("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT); ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); @@ -2300,7 +2292,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf } } - OutTraceD("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); HookDDSurfacePrim(lplpdds, dxversion); @@ -2312,7 +2304,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){ - OutTraceD("CreateSurface: ASSERT DDSEmu_Prim already exists\n"); + OutTraceDW("CreateSurface: ASSERT DDSEmu_Prim already exists\n"); res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim); // ok only if the previous surface has the good properties!!! (*pReleaseS)(lpDDSEmu_Prim); } @@ -2321,7 +2313,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } - OutTraceD("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); + OutTraceDW("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); InitDSScreenParameters(lpDDSEmu_Prim); dxw.MarkRegularSurface(lpDDSEmu_Prim); @@ -2344,7 +2336,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } - OutTraceD("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); + OutTraceDW("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); dxw.MarkRegularSurface(lpDDSEmu_Back); if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); @@ -2382,7 +2374,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf } } - OutTraceD("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); if(dxw.dwFlags1 & EMULATEBUFFER){ @@ -2401,7 +2393,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); return res; } - OutTraceD("CreateSurface: created FIX DDSPrim=%x\n", *lplpdds); + OutTraceDW("CreateSurface: created FIX DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim(2)", __LINE__); } @@ -2435,7 +2427,7 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS return res; } - OutTraceD("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! lpBackBufferDD = lpdd; // v2.02.31 @@ -2469,13 +2461,13 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS (*pReleaseS)(lpPrim); ddsd.dwWidth = prim.dwWidth; ddsd.dwHeight = prim.dwHeight; - OutTraceD("BMX FIX: res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight); + OutTraceDW("BMX FIX: res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight); } DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]" , __LINE__); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res) { if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){ - OutTraceD("CreateSurface: CreateSurface DDERR_OUTOFVIDEOMEMORY ERROR at %d, retry in SYSTEMMEMORY\n", __LINE__); + OutTraceDW("CreateSurface: CreateSurface DDERR_OUTOFVIDEOMEMORY ERROR at %d, retry in SYSTEMMEMORY\n", __LINE__); ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; // try ... ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; // try ... res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); @@ -2486,7 +2478,7 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS } } - OutTraceD("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! lpBackBufferDD = lpdd; // v2.02.31 @@ -2510,7 +2502,7 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf return res; } - OutTraceD("CreateSurface: created Emu_Generic dds=%x\n", *lplpdds); + OutTraceDW("CreateSurface: created Emu_Generic dds=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSEmu_Generic", __LINE__); // diagnostic hooks .... HookDDSurfaceGeneric(lplpdds, dxversion); @@ -2527,7 +2519,7 @@ static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); if(res){ if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){ - OutTraceD("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); + OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); @@ -2537,13 +2529,13 @@ static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf return res; } } - OutTraceD("CreateSurface: created GENERIC surface dds=%x flags=%x(%s) caps=%x(%s)\n", + OutTraceDW("CreateSurface: created GENERIC surface dds=%x flags=%x(%s) caps=%x(%s)\n", *lplpdds, lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags), lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); // hooks .... HookDDSurfaceGeneric(lplpdds, dxversion); - OutTraceD("CreateSurface: created lpdds=%x type=Generic ret=%x\n", *lplpdds, res); + OutTraceDW("CreateSurface: created lpdds=%x type=Generic ret=%x\n", *lplpdds, res); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "Generic", __LINE__); //v2.02.44 bug fix return DD_OK; @@ -2573,7 +2565,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate BuildGeneric = BuildGenericDir; } - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("CreateSurface: Version=%d lpdd=%x ", dxversion, lpdd); LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__); } @@ -2584,14 +2576,14 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate char sMsg[81]; sprintf_s(sMsg,80, "CreateSurface: ASSERT bad dwSize=%d dxversion=%d\n", lpddsd->dwSize, dxversion); - OutTraceD(sMsg); + OutTraceDW(sMsg); if(IsAssertEnabled) MessageBox(0, sMsg, "CreateSurface", MB_OK | MB_ICONEXCLAMATION); return DDERR_INVALIDPARAMS; } //GHO workaround (needed for WarWind, Rogue Spear): if (lpddsd->dwFlags && !(lpddsd->dwFlags & 0x1)){ - OutTraceD("CreateSurface: fixing illegal dwFlags value: %x -> %x\n", + OutTraceDW("CreateSurface: fixing illegal dwFlags value: %x -> %x\n", lpddsd->dwFlags, lpddsd->dwFlags+1); lpddsd->dwFlags++; } @@ -2631,13 +2623,13 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) BBCount=ddsd.dwBackBufferCount; if ((BBCount > 0) && (iBakBufferVersion < 4)){ lpDDSBack=NULL; - OutTraceD("CreateSurface: backbuffer cleared - BackBufferCount=%d\n", BBCount); + OutTraceDW("CreateSurface: backbuffer cleared - BackBufferCount=%d\n", BBCount); } if (BBCount > MAXBACKBUFFERS){ char sMsg[81]; sprintf_s(sMsg, 80, "CreateSurface: BackBufferCount=%d\n", BBCount); - OutTraceD(sMsg); + OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "CreateSurface", MB_OK | MB_ICONEXCLAMATION); // recover ... BBCount = MAXBACKBUFFERS; @@ -2665,7 +2657,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate lpDDSBack->AddRef(); // should it be repeated BBCount times???? } - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("CreateSurface: created DDSPrim=%x DDSBack=%x", lpDDSPrim, lpDDSBack); if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)) OutTrace(" DDSEmu_Prim=%x", lpDDSEmu_Prim); if(dxw.dwFlags1 & EMULATESURFACE) OutTrace(" DDSEmu_Back=%x", lpDDSEmu_Back); @@ -2680,7 +2672,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate // a request for a separate (not complex) backbuffer to attach later on, maybe. if ((ddsd.dwFlags & DDSD_CAPS) && (ddsd.ddsCaps.dwCaps & DDSCAPS_BACKBUFFER)){ if (lpDDSBack) { - OutTraceD("CreateSurface: returning current DDSBack=%x\n", lpDDSBack); + OutTraceDW("CreateSurface: returning current DDSBack=%x\n", lpDDSBack); *lplpdds = lpDDSBack; return DD_OK; } @@ -2696,7 +2688,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { lpDDZBuffer=*lplpdds; DDZBufferCaps = lpddsd->ddsCaps.dwCaps; - OutTraceD("CreateSurface: lpDDZBuffer=%x save ZBUFFER caps=%x(%s)\n", lpDDZBuffer, DDZBufferCaps, ExplainDDSCaps(DDZBufferCaps)); + OutTraceDW("CreateSurface: lpDDZBuffer=%x save ZBUFFER caps=%x(%s)\n", lpDDZBuffer, DDZBufferCaps, ExplainDDSCaps(DDZBufferCaps)); } res=BuildGeneric(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, pu); @@ -2736,12 +2728,12 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet IsPrim=dxw.IsAPrimarySurface(lpdds); IsBack=dxw.IsABackBufferSurface(lpdds); - OutTraceD("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", + OutTraceDDRAW("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps)); #if 0 if(lpddsc->dwCaps & DDSCAPS_MIPMAP){ - OutTraceD("GetAttachedSurface: emulate MIPMAP capability\n"); + OutTraceDW("GetAttachedSurface: emulate MIPMAP capability\n"); lpddsc->dwCaps &= ~DDSCAPS_MIPMAP; } #endif @@ -2751,7 +2743,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet // //if (IsBack && (lpddsc->dwCaps & DDSCAPS_ZBUFFER) && lpDDZBuffer){ // *lplpddas = lpDDZBuffer; - // OutTraceD("GetAttachedSurface(%d): emulating ZBUFFER attach on BACKBUFFER lpddsadd=%x\n", dxversion, *lplpddas); + // OutTraceDW("GetAttachedSurface(%d): emulating ZBUFFER attach on BACKBUFFER lpddsadd=%x\n", dxversion, *lplpddas); // return 0; //} @@ -2764,7 +2756,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet if (IsBack && (DDSD_Prim.dwBackBufferCount > 1)){ *lplpddas = lpDDSBack; - OutTraceD("GetAttachedSurface(%d): DOUBLEBUFFER attached=%x\n", dxversion, *lplpddas); + OutTraceDW("GetAttachedSurface(%d): DOUBLEBUFFER attached=%x\n", dxversion, *lplpddas); return 0; } @@ -2774,12 +2766,12 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet if(IsPrim && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))) { // v2.02.42 added DDSCAPS_FLIP for Empire Earth if (lpDDSBack) { *lplpddas = lpDDSBack; - OutTraceD("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); + OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); return 0; } else { *lplpddas = NULL; - OutTraceD("GetAttachedSurface(%d): no attached BACKBUFFER\n", dxversion); + OutTraceDW("GetAttachedSurface(%d): no attached BACKBUFFER\n", dxversion); return DDERR_NOTFOUND; } } @@ -2790,7 +2782,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet if(res) OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); else - OutTraceD("GetAttachedSurface(%d): attached=%x\n", dxversion, *lplpddas); + OutTraceDDRAW("GetAttachedSurface(%d): attached=%x\n", dxversion, *lplpddas); return res; } @@ -2817,18 +2809,18 @@ HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpdds static void BlitError(HRESULT res, LPRECT lps, LPRECT lpd, int line) { - OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), line); + OutTrace("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), line); if (res==DDERR_INVALIDRECT){ if (lps) - OutTraceE(" src=(%d,%d)-(%d,%d)",lps->left, lps->top, lps->right, lps->bottom); + OutTrace(" src=(%d,%d)-(%d,%d)",lps->left, lps->top, lps->right, lps->bottom); else - OutTraceE(" src=(NULL)"); + OutTrace(" src=(NULL)"); if (lpd) - OutTraceE(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom); + OutTrace(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom); else - OutTraceE(" dest=(NULL)"); + OutTrace(" dest=(NULL)"); } - OutTraceE("\n"); + OutTrace("\n"); return; } @@ -2868,7 +2860,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, CleanRect(&lpsrcrect,__LINE__); // log - if(IsTraceD){ + if(IsTraceDW){ char sLog[256]; char sInfo[128]; sprintf(sLog, "%s: dest=%x%s src=%x%s dwFlags=%x(%s)", @@ -3037,7 +3029,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, if (isFlipping){ // handle the flipping chain ... lpddssrc=lpDDSBack; - OutTraceD("Flip: setting flip chain to lpdds=%x\n", lpddssrc); + OutTraceDW("Flip: setting flip chain to lpdds=%x\n", lpddssrc); } } @@ -3124,7 +3116,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, HRESULT res; IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n", + OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n", lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); if (!IsPrim){ @@ -3139,7 +3131,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, sd.dwSize=Set_dwSize_From_Surface(lpdds); res=lpdds->GetSurfaceDesc((DDSURFACEDESC *)&sd); - if (res) OutTraceD("Flip: GetSurfaceDesc res=%x at %d\n",res, __LINE__); + if (res) OutTraceDW("Flip: GetSurfaceDesc res=%x at %d\n",res, __LINE__); // replace these CAPS (good for seven kingdoms II) with same as lpdds surface //ddsc.dwCaps=DDSCAPS_OFFSCREENPLAIN+DDSCAPS_SYSTEMMEMORY; @@ -3220,7 +3212,7 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, CleanRect(&lpsrcrect,__LINE__); - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("BltFast: dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) ", lpdds, ToPrim?"(PRIM)":"", lpddssrc, FromPrim?"(PRIM)":"", dwtrans, ExplainBltFastFlags(dwtrans), dwx, dwy); if (lpsrcrect) @@ -3233,7 +3225,7 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, // consistency check .... if (lpsrcrect) if((lpsrcrect->left >= lpsrcrect->right) || (lpsrcrect->top >= lpsrcrect->bottom)) { - OutTraceD("BltFast: ASSERT bad rect at %d\n", __LINE__); + OutTraceDW("BltFast: ASSERT bad rect at %d\n", __LINE__); return 0; } @@ -3295,7 +3287,7 @@ HRESULT WINAPI extCreatePalette(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY { HRESULT res; - OutTraceD("CreatePalette: dwFlags=%x(%s)\n", dwflags, ExplainCreatePaletteFlags(dwflags)); + OutTraceDDRAW("CreatePalette: dwFlags=%x(%s)\n", dwflags, ExplainCreatePaletteFlags(dwflags)); if(IsDebug && (dwflags & DDPCAPS_8BIT)) dxw.DumpPalette(256, lpddpa); //if (dwflags & ~(DDPCAPS_PRIMARYSURFACE|DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE_LEGACY)) STOPPER("Palette flags"); @@ -3306,7 +3298,7 @@ HRESULT WINAPI extCreatePalette(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY OutTraceE("CreatePalette: ERROR res=%x(%s)\n", res, ExplainDDError(res)); return res; } - else OutTraceD("CreatePalette: OK lpddp=%x\n", *lplpddp); + else OutTraceDDRAW("CreatePalette: OK lpddp=%x\n", *lplpddp); HookDDPalette(lplpddp); return 0; @@ -3316,11 +3308,11 @@ HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lpl { HRESULT res; - OutTraceD("GetPalette: lpdds=%x\n", lpdds); + OutTraceDDRAW("GetPalette: lpdds=%x\n", lpdds); res=(*pGetPalette)(lpdds, lplpddp); if (res) OutTraceE("GetPalette: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - else OutTraceD("GetPalette: OK\n"); + else OutTraceDDRAW("GetPalette: OK\n"); return res; } @@ -3331,15 +3323,15 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd HRESULT res; isPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("SetPalette: lpdds=%x%s lpddp=%x\n", lpdds, isPrim?"(PRIM)":"", lpddp); + OutTraceDDRAW("SetPalette: lpdds=%x%s lpddp=%x\n", lpdds, isPrim?"(PRIM)":"", lpddp); res=(*pSetPalette)(lpdds, lpddp); res=DD_OK; if(res)OutTraceE("SetPalette: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("SetPalette: OK\n"); + else OutTraceDDRAW("SetPalette: OK\n"); if((dxw.dwFlags1 & EMULATESURFACE) && isPrim){ - OutTraceD("SetPalette: register PRIMARY palette lpDDP=%x\n", lpddp); + OutTraceDW("SetPalette: register PRIMARY palette lpDDP=%x\n", lpddp); lpDDP = lpddp; if(lpddp){ HRESULT res2; @@ -3358,20 +3350,20 @@ HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dws { HRESULT res; - OutTraceD("SetEntries: lpddp=%x dwFlags=%x, start=%d, count=%d entries=%x\n", //GHO: added trace infos + OutTraceDDRAW("SetEntries: lpddp=%x dwFlags=%x, start=%d, count=%d entries=%x\n", //GHO: added trace infos lpddp, dwflags, dwstart, dwcount, lpentries); if(IsDebug) dxw.DumpPalette(dwcount, &lpentries[dwstart]); res = (*pSetEntries)(lpddp, dwflags, dwstart, dwcount, lpentries); if(res) OutTraceE("SetEntries: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - else OutTraceD("SetEntries: OK\n"); + else OutTraceDDRAW("SetEntries: OK\n"); if((dxw.dwFlags1 & EMULATESURFACE) && (lpDDP == lpddp)){ - OutTraceD("SetEntries: update PRIMARY palette lpDDP=%x\n", lpddp); + OutTraceDW("SetEntries: update PRIMARY palette lpDDP=%x\n", lpddp); if ((dwstart + dwcount > 256) || (dwstart<0)){ dwcount=256; dwstart=0; - OutTraceD("SetEntries: ASSERT start+count > 256\n"); + OutTraceDW("SetEntries: ASSERT start+count > 256\n"); } mySetPalette(dwstart, dwcount, lpentries); @@ -3390,7 +3382,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd HRESULT res; BOOL isPrim; isPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("SetClipper: lpdds=%x%s lpddc=%x\n", lpdds, isPrim?"(PRIM)":"", lpddc); + OutTraceDDRAW("SetClipper: lpdds=%x%s lpddc=%x\n", lpdds, isPrim?"(PRIM)":"", lpddc); // v2.1.84: SUPPRESSCLIPPING flag - improves "Monopoly Edition 3D" where continuous // clipping ON & OFF affects blitting on primary surface. @@ -3399,7 +3391,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ if ((isPrim && lpDDSEmu_Prim) || ((lpdds == lpDDSBack) && lpDDSEmu_Back)){ - OutTraceD("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds); + OutTraceDW("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds); res=0; } else @@ -3421,7 +3413,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSUR IsPrim=dxw.IsAPrimarySurface(lpdds); CleanRect(&lprect, __LINE__); - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpdds2=%x", lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpdds2); if (lprect) @@ -3434,7 +3426,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSUR if(res==DDERR_SURFACEBUSY){ // v70: fix for "Ancient Evil" (*pUnlockMethod(lpdds))(lpdds, NULL); res = (*pLock)(lpdds, lprect, lpdds2, flags, hEvent); - OutTraceD("Lock RETRY: ret=%x(%s)\n", res, ExplainDDError(res)); + OutTraceDW("Lock RETRY: ret=%x(%s)\n", res, ExplainDDError(res)); } if(res) OutTraceE("Lock ERROR: ret=%x(%s)\n", res, ExplainDDError(res)); DumpSurfaceAttributes((LPDDSURFACEDESC)lpdds2, "[Locked]" , __LINE__); @@ -3458,7 +3450,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAW // Beware!!! for strange reason, the function gets hooked to ANY surface, also non primary ones!!! // to find out whether it is the primary or not, using lpdds==lpPrimaryDD->GetGDISurface(&lpDDSPrim); - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("Lock: lpdds=%x flags=%x(%s) lpdds2=%x", lpdds, flags, ExplainLockFlags(flags), lpdds2); if (lprect) @@ -3510,7 +3502,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAW OffsetRect(lprect, upleft.x+(client.right-dxw.GetScreenWidth())/2, upleft.y+(client.bottom-dxw.GetScreenHeight())/2); - OutTraceD("Lock: NULL rect remapped to (%d,%d)-(%d,%d)\n", + OutTraceDW("Lock: NULL rect remapped to (%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); } } @@ -3535,7 +3527,7 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC if ((dxversion == 4) && lprect) CleanRect(&lprect,__LINE__); - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("Unlock: lpdds=%x%s ", lpdds, (IsPrim ? "(PRIM)":"")); if (dxversion == 4){ if (lprect){ @@ -3576,7 +3568,7 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__); - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("Unlock: lpdds=%x%s ", lpdds, (IsPrim ? "(PRIM)":"")); if (dxversion == 4){ if (lprect){ @@ -3634,14 +3626,14 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) BOOL IsPrim; IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("GetDC: lpdss=%x%s\n",lpdds, IsPrim?"(PRIM)":""); + OutTraceDDRAW("GetDC: lpdss=%x%s\n",lpdds, IsPrim?"(PRIM)":""); res=(*pGetDC)(lpdds, pHDC); if (res==DDERR_CANTCREATEDC && (dxw.dwFlags1 & EMULATESURFACE) && dxw.VirtualPixelFormat.dwRGBBitCount==8) { // for 8BPP palettized surfaces, connect them to either the ddraw emulated palette or the GDI emulated palette - OutTraceD("GetDC: adding 8BPP palette to surface lpdds=%x\n", lpdds); + OutTraceDW("GetDC: adding 8BPP palette to surface lpdds=%x\n", lpdds); if(lpDDP==NULL){ // should link here to the GDI palette? See Hyperblade.... dxw.palNumEntries=256; @@ -3660,7 +3652,7 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) res=(*pGetDC)(lpdds, pHDC); } - OutTraceD("GetDC: res=%x hdc=%x\n",res, *pHDC); + OutTraceDDRAW("GetDC: res=%x hdc=%x\n",res, *pHDC); return res; } @@ -3670,11 +3662,11 @@ HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) BOOL IsPrim; IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc); + OutTraceDDRAW("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc); res=(*pReleaseDC)(lpdds,hdc); if((IsPrim) && (dxw.dwFlags1 & EMULATESURFACE)) sBlt("ReleaseDC", lpdds, NULL, lpdds, NULL, 0, NULL, FALSE); if (res) OutTraceE("ReleaseDC: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } @@ -3683,7 +3675,7 @@ HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW lpdd) { //HRESULT res; - OutTraceD("FlipToGDISurface: lpdd=%x\n", lpdd); + OutTraceDDRAW("FlipToGDISurface: lpdd=%x\n", lpdd); // to revise: so far, it seems the best thing to do is NOTHING, just return 0. //res=(*pFlipToGDISurface)(lpdd); //if (res) OutTraceE("FlipToGDISurface: ERROR res=%x(%s), skipping\n", res, ExplainDDError(res)); @@ -3707,7 +3699,7 @@ HRESULT WINAPI extGetGDISurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) OutTraceE("GetGDISurface: ERROR lpdd=%x res=%x(%s)\n", lpdd, res, ExplainDDError(res)); } else { - OutTraceD("GetGDISurface: PROXED lpdd=%x w=%x\n", lpdd, *w); + OutTraceDDRAW("GetGDISurface: lpdd=%x w=%x\n", lpdd, *w); } return res; @@ -3740,7 +3732,7 @@ HRESULT WINAPI myEnumModesFilter(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpConte // if PREVENTMAXIMIZE is set, don't let the caller know about forbidden screen settings. if((lpDDSurfaceDesc->dwHeight > dxw.GetScreenHeight()) || (lpDDSurfaceDesc->dwWidth > dxw.GetScreenWidth())){ - OutTraceD("EnumDisplayModes: skipping screen size=(%d,%d)\n", lpDDSurfaceDesc->dwHeight, lpDDSurfaceDesc->dwWidth); + OutTraceDW("EnumDisplayModes: skipping screen size=(%d,%d)\n", lpDDSurfaceDesc->dwHeight, lpDDSurfaceDesc->dwWidth); return DDENUMRET_OK; } } @@ -3764,7 +3756,7 @@ HRESULT WINAPI myEnumModesFilter(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpConte HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) { HRESULT res; - OutTraceD("EnumDisplayModes(D): lpdd=%x flags=%x lpddsd=%x callback=%x\n", lpdd, dwflags, lpddsd, cb); + OutTraceDDRAW("EnumDisplayModes(D): lpdd=%x flags=%x lpddsd=%x callback=%x\n", lpdd, dwflags, lpddsd, cb); // note: extEnumDisplayModes serves both the EnumDisplayModes and EnumDisplayModes2 interfaces: // they differ for the lpddsd argument that should point to either DDSURFACEDESC or DDSURFACEDESC2 @@ -3829,7 +3821,7 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD } if(res==DDENUMRET_CANCEL) break; } - OutTraceD("EnumDisplayModes(D): cycled to res=%d size=(%d,%d)\n", + OutTraceDW("EnumDisplayModes(D): cycled to res=%d size=(%d,%d)\n", SupportedDepths[DepthIdx], SupportedRes[ResIdx].w, SupportedRes[ResIdx].h); #else NewContext_Type NewContext; @@ -3843,7 +3835,7 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD // proxy the call res=(*pEnumDisplayModes)(lpdd, dwflags, lpddsd, lpContext, cb); } - if(res) OutTraceD("EnumDisplayModes(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); + if(res) OutTraceE("EnumDisplayModes(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); return res; } @@ -3864,7 +3856,7 @@ HRESULT WINAPI extDuplicateSurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE s, LPD if (res) OutTraceE("DuplicateSurface: ERROR dds=%x res=%x(%s)\n", s, res, ExplainDDError(res)); else - OutTraceD("DuplicateSurface: dds=%x pdds=%x\n", s, *sp); + OutTraceDDRAW("DuplicateSurface: dds=%x pdds=%x\n", s, *sp); return res; } @@ -3874,13 +3866,13 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) BOOL IsPrim; IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("GetPixelFormat: lpdds=%x%s\n", lpdds, IsPrim?"(PRIM)":""); + OutTraceDDRAW("GetPixelFormat: lpdds=%x%s\n", lpdds, IsPrim?"(PRIM)":""); res=(*pGetPixelFormat)(lpdds, p); if(res){ OutTraceE("GetPixelFormat: ERROR res=%x(%s)\n", res, ExplainDDError(res)); } else{ - OutTraceD("GetPixelFormat: Flags=%x(%s) FourCC=%x BitCount=%d RGBA=(%x,%x,%x,%x)\n", + OutTraceDDRAW("GetPixelFormat: Flags=%x(%s) FourCC=%x BitCount=%d RGBA=(%x,%x,%x,%x)\n", p->dwFlags, ExplainPixelFormatFlags(p->dwFlags), p->dwFourCC, p->dwRGBBitCount, p->dwRBitMask, p->dwGBitMask, p->dwBBitMask, p->dwRGBAlphaBitMask ); } @@ -3892,7 +3884,7 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) p->dwGBitMask = dxw.VirtualPixelFormat.dwGBitMask; p->dwBBitMask = dxw.VirtualPixelFormat.dwBBitMask; p->dwRGBAlphaBitMask = dxw.VirtualPixelFormat.dwRGBAlphaBitMask; - OutTraceD("GetPixelFormat: EMULATED BitCount=%d RGBA=(%x,%x,%x,%x)\n", + OutTraceDW("GetPixelFormat: EMULATED BitCount=%d RGBA=(%x,%x,%x,%x)\n", p->dwRGBBitCount, p->dwRBitMask, p->dwGBitMask, p->dwBBitMask, p->dwRGBAlphaBitMask ); } @@ -3927,7 +3919,7 @@ HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW lpdd) if(res) OutTraceE("TestCooperativeLevel: RestoreAllSurfaces ERROR res=%x(%s)\n", res, ExplainDDError(res)); #endif } - if(dxw.dwFlags1 & SUPPRESSDXERRORS) return DD_OK; + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } @@ -3942,26 +3934,26 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) res = (*pReleaseS)(lpdds); - OutTraceD("Release(S): lpdds=%x%s refcount=%d\n", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res); + OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res); if (res==0) { // common precondition // when releasing primary surface, erase clipping region if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor(); if (dxw.dwFlags1 & EMULATESURFACE) { if(lpdds==lpDDSEmu_Prim) { - OutTraceD("Release(S): Clearing lpDDSEmu_Prim pointer\n"); + OutTraceDW("Release(S): Clearing lpDDSEmu_Prim pointer\n"); lpDDSEmu_Prim=NULL; } if(lpdds==lpDDSEmu_Back) { - OutTraceD("Release(S): Clearing lpDDSEmu_Back pointer\n"); + OutTraceDW("Release(S): Clearing lpDDSEmu_Back pointer\n"); lpDDSEmu_Back=NULL; } if(lpdds==dxw.lpDDSPrimHDC) { - OutTraceD("Release(S): Clearing lpDDSPrimHDC pointer\n"); + OutTraceDW("Release(S): Clearing lpDDSPrimHDC pointer\n"); dxw.ResetPrimarySurface(); } } if(lpdds==lpDDSBack) { // v2.02.38 - OutTraceD("Release(S): Clearing lpDDSBack pointer\n"); + OutTraceDW("Release(S): Clearing lpDDSBack pointer\n"); lpDDSBack = NULL; } } @@ -3973,7 +3965,7 @@ HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK HRESULT res; BOOL IsPrim; IsPrim=dxw.IsAPrimarySurface(lpdds); - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("SetColorKey: lpdds=%x%s flags=%x(%s) ", lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); if (lpDDColorKey) @@ -3993,13 +3985,13 @@ HRESULT WINAPI extGetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK HRESULT res; BOOL IsPrim; IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("GetColorKey(S): lpdds=%x%s flags=%x(%s)\n", + OutTraceDDRAW("GetColorKey(S): lpdds=%x%s flags=%x(%s)\n", lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); res=(*pGetColorKey)(lpdds, flags, lpDDColorKey); if(res) OutTraceE("GetColorKey: ERROR lpdds=%x flags=%x res=%x(%s)\n", lpdds, flags, res, ExplainDDError(res)); else - OutTraceD("GetColorKey: colors=(L:%x,H:%x)\n", + OutTraceDDRAW("GetColorKey: colors=(L:%x,H:%x)\n", lpdds, lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); return res; } @@ -4011,7 +4003,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("EnumAttachedSurfaces: lpdds=%x%s Context=%x Callback=%x\n", + OutTraceDDRAW("EnumAttachedSurfaces: lpdds=%x%s Context=%x Callback=%x\n", lpdds, (IsPrim ? "(PRIM)":""), lpContext, lpEnumSurfacesCallback); if (IsPrim){ @@ -4032,7 +4024,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte return res; } res=(lpEnumSurfacesCallback)(lpDDSBack, (LPDDSURFACEDESC)&ddsd, lpContext); - OutTraceD("EnumSurfacesCallback: on DDSBack res=%x(%s)\n", res, ExplainDDError(res)); + OutTraceDW("EnumSurfacesCallback: on DDSBack res=%x(%s)\n", res, ExplainDDError(res)); } res=0; // for Black Dahlia } @@ -4056,7 +4048,7 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF // But beware: this holds to BACKBUFFER surfaces only, and NOT for attached ZBUFFERS or similar! IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("AddAttachedSurface: lpdds=%x%s lpddsadd=%x\n", lpdds, IsPrim?"(PRIM)":"", lpddsadd); + OutTraceDDRAW("AddAttachedSurface: lpdds=%x%s lpddsadd=%x\n", lpdds, IsPrim?"(PRIM)":"", lpddsadd); //if(!lpddsadd) return DDERR_CANNOTATTACHSURFACE; // to avoid a crash... res=(*pAddAttachedSurface)(lpdds, lpddsadd); if (res) { @@ -4067,13 +4059,13 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF if (sdres) OutTraceE("AddAttachedSurface: GetSurfaceDesc ERROR res=%x at %d\n", sdres, __LINE__); else - OutTraceD("AddAttachedSurface: GetSurfaceDesc dwCaps=%x(%s)\n", + OutTraceDW("AddAttachedSurface: GetSurfaceDesc dwCaps=%x(%s)\n", sd.ddsCaps.dwCaps, ExplainDDSCaps(sd.ddsCaps.dwCaps)); if (IsPrim){ if (sd.ddsCaps.dwCaps & DDSCAPS_BACKBUFFER) if ((dxw.dwFlags1 & EMULATESURFACE) && (res==DDERR_CANNOTATTACHSURFACE) || (res==DDERR_NOEXCLUSIVEMODE)) - OutTraceD("AddAttachedSurface: emulating BACKBUFFER attach on PRIMARY\n"); + OutTraceDW("AddAttachedSurface: emulating BACKBUFFER attach on PRIMARY\n"); lpDDSBack=lpddsadd; if (pAddRefS) (*pAddRefS)(lpdds); res=DD_OK; @@ -4084,7 +4076,7 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF // is set in the game "Options" menu. if (sd.ddsCaps.dwCaps & DDSCAPS_ZBUFFER) // DDSCAPS_BACKBUFFER for double buffering ??? if ((dxw.dwFlags1 & EMULATESURFACE) && (res==DDERR_CANNOTATTACHSURFACE)){ - OutTraceD("AddAttachedSurface: emulating ZBUFFER attach on BACKBUFFER\n"); + OutTraceDW("AddAttachedSurface: emulating ZBUFFER attach on BACKBUFFER\n"); if (pAddRefS) (*pAddRefS)(lpdds); res=DD_OK; } @@ -4097,11 +4089,11 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) { HRESULT res; - OutTraceD("DeleteAttachedSurface: lpdds=%x flags=%x lpddsdel=%x\n", lpdds, dwflags, lpddsdel); + OutTraceDDRAW("DeleteAttachedSurface: lpdds=%x flags=%x lpddsdel=%x\n", lpdds, dwflags, lpddsdel); res=(*pDeleteAttachedSurface)(lpdds, dwflags, lpddsdel); if(res) OutTraceE("DeleteAttachedSurface: ERROR %x(%s)\n", res, ExplainDDError(res)); if (res && (lpddsdel==lpDDSBack)){ - OutTraceD("DeleteAttachedSurface: emulating surface detach lpdds=%x\n", lpddsdel); + OutTraceDW("DeleteAttachedSurface: emulating surface detach lpdds=%x\n", lpddsdel); lpDDSBack->Release(); // GHO TRY lpDDSBack=NULL; res=0; @@ -4111,7 +4103,7 @@ HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE lpdds, DWORD dwflag HRESULT WINAPI cbDump(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext) { - OutTraceD("EnumDisplayModes: CALLBACK lpdds=%x Context=%x Caps=%x(%s)\n", + OutTraceDW("EnumDisplayModes: CALLBACK lpdds=%x Context=%x Caps=%x(%s)\n", lpDDSurfaceDesc, lpContext, lpDDSurfaceDesc->ddsCaps.dwCaps, ExplainDDSCaps(lpDDSurfaceDesc->ddsCaps.dwCaps)); return 1; @@ -4124,15 +4116,15 @@ HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRA IsPrim=dxw.IsAPrimarySurface(lpdds); IsBack=dxw.IsABackBufferSurface(lpdds); IsFixed=FALSE; - OutTraceD("GetCaps(S%d): lpdds=%x%s, lpcaps=%x\n", dxInterface, lpdds, IsPrim?"(PRIM)":"", caps); + OutTraceDDRAW("GetCaps(S%d): lpdds=%x%s, lpcaps=%x\n", dxInterface, lpdds, IsPrim?"(PRIM)":"", caps); res=(*pGetCapsS)(lpdds, caps); if(res) OutTraceE("GetCaps(S%d): ERROR %x(%s)\n", dxInterface, res, ExplainDDError(res)); else - OutTraceD("GetCaps(S%d): lpdds=%x caps=%x(%s)\n", dxInterface, lpdds, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); + OutTraceDDRAW("GetCaps(S%d): lpdds=%x caps=%x(%s)\n", dxInterface, lpdds, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); if (IsPrim) { - OutTraceD("GetCaps(S%d): fixing PRIMARY surface\n", dxInterface); + OutTraceDW("GetCaps(S%d): fixing PRIMARY surface\n", dxInterface); IsFixed=TRUE; caps->dwCaps |= DDSD_Prim.ddsCaps.dwCaps; caps->dwCaps |= DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE; // primary surfaces must be this way @@ -4140,14 +4132,14 @@ HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRA } if (IsBack) { - OutTraceD("GetCaps(S%d): fixing BACKBUFFER surface\n", dxInterface); + OutTraceDW("GetCaps(S%d): fixing BACKBUFFER surface\n", dxInterface); IsFixed=TRUE; caps->dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // you never know.... caps->dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way } if ((caps->dwCaps & DDSCAPS_ZBUFFER) || (lpdds == lpDDZBuffer)){ - OutTraceD("GetCaps(S%d): fixing ZBUFFER surface\n", dxInterface); + OutTraceDW("GetCaps(S%d): fixing ZBUFFER surface\n", dxInterface); IsFixed=TRUE; if (DDZBufferCaps & DDSCAPS_SYSTEMMEMORY){ caps->dwCaps |= (DDSCAPS_ZBUFFER|DDSCAPS_SYSTEMMEMORY); @@ -4159,7 +4151,7 @@ HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRA } } - if(IsFixed) OutTraceD("GetCaps(S%d): lpdds=%x FIXED caps=%x(%s)\n", dxInterface, lpdds, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); + if(IsFixed) OutTraceDW("GetCaps(S%d): lpdds=%x FIXED caps=%x(%s)\n", dxInterface, lpdds, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); return res; } @@ -4191,11 +4183,11 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) int dxversion; dxversion=lpddHookedVersion(lpdd); // must be called BEFORE releasing the session!! - OutTraceD("Release(D): lpdd=%x dxversion=%d\n", lpdd, dxversion); + OutTraceDDRAW("Release(D): lpdd=%x dxversion=%d\n", lpdd, dxversion); ActualRef=(*pReleaseD)(lpdd); VirtualRef=(LONG)ActualRef; - OutTraceD("Release(D): lpdd=%x service_lpdd=%x ref=%d\n", lpdd, lpPrimaryDD, ActualRef); + OutTraceDW("Release(D): lpdd=%x service_lpdd=%x ref=%d\n", lpdd, lpPrimaryDD, ActualRef); if (lpdd == lpPrimaryDD) { // v2.1.87: fix for Dungeon Keeper II if(dxw.dwFlags4 & FIXREFCOUNTER){ @@ -4207,11 +4199,11 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) if(lpDDSEmu_Back) --VirtualRef; } if(VirtualRef<0) VirtualRef=0; - OutTraceD("Release(D): fixed ref counter %d->%d\n", ActualRef, VirtualRef); + OutTraceDW("Release(D): fixed ref counter %d->%d\n", ActualRef, VirtualRef); } if((dxversion<4) && (ActualRef==0)){ // directdraw old versions automatically free all linked objects when the parent session is closed. - OutTraceD("Release(D): RefCount=0 - service object RESET condition\n"); + OutTraceDW("Release(D): RefCount=0 - service object RESET condition\n"); lpDDSEmu_Prim=NULL; lpDDSEmu_Back=NULL; lpDDP=NULL; @@ -4228,7 +4220,7 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) //extern void SwitchTo16BPP(); //if((ActualRef==0) && (dxw.dwFlags3 & FORCE16BPP)) SwitchTo16BPP(); - OutTraceD("Release(D): lpdd=%x ref=%x\n", lpdd, VirtualRef); + OutTraceDDRAW("Release(D): lpdd=%x ref=%x\n", lpdd, VirtualRef); return (ULONG)VirtualRef; } @@ -4236,7 +4228,7 @@ HRESULT WINAPI extCreateClipper(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) { HRESULT res; - OutTraceD("CreateClipper: lpdd=%x flags=%x\n", lpdd, dwflags); + OutTraceDDRAW("CreateClipper: lpdd=%x flags=%x\n", lpdd, dwflags); res=(*pCreateClipper)(lpdd, dwflags, lplpDDClipper, pUnkOuter); if(res) { OutTraceE("CreateClipper: ERROR res=%x(%s)\n", lpdd, res, ExplainDDError(res)); @@ -4252,7 +4244,7 @@ HRESULT WINAPI extReleaseC(LPDIRECTDRAWCLIPPER lpddClip) ref = (*pReleaseC)(lpddClip); - OutTraceD("Release(C): PROXED lpddClip=%x ref=%x\n", lpddClip, ref); + OutTraceDDRAW("Release(C): PROXED lpddClip=%x ref=%x\n", lpddClip, ref); return ref; } @@ -4270,7 +4262,7 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR } res=(*pGetSurfaceDesc)(lpdds, lpddsd); - OutTraceD("GetSurfaceDesc: %slpdds=%x%s res=%x(%s)\n", + OutTraceDDRAW("GetSurfaceDesc: %slpdds=%x%s res=%x(%s)\n", res?"ERROR ":"", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res, ExplainDDError(res)); if(res) { OutTraceE("GetSurfaceDesc: ERROR err=%d(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -4280,7 +4272,7 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR LogSurfaceAttributes(lpddsd, "GetSurfaceDesc", __LINE__); if (IsPrim) { - OutTraceD("GetSurfaceDesc: fixing PRIMARY surface\n"); + OutTraceDW("GetSurfaceDesc: fixing PRIMARY surface\n"); IsFixed=TRUE; if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; lpddsd->ddsCaps.dwCaps |= DDSD_Prim.ddsCaps.dwCaps; @@ -4292,14 +4284,14 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR } if (IsBack) { - OutTraceD("GetSurfaceDesc: fixing BACKBUFFER surface\n"); + OutTraceDW("GetSurfaceDesc: fixing BACKBUFFER surface\n"); IsFixed=TRUE; lpddsd->ddsCaps.dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // you never know.... lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way } if (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { - OutTraceD("GetSurfaceDesc: fixing ZBUFFER surface\n"); + OutTraceDW("GetSurfaceDesc: fixing ZBUFFER surface\n"); IsFixed=TRUE; if (DDZBufferCaps & DDSCAPS_SYSTEMMEMORY){ lpddsd->ddsCaps.dwCaps |= (DDSCAPS_ZBUFFER|DDSCAPS_SYSTEMMEMORY); @@ -4350,11 +4342,11 @@ HRESULT WINAPI extGetSurfaceDesc1(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpd if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); break; default: - OutTraceD("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); + OutTraceDW("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); return DDERR_INVALIDOBJECT; break; } - OutTraceD("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", + OutTraceDW("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", lpdds, lpddsd->dwSize, lpddsd->dwSize==sizeof(DDSURFACEDESC)?"DDSURFACEDESC":"DDSURFACEDESC2", __LINE__); return DDERR_INVALIDOBJECT; } @@ -4370,10 +4362,10 @@ HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 l if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); break; default: - OutTraceD("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); + OutTraceDW("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); return DDERR_INVALIDOBJECT; } - OutTraceD("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", + OutTraceDW("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", lpdds, lpddsd->dwSize, lpddsd->dwSize==sizeof(DDSURFACEDESC)?"DDSURFACEDESC":"DDSURFACEDESC2", __LINE__); return DDERR_INVALIDOBJECT; } @@ -4384,9 +4376,9 @@ HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE lpddPalette) ref = (*pReleaseP)(lpddPalette); - OutTraceD("Release(P): lpddPalette=%x ref=%x\n", lpddPalette, ref); + OutTraceDDRAW("Release(P): lpddPalette=%x ref=%x\n", lpddPalette, ref); if(lpddPalette==lpDDP && ref==0){ - OutTraceD("Release(P): clearing lpDDP=%x->NULL\n", lpDDP); + OutTraceDW("Release(P): clearing lpDDP=%x->NULL\n", lpDDP); lpDDP=NULL; } return ref; @@ -4397,11 +4389,11 @@ BOOL WINAPI DDEnumerateCallbackFilter(GUID *lpGuid, LPSTR lpDriverDescription, L BOOL res; typedef struct {LPDDENUMCALLBACK lpCallback; LPVOID lpContext;} Context_Type; Context_Type *p=(Context_Type *)lpContext; - OutTraceD("DDEnumerateCallback: guid=%x DriverDescription=\"%s\" DriverName=\"%s\" Context=%x\n", + OutTraceDW("DDEnumerateCallback: guid=%x DriverDescription=\"%s\" DriverName=\"%s\" Context=%x\n", lpGuid, lpDriverDescription, lpDriverName, p->lpContext); if((lpGuid==NULL) || !(dxw.dwFlags2 & HIDEMULTIMONITOR)) res=(*p->lpCallback)(lpGuid, lpDriverDescription, lpDriverName, p->lpContext); if((lpGuid==NULL) && (dxw.dwFlags2 & HIDEMULTIMONITOR)) res=FALSE; - OutTraceD("DDEnumerateCallback: res=%x(%s)\n", res, res?"continue":"break"); + OutTraceDW("DDEnumerateCallback: res=%x(%s)\n", res, res?"continue":"break"); return res; } @@ -4410,19 +4402,19 @@ BOOL WINAPI DDEnumerateCallbackExFilter(GUID *lpGuid, LPSTR lpDriverDescription, BOOL res; typedef struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} Context_Type; Context_Type *p=(Context_Type *)lpContext; - OutTraceD("DDEnumerateCallbackEx: guid=%x DriverDescription=\"%s\" DriverName=\"%s\" Context=%x hm=%x\n", + OutTraceDW("DDEnumerateCallbackEx: guid=%x DriverDescription=\"%s\" DriverName=\"%s\" Context=%x hm=%x\n", lpGuid, lpDriverDescription, lpDriverName, lpContext, hm); res=TRUE; if((lpGuid==NULL) || !(dxw.dwFlags2 & HIDEMULTIMONITOR)) res=(*p->lpCallback)(lpGuid, lpDriverDescription, lpDriverName, p->lpContext, hm); if((lpGuid==NULL) && (dxw.dwFlags2 & HIDEMULTIMONITOR)) res=FALSE; - OutTraceD("DDEnumerateCallbackEx: res=%x(%s)\n", res, res?"continue":"break"); + OutTraceDW("DDEnumerateCallbackEx: res=%x(%s)\n", res, res?"continue":"break"); return res; } HRESULT WINAPI extDirectDrawEnumerate(LPDDENUMCALLBACK lpCallback, LPVOID lpContext) { HRESULT ret; - OutTraceD("DirectDrawEnumerate: lpCallback=%x lpContext=%x\n", lpCallback, lpContext); + OutTraceDDRAW("DirectDrawEnumerate: lpCallback=%x lpContext=%x\n", lpCallback, lpContext); if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ struct {LPDDENUMCALLBACK lpCallback; LPVOID lpContext;} myContext; myContext.lpCallback=lpCallback; @@ -4438,7 +4430,7 @@ HRESULT WINAPI extDirectDrawEnumerate(LPDDENUMCALLBACK lpCallback, LPVOID lpCont HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX lpCallback, LPVOID lpContext, DWORD dwFlags) { HRESULT ret; - OutTraceP("DirectDrawEnumerateEx: lpCallback=%x lpContext=%x Flags=%x(%s)\n", + OutTraceDDRAW("DirectDrawEnumerateEx: lpCallback=%x lpContext=%x Flags=%x(%s)\n", lpCallback, lpContext, dxw.dwFlags1, ExplainDDEnumerateFlags(dwFlags)); if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} myContext; @@ -4448,26 +4440,69 @@ HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX lpCallback, LPVOID lp } else ret=(*pDirectDrawEnumerateEx)(lpCallback, lpContext, dwFlags); - if(ret) OutTraceD("DirectDrawEnumerateEx: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); + if(ret) OutTraceE("DirectDrawEnumerateEx: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); return ret; } HRESULT WINAPI extDDGetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDGAMMARAMP lpgr) { HRESULT ret; - OutTraceD("GetGammaRamp: dds=%x dwFlags=%x\n", lpdds, dwFlags); + OutTraceDDRAW("GetGammaRamp: dds=%x dwFlags=%x\n", lpdds, dwFlags); ret=(*pDDGetGammaRamp)(lpdds, dwFlags, lpgr); if(ret) OutTraceE("GetGammaRamp: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); - else OutTraceD("GetGammaRamp: RGB=(%x,%x,%x)\n", lpgr->red, lpgr->green, lpgr->blue); + else OutTraceDDRAW("GetGammaRamp: RGB=(%x,%x,%x)\n", lpgr->red, lpgr->green, lpgr->blue); return ret; } HRESULT WINAPI extDDSetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDGAMMARAMP lpgr) { HRESULT ret; - OutTraceD("GetGammaRamp: dds=%x dwFlags=%x RGB=(%x,%x,%x)\n", lpdds, dwFlags, lpgr->red, lpgr->green, lpgr->blue); + OutTraceDDRAW("GetGammaRamp: dds=%x dwFlags=%x RGB=(%x,%x,%x)\n", lpdds, dwFlags, lpgr->red, lpgr->green, lpgr->blue); if (dxw.dwFlags2 & DISABLEGAMMARAMP) return DD_OK; ret=(*pDDSetGammaRamp)(lpdds, dwFlags, lpgr); if(ret) OutTraceE("GetGammaRamp: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); return ret; } + + HRESULT WINAPI extGetAvailableVidMem(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree, GetAvailableVidMem_Type pGetAvailableVidMem) +{ + HRESULT res; + OutTraceDDRAW("GetAvailableVidMem(D): lpdd=%x\n", lpdd); + res=(*pGetAvailableVidMem)(lpdd, lpDDSCaps, lpdwTotal, lpdwFree); + if(res){ + OutTraceDW("GetAvailableVidMem(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); + } + else { + OutTraceDW("GetAvailableVidMem(D): DDSCaps=%x(%s) Total=%x Free=%x\n", + *lpDDSCaps, ExplainDDSCaps(lpDDSCaps->dwCaps), *lpdwTotal, *lpdwFree); + if(dxw.dwFlags2 & LIMITRESOURCES){ // check for memory value overflow - see "Mageslayer" and "Take no Prisoners" + DWORD dwLocalTotal; + const DWORD dwMaxMem = 0x7FFFF000; + if(lpdwTotal == NULL) lpdwTotal = &dwLocalTotal; // point to usable memory.... + if(*lpdwTotal > dwMaxMem){ + if(lpdwFree != NULL){ + DWORD dwDiff = *lpdwTotal - *lpdwFree; + if(dwDiff > dwMaxMem){ + *lpdwFree = dwMaxMem; + } + else{ + *lpdwFree = dwMaxMem - dwDiff; + } + } + *lpdwTotal = dwMaxMem; + OutTraceDW("GetAvailableVidMem(D): FIXED Total=%x Free=%x\n", *lpdwTotal, *lpdwFree); + } + } + } + return res; +} + +HRESULT WINAPI extGetAvailableVidMem2(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) +{ + return extGetAvailableVidMem(lpdd, lpDDSCaps, lpdwTotal, lpdwFree, pGetAvailableVidMem2); +} + +HRESULT WINAPI extGetAvailableVidMem4(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) +{ + return extGetAvailableVidMem(lpdd, lpDDSCaps, lpdwTotal, lpdwFree, pGetAvailableVidMem4); +} diff --git a/dll/dinput.cpp b/dll/dinput.cpp index 45a74a5..6b83488 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -96,7 +96,7 @@ HRESULT WINAPI extDirectInputCreate(HINSTANCE hinst, { HRESULT res; - OutTraceD("DirectInputCreate: dwVersion = %x\n", + OutTraceDW("DirectInputCreate: dwVersion = %x\n", dwversion); res = (*pDirectInputCreate)(hinst, dwversion, lplpdi, pu); @@ -111,7 +111,7 @@ HRESULT WINAPI extDirectInputCreateEx(HINSTANCE hinst, { HRESULT res; - OutTraceD("DirectInputCreateEx: dwVersion = %x REFIID = %x\n", + OutTraceDW("DirectInputCreateEx: dwVersion = %x REFIID = %x\n", dwversion, riidltf.Data1); res = (*pDirectInputCreateEx)(hinst, dwversion, riidltf, ppvout, pu); @@ -125,7 +125,7 @@ HRESULT WINAPI extQueryInterfaceI(void * lpdi, REFIID riid, LPVOID *obp) { HRESULT res; - OutTraceD("lpDI->QueryInterface: REFIID = %x\n", + OutTraceDW("lpDI->QueryInterface: REFIID = %x\n", riid.Data1); res = (*pQueryInterfaceI)(lpdi, riid, obp); @@ -145,7 +145,7 @@ HRESULT WINAPI extDirectInput8Create(HINSTANCE hinst, { HRESULT res; - OutTraceD("DirectInput8Create: dwVersion = %x REFIID = %x\n", + OutTraceDW("DirectInput8Create: dwVersion = %x REFIID = %x\n", dwversion, riidltf.Data1); res = (*pDirectInputCreateEx)(hinst, dwversion, riidltf, ppvout, pu); @@ -159,7 +159,7 @@ HRESULT WINAPI extDICreateDevice(LPDIRECTINPUT lpdi, REFGUID rguid, { HRESULT res; - OutTraceD("lpDI->CreateDevice: REFGUID = %x\n", + OutTraceDW("lpDI->CreateDevice: REFGUID = %x\n", rguid.Data1); res = (*pDICreateDevice)(lpdi, rguid, lplpdid, pu); @@ -176,7 +176,7 @@ HRESULT WINAPI extDICreateDeviceEx(LPDIRECTINPUT lpdi, REFGUID rguid, { HRESULT res; - OutTraceD("lpDI->CreateDeviceEx: GUID = %x REFIID = %x\n", + OutTraceDW("lpDI->CreateDeviceEx: GUID = %x REFIID = %x\n", rguid.Data1, riid.Data1); res = (*pDICreateDeviceEx)(lpdi, rguid, riid, pvout, pu); @@ -195,7 +195,7 @@ HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPVOID unsigned int i; POINT p; - OutTraceD("GetDeviceData cbdata:%i\n", cbdata); + OutTraceDW("GetDeviceData cbdata:%i\n", cbdata); res = (*pGetDeviceData)(lpdid, cbdata, rgdod, pdwinout, dwflags); if(res) return res; @@ -225,7 +225,7 @@ HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPVOID } tmp += cbdata; } - OutTraceD("DEBUG: directinput mousedata=(%d,%d)\n", p.x, p.y); + OutTraceDW("DEBUG: directinput mousedata=(%d,%d)\n", p.x, p.y); } return 0; } @@ -235,7 +235,7 @@ HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMO HRESULT res; POINT p = {0, 0}; - OutTraceD("GetDeviceState cbData:%i %i\n", cbdata, dxw.bActive); + OutTraceDW("GetDeviceState cbData:%i %i\n", cbdata, dxw.bActive); res = (*pGetDeviceState)(lpdid, cbdata, lpvdata); if(res) return res; @@ -257,7 +257,7 @@ HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMO lpvdata->lZ = 0; *(DWORD *)lpvdata->rgbButtons = 0; } - OutTraceD("DEBUG: directinput mousestate=(%d,%d)\n", p.x, p.y); + OutTraceDW("DEBUG: directinput mousestate=(%d,%d)\n", p.x, p.y); } if(cbdata == 256 && !dxw.bActive) ZeroMemory(lpvdata, 256); @@ -266,7 +266,7 @@ HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMO HRESULT WINAPI extSetDataFormat(LPDIRECTINPUTDEVICE lpdid, LPCDIDATAFORMAT lpdf) { - OutTraceD("SetDataFormat: flags = 0x%x\n", lpdf->dwFlags); + OutTraceDW("SetDataFormat: flags = 0x%x\n", lpdf->dwFlags); if(lpdf->dwFlags & DIDF_ABSAXIS) dxw.bDInputAbs = 1; if(lpdf->dwFlags & DIDF_RELAXIS) dxw.bDInputAbs = 0; @@ -275,7 +275,7 @@ HRESULT WINAPI extSetDataFormat(LPDIRECTINPUTDEVICE lpdid, LPCDIDATAFORMAT lpdf) HRESULT WINAPI extDISetCooperativeLevel(LPDIRECTINPUTDEVICE lpdid, HWND hwnd, DWORD dwflags) { - OutTraceD("lpDI->SetCooperativeLevel\n"); + OutTraceDW("lpDI->SetCooperativeLevel\n"); dwflags = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; return (*pDISetCooperativeLevel)(lpdid, hwnd, dwflags); @@ -290,7 +290,7 @@ void GetMousePosition(int *x, int *y) extGetCursorPos(&p); *x = p.x; *y = p.y; - OutTraceD("GetMousePosition: x,y=(%d,%d)\n", *x, *y); + OutTraceDW("GetMousePosition: x,y=(%d,%d)\n", *x, *y); } void InitPosition(int x, int y, int minx, int miny, int maxx, int maxy) diff --git a/dll/dxdiaghook.cpp b/dll/dxdiaghook.cpp index b37f2ef..7d3cede 100644 --- a/dll/dxdiaghook.cpp +++ b/dll/dxdiaghook.cpp @@ -40,15 +40,15 @@ HRESULT HookDxDiag(REFIID riid, LPVOID FAR* ppv) { HMODULE dxdlib; - OutTraceD("CoCreateInstance: CLSID_DxDiagProvider object\n"); + OutTraceDW("CoCreateInstance: CLSID_DxDiagProvider object\n"); dxdlib=(*pLoadLibraryA)("dxdiagn.dll"); - OutTraceD("CoCreateInstance: dxdiagn lib handle=%x\n", dxdlib); + OutTraceDW("CoCreateInstance: dxdiagn lib handle=%x\n", dxdlib); extern void HookModule(HMODULE, int); HookModule(dxdlib, 0); switch (*(DWORD *)&riid){ case 0x9C6B4CB0: - OutTraceD("CoCreateInstance: IID_DxDiagProvider RIID\n"); + OutTraceDW("CoCreateInstance: IID_DxDiagProvider RIID\n"); // IID_DxDiagProvider::QueryInterface SetHook((void *)(**(DWORD **)ppv), extQueryInterfaceDD, (void **)&pQueryInterfaceDD, "QueryInterface(DxDiag)"); // IID_DxDiagProvider::Initialize @@ -57,7 +57,7 @@ HRESULT HookDxDiag(REFIID riid, LPVOID FAR* ppv) SetHook((void *)(**(DWORD **)ppv + 16), extGetRootContainer, (void **)&pGetRootContainer, "GetRootContainer(DxDiag)"); break; case 0x7D0F462F: - OutTraceD("CoCreateInstance: IID_IDxDiagContainer RIID\n"); + OutTraceDW("CoCreateInstance: IID_IDxDiagContainer RIID\n"); break; } @@ -68,65 +68,65 @@ HRESULT HookDxDiag(REFIID riid, LPVOID FAR* ppv) HRESULT WINAPI extInitializeDD(void *th, DXDIAG_INIT_PARAMS *pParams) { HRESULT res; - OutTraceD("DxDiag::Initialize Params=%x\n", pParams); + OutTraceDW("DxDiag::Initialize Params=%x\n", pParams); res=(*pInitializeDD)(th, pParams); - OutTraceD("DxDiag::Initialize res=%x\n", res); + OutTraceDW("DxDiag::Initialize res=%x\n", res); return res; } HRESULT WINAPI extGetRootContainer(void *th, IDxDiagContainer **ppInstance) { HRESULT res; - OutTraceD("DxDiag::GetRootContainer pInstance=%x\n", *ppInstance); + OutTraceDW("DxDiag::GetRootContainer pInstance=%x\n", *ppInstance); res=(*pGetRootContainer)(th, ppInstance); // IID_IDxDiagContainer::GetNumberOfChildContainers SetHook((void *)(**(DWORD **)ppInstance + 12), extGetNumberOfChildContainers, (void **)&pGetNumberOfChildContainers, "GetNumberOfChildContainers(DxDiag)"); // IID_IDxDiagContainer::GetProp SetHook((void *)(**(DWORD **)ppInstance + 32), extGetProp, (void **)&pGetProp, "GetProp(DxDiag)"); - OutTraceD("DxDiag::GetRootContainer res=%x\n", res); + OutTraceDW("DxDiag::GetRootContainer res=%x\n", res); return res; } HRESULT WINAPI extGetNumberOfChildContainers(void *th, DWORD *pdwCount) { HRESULT res; - OutTraceD("DxDiag::GetNumberOfChildContainers\n"); + OutTraceDW("DxDiag::GetNumberOfChildContainers\n"); res=(*pGetNumberOfChildContainers)(th, pdwCount); - OutTraceD("DxDiag::GetNumberOfChildContainers res=%x Count=%d\n", res, *pdwCount); + OutTraceDW("DxDiag::GetNumberOfChildContainers res=%x Count=%d\n", res, *pdwCount); return res; } HRESULT WINAPI extQueryInterfaceDD(void *th, REFIID riid, LPVOID *ppvObj) { HRESULT res; - OutTraceD("DxDiag::QueryInterface ref=%x\n"); + OutTraceDW("DxDiag::QueryInterface ref=%x\n"); res=(*pQueryInterfaceDD)(th, riid, ppvObj); - OutTraceD("DxDiag::QueryInterface res=%x\n", res); + OutTraceDW("DxDiag::QueryInterface res=%x\n", res); return res; } HRESULT WINAPI extGetProp(void *th, LPCWSTR pwszPropName, VARIANT *pvarProp) { HRESULT res; - OutTraceD("DxDiag::GetProp PropName=%ls\n", pwszPropName); + OutTraceDW("DxDiag::GetProp PropName=%ls\n", pwszPropName); res=(*pGetProp)(th, pwszPropName, pvarProp); if(res) OutTraceE("DxDiag::GetProp ERROR res=%x\n", res); if (!wcsncmp(L"dwDirectXVersionMajor", pwszPropName, sizeof(L"dwDirectXVersionMajor"))){ - OutTraceD("DxDiag::GetProp DirectXVersionMajor=%d\n", *pvarProp); + OutTraceDW("DxDiag::GetProp DirectXVersionMajor=%d\n", *pvarProp); //*(DWORD *)pvarProp=10; - //OutTraceD("DxDiag::GetProp fixed DirectXVersionMajor=%d\n", *pvarProp); + //OutTraceDW("DxDiag::GetProp fixed DirectXVersionMajor=%d\n", *pvarProp); } if (!wcsncmp(L"dwDirectXVersionMinor", pwszPropName, sizeof(L"dwDirectXVersionMinor"))){ - OutTraceD("DxDiag::GetProp DirectXVersionMinor=%d\n", *pvarProp); + OutTraceDW("DxDiag::GetProp DirectXVersionMinor=%d\n", *pvarProp); //*(DWORD *)pvarProp=10; - //OutTraceD("DxDiag::GetProp fixed dwDirectXVersionMinor=%d\n", *pvarProp); + //OutTraceDW("DxDiag::GetProp fixed dwDirectXVersionMinor=%d\n", *pvarProp); } if (!wcsncmp(L"szDirectXVersionLetter", pwszPropName, sizeof(L"szDirectXVersionLetter"))){ - OutTraceD("DxDiag::GetProp DirectXVersionLetter=%d\n", *pvarProp); + OutTraceDW("DxDiag::GetProp DirectXVersionLetter=%d\n", *pvarProp); //*(DWORD *)pvarProp=9; - //OutTraceD("DxDiag::GetProp fixed szDirectXVersionLetter=%d\n", *pvarProp); + //OutTraceDW("DxDiag::GetProp fixed szDirectXVersionLetter=%d\n", *pvarProp); } return res; } diff --git a/dll/dxemublt.cpp b/dll/dxemublt.cpp index 720c382..f90b534 100644 --- a/dll/dxemublt.cpp +++ b/dll/dxemublt.cpp @@ -116,7 +116,7 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest src8 += lpsrcrect->left; srcpitch = ddsd_src.lPitch - w; - // OutTraceD("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); for(y = 0; y < h; y ++){ for(x = 0; x < w; x ++){ *(dest ++) = PaletteEntries[*(src8 ++)]; @@ -126,6 +126,31 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest } if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); +#if 0 + if(1 && IsTraceDDRAW) { + DWORD dwStats[256]; + src8 = (BYTE *)lpsurface; + src8 += lpsrcrect->top*ddsd_src.lPitch; + src8 += lpsrcrect->left; + for(x = 0; x < 256; x ++) dwStats[x]=0; + for(y = 0; y < h; y ++){ + for(x = 0; x < w; x ++){ + dwStats[*(src8 ++)]++; + } + src8 += srcpitch; + } + OutTrace("Colors: "); + for(x = 0; x < 256; x ++) { + char sElement[8]; + if (dwStats[x]) + sprintf(sElement,"%x,", dwStats[x]); + else + strcpy(sElement, "_,"); + OutTrace(sElement); + } + OutTrace("\n"); + } +#endif res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt8_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); @@ -134,7 +159,6 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest return res; } - static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { @@ -189,7 +213,7 @@ static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes src16 += lpsrcrect->left; srcpitch = ddsd_src.lPitch - w; - // OutTraceD("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src16,dest,srcpitch,destpitch); + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src16,dest,srcpitch,destpitch); if (!Palette16BPP) { // first time through ..... unsigned int pi; Palette16BPP = (DWORD *)malloc(0x10000 * sizeof(DWORD)); @@ -375,7 +399,7 @@ static HRESULT WINAPI EmuBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes src32 += lpsrcrect->left; srcpitch = ddsd_src.lPitch - w; - // OutTraceD("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src32,dest,srcpitch,destpitch); + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src32,dest,srcpitch,destpitch); for(y = 0; y < h; y ++){ for(x = 0; x < w; x ++) *(dest ++) = *(src32 ++); @@ -446,7 +470,7 @@ static HRESULT WINAPI EmuBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest src8 += lpsrcrect->left; srcpitch = ddsd_src.lPitch - w; - // OutTraceD("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); for(y = 0; y < h; y ++){ for(x = 0; x < w; x ++){ *(dest ++) = (SHORT)PaletteEntries[*(src8 ++)]; @@ -471,7 +495,7 @@ static HRESULT WINAPI EmuBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes #ifdef DXWNDDIRECTBLITTING return (*pBlt)(lpddsdst, lpdestrect, lpddssrc, lpsrcrect, dwflags, NULL); #else - OutTraceD("EmuBlt_16_to_16: UNSUPPORTED\n"); + OutTraceDW("EmuBlt_16_to_16: UNSUPPORTED\n"); return -1; #endif } @@ -610,7 +634,7 @@ static int GetMatchingPaletteEntry32(DWORD crColor) if (iMinDistance==0) break; // got the perfect match! } - OutTraceD("GetMatchingPaletteEntry32: color=%x matched with palette[%d]=%x dist=%d\n", + OutTraceDW("GetMatchingPaletteEntry32: color=%x matched with palette[%d]=%x dist=%d\n", crColor, iMinColorIndex, PaletteEntries[iMinColorIndex], iDistance); return iMinColorIndex; @@ -647,7 +671,7 @@ static int GetMatchingPaletteEntry16(DWORD crColor) if (iMinDistance==0) break; // got the perfect match! } - OutTraceD("GetMatchingPaletteEntry: color=%x matched with palette[%d]=%x dist=%d\n", + OutTraceDW("GetMatchingPaletteEntry: color=%x matched with palette[%d]=%x dist=%d\n", crColor, iMinColorIndex, PaletteEntries[iMinColorIndex], iDistance); return iMinColorIndex; @@ -678,7 +702,7 @@ static HRESULT WINAPI RevBlt_32_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest static BYTE *PaletteFlags = NULL; int pi; - OutTraceD("RevBlt32_8: src=%x dst=%d\n", lpddssrc, lpddsdst); + OutTraceDW("RevBlt32_8: src=%x dst=%d\n", lpddssrc, lpddsdst); w = lpdestrect->right - lpdestrect->left; h = lpdestrect->bottom - lpdestrect->top; @@ -710,7 +734,7 @@ static HRESULT WINAPI RevBlt_32_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest src8 += lpsrcrect->left; srcpitch = ddsd_src.lPitch - w; - // OutTraceD("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); if (!PaletteRev32BPP) { // first time through ..... PaletteRev32BPP = (BYTE *)malloc(REVPAL32SIZE); PaletteFlags = (BYTE *)malloc(REVPAL32SIZE); @@ -756,7 +780,7 @@ static HRESULT WINAPI RevBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes long srcpitch, destpitch; DWORD x, y, w, h; - OutTraceD("RevBlt32_16: src=%x dst=%d\n", lpddssrc, lpddsdst); + OutTraceDW("RevBlt32_16: src=%x dst=%d\n", lpddssrc, lpddsdst); w = lpdestrect->right - lpdestrect->left; h = lpdestrect->bottom - lpdestrect->top; @@ -816,7 +840,7 @@ static HRESULT WINAPI RevBlt_16_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest static BYTE *PaletteFlags = NULL; int pi; - OutTraceD("RevBlt16_8: src=%x dst=%d\n", lpddssrc, lpddsdst); + OutTraceDW("RevBlt16_8: src=%x dst=%d\n", lpddssrc, lpddsdst); w = lpdestrect->right - lpdestrect->left; h = lpdestrect->bottom - lpdestrect->top; @@ -848,7 +872,7 @@ static HRESULT WINAPI RevBlt_16_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest src8 += lpsrcrect->left; srcpitch = ddsd_src.lPitch - w; - // OutTraceD("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); if (!PaletteRev16BPP) { // first time through ..... PaletteRev16BPP = (BYTE *)malloc(REVPAL16SIZE); PaletteFlags = (BYTE *)malloc(REVPAL16SIZE); @@ -902,7 +926,7 @@ static HRESULT WINAPI RevBlt_Null(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrec void SetBltTransformations() { - OutTraceD("SetBltTransformations: color transformation %d->%d\n", + OutTraceDW("SetBltTransformations: color transformation %d->%d\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.ActualPixelFormat.dwRGBBitCount); /* default (bad) setting */ @@ -915,24 +939,24 @@ void SetBltTransformations() case 8: pRevBlt=RevBlt_32_to_8; pEmuBlt=EmuBlt_8_to_32; - OutTraceD("set color transformation 8<->32\n"); + OutTraceDW("set color transformation 8<->32\n"); break; case 16: pRevBlt=RevBlt_32_to_16; pEmuBlt=EmuBlt_16_to_32; - OutTraceD("set color transformation 16<->32\n"); + OutTraceDW("set color transformation 16<->32\n"); break; case 24: //pRevBlt=RevBlt_24_to_32; pEmuBlt=EmuBlt_24_to_32; - OutTraceD("set color transformation 24->32\n"); + OutTraceDW("set color transformation 24->32\n"); break; case 32: pEmuBlt=EmuBlt_32_to_32; - OutTraceD("set color transformation 32->32\n"); + OutTraceDW("set color transformation 32->32\n"); break; default: - OutTraceD("unsupported color transformation %d->32\n", dxw.VirtualPixelFormat.dwRGBBitCount); + OutTraceDW("unsupported color transformation %d->32\n", dxw.VirtualPixelFormat.dwRGBBitCount); break; } break; @@ -941,28 +965,28 @@ void SetBltTransformations() case 8: pRevBlt=RevBlt_16_to_8; pEmuBlt=EmuBlt_8_to_16; - OutTraceD("set color transformation 8<->16\n"); + OutTraceDW("set color transformation 8<->16\n"); break; case 16: pRevBlt=RevBlt_16_to_16; pEmuBlt=EmuBlt_16_to_16; - OutTraceD("set color transformation 16<->16\n"); + OutTraceDW("set color transformation 16<->16\n"); break; case 24: //pRevBlt=RevBlt_24_to_16; pEmuBlt=EmuBlt_24_to_16; - OutTraceD("set color transformation 24<->16\n"); + OutTraceDW("set color transformation 24<->16\n"); break; case 32: pEmuBlt=EmuBlt_32_to_16; break; default: - OutTraceD("unsupported color transformation %d->16\n", dxw.VirtualPixelFormat.dwRGBBitCount); + OutTraceDW("unsupported color transformation %d->16\n", dxw.VirtualPixelFormat.dwRGBBitCount); break; } break; default: - OutTraceD("unsupported color transformation %d->%d\n", + OutTraceDW("unsupported color transformation %d->%d\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.ActualPixelFormat.dwRGBBitCount); break; diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 88e3f42..d867ea2 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -67,7 +67,7 @@ static char *Flag3Names[32]={ static char *Flag4Names[32]={ "NOALPHACHANNEL", "SUPPRESSCHILD", "FIXREFCOUNTER", "SHOWTIMESTRETCH", "ZBUFFERCLEAN", "ZBUFFER0CLEAN", "ZBUFFERALWAYS", "DISABLEFOGGING", - "NOPOWER2FIX", "", "", "", + "NOPOWER2FIX", "NOPERFCOUNTER", "ADDPROXYLIBS", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -143,19 +143,19 @@ static void dx_ToggleLogging() { // toggle LOGGING if(dxw.dwTFlags & OUTTRACE){ - OutTraceD("Toggle logging OFF\n"); + OutTraceDW("Toggle logging OFF\n"); dxw.dwTFlags &= ~OUTTRACE; } else { dxw.dwTFlags |= OUTTRACE; - OutTraceD("Toggle logging ON\n"); + OutTraceDW("Toggle logging ON\n"); } GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE); } static void SuppressIMEWindow() { - OutTraceD("WindowProc: SUPPRESS IME\n"); + OutTraceDW("WindowProc: SUPPRESS IME\n"); typedef BOOL (WINAPI *ImmDisableIME_Type)(DWORD); ImmDisableIME_Type pImmDisableIME; HMODULE ImmLib; @@ -222,7 +222,7 @@ void HookDlls(HMODULE module) } __except(EXCEPTION_EXECUTE_HANDLER) { - OutTraceD("HookDlls: EXCEPTION\n"); + OutTraceDW("HookDlls: EXCEPTION\n"); } return; } @@ -282,7 +282,7 @@ void DumpImportTable(HMODULE module) } __except(EXCEPTION_EXECUTE_HANDLER) { - OutTraceD("DumpImportTable: EXCEPTION\n"); + OutTraceDW("DumpImportTable: EXCEPTION\n"); } return; } @@ -304,23 +304,32 @@ void SetHook(void *target, void *hookproc, void **hookedproc, char *hookname) if((dwTmp <= MaxHook) && (dwTmp >= MinHook)) return; // already hooked if(dwTmp == 0){ sprintf(msg,"SetHook ERROR: NULL target for %s\n", hookname); - OutTraceD(msg); + OutTraceDW(msg); MessageBox(0, msg, "SetHook", MB_OK | MB_ICONEXCLAMATION); return; // error condition } if(!VirtualProtect(target, 4, PAGE_READWRITE, &oldprot)) { sprintf(msg,"SetHook ERROR: target=%x err=%d\n", target, GetLastError()); - OutTraceD(msg); + OutTraceDW(msg); if (IsAssertEnabled) MessageBox(0, msg, "SetHook", MB_OK | MB_ICONEXCLAMATION); return; // error condition } *(DWORD *)target = (DWORD)hookproc; - VirtualProtect(target, 4, oldprot, &oldprot); + if(!VirtualProtect(target, 4, oldprot, &oldprot)){ + OutTrace("SetHook: VirtualProtect ERROR target=%x, err=%x\n", target, GetLastError()); + return; // error condition + } +#if 0 + if(!FlushInstructionCache(GetCurrentProcess(), target, 4)){ + OutTrace("SetHook: FlushInstructionCache ERROR target=%x, err=%x\n", target, GetLastError()); + return; // error condition + } +#endif tmp=(void *)dwTmp; if (*hookedproc && *hookedproc!=tmp) { sprintf(msg,"SetHook: proc=%s oldhook=%x newhook=%x\n", hookname, hookedproc, tmp); - OutTraceD(msg); + OutTraceDW(msg); if (IsAssertEnabled) MessageBox(0, msg, "SetHook", MB_OK | MB_ICONEXCLAMATION); } *hookedproc = tmp; @@ -397,13 +406,13 @@ void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, voi return 0; } pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva); - OutTraceD("HookAPI: pidesc=%x\n", pidesc); + OutTraceDW("HookAPI: pidesc=%x\n", pidesc); while(pidesc->Name){ pThunk=(PCHAR)base+pidesc->FirstThunk; dwThunk = pidesc->FirstThunk; pDllName=(PSTR)base+pidesc->Name; - OutTraceD("HookAPI: pDllName=%s Name=%s\n", pDllName, pidesc->Name); + OutTraceDW("HookAPI: pDllName=%s Name=%s\n", pDllName, pidesc->Name); //impmodule = (PSTR)(base + pidesc->Name); //if(!lstrcmpi(dll, impmodule)) break; pidesc ++; @@ -417,7 +426,7 @@ void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, voi ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL; if((apiproc==NULL) && (ptname==NULL)){ - if (IsDebug) OutTraceD("HookAPI: unreacheable api=%s dll=%s\n", apiname, dll); + if (IsDebug) OutTraceDW("HookAPI: unreacheable api=%s dll=%s\n", apiname, dll); return 0; } @@ -440,23 +449,23 @@ void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, voi if(org == hookproc) return 0; // already hooked if(!VirtualProtect(&ptaddr->u1.Function, 4, PAGE_EXECUTE_READWRITE, &oldprotect)) { - OutTraceD("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); + OutTraceDW("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); return 0; } ptaddr->u1.Function = (DWORD)hookproc; if(!VirtualProtect(&ptaddr->u1.Function, 4, oldprotect, &oldprotect)) { - OutTraceD("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); + OutTraceDW("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); return 0; } if (!FlushInstructionCache(GetCurrentProcess(), &ptaddr->u1.Function, 4)) { - OutTraceD("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__); + OutTraceDW("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__); return 0; } if(IsDebug) OutTrace("HookAPI hook=%s address=%x->%x\n", apiname, org, hookproc); } __except(EXCEPTION_EXECUTE_HANDLER) { - OutTraceD("HookAPI: EXCEPTION hook=%s:%s Hook Failed.\n", dll, apiname); + OutTraceDW("HookAPI: EXCEPTION hook=%s:%s Hook Failed.\n", dll, apiname); org = 0; } return org; @@ -537,23 +546,23 @@ void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, voi if(org == hookproc) return 0; // already hooked if(!VirtualProtect(&ptaddr->u1.Function, 4, PAGE_EXECUTE_READWRITE, &oldprotect)) { - OutTraceD("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); + OutTraceDW("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); return 0; } ptaddr->u1.Function = (DWORD)hookproc; if(!VirtualProtect(&ptaddr->u1.Function, 4, oldprotect, &oldprotect)) { - OutTraceD("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); + OutTraceDW("HookAPI: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); return 0; } if (!FlushInstructionCache(GetCurrentProcess(), &ptaddr->u1.Function, 4)) { - OutTraceD("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__); + OutTraceDW("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__); return 0; } OutTraceH("HookAPI hook=%s address=%x->%x\n", apiname, org, hookproc); } __except(EXCEPTION_EXECUTE_HANDLER) { - OutTraceD("HookAPI: EXCEPTION hook=%s:%s Hook Failed.\n", dll, apiname); + OutTraceDW("HookAPI: EXCEPTION hook=%s:%s Hook Failed.\n", dll, apiname); org = 0; } return org; @@ -643,12 +652,12 @@ void CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWPOS wp) void AdjustWindowPos(HWND hwnd, DWORD width, DWORD height) { WINDOWPOS wp; - OutTraceD("AdjustWindowPos: hwnd=%x, size=(%d,%d)\n", hwnd, width, height); + OutTraceDW("AdjustWindowPos: hwnd=%x, size=(%d,%d)\n", hwnd, width, height); CalculateWindowPos(hwnd, width, height, &wp); - OutTraceD("AdjustWindowPos: fixed pos=(%d,%d) size=(%d,%d)\n", wp.x, wp.y, wp.cx, wp.cy); + OutTraceDW("AdjustWindowPos: fixed pos=(%d,%d) size=(%d,%d)\n", wp.x, wp.y, wp.cx, wp.cy); //if(!pSetWindowPos) pSetWindowPos=SetWindowPos; - //OutTraceD("pSetWindowPos=%x\n", pSetWindowPos); - OutTraceD("hwnd=%x pos=(%d,%d) size=(%d,%d)\n", pSetWindowPos, wp.x, wp.y, wp.cx, wp.cy); + //OutTraceDW("pSetWindowPos=%x\n", pSetWindowPos); + OutTraceDW("hwnd=%x pos=(%d,%d) size=(%d,%d)\n", pSetWindowPos, wp.x, wp.y, wp.cx, wp.cy); if(!(*pSetWindowPos)(hwnd, 0, wp.x, wp.y, wp.cx, wp.cy, 0)){ OutTraceE("AdjustWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); } @@ -658,14 +667,29 @@ void AdjustWindowPos(HWND hwnd, DWORD width, DWORD height) return; } +void HookWindowProc(HWND hwnd) +{ + WNDPROC pWindowProc; + pWindowProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC); + if (pWindowProc == extWindowProc){ + // hooked already !!! + OutTraceDW("GetWindowLong: hwnd=%x WindowProc HOOK already in place\n", hwnd); + } + else {// don't hook twice .... + long lres; + WhndStackPush(hwnd, pWindowProc); + lres=(*pSetWindowLong)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); + OutTraceDW("SetWindowLong: hwnd=%x HOOK WindowProc=%x->%x\n", hwnd, lres, (LONG)extWindowProc); + } +} + void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height) { HRESULT res=0; - WNDPROC pWindowProc; LONG style; - OutTraceD("AdjustWindowFrame hwnd=%x, size=(%d,%d) coord=%d\n", hwnd, width, height, dxw.Coordinates); + OutTraceDW("AdjustWindowFrame hwnd=%x, size=(%d,%d) coord=%d\n", hwnd, width, height, dxw.Coordinates); dxw.SetScreenSize(width, height); if (hwnd==NULL) return; @@ -684,29 +708,18 @@ void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height) (*pSetWindowLong)(hwnd, GWL_STYLE, style); (*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0); (*pShowWindow)(hwnd, SW_SHOWNORMAL); - OutTraceD("AdjustWindowFrame hwnd=%x, set style=%s extstyle=0\n", hwnd, (style == 0) ? "0" : "WS_OVERLAPPEDWINDOW"); + OutTraceDW("AdjustWindowFrame hwnd=%x, set style=%s extstyle=0\n", hwnd, (style == 0) ? "0" : "WS_OVERLAPPEDWINDOW"); AdjustWindowPos(hwnd, width, height); // fixing windows message handling procedure - - pWindowProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC); - if (pWindowProc == extWindowProc){ - // hooked already !!! - OutTraceD("GetWindowLong: extWindowProc already in place, hwnd=%x\n", hwnd); - } - else {// don't hook twice .... - long lres; - WhndStackPush(hwnd, pWindowProc); - lres=(*pSetWindowLong)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); - OutTraceD("AdjustWindowFrame: fixing hwnd=%x WindowProc=%x->%x\n", hwnd, lres, (LONG)extWindowProc); - } + HookWindowProc(hwnd); // fixing cursor view and clipping region if (dxw.dwFlags1 & HIDEHWCURSOR) while ((*pShowCursor)(0) >= 0); if (dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0); if (dxw.dwFlags1 & CLIPCURSOR) { - OutTraceD("AdjustWindowFrame: setting clip region\n"); + OutTraceDW("AdjustWindowFrame: setting clip region\n"); dxw.SetClipCursor(); } @@ -736,7 +749,7 @@ INT_PTR CALLBACK extDialogWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPA pWindowProc=WhndGetWindowProc(hwnd); if(pWindowProc) return(*pWindowProc)(hwnd, message, wparam, lparam); char *sMsg="ASSERT: DialogWinMsg pWindowProc=NULL !!!\n"; - OutTraceD(sMsg); + OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION); return NULL; } @@ -799,7 +812,7 @@ static void dx_UpdatePositionLock(HWND hwnd) (*pGetClientRect)(hwnd,&rect); (*pClientToScreen)(hwnd,&p); dxw.dwFlags1 |= LOCKWINPOS; - OutTraceD("Toggle position lock ON\n"); + OutTraceDW("Toggle position lock ON\n"); dxw.InitWindowPos(p.x, p.y, rect.right-rect.left, rect.bottom-rect.top); } @@ -808,11 +821,11 @@ static void dx_TogglePositionLock(HWND hwnd) // toggle position locking if(dxw.dwFlags1 & LOCKWINPOS){ // unlock - OutTraceD("Toggle position lock OFF\n"); + OutTraceDW("Toggle position lock OFF\n"); dxw.dwFlags1 &= ~LOCKWINPOS; } else { - OutTraceD("Toggle position lock ON\n"); + OutTraceDW("Toggle position lock ON\n"); dxw.dwFlags1 |= LOCKWINPOS; dx_UpdatePositionLock(hwnd); } @@ -915,19 +928,19 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp break; case WM_NCCALCSIZE: if((dxw.dwFlags1 & LOCKWINPOS) && (hwnd == dxw.GethWnd())){ // v2.02.30: don't alter child and other windows.... - OutTraceD("WindowProc: WS_NCCALCSIZE wparam=%x\n", wparam); + OutTraceDW("WindowProc: WS_NCCALCSIZE wparam=%x\n", wparam); if(wparam){ // nothing so far .... if (IsDebug){ NCCALCSIZE_PARAMS *ncp; ncp = (NCCALCSIZE_PARAMS *) lparam; - OutTraceD("WindowProc: WS_NCCALCSIZE rect[0]=(%d,%d)-(%d,%d)\n", + OutTraceDW("WindowProc: WS_NCCALCSIZE rect[0]=(%d,%d)-(%d,%d)\n", ncp->rgrc[0].left, ncp->rgrc[0].top, ncp->rgrc[0].right, ncp->rgrc[0].bottom); - OutTraceD("WindowProc: WS_NCCALCSIZE rect[1]=(%d,%d)-(%d,%d)\n", + OutTraceDW("WindowProc: WS_NCCALCSIZE rect[1]=(%d,%d)-(%d,%d)\n", ncp->rgrc[1].left, ncp->rgrc[1].top, ncp->rgrc[1].right, ncp->rgrc[1].bottom); - OutTraceD("WindowProc: WS_NCCALCSIZE rect[2]=(%d,%d)-(%d,%d)\n", + OutTraceDW("WindowProc: WS_NCCALCSIZE rect[2]=(%d,%d)-(%d,%d)\n", ncp->rgrc[2].left, ncp->rgrc[2].top, ncp->rgrc[2].right, ncp->rgrc[2].bottom); - OutTraceD("WindowProc: WS_NCCALCSIZE winrect=(%d,%d)-(%d,%d)\n", + OutTraceDW("WindowProc: WS_NCCALCSIZE winrect=(%d,%d)-(%d,%d)\n", ncp->lppos->x, ncp->lppos->y, ncp->lppos->cx, ncp->lppos->cy); } } @@ -960,7 +973,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case WM_IME_KEYDOWN: case WM_IME_KEYUP: if(dxw.dwFlags2 & SUPPRESSIME){ - OutTraceD("WindowProc: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", message, ExplainWinMessage(message), wparam, lparam); + OutTraceDW("WindowProc: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", message, ExplainWinMessage(message), wparam, lparam); return 0; } break; @@ -981,13 +994,13 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp break; case WM_ERASEBKGND: if(dxw.IsDesktop(hwnd)){ - OutTraceD("WindowProc: WM_ERASEBKGND(%x,%x) - suppressed\n", wparam, lparam); + OutTraceDW("WindowProc: WM_ERASEBKGND(%x,%x) - suppressed\n", wparam, lparam); return 1; // 1 == OK, erased } break; case WM_DISPLAYCHANGE: if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()){ - OutTraceD("WindowProc: prevent WM_DISPLAYCHANGE depth=%d size=(%d,%d)\n", + OutTraceDW("WindowProc: prevent WM_DISPLAYCHANGE depth=%d size=(%d,%d)\n", wparam, HIWORD(lparam), LOWORD(lparam)); // v2.02.43: unless EMULATESURFACE is set, lock the screen resolution only, but not the color depth! if(dxw.dwFlags1 & EMULATESURFACE) return 0; @@ -1001,7 +1014,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp LPWINDOWPOS wp; wp = (LPWINDOWPOS)lparam; dxwFixWindowPos("WindowProc", hwnd, lparam); - OutTraceD("WindowProc: WM_WINDOWPOSCHANGING fixed size=(%d,%d)\n", wp->cx, wp->cy); + OutTraceDW("WindowProc: WM_WINDOWPOSCHANGING fixed size=(%d,%d)\n", wp->cx, wp->cy); break; case WM_ENTERSIZEMOVE: if(IsToBeLocked){ @@ -1090,16 +1103,16 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp GetHookInfo()->CursorY=HIWORD(lparam); break; case WM_SETFOCUS: - OutTraceD("WindowProc: hwnd=%x GOT FOCUS\n", hwnd); + OutTraceDW("WindowProc: hwnd=%x GOT FOCUS\n", hwnd); if (dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion); break; case WM_KILLFOCUS: - OutTraceD("WindowProc: hwnd=%x LOST FOCUS\n", hwnd); + OutTraceDW("WindowProc: hwnd=%x LOST FOCUS\n", hwnd); if (dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor(); if (dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL); break; case WM_CLOSE: - OutTraceD("WindowProc: WM_CLOSE - terminating process\n"); + OutTraceDW("WindowProc: WM_CLOSE - terminating process\n"); if(dxw.dwFlags3 & FORCE16BPP) RecoverScreenMode(); TerminateProcess(GetCurrentProcess(),0); break; @@ -1108,7 +1121,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp switch (wparam){ case VK_F12: if(dxw.dwFlags1 & CLIPCURSOR){ - OutTraceD("WindowProc: WM_SYSKEYDOWN key=%x ToggleState=%x\n",wparam,ClipCursorToggleState); + OutTraceDW("WindowProc: WM_SYSKEYDOWN key=%x ToggleState=%x\n",wparam,ClipCursorToggleState); ClipCursorToggleState = !ClipCursorToggleState; ClipCursorToggleState ? dxw.SetClipCursor() : dxw.EraseClipCursor(); } @@ -1138,7 +1151,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp break; case VK_F4: if (dxw.dwFlags1 & HANDLEALTF4) { - OutTraceD("WindowProc: WM_SYSKEYDOWN(ALT-F4) - terminating process\n"); + OutTraceDW("WindowProc: WM_SYSKEYDOWN(ALT-F4) - terminating process\n"); TerminateProcess(GetCurrentProcess(),0); } break; @@ -1180,12 +1193,12 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp return ret; } - //OutTraceD("ASSERT: WindowProc mismatch hwnd=%x\n", hwnd); + //OutTraceDW("ASSERT: WindowProc mismatch hwnd=%x\n", hwnd); // ??? maybe it's a normal condition, whenever you don't have a WindowProc routine // like in Commandos 2. Flag it? char sMsg[81]; sprintf(sMsg,"ASSERT: WindowProc mismatch hwnd=%x\n", hwnd); - OutTraceD(sMsg); + OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION); return (*pDefWindowProc)(hwnd, message, wparam, lparam); } @@ -1209,7 +1222,7 @@ static void SaveScreenMode() if(DoOnce) return; DoOnce=TRUE; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &InitDevMode); - OutTraceD("DXWND: Initial display mode WxH=(%dx%d) BitsPerPel=%d\n", + OutTraceDW("DXWND: Initial display mode WxH=(%dx%d) BitsPerPel=%d\n", InitDevMode.dmPelsWidth, InitDevMode.dmPelsHeight, InitDevMode.dmBitsPerPel); } @@ -1218,11 +1231,11 @@ static void RecoverScreenMode() DEVMODE CurrentDevMode; BOOL res; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &CurrentDevMode); - OutTraceD("ChangeDisplaySettings: recover CURRENT WxH=(%dx%d) BitsPerPel=%d TARGET WxH=(%dx%d) BitsPerPel=%d\n", + OutTraceDW("ChangeDisplaySettings: recover CURRENT WxH=(%dx%d) BitsPerPel=%d TARGET WxH=(%dx%d) BitsPerPel=%d\n", CurrentDevMode.dmPelsWidth, CurrentDevMode.dmPelsHeight, CurrentDevMode.dmBitsPerPel, InitDevMode.dmPelsWidth, InitDevMode.dmPelsHeight, InitDevMode.dmBitsPerPel); InitDevMode.dmFields = (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT); - res=(*pChangeDisplaySettings)(&InitDevMode, 0); + res=(*pChangeDisplaySettingsA)(&InitDevMode, 0); if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); } @@ -1231,11 +1244,11 @@ void SwitchTo16BPP() DEVMODE CurrentDevMode; BOOL res; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &CurrentDevMode); - OutTraceD("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> 16\n", + OutTraceDW("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> 16\n", CurrentDevMode.dmPelsWidth, CurrentDevMode.dmPelsHeight, CurrentDevMode.dmBitsPerPel); CurrentDevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; CurrentDevMode.dmBitsPerPel = 16; - res=(*pChangeDisplaySettings)(&CurrentDevMode, CDS_UPDATEREGISTRY); + res=(*pChangeDisplaySettingsA)(&CurrentDevMode, CDS_UPDATEREGISTRY); if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); } @@ -1243,13 +1256,13 @@ static void LockScreenMode(DWORD dmPelsWidth, DWORD dmPelsHeight, DWORD dmBitsPe { DEVMODE InitDevMode; BOOL res; - OutTraceD("ChangeDisplaySettings: LOCK wxh=(%dx%d) BitsPerPel=%d -> wxh=(%dx%d) BitsPerPel=%d\n", + OutTraceDW("ChangeDisplaySettings: LOCK wxh=(%dx%d) BitsPerPel=%d -> wxh=(%dx%d) BitsPerPel=%d\n", InitDevMode.dmPelsWidth, InitDevMode.dmPelsHeight, InitDevMode.dmBitsPerPel, dmPelsWidth, dmPelsHeight, dmBitsPerPel); if( (dmPelsWidth != InitDevMode.dmPelsWidth) || (dmPelsHeight !=InitDevMode.dmPelsHeight) || (dmBitsPerPel != InitDevMode.dmBitsPerPel)){ - res=(*pChangeDisplaySettings)(&InitDevMode, 0); + res=(*pChangeDisplaySettingsA)(&InitDevMode, 0); if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); } } @@ -1300,7 +1313,7 @@ LONG WINAPI myUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo) LPTOP_LEVEL_EXCEPTION_FILTER WINAPI extSetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { - OutTraceD("SetUnhandledExceptionFilter: lpExceptionFilter=%x\n", lpTopLevelExceptionFilter); + OutTraceDW("SetUnhandledExceptionFilter: lpExceptionFilter=%x\n", lpTopLevelExceptionFilter); extern LONG WINAPI myUnhandledExceptionFilter(LPEXCEPTION_POINTERS); return (*pSetUnhandledExceptionFilter)(myUnhandledExceptionFilter); } @@ -1310,7 +1323,7 @@ void HookExceptionHandler(void) void *tmp; HMODULE base; - OutTraceD("Set exception handlers\n"); + OutTraceDW("Set exception handlers\n"); base=GetModuleHandle(NULL); pSetUnhandledExceptionFilter = SetUnhandledExceptionFilter; //v2.1.75 override default exception handler, if any.... @@ -1385,15 +1398,15 @@ void SetSingleProcessAffinity(void) DWORD ProcessAffinityMask, SystemAffinityMask; if(!GetProcessAffinityMask(GetCurrentProcess(), &ProcessAffinityMask, &SystemAffinityMask)) OutTraceE("GetProcessAffinityMask: ERROR err=%d\n", GetLastError()); - OutTraceD("Process affinity=%x\n", ProcessAffinityMask); + OutTraceDW("Process affinity=%x\n", ProcessAffinityMask); for (i=0; i<(8 * sizeof(DWORD)); i++){ if (ProcessAffinityMask & 0x1) break; ProcessAffinityMask >>= 1; } - OutTraceD("First process affinity bit=%d\n", i); + OutTraceDW("First process affinity bit=%d\n", i); ProcessAffinityMask &= 0x1; for (; i; i--) ProcessAffinityMask <<= 1; - OutTraceD("Process affinity=%x\n", ProcessAffinityMask); + OutTraceDW("Process affinity=%x\n", ProcessAffinityMask); if (!SetProcessAffinityMask(GetCurrentProcess(), ProcessAffinityMask)) OutTraceE("SetProcessAffinityMask: ERROR err=%d\n", GetLastError()); } @@ -1440,7 +1453,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) dxw.SethWnd((dxw.dwFlags1 & FIXPARENTWIN) ? GetParent(hwnd) : hwnd); } - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d)", target->path, target->module, dxversions[dxw.dwTargetDDVersion], target->posx, target->posy, target->sizx, target->sizy); @@ -1448,6 +1461,19 @@ void HookInit(TARGETMAP *target, HWND hwnd) else OutTrace("\n"); } +#if 0 + if(dxw.dwFlags4 & ADDPROXYLIBS){ + #define MAX_FILE_PATH 512 + char sSourcePath[MAX_FILE_PATH+1]; + char *p; + GetModuleFileName(GetModuleHandle("dxwnd"), sSourcePath, MAX_FILE_PATH); + p=&sSourcePath[strlen(sSourcePath)-strlen("dxwnd.dll")]; + strcpy(p, "d3d9.dll"); + OutTraceDW("HookInit: copy %s -> d3d9.dll\n", sSourcePath); + CopyFile(sSourcePath, "d3d9.dll", FALSE); + } +#endif + if (hwnd && IsDebug){ DWORD dwStyle, dwExStyle; dwStyle=GetWindowLong(dxw.GethWnd(), GWL_STYLE); @@ -1489,7 +1515,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) OutTraceE("HookInit: LoadLibrary ERROR module=%s err=%d\n", sModule, GetLastError()); } else { - OutTraceD("HookInit: hooking additional module=%s base=%x\n", sModule, base); + OutTraceDW("HookInit: hooking additional module=%s base=%x\n", sModule, base); if (dxw.dwTFlags & OUTIMPORTTABLE) DumpImportTable(base); HookModule(base, dxw.dwTargetDDVersion); } @@ -1507,8 +1533,9 @@ void HookInit(TARGETMAP *target, HWND hwnd) } InitScreenParameters(); + if(hwnd) HookWindowProc(hwnd); - if (IsDebug) OutTraceD("MoveWindow: target pos=(%d,%d) size=(%d,%d)\n", dxw.iPosX, dxw.iPosY, dxw.iSizX, dxw.iSizY); //v2.02.09 + if (IsDebug) OutTraceDW("MoveWindow: target pos=(%d,%d) size=(%d,%d)\n", dxw.iPosX, dxw.iPosY, dxw.iSizX, dxw.iSizY); //v2.02.09 } LPCSTR ProcToString(LPCSTR proc) @@ -1527,7 +1554,8 @@ FARPROC RemapLibrary(LPCSTR proc, HMODULE hModule, HookEntry_Type *Hooks) for(; Hooks->APIName; Hooks++){ if (!strcmp(proc,Hooks->APIName)){ if (Hooks->StoreAddress) *(Hooks->StoreAddress)=(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), (Hooks->StoreAddress) ? *(Hooks->StoreAddress) : 0); + OutTraceDW("GetProcAddress: hooking proc=%s addr=%x->%x\n", + ProcToString(proc), (Hooks->StoreAddress) ? *(Hooks->StoreAddress) : 0, Hooks->HookerAddress); return Hooks->HookerAddress; } } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index b3131b9..eab33d5 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -37,14 +37,14 @@ dxwCore::~dxwCore() void dxwCore::SetFullScreen(BOOL fs, int line) { - OutTraceD("SetFullScreen: %s at %d\n", fs?"FULLSCREEN":"WINDOWED", line); + OutTraceDW("SetFullScreen: %s at %d\n", fs?"FULLSCREEN":"WINDOWED", line); FullScreen=fs; } void dxwCore::SetFullScreen(BOOL fs) { if(dxw.dwFlags3 & FULLSCREENONLY) fs=TRUE; - OutTraceD("SetFullScreen: %s\n", fs?"FULLSCREEN":"WINDOWED"); + OutTraceDW("SetFullScreen: %s\n", fs?"FULLSCREEN":"WINDOWED"); FullScreen=fs; } @@ -84,7 +84,7 @@ void dxwCore::InitTarget(TARGETMAP *target) void dxwCore::UnmarkPrimarySurface(LPDIRECTDRAWSURFACE ps) { int i; - // OutTraceD("PRIMARYSURFACE del %x\n",ps); + // OutTraceDW("PRIMARYSURFACE del %x\n",ps); for (i=0;iFPSCount = FPSCount; // for overlay display // show fps on win title bar @@ -1077,7 +1077,7 @@ void dxwCore::ShowBanner(HWND hwnd) GetObject(g_hbmBall, sizeof(bm), &bm); (*pGetWindowRect)(hwnd, &win); - OutTraceD("ShowBanner: hdc=%x win=(%d,%d)-(%d,%d) banner size=(%dx%d)\n", + OutTraceDW("ShowBanner: hwnd=%x win=(%d,%d)-(%d,%d) banner size=(%dx%d)\n", hwnd, win.left, win.top, win.right, win.bottom, bm.bmWidth, bm.bmHeight); //if(!pSetViewportOrgEx) pSetViewportOrgEx=SetViewportOrgEx; @@ -1153,7 +1153,7 @@ int dxwCore::GetDLLIndex(char *lpFileName) (!lstrcmpi(lpName,SysNames[idx])) || (!lstrcmpi(lpName,SysNameExt)) ){ - OutTraceB("Registered DLL FileName=%s\n", lpFileName); + OutTraceDW("Registered DLL FileName=%s\n", lpFileName); break; } } @@ -1168,7 +1168,7 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) switch (wParam) { case GWL_STYLE: - OutTraceD("%s: new Style=%x(%s)\n", + OutTraceDW("%s: new Style=%x(%s)\n", ApiName, lpSS->styleNew, ExplainStyle(lpSS->styleNew)); if (dxw.dwFlags1 & FIXWINFRAME){ // set canonical style lpSS->styleNew= WS_OVERLAPPEDWINDOW; @@ -1178,13 +1178,13 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) } if (dxw.dwFlags1 & PREVENTMAXIMIZE){ // disable maximize settings if (lpSS->styleNew & WS_MAXIMIZE){ - OutTraceD("%s: prevent maximize style\n", ApiName); + OutTraceDW("%s: prevent maximize style\n", ApiName); lpSS->styleNew &= ~WS_MAXIMIZE; } } break; case GWL_EXSTYLE: - OutTraceD("%s: new ExStyle=%x(%s)\n", + OutTraceDW("%s: new ExStyle=%x(%s)\n", ApiName, lpSS->styleNew, ExplainExStyle(lpSS->styleNew)); if (dxw.dwFlags1 & FIXWINFRAME){ // set canonical style lpSS->styleNew= 0; @@ -1194,7 +1194,7 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) } if ((dxw.dwFlags1 & PREVENTMAXIMIZE) && (hwnd==hWnd)){ // disable maximize settings if (lpSS->styleNew & WS_EX_TOPMOST){ - OutTraceD("%s: prevent EXSTYLE topmost style\n", ApiName); + OutTraceDW("%s: prevent EXSTYLE topmost style\n", ApiName); lpSS->styleNew &= ~WS_EX_TOPMOST; } } diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index ddf12ff..f31070b 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.48" +#define VERSION "2.02.49" #define DDTHREADLOCK 1 @@ -92,7 +92,7 @@ int SetTarget(TARGETMAP *targets){ pStatus->Height = pStatus->Width = 0; pStatus->DXVersion = 0; for(i = 0; targets[i].path[0]; i ++){ - //OutTraceD("SetTarget entry %s\n",pMapping[i].path); + //OutTraceDW("SetTarget entry %s\n",pMapping[i].path); pMapping[i] = targets[i]; for(j = 0; pMapping[i].path[j]; j ++) pMapping[i].path[j] = tolower(pMapping[i].path[j]); diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 6509a8b63d23b994ac3164c98752e865a8dd80aa..b6b22961881fd220732919742e987fddbf9ebacf 100644 GIT binary patch delta 35151 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 VSQD`ZU_1c~_~@dy53=^K{~vDa23P<9 delta 13831 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�H8nf(JGrpV_^HF`SG(kXg-(zT9z3eg60?>7Gnj! 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 L4~{$+&FJvoANO|6 diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 2c302f5..f74fe4d 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -286,7 +286,7 @@ static COLORREF GetMatchingColor(COLORREF crColor) if (iMinDistance==0) break; // got the perfect match! } - OutTraceD("GetMatchingColor: color=%x matched with palette[%d]=%x dist=%d\n", + OutTraceDW("GetMatchingColor: color=%x matched with palette[%d]=%x dist=%d\n", crColor, iMinColorIndex, PaletteEntries[iMinColorIndex], iDistance); PalColor=PaletteEntries[iMinColorIndex]; switch(dxw.ActualPixelFormat.dwRGBBitCount){ @@ -318,7 +318,7 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) DWORD res; res = (*pGDIGetDeviceCaps)(hdc, nindex); - if(IsTraceD){ + if(IsTraceDDRAW){ OutTrace("GetDeviceCaps: hdc=%x index=%x(%s)", hdc, nindex, ExplainDeviceCaps(nindex)); switch(nindex){ case RASTERCAPS: @@ -341,15 +341,15 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) case BITSPIXEL: case COLORRES: res = pSetDevMode->dmBitsPerPel; - OutTraceD("GetDeviceCaps: fix(1) BITSPIXEL/COLORRES cap=%x\n",res); + OutTraceDW("GetDeviceCaps: fix(1) BITSPIXEL/COLORRES cap=%x\n",res); return res; case HORZRES: res = pSetDevMode->dmPelsWidth; - OutTraceD("GetDeviceCaps: fix(1) HORZRES cap=%d\n", res); + OutTraceDW("GetDeviceCaps: fix(1) HORZRES cap=%d\n", res); return res; case VERTRES: res = pSetDevMode->dmPelsHeight; - OutTraceD("GetDeviceCaps: fix(1) VERTRES cap=%d\n", res); + OutTraceDW("GetDeviceCaps: fix(1) VERTRES cap=%d\n", res); return res; } } @@ -357,18 +357,18 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) switch(nindex){ case VERTRES: res= dxw.GetScreenHeight(); - OutTraceD("GetDeviceCaps: fix(2) VERTRES cap=%d\n", res); + OutTraceDW("GetDeviceCaps: fix(2) VERTRES cap=%d\n", res); break; case HORZRES: res= dxw.GetScreenWidth(); - OutTraceD("GetDeviceCaps: fix(2) HORZRES cap=%d\n", res); + OutTraceDW("GetDeviceCaps: fix(2) HORZRES cap=%d\n", res); break; // WARNING: in no-emu mode, the INIT8BPP and INIT16BPP flags expose capabilities that // are NOT implemented and may cause later troubles! case RASTERCAPS: if(dxw.dwFlags2 & INIT8BPP) { res |= RC_PALETTE; // v2.02.12 - OutTraceD("GetDeviceCaps: fix(2) RASTERCAPS setting RC_PALETTE cap=%x\n",res); + OutTraceDW("GetDeviceCaps: fix(2) RASTERCAPS setting RC_PALETTE cap=%x\n",res); } break; case BITSPIXEL: @@ -376,7 +376,7 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix if(dxw.dwFlags2 & INIT8BPP) res = 8; if(dxw.dwFlags2 & INIT16BPP) res = 16; - OutTraceD("GetDeviceCaps: fix(2) BITSPIXEL/COLORRES cap=%d\n",res); + OutTraceDW("GetDeviceCaps: fix(2) BITSPIXEL/COLORRES cap=%d\n",res); } break; //case NUMCOLORS: // numcolors windows bug fix.... @@ -389,7 +389,7 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) case RASTERCAPS: if((dxw.VirtualPixelFormat.dwRGBBitCount==8) || (dxw.dwFlags2 & INIT8BPP)){ res |= RC_PALETTE; - OutTraceD("GetDeviceCaps: fix(3) RASTERCAPS setting RC_PALETTE cap=%x(%s)\n", res, ExplainRasterCaps(res)); + OutTraceDW("GetDeviceCaps: fix(3) RASTERCAPS setting RC_PALETTE cap=%x(%s)\n", res, ExplainRasterCaps(res)); } break; case BITSPIXEL: @@ -399,15 +399,15 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) if(dxw.VirtualPixelFormat.dwRGBBitCount!=0) res = dxw.VirtualPixelFormat.dwRGBBitCount; if(dxw.dwFlags2 & INIT8BPP) res = 8; if(dxw.dwFlags2 & INIT16BPP) res = 16; - if(PrevRes != res) OutTraceD("GetDeviceCaps: fix(3) BITSPIXEL/COLORRES cap=%d\n",res); + if(PrevRes != res) OutTraceDW("GetDeviceCaps: fix(3) BITSPIXEL/COLORRES cap=%d\n",res); break; case SIZEPALETTE: res = 256; - OutTraceD("GetDeviceCaps: fix(3) SIZEPALETTE cap=%x\n",res); + OutTraceDW("GetDeviceCaps: fix(3) SIZEPALETTE cap=%x\n",res); break; case NUMRESERVED: res = 0; - OutTraceD("GetDeviceCaps: fix(3) NUMRESERVED cap=%x\n",res); + OutTraceDW("GetDeviceCaps: fix(3) NUMRESERVED cap=%x\n",res); break; } } @@ -417,11 +417,11 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) BOOL WINAPI extTextOutA(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cchString) { BOOL ret; - OutTraceD("TextOut: hdc=%x xy=(%d,%d) str=(%d)\"%s\"\n", hdc, nXStart, nYStart, cchString, lpString); + OutTraceDW("TextOut: hdc=%x xy=(%d,%d) str=(%d)\"%s\"\n", hdc, nXStart, nYStart, cchString, lpString); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&nXStart, &nYStart); - OutTraceD("TextOut: fixed dest=(%d,%d)\n", nXStart, nYStart); + OutTraceDW("TextOut: fixed dest=(%d,%d)\n", nXStart, nYStart); } ret=(*pGDITextOutA)(hdc, nXStart, nYStart, lpString, cchString); @@ -431,7 +431,7 @@ BOOL WINAPI extTextOutA(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int BOOL WINAPI extScaleWindowExtEx(HDC hdc, int Xnum, int Xdenom, int Ynum, int Ydenom, LPSIZE lpSize) { - OutTraceD("ScaleWindowExtEx: hdc=%x num=(%d,%d) denom=(%d,%d) lpSize=%d\n", + OutTraceDW("ScaleWindowExtEx: hdc=%x num=(%d,%d) denom=(%d,%d) lpSize=%d\n", hdc, Xnum, Ynum, Xdenom, Ydenom, lpSize); MessageBox(0, "ScaleWindowExtEx", "to fix", MB_OK | MB_ICONEXCLAMATION); @@ -443,11 +443,11 @@ BOOL WINAPI extRectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, i { int ret; - OutTraceD("Rectangle: hdc=%x xy=(%d,%d)-(%d,%d)\n", hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); + OutTraceDW("Rectangle: hdc=%x xy=(%d,%d)-(%d,%d)\n", hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&nLeftRect, &nTopRect, &nRightRect, &nBottomRect); - OutTraceD("Rectangle: fixed dest=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); + OutTraceDW("Rectangle: fixed dest=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); } ret=(*pGDIRectangle)(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); @@ -460,7 +460,7 @@ int WINAPI extGDISaveDC(HDC hdc) int ret; ret=(*pGDISaveDC)(hdc); - OutTraceD("GDI.SaveDC: hdc=%x ret=%x\n", hdc, ret); + OutTraceDW("GDI.SaveDC: hdc=%x ret=%x\n", hdc, ret); return ret; } @@ -469,7 +469,7 @@ BOOL WINAPI extGDIRestoreDC(HDC hdc, int nSavedDC) BOOL ret; ret=(*pGDIRestoreDC)(hdc, nSavedDC); - OutTraceD("GDI.RestoreDC: hdc=%x nSavedDC=%x ret=%x\n", hdc, nSavedDC, ret); + OutTraceDW("GDI.RestoreDC: hdc=%x nSavedDC=%x ret=%x\n", hdc, nSavedDC, ret); return ret; } @@ -484,14 +484,14 @@ HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *plpal) HPALETTE ret; int idx; - OutTraceD("GDI.CreatePalette: plpal=%x version=%x NumEntries=%x\n", plpal, plpal->palVersion, plpal->palNumEntries); + OutTraceDW("GDI.CreatePalette: plpal=%x version=%x NumEntries=%x\n", plpal, plpal->palVersion, plpal->palNumEntries); ret=(*pGDICreatePalette)(plpal); if(IsDebug){ - OutTraceD("PalEntry[%x]= ", plpal->palNumEntries); - for(idx=0; idxpalNumEntries; idx++) OutTraceD("(%x)", plpal->palPalEntry[idx]); - OutTraceD("\n"); + OutTraceDW("PalEntry[%x]= ", plpal->palNumEntries); + for(idx=0; idxpalNumEntries; idx++) OutTraceDW("(%x)", plpal->palPalEntry[idx]); + OutTraceDW("\n"); } - OutTraceD("GDI.CreatePalette: hPalette=%x\n", ret); + OutTraceDW("GDI.CreatePalette: hPalette=%x\n", ret); return ret; } @@ -502,9 +502,9 @@ HPALETTE WINAPI extSelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground) HPALETTE ret; ret=(*pGDISelectPalette)(hdc, hpal, bForceBackground); - OutTraceD("GDI.SelectPalette: hdc=%x hpal=%x ForceBackground=%x ret=%x\n", hdc, hpal, bForceBackground, ret); + OutTraceDW("GDI.SelectPalette: hdc=%x hpal=%x ForceBackground=%x ret=%x\n", hdc, hpal, bForceBackground, ret); if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ - OutTraceD("GDI.SelectPalette: register desktop palette hpal=%x\n", hpal); + OutTraceDW("GDI.SelectPalette: register desktop palette hpal=%x\n", hpal); hDesktopPalette=hpal; } return ret; @@ -522,7 +522,7 @@ UINT WINAPI extRealizePalette(HDC hdc) UINT ret; extern void mySetPalette(int, int, LPPALETTEENTRY); - OutTraceD("GDI.RealizePalette: hdc=%x\n", hdc); + OutTraceDW("GDI.RealizePalette: hdc=%x\n", hdc); if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ PALETTEENTRY PalEntries[256]; UINT nEntries; @@ -533,7 +533,7 @@ UINT WINAPI extRealizePalette(HDC hdc) } else ret=(*pGDIRealizePalette)(hdc); - OutTraceD("GDI.RealizePalette: hdc=%x ret=%x\n", hdc, ret); + OutTraceDW("GDI.RealizePalette: hdc=%x ret=%x\n", hdc, ret); return ret; } @@ -613,14 +613,14 @@ UINT WINAPI extGetSystemPaletteEntries(HDC hdc, UINT iStartIndex, UINT nEntries, { int ret; - OutTraceD("GetSystemPaletteEntries: hdc=%x start=%d num=%d\n", hdc, iStartIndex, nEntries); + OutTraceDW("GetSystemPaletteEntries: hdc=%x start=%d num=%d\n", hdc, iStartIndex, nEntries); ret=(*pGDIGetSystemPaletteEntries)(hdc, iStartIndex, nEntries, lppe); - OutTraceD("GetSystemPaletteEntries: ret=%d\n", ret); + OutTraceDW("GetSystemPaletteEntries: ret=%d\n", ret); if((ret == 0) && (dxw.dwFlags1 & EMULATESURFACE)) { // use static default data... for(UINT idx=0; idx 0) dxw.MapClient(&nWidth, &nHeight); else { @@ -1114,7 +1115,7 @@ HFONT WINAPI extCreateFontIndirect(const LOGFONT* lplf) { LOGFONT lf; HFONT retHFont; - OutTraceD("CreateFontIndirect: h=%d w=%d face=\"%s\"\n", lplf->lfHeight, lplf->lfWidth, lplf->lfFaceName); + OutTraceDW("CreateFontIndirect: h=%d w=%d face=\"%s\"\n", lplf->lfHeight, lplf->lfWidth, lplf->lfFaceName); memcpy((char *)&lf, (char *)lplf, sizeof(LOGFONT)); lf.lfQuality=NONANTIALIASED_QUALITY; if(dxw.dwFlags1 & FIXTEXTOUT) { @@ -1127,18 +1128,18 @@ HFONT WINAPI extCreateFontIndirect(const LOGFONT* lplf) } retHFont=((*pGDICreateFontIndirect)(&lf)); if(retHFont) - OutTraceD("CreateFontIndirect: hfont=%x\n", retHFont); + OutTraceDW("CreateFontIndirect: hfont=%x\n", retHFont); else - OutTraceD("CreateFontIndirect: error=%d at %d\n", GetLastError(), __LINE__); + OutTraceDW("CreateFontIndirect: error=%d at %d\n", GetLastError(), __LINE__); return retHFont; } BOOL WINAPI extSetDeviceGammaRamp(HDC hDC, LPVOID lpRamp) { BOOL ret; - OutTraceD("SetDeviceGammaRamp: hdc=%x\n", hDC); + OutTraceDW("SetDeviceGammaRamp: hdc=%x\n", hDC); if(dxw.dwFlags2 & DISABLEGAMMARAMP) { - OutTraceD("SetDeviceGammaRamp: SUPPRESSED\n"); + OutTraceDW("SetDeviceGammaRamp: SUPPRESSED\n"); return TRUE; } ret=(*pGDISetDeviceGammaRamp)(hDC, lpRamp); @@ -1149,7 +1150,7 @@ BOOL WINAPI extSetDeviceGammaRamp(HDC hDC, LPVOID lpRamp) BOOL WINAPI extGetDeviceGammaRamp(HDC hDC, LPVOID lpRamp) { BOOL ret; - OutTraceD("GetDeviceGammaRamp: hdc=%x\n", hDC); + OutTraceDW("GetDeviceGammaRamp: hdc=%x\n", hDC); ret=(*pGDIGetDeviceGammaRamp)(hDC, lpRamp); if(!ret) OutTraceE("GetDeviceGammaRamp: ERROR err=%d\n", GetLastError()); return ret; @@ -1160,23 +1161,23 @@ int WINAPI extGetClipBox(HDC hdc, LPRECT lprc) // v2.02.31: needed in "Imperialism II" to avoid blit clipping int ret; char *sRetCodes[4]={"ERROR", "NULLREGION", "SIMPLEREGION", "COMPLEXREGION"}; - OutTraceD("GetClipBox: hdc=%x\n", hdc); + OutTraceDW("GetClipBox: hdc=%x\n", hdc); ret=(*pGDIGetClipBox)(hdc, lprc); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)) && (ret!=ERROR)){ - OutTraceD("GetClipBox: scaling main win coordinates (%d,%d)-(%d,%d)\n", + OutTraceDW("GetClipBox: scaling main win coordinates (%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); // current implementation is NOT accurate, since it always returns the whole // virtual desktop area as the current clipbox...!!! *lprc=dxw.GetScreenRect(); } - OutTraceD("GetClipBox: ret=%x(%s)\n", ret, sRetCodes[ret]); + OutTraceDW("GetClipBox: ret=%x(%s)\n", ret, sRetCodes[ret]); return ret; } BOOL WINAPI extPolyline(HDC hdc, const POINT *lppt, int cPoints) { BOOL ret; - if(IsTraceD){ + if(IsTraceDDRAW){ int i; OutTrace("Polyline: hdc=%x cPoints=%d pt=", hdc, cPoints); for(i=0; ibmiHeader); - OutTraceD("SetDIBitsToDevice: BitmapInfo dim=(%dx%d) Planes=%d BPP=%d Compression=%x SizeImage=%x\n", + OutTraceDW("SetDIBitsToDevice: BitmapInfo dim=(%dx%d) Planes=%d BPP=%d Compression=%x SizeImage=%x\n", bmi->biWidth, bmi->biHeight, bmi->biPlanes, bmi->biBitCount, bmi->biCompression, bmi->biSizeImage); if (dxw.IsFullScreen() && dxw.IsVirtual(hdc)){ int X, Y; X=XDest+dxw.VirtualOffsetX; Y=YDest+dxw.VirtualOffsetY; - OutTraceD("SetDIBitsToDevice: virtual pos=(%d,%d)+(%d+%d)=(%d,%d)\n", + OutTraceDW("SetDIBitsToDevice: virtual pos=(%d,%d)+(%d+%d)=(%d,%d)\n", XDest, YDest, dxw.VirtualOffsetX, dxw.VirtualOffsetY, X, Y); ret=(*pSetDIBitsToDevice)(hdc, X, Y, dwWidth, dwHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse); if(!ret || (ret==GDI_ERROR)) OutTraceE("SetDIBitsToDevice: ERROR ret=%x err=%d\n", ret, GetLastError()); @@ -1361,7 +1362,7 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW OrigXDest=XDest; OrigYDest=YDest; dxw.MapClient(&XDest, &YDest, (int *)&dwWidth, (int *)&dwHeight); - OutTraceD("SetDIBitsToDevice: fixed dest=(%d,%d)-(%d,%d)\n", XDest, YDest, dwWidth, dwHeight); + OutTraceDW("SetDIBitsToDevice: fixed dest=(%d,%d)-(%d,%d)\n", XDest, YDest, dwWidth, dwHeight); HDC hTempDc; HBITMAP hbmPic; if(!(hTempDc=CreateCompatibleDC(hdc))) @@ -1392,12 +1393,12 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW //HBITMAP WINAPI extCreateCompatibleBitmap(HDC hdc, int nWidth, int nHeight) //{ // HBITMAP ret; -// OutTraceD("CreateCompatibleBitmap: hdc=%x size=(%d,%d)\n", +// OutTraceDW("CreateCompatibleBitmap: hdc=%x size=(%d,%d)\n", // hdc, nWidth, nHeight); // // if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ // dxw.MapClient(&nWidth, &nHeight); -// OutTraceD("CreateCompatibleBitmap: fixed size=(%d,%d)\n", nWidth, nHeight); +// OutTraceDW("CreateCompatibleBitmap: fixed size=(%d,%d)\n", nWidth, nHeight); // } // // ret=(*pCreateCompatibleBitmap)(hdc, nWidth, nHeight); @@ -1408,11 +1409,11 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW COLORREF WINAPI extSetPixel(HDC hdc, int X, int Y, COLORREF crColor) { COLORREF ret; - OutTraceD("SetPixel: hdc=%x color=%x point=(%d,%d)\n", hdc, crColor, X, Y); + OutTraceDW("SetPixel: hdc=%x color=%x point=(%d,%d)\n", hdc, crColor, X, Y); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&X, &Y); - OutTraceD("SetPixel: fixed pos=(%d,%d)\n", X, Y); + OutTraceDW("SetPixel: fixed pos=(%d,%d)\n", X, Y); } ret=(*pSetPixel)(hdc, X, Y, crColor); @@ -1424,11 +1425,11 @@ COLORREF WINAPI extSetPixel(HDC hdc, int X, int Y, COLORREF crColor) BOOL WINAPI extEllipse(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) { int ret; - OutTraceD("Ellipse: hdc=%x rect=(%d,%d)-(%d,%d)\n", hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); + OutTraceDW("Ellipse: hdc=%x rect=(%d,%d)-(%d,%d)\n", hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&nLeftRect, &nTopRect, &nRightRect, &nBottomRect); - OutTraceD("Ellipse: fixed dest=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); + OutTraceDW("Ellipse: fixed dest=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); } ret=(*pEllipse)(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); @@ -1439,7 +1440,7 @@ BOOL WINAPI extEllipse(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int BOOL WINAPI extPolygon(HDC hdc, const POINT *lpPoints, int cCount) { BOOL ret; - if(IsTraceD){ + if(IsTraceDDRAW){ int i; OutTrace("Polygon: hdc=%x cCount=%d pt=", hdc, cCount); for(i=0; ileft, lprc->top, lprc->right, lprc->bottom); + OutTraceDW("CreateEllipticRgnIndirect: rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); if (dxw.IsFullScreen()){ dxw.MapClient((RECT *)lprc); - OutTraceD("CreateEllipticRgnIndirect: fixed rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); + OutTraceDW("CreateEllipticRgnIndirect: fixed rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); } ret=(*pCreateEllipticRgnIndirect)(lprc); @@ -1510,11 +1511,11 @@ HRGN WINAPI extCreateEllipticRgnIndirect(const RECT *lprc) HRGN WINAPI extCreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) { HRGN ret; - OutTraceD("CreateRectRgn: rect=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); + OutTraceDW("CreateRectRgn: rect=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); if (dxw.IsFullScreen()){ dxw.MapClient(&nLeftRect, &nTopRect, &nRightRect, &nBottomRect); - OutTraceD("CreateRectRgn: fixed rect=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); + OutTraceDW("CreateRectRgn: fixed rect=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); } ret=(*pCreateRectRgn)(nLeftRect, nTopRect, nRightRect, nBottomRect); @@ -1525,11 +1526,11 @@ HRGN WINAPI extCreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nB HRGN WINAPI extCreateRectRgnIndirect(const RECT *lprc) { HRGN ret; - OutTraceD("CreateRectRgnIndirect: rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); + OutTraceDW("CreateRectRgnIndirect: rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); if (dxw.IsFullScreen()){ dxw.MapClient((RECT *)lprc); - OutTraceD("CreateRectRgnIndirect: fixed rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); + OutTraceDW("CreateRectRgnIndirect: fixed rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); } ret=(*pCreateRectRgnIndirect)(lprc); @@ -1540,7 +1541,7 @@ HRGN WINAPI extCreateRectRgnIndirect(const RECT *lprc) HRGN WINAPI extCreatePolygonRgn(const POINT *lpPoints, int cPoints, int fnPolyFillMode) { HRGN ret; - if(IsTraceD){ + if(IsTraceDDRAW){ int i; OutTrace("CreatePolygonRgn: PolyFillMode=%x cCount=%d pt=", fnPolyFillMode, cPoints); for(i=0; ileft, lpRect->top, lpRect->right, lpRect->bottom, uFormat, nCount, lpchText); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient((RECT *)lpRect); - OutTraceD("DrawText: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + OutTraceDW("DrawText: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); } ret=(*pDrawText)(hdc, lpchText, nCount, lpRect, uFormat); @@ -1579,12 +1580,12 @@ int WINAPI extDrawText(HDC hdc, LPCTSTR lpchText, int nCount, LPRECT lpRect, UIN int WINAPI extDrawTextEx(HDC hdc, LPTSTR lpchText, int nCount, LPRECT lpRect, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams) { int ret; - OutTraceD("DrawTextEx: hdc=%x rect=(%d,%d)-(%d,%d) DTFormat=%x Text=(%d)\"%s\"\n", + OutTraceDW("DrawTextEx: hdc=%x rect=(%d,%d)-(%d,%d) DTFormat=%x Text=(%d)\"%s\"\n", hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, dwDTFormat, nCount, lpchText); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient((RECT *)lpRect); - OutTraceD("DrawTextEx: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + OutTraceDW("DrawTextEx: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); } ret=(*pDrawTextEx)(hdc, lpchText, nCount, lpRect, dwDTFormat, lpDTParams); @@ -1596,12 +1597,12 @@ BOOL WINAPI extMaskBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHei int nXSrc, int nYSrc, HBITMAP hbmMask, int xMask, int yMask, DWORD dwRop) { BOOL ret; - OutTraceD("MaskBlt: hdcDest=%x pos=(%d,%d) size=(%dx%d) hdcSrc=%x pos=(%d,%d) hbmMask=%x Mask=(%d,%d) dwRop=%x\n", + OutTraceDW("MaskBlt: hdcDest=%x pos=(%d,%d) size=(%dx%d) hdcSrc=%x pos=(%d,%d) hbmMask=%x Mask=(%d,%d) dwRop=%x\n", hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, hbmMask, xMask, yMask, dwRop); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdcDest))){ dxw.MapClient(&nXDest, &nYDest, &nWidth, &nHeight); - OutTraceD("MaskBlt: fixed pos=(%d,%d) size=(%dx%d)\n", nXDest, nYDest, nWidth, nHeight); + OutTraceDW("MaskBlt: fixed pos=(%d,%d) size=(%dx%d)\n", nXDest, nYDest, nWidth, nHeight); } ret=(*pMaskBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, hbmMask, xMask, yMask, dwRop); @@ -1612,10 +1613,10 @@ BOOL WINAPI extMaskBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHei BOOL WINAPI extSetViewportOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint) { BOOL ret; - OutTraceD("SetViewportOrgEx: hdc=%x pos=(%d,%d)\n", hdc, X, Y); + OutTraceDW("SetViewportOrgEx: hdc=%x pos=(%d,%d)\n", hdc, X, Y); if(dxw.IsVirtual(hdc)) { - OutTraceD("SetViewportOrgEx: virtual hdc\n"); + OutTraceDW("SetViewportOrgEx: virtual hdc\n"); dxw.VirtualOffsetX = X; dxw.VirtualOffsetY = Y; return TRUE; @@ -1623,15 +1624,15 @@ BOOL WINAPI extSetViewportOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint) if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&X, &Y); - OutTraceD("SetViewportOrgEx: fixed pos=(%d,%d)\n", X, Y); + OutTraceDW("SetViewportOrgEx: fixed pos=(%d,%d)\n", X, Y); } ret=(*pSetViewportOrgEx)(hdc, X, Y, lpPoint); if(ret && lpPoint) { - OutTraceD("SetViewportOrgEx: previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("SetViewportOrgEx: previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.UnmapClient(lpPoint); - OutTraceD("SetViewportOrgEx: fixed previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("SetViewportOrgEx: fixed previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); } } if(!ret) OutTraceE("SetViewportOrgEx: ERROR ret=%x err=%d\n", ret, GetLastError()); @@ -1641,19 +1642,19 @@ BOOL WINAPI extSetViewportOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint) BOOL WINAPI extSetViewportExtEx(HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize) { BOOL ret; - OutTraceD("SetViewportExtEx: hdc=%x ext=(%d,%d)\n", hdc, nXExtent, nYExtent); + OutTraceDW("SetViewportExtEx: hdc=%x ext=(%d,%d)\n", hdc, nXExtent, nYExtent); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&nXExtent, &nYExtent); - OutTraceD("SetViewportExtEx: fixed ext=(%d,%d)\n", nXExtent, nYExtent); + OutTraceDW("SetViewportExtEx: fixed ext=(%d,%d)\n", nXExtent, nYExtent); } ret=(*pSetViewportExtEx)(hdc, nXExtent, nYExtent, lpSize); if(ret && lpSize) { - OutTraceD("SetViewportExtEx: previous ext=(%d,%d)\n", lpSize->cx, lpSize->cy); + OutTraceDW("SetViewportExtEx: previous ext=(%d,%d)\n", lpSize->cx, lpSize->cy); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.UnmapClient((LPPOINT)lpSize); - OutTraceD("SetViewportExtEx: fixed previous ext=(%d,%d)\n", lpSize->cx, lpSize->cy); + OutTraceDW("SetViewportExtEx: fixed previous ext=(%d,%d)\n", lpSize->cx, lpSize->cy); } } @@ -1664,7 +1665,7 @@ BOOL WINAPI extSetViewportExtEx(HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSi BOOL WINAPI extGetViewportOrgEx(HDC hdc, LPPOINT lpPoint) { BOOL ret; - OutTraceD("GetViewportOrgEx: hdc=%x\n", hdc); + OutTraceDW("GetViewportOrgEx: hdc=%x\n", hdc); if(dxw.IsVirtual(hdc)) { lpPoint->x = dxw.VirtualOffsetX; @@ -1674,10 +1675,10 @@ BOOL WINAPI extGetViewportOrgEx(HDC hdc, LPPOINT lpPoint) ret=(*pGetViewportOrgEx)(hdc, lpPoint); if(ret) { - OutTraceD("GetViewportOrgEx: ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("GetViewportOrgEx: ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.UnmapClient(lpPoint); - OutTraceD("GetViewportOrgEx: fixed ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("GetViewportOrgEx: fixed ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); } } @@ -1688,14 +1689,14 @@ BOOL WINAPI extGetViewportOrgEx(HDC hdc, LPPOINT lpPoint) BOOL WINAPI extGetWindowOrgEx(HDC hdc, LPPOINT lpPoint) { BOOL ret; - OutTraceD("GetWindowOrgEx: hdc=%x\n", hdc); + OutTraceDW("GetWindowOrgEx: hdc=%x\n", hdc); ret=(*pGetWindowOrgEx)(hdc, lpPoint); if(ret) { - OutTraceD("GetWindowOrgEx: ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("GetWindowOrgEx: ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.UnmapClient(lpPoint); - OutTraceD("GetWindowOrgEx: fixed ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("GetWindowOrgEx: fixed ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); } } @@ -1706,19 +1707,19 @@ BOOL WINAPI extGetWindowOrgEx(HDC hdc, LPPOINT lpPoint) BOOL WINAPI extSetWindowOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint) { BOOL ret; - OutTraceD("SetWindowOrgEx: hdc=%x pos=(%d,%d)\n", hdc, X, Y); + OutTraceDW("SetWindowOrgEx: hdc=%x pos=(%d,%d)\n", hdc, X, Y); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&X, &Y); - OutTraceD("SetWindowOrgEx: fixed pos=(%d,%d)\n", X, Y); + OutTraceDW("SetWindowOrgEx: fixed pos=(%d,%d)\n", X, Y); } ret=(*pSetWindowOrgEx)(hdc, X, Y, lpPoint); if(ret && lpPoint) { - OutTraceD("SetWindowOrgEx: previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("SetWindowOrgEx: previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.UnmapClient(lpPoint); - OutTraceD("SetWindowOrgEx: fixed previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("SetWindowOrgEx: fixed previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y); } } if(!ret) OutTraceE("SetWindowOrgEx: ERROR ret=%x err=%d\n", ret, GetLastError()); @@ -1728,14 +1729,14 @@ BOOL WINAPI extSetWindowOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint) BOOL WINAPI extGetCurrentPositionEx(HDC hdc, LPPOINT lpPoint) { BOOL ret; - OutTraceD("GetCurrentPositionEx: hdc=%x\n", hdc); + OutTraceDW("GetCurrentPositionEx: hdc=%x\n", hdc); ret=(*pGetCurrentPositionEx)(hdc, lpPoint); if(ret) { - OutTraceD("GetCurrentPositionEx: pos=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("GetCurrentPositionEx: pos=(%d,%d)\n", lpPoint->x, lpPoint->y); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.UnmapClient(lpPoint); - OutTraceD("GetCurrentPositionEx: fixed pos=(%d,%d)\n", lpPoint->x, lpPoint->y); + OutTraceDW("GetCurrentPositionEx: fixed pos=(%d,%d)\n", lpPoint->x, lpPoint->y); } } if(!ret) OutTraceE("GetCurrentPositionEx: ERROR ret=%x err=%d\n", ret, GetLastError()); @@ -1745,7 +1746,7 @@ BOOL WINAPI extGetCurrentPositionEx(HDC hdc, LPPOINT lpPoint) BOOL WINAPI extCreateScalableFontResourceA(DWORD fdwHidden, LPCTSTR lpszFontRes, LPCTSTR lpszFontFile, LPCTSTR lpszCurrentPath) { BOOL res; - OutTraceD("CreateScalableFontResource: hidden=%d FontRes=\"%s\" FontFile=\"%s\" CurrentPath=\"%s\"\n", + OutTraceDW("CreateScalableFontResource: hidden=%d FontRes=\"%s\" FontFile=\"%s\" CurrentPath=\"%s\"\n", fdwHidden, lpszFontRes, lpszFontFile, lpszCurrentPath); if(dxw.dwFlags3 & FONTBYPASS) return TRUE; res=(*pCreateScalableFontResourceA)(fdwHidden, lpszFontRes, lpszFontFile, lpszCurrentPath); @@ -1756,7 +1757,7 @@ BOOL WINAPI extCreateScalableFontResourceA(DWORD fdwHidden, LPCTSTR lpszFontRes, BOOL WINAPI extCreateScalableFontResourceW(DWORD fdwHidden, LPCWSTR lpszFontRes, LPCWSTR lpszFontFile, LPCWSTR lpszCurrentPath) { BOOL res; - OutTraceD("CreateScalableFontResource: hidden=%d FontRes=\"%ls\" FontFile=\"%ls\" CurrentPath=\"%ls\"\n", + OutTraceDW("CreateScalableFontResource: hidden=%d FontRes=\"%ls\" FontFile=\"%ls\" CurrentPath=\"%ls\"\n", fdwHidden, lpszFontRes, lpszFontFile, lpszCurrentPath); if(dxw.dwFlags3 & FONTBYPASS) return TRUE; res=(*pCreateScalableFontResourceW)(fdwHidden, lpszFontRes, lpszFontFile, lpszCurrentPath); @@ -1767,9 +1768,9 @@ BOOL WINAPI extCreateScalableFontResourceW(DWORD fdwHidden, LPCWSTR lpszFontRes, int WINAPI extAddFontResourceA(LPCTSTR lpszFontFile) { BOOL res; - OutTraceD("AddFontResource: FontFile=\"%s\"\n", lpszFontFile); + OutTraceDW("AddFontResource: FontFile=\"%s\"\n", lpszFontFile); if(dxw.dwFlags3 & FONTBYPASS) { - OutTraceD("AddFontResource: SUPPRESSED FontFile=\"%s\"\n", lpszFontFile); + OutTraceDW("AddFontResource: SUPPRESSED FontFile=\"%s\"\n", lpszFontFile); return TRUE; } res=(*pAddFontResourceA)(lpszFontFile); @@ -1780,9 +1781,9 @@ int WINAPI extAddFontResourceA(LPCTSTR lpszFontFile) int WINAPI extAddFontResourceW(LPCWSTR lpszFontFile) { BOOL res; - OutTraceD("AddFontResource: FontFile=\"%ls\"\n", lpszFontFile); + OutTraceDW("AddFontResource: FontFile=\"%ls\"\n", lpszFontFile); if(dxw.dwFlags3 & FONTBYPASS) { - OutTraceD("AddFontResource: SUPPRESSED FontFile=\"%ls\"\n", lpszFontFile); + OutTraceDW("AddFontResource: SUPPRESSED FontFile=\"%ls\"\n", lpszFontFile); return TRUE; } res=(*pAddFontResourceW)(lpszFontFile); @@ -1793,14 +1794,14 @@ int WINAPI extAddFontResourceW(LPCWSTR lpszFontFile) UINT WINAPI extSetSystemPaletteUse(HDC hdc, UINT uUsage) { //BOOL res; - OutTraceD("SetSystemPaletteUse: hdc=%x Usage=%x(%s)\n", hdc, uUsage, ExplainPaletteUse(uUsage)); + OutTraceDW("SetSystemPaletteUse: hdc=%x Usage=%x(%s)\n", hdc, uUsage, ExplainPaletteUse(uUsage)); return SYSPAL_NOSTATIC256; } #if 0 int WINAPI extSetMapMode(HDC hdc, int fnMapMode) { - OutTraceD("SetMapMode: hdc=%x MapMode=%d\n", hdc, fnMapMode); + OutTraceDW("SetMapMode: hdc=%x MapMode=%d\n", hdc, fnMapMode); return TRUE; } #endif diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index e63af05..c28be5d 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -36,6 +36,8 @@ typedef HRESULT (WINAPI *GetViewport_Type)(void *, D3DVIEWPORT9 *); typedef HRESULT (WINAPI *SetViewport_Type)(void *, D3DVIEWPORT9 *); typedef void (WINAPI *SetGammaRamp_Type)(void *, UINT, DWORD, D3DGAMMARAMP *); typedef void (WINAPI *GetGammaRamp_Type)(void *, UINT, D3DGAMMARAMP *); +typedef void (WINAPI *SetCursorPosition9_Type)(void *, int, int, DWORD); +typedef void (WINAPI *SetCursorPosition8_Type)(void *, int, int, DWORD); typedef HRESULT (WINAPI *D3D10CreateDevice_Type)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, ID3D10Device **); typedef HRESULT (WINAPI *D3D10CreateDeviceAndSwapChain_Type)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D10Device **); @@ -43,7 +45,9 @@ typedef HRESULT (WINAPI *D3D10CreateDevice1_Type)(IDXGIAdapter *, D3D10_DRIVER_T typedef HRESULT (WINAPI *D3D10CreateDeviceAndSwapChain1_Type)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D10Device **); typedef HRESULT (WINAPI *D3D11CreateDevice_Type)(IDXGIAdapter *, D3D_DRIVER_TYPE, HMODULE, UINT, const D3D_FEATURE_LEVEL *, UINT, UINT, ID3D11Device **, D3D_FEATURE_LEVEL *, ID3D11DeviceContext **); typedef HRESULT (WINAPI *D3D11CreateDeviceAndSwapChain_Type)(IDXGIAdapter *, D3D_DRIVER_TYPE, HMODULE, UINT, const D3D_FEATURE_LEVEL *, UINT, UINT, const DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D11Device **, D3D_FEATURE_LEVEL *, ID3D11DeviceContext **); -typedef void (WINAPI *RSSetViewports_Type)(void *, UINT, D3D11_VIEWPORT *); +typedef void (WINAPI *RSSetViewports_Type)(void *, UINT, D3D11_VIEWPORT *); +typedef ULONG (WINAPI *AddRef_Type)(void *); +typedef ULONG (WINAPI *Release_Type)(void *); HRESULT WINAPI extQueryInterfaceD3D8(void *, REFIID, void** ); HRESULT WINAPI extQueryInterfaceDev8(void *, REFIID, void** ); @@ -74,8 +78,14 @@ HRESULT WINAPI extGetRenderState(void *, D3DRENDERSTATETYPE, DWORD); HRESULT WINAPI extCreateAdditionalSwapChain(void *, D3DPRESENT_PARAMETERS *, IDirect3DSwapChain9 **); HRESULT WINAPI extGetViewport(void *, D3DVIEWPORT9 *); HRESULT WINAPI extSetViewport(void *, D3DVIEWPORT9 *); +HRESULT WINAPI extReset(void *, D3DPRESENT_PARAMETERS *); void WINAPI extSetGammaRamp(void *, UINT, DWORD, D3DGAMMARAMP *); void WINAPI extGetGammaRamp(void *, UINT, D3DGAMMARAMP *); +void WINAPI extSetCursorPosition9(void *, int, int, DWORD); +void WINAPI extSetCursorPosition8(void *, int, int, DWORD); +ULONG WINAPI extAddRef9(void *); +ULONG WINAPI extRelease9(void *); + HRESULT WINAPI extD3D10CreateDevice(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, ID3D10Device **); HRESULT WINAPI extD3D10CreateDeviceAndSwapChain(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D10Device **); @@ -119,6 +129,8 @@ GetViewport_Type pGetViewport = 0; SetViewport_Type pSetViewport = 0; SetGammaRamp_Type pSetGammaRamp = 0; GetGammaRamp_Type pGetGammaRamp = 0; +SetCursorPosition9_Type pSetCursorPosition9 = 0; +SetCursorPosition8_Type pSetCursorPosition8 = 0; D3D10CreateDevice_Type pD3D10CreateDevice = 0; D3D10CreateDeviceAndSwapChain_Type pD3D10CreateDeviceAndSwapChain = 0; @@ -128,13 +140,32 @@ D3D11CreateDevice_Type pD3D11CreateDevice = 0; D3D11CreateDeviceAndSwapChain_Type pD3D11CreateDeviceAndSwapChain = 0; RSSetViewports_Type pRSSetViewports = 0; +AddRef_Type pAddRef9 = 0; +Release_Type pRelease9 = 0; + DWORD dwD3DVersion; +void dxwCopyProxyLib9() +{ + #define MAX_FILE_PATH 512 + DWORD dwAttrib; + char sSourcePath[MAX_FILE_PATH+1]; + char *p; + + dwAttrib = GetFileAttributes("dxwnd.dll"); + if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) return; + GetModuleFileName(GetModuleHandle("dxwnd"), sSourcePath, MAX_FILE_PATH); + p=&sSourcePath[strlen(sSourcePath)-strlen("dxwnd.dll")]; + strcpy(p, "d3d9.dll"); + OutTraceDW("HookInit: copy %s -> d3d9.dll\n", sSourcePath); + CopyFile(sSourcePath, "d3d9.dll", FALSE); +} + FARPROC Remap_d3d8_ProcAddress(LPCSTR proc, HMODULE hModule) { if (!strcmp(proc,"Direct3DCreate8") && !pDirect3DCreate8){ pDirect3DCreate8=(Direct3DCreate8_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreate8); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreate8); return (FARPROC)extDirect3DCreate8; } // NULL -> keep the original call address @@ -143,55 +174,56 @@ FARPROC Remap_d3d8_ProcAddress(LPCSTR proc, HMODULE hModule) HRESULT WINAPI voidDirect3DShaderValidatorCreate9(void) { - OutTraceD("Direct3DShaderValidatorCreate9: SUPPRESSED\n"); + OutTraceDW("Direct3DShaderValidatorCreate9: SUPPRESSED\n"); return 0; } void WINAPI voidDebugSetLevel(void) { - OutTraceD("DebugSetLevel: SUPPRESSED\n"); + OutTraceDW("DebugSetLevel: SUPPRESSED\n"); } void WINAPI voidDebugSetMute(void) { - OutTraceD("DebugSetMute: SUPPRESSED\n"); + OutTraceDW("DebugSetMute: SUPPRESSED\n"); } FARPROC Remap_d3d9_ProcAddress(LPCSTR proc, HMODULE hModule) { // NULL -> keep the original call address // (FARPROC)-1 -> returns NULL + if(dxw.dwFlags4 & ADDPROXYLIBS) dxwCopyProxyLib9(); if (!strcmp(proc,"Direct3DCreate9") && !pDirect3DCreate9){ pDirect3DCreate9=(Direct3DCreate9_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreate9); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreate9); return (FARPROC)extDirect3DCreate9; } if (!strcmp(proc,"Direct3DCreate9Ex") && !pDirect3DCreate9Ex){ pDirect3DCreate9Ex=(Direct3DCreate9Ex_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreate9Ex); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreate9Ex); return (FARPROC)extDirect3DCreate9Ex; } if (!strcmp(proc,"CheckFullScreen") && !pCheckFullScreen){ pCheckFullScreen=(CheckFullScreen_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pCheckFullScreen); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pCheckFullScreen); return (FARPROC)extCheckFullScreen; } if (!(dxw.dwFlags3 & SUPPRESSD3DEXT)) return NULL; if (!strcmp(proc,"Direct3DShaderValidatorCreate9")){ - OutTraceD("GetProcAddress: suppressing Direct3DShaderValidatorCreate9\n"); + OutTraceDW("GetProcAddress: suppressing Direct3DShaderValidatorCreate9\n"); return (FARPROC)voidDirect3DShaderValidatorCreate9; //return (FARPROC)-1; } if (!strcmp(proc,"DebugSetLevel")){ - OutTraceD("GetProcAddress: suppressing DebugSetLevel\n"); + OutTraceDW("GetProcAddress: suppressing DebugSetLevel\n"); return (FARPROC)voidDebugSetLevel; //return (FARPROC)-1; } if (!strcmp(proc,"DebugSetMute")){ - OutTraceD("GetProcAddress: suppressing DebugSetMute\n"); + OutTraceDW("GetProcAddress: suppressing DebugSetMute\n"); return (FARPROC)voidDebugSetMute; //return (FARPROC)-1; } @@ -202,12 +234,12 @@ FARPROC Remap_d3d10_ProcAddress(LPCSTR proc, HMODULE hModule) { if (!strcmp(proc,"D3D10CreateDevice") && !pD3D10CreateDevice){ pD3D10CreateDevice=(D3D10CreateDevice_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D10CreateDevice); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D10CreateDevice); return (FARPROC)extD3D10CreateDevice; } if (!strcmp(proc,"D3D10CreateDeviceAndSwapChain") && !pD3D10CreateDeviceAndSwapChain){ pD3D10CreateDeviceAndSwapChain=(D3D10CreateDeviceAndSwapChain_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D10CreateDeviceAndSwapChain); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D10CreateDeviceAndSwapChain); return (FARPROC)extD3D10CreateDeviceAndSwapChain; } // NULL -> keep the original call address @@ -218,12 +250,12 @@ FARPROC Remap_d3d10_1_ProcAddress(LPCSTR proc, HMODULE hModule) { if (!strcmp(proc,"D3D10CreateDevice1") && !pD3D10CreateDevice1){ pD3D10CreateDevice1=(D3D10CreateDevice1_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D10CreateDevice1); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D10CreateDevice1); return (FARPROC)extD3D10CreateDevice1; } if (!strcmp(proc,"D3D10CreateDeviceAndSwapChain1") && !pD3D10CreateDeviceAndSwapChain1){ pD3D10CreateDeviceAndSwapChain1=(D3D10CreateDeviceAndSwapChain1_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D10CreateDeviceAndSwapChain1); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D10CreateDeviceAndSwapChain1); return (FARPROC)extD3D10CreateDeviceAndSwapChain1; } // NULL -> keep the original call address @@ -234,12 +266,12 @@ FARPROC Remap_d3d11_ProcAddress(LPCSTR proc, HMODULE hModule) { if (!strcmp(proc,"D3D11CreateDevice") && !pD3D11CreateDevice){ pD3D11CreateDevice=(D3D11CreateDevice_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D11CreateDevice); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D11CreateDevice); return (FARPROC)extD3D11CreateDevice; } if (!strcmp(proc,"D3D11CreateDeviceAndSwapChain") && !pD3D11CreateDeviceAndSwapChain){ pD3D11CreateDeviceAndSwapChain=(D3D11CreateDeviceAndSwapChain_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D11CreateDeviceAndSwapChain); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pD3D11CreateDeviceAndSwapChain); return (FARPROC)extD3D11CreateDeviceAndSwapChain; } // NULL -> keep the original call address @@ -257,6 +289,8 @@ int HookDirect3D(HMODULE module, int version){ switch(version){ case 0: // D3D8 + if(dxw.dwFlags4 & ADDPROXYLIBS) dxwCopyProxyLib9(); + tmp = HookAPI(module, "d3d8.dll", NULL, "Direct3DCreate8", extDirect3DCreate8); if(tmp) pDirect3DCreate8 = (Direct3DCreate8_Type)tmp; // D3D9 @@ -294,13 +328,14 @@ int HookDirect3D(HMODULE module, int version){ } break; case 9: - hinst = LoadLibrary("d3d9.dll"); + if(dxw.dwFlags4 & ADDPROXYLIBS) dxwCopyProxyLib9(); + hinst = (*pLoadLibraryA)("d3d9.dll"); pDirect3DCreate9 = - (Direct3DCreate9_Type)GetProcAddress(hinst, "Direct3DCreate9"); + (Direct3DCreate9_Type)(*pGetProcAddress)(hinst, "Direct3DCreate9"); pDirect3DCreate9Ex = - (Direct3DCreate9Ex_Type)GetProcAddress(hinst, "Direct3DCreate9Ex"); + (Direct3DCreate9Ex_Type)(*pGetProcAddress)(hinst, "Direct3DCreate9Ex"); pCheckFullScreen = - (CheckFullScreen_Type)GetProcAddress(hinst, "CheckFullScreen"); + (CheckFullScreen_Type)(*pGetProcAddress)(hinst, "CheckFullScreen"); if(pDirect3DCreate9){ lpd3d = (LPDIRECT3D9)extDirect3DCreate9(31); if(lpd3d) lpd3d->Release(); @@ -308,9 +343,9 @@ int HookDirect3D(HMODULE module, int version){ break; #ifdef HOOKD3D10ANDLATER case 10: - hinst = LoadLibrary("d3d10.dll"); + hinst = (*pLoadLibraryA)("d3d10.dll"); pD3D10CreateDevice = - (D3D10CreateDevice_Type)GetProcAddress(hinst, "D3D10CreateDevice"); + (D3D10CreateDevice_Type)(*pGetProcAddress)(hinst, "D3D10CreateDevice"); if(pD3D10CreateDevice){ res = extD3D10CreateDevice( NULL, @@ -321,9 +356,9 @@ int HookDirect3D(HMODULE module, int version){ &lpd3d10); if(res==DD_OK) lpd3d10->Release(); } - hinst = LoadLibrary("d3d10_1.dll"); + hinst = (*pLoadLibraryA)("d3d10_1.dll"); pD3D10CreateDevice1 = - (D3D10CreateDevice1_Type)GetProcAddress(hinst, "D3D10CreateDevice1"); + (D3D10CreateDevice1_Type)(*pGetProcAddress)(hinst, "D3D10CreateDevice1"); break; if(pD3D10CreateDevice1){ res = extD3D10CreateDevice1( @@ -337,7 +372,7 @@ int HookDirect3D(HMODULE module, int version){ if(res==DD_OK) lpd3d10->Release(); } pD3D10CreateDeviceAndSwapChain = - (D3D10CreateDeviceAndSwapChain_Type)GetProcAddress(hinst, "D3D10CreateDeviceAndSwapChain"); + (D3D10CreateDeviceAndSwapChain_Type)(*pGetProcAddress)(hinst, "D3D10CreateDeviceAndSwapChain"); if(pD3D10CreateDeviceAndSwapChain){ DXGI_SWAP_CHAIN_DESC swapChainDesc; IDXGISwapChain *pSwapChain; @@ -374,9 +409,9 @@ int HookDirect3D(HMODULE module, int version){ } break; case 11: - hinst = LoadLibrary("d3d11.dll"); + hinst = (*pLoadLibraryA)("d3d11.dll"); pD3D11CreateDevice = - (D3D11CreateDevice_Type)GetProcAddress(hinst, "D3D11CreateDevice"); + (D3D11CreateDevice_Type)(*pGetProcAddress)(hinst, "D3D11CreateDevice"); if(pD3D11CreateDevice){ D3D_FEATURE_LEVEL FeatureLevel; ID3D11DeviceContext *pImmediateContext; @@ -394,7 +429,7 @@ int HookDirect3D(HMODULE module, int version){ if(res==DD_OK) lpd3d11->Release(); } pD3D11CreateDeviceAndSwapChain = - (D3D11CreateDeviceAndSwapChain_Type)GetProcAddress(hinst, "D3D11CreateDeviceAndSwapChain"); + (D3D11CreateDeviceAndSwapChain_Type)(*pGetProcAddress)(hinst, "D3D11CreateDeviceAndSwapChain"); break; #endif } @@ -402,41 +437,100 @@ int HookDirect3D(HMODULE module, int version){ return 0; } +void HookD3DDevice8(void** ppD3Ddev8) +{ + void *pReset; + OutTraceDW("Device hook for IID_IDirect3DDevice8 interface\n"); + pReset=NULL; // to avoid assert condition + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 0), extQueryInterfaceDev8, (void **)&pQueryInterfaceDev8, "QueryInterface(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 24), extGetDirect3D, (void **)&pGetDirect3D, "GetDirect3D(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 32), extGetDisplayMode8, (void **)&pGetDisplayMode8, "GetDisplayMode(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 44), extSetCursorPosition8, (void **)&pSetCursorPosition8, "SetCursorPosition(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 52), extCreateAdditionalSwapChain, (void **)&pCreateAdditionalSwapChain, "CreateAdditionalSwapChain(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 56), extReset, (void **)&pReset, "Reset(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 60), extPresent, (void **)&pPresent, "Present(D8)"); + if(dxw.dwFlags2 & DISABLEGAMMARAMP){ + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 72), extSetGammaRamp, (void **)&pSetGammaRamp, "SetGammaRamp(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 76), extGetGammaRamp, (void **)&pGetGammaRamp, "GetGammaRamp(D8)"); + } + if(dxw.dwFlags2 & WIREFRAME){ + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 200), extSetRenderState, (void **)&pSetRenderState, "SetRenderState(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 204), extGetRenderState, (void **)&pGetRenderState, "GetRenderState(D8)"); + (*pSetRenderState)((void *)*ppD3Ddev8, D3DRS_FILLMODE, D3DFILL_WIREFRAME); + } +} + +void HookD3DDevice9(void** ppD3Ddev9) +{ + void *pReset; + OutTraceDW("Device hook for IID_IDirect3DDevice9 interface\n"); + pReset=NULL; // to avoid assert condition + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 0), extQueryInterfaceDev9, (void **)&pQueryInterfaceDev9, "QueryInterface(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 24), extGetDirect3D, (void **)&pGetDirect3D, "GetDirect3D(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 32), extGetDisplayMode9, (void **)&pGetDisplayMode9, "GetDisplayMode(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 44), extSetCursorPosition9, (void **)&pSetCursorPosition9, "SetCursorPosition(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 52), extCreateAdditionalSwapChain, (void **)&pCreateAdditionalSwapChain, "CreateAdditionalSwapChain(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 64), extReset, (void **)&pReset, "Reset(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 68), extPresent, (void **)&pPresent, "Present(D9)"); + if(dxw.dwFlags2 & DISABLEGAMMARAMP){ + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 84), extSetGammaRamp, (void **)&pSetGammaRamp, "SetGammaRamp(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 88), extGetGammaRamp, (void **)&pGetGammaRamp, "GetGammaRamp(D9)"); + } + //SetHook((void *)(**(DWORD **)ppD3Ddev9 +188), extSetViewport, (void **)&pSetViewport, "SetViewport(D9)"); + //SetHook((void *)(**(DWORD **)ppD3Ddev9 +192), extGetViewport, (void **)&pGetViewport, "GetViewport(D9)"); + if(dxw.dwFlags2 & WIREFRAME){ + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 228), extSetRenderState, (void **)&pSetRenderState, "SetRenderState(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 232), extGetRenderState, (void **)&pGetRenderState, "GetRenderState(D9)"); + (*pSetRenderState)((void *)*ppD3Ddev9, D3DRS_FILLMODE, D3DFILL_WIREFRAME); + } + + if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 4), extAddRef9, (void **)&pAddRef9, "AddRef(D9)"); + SetHook((void *)(**(DWORD **)ppD3Ddev9 + 8), extRelease9, (void **)&pRelease9, "Release(D9)"); +} + + void* WINAPI extDirect3DCreate8(UINT sdkversion) { void *lpd3d; - dwD3DVersion = 8; + OutTraceD3D("Direct3DCreate8: sdkversion=%x\n", sdkversion); lpd3d = (*pDirect3DCreate8)(sdkversion); - if(!lpd3d) return 0; + if(!lpd3d) { + OutTraceD3D("Direct3DCreate8: ERROR err=%d\n", GetLastError()); + return 0; + } + dwD3DVersion = 8; SetHook((void *)(*(DWORD *)lpd3d + 0), extQueryInterfaceD3D8, (void **)&pQueryInterfaceD3D8, "QueryInterface(D8)"); SetHook((void *)(*(DWORD *)lpd3d + 16), extGetAdapterCount8, (void **)&pGetAdapterCount8, "GetAdapterCount(D8)"); SetHook((void *)(*(DWORD *)lpd3d + 20), extGetAdapterIdentifier8, (void **)&pGetAdapterIdentifier8, "GetAdapterIdentifier(D8)"); SetHook((void *)(*(DWORD *)lpd3d + 28), extEnumAdapterModes8, (void **)&pEnumAdapterModes8, "EnumAdapterModes(D8)"); SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode8, (void **)&pGetAdapterDisplayMode8, "GetAdapterDisplayMode(D8)"); SetHook((void *)(*(DWORD *)lpd3d + 60), extCreateDevice, (void **)&pCreateDevice8, "CreateDevice(D8)"); + OutTraceD3D("Direct3DCreate8: d3d=%x\n", lpd3d); - OutTraceD("Direct3DCreate8: SDKVERSION=%x pCreateDevice=%x\n", - sdkversion, pCreateDevice8); return lpd3d; } void* WINAPI extDirect3DCreate9(UINT sdkversion) { - void *lpd3d; + void *lpd3d; + + OutTraceD3D("Direct3DCreate9: sdkversion=%x\n", sdkversion); + lpd3d = (*pDirect3DCreate9)(sdkversion); + if(!lpd3d) { + OutTraceD3D("Direct3DCreate9: ERROR err=%d\n", GetLastError()); + return 0; + } dwD3DVersion = 9; - lpd3d = (*pDirect3DCreate9)(sdkversion); - if(!lpd3d) return 0; SetHook((void *)(*(DWORD *)lpd3d + 0), extQueryInterfaceD3D9, (void **)&pQueryInterfaceD3D9, "QueryInterface(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 16), extGetAdapterCount9, (void **)&pGetAdapterCount9, "GetAdapterCount(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 20), extGetAdapterIdentifier9, (void **)&pGetAdapterIdentifier9, "GetAdapterIdentifier(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 28), extEnumAdapterModes9, (void **)&pEnumAdapterModes9, "EnumAdapterModes(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode9, (void **)&pGetAdapterDisplayMode9, "GetAdapterDisplayMode(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 64), extCreateDevice, (void **)&pCreateDevice9, "CreateDevice(D9)"); - - OutTraceD("Direct3DCreate9: SDKVERSION=%x pCreateDevice=%x\n", - sdkversion, pCreateDevice9); + OutTraceD3D("Direct3DCreate9: d3d=%x\n", lpd3d); return lpd3d; } @@ -446,12 +540,13 @@ HRESULT WINAPI extDirect3DCreate9Ex(UINT sdkversion, IDirect3D9Ex **ppD3D) void *lpd3d; HRESULT res; - dwD3DVersion = 9; + OutTraceD3D("Direct3DCreate9Ex: sdkversion=%x\n", sdkversion); res = (*pDirect3DCreate9Ex)(sdkversion, ppD3D); if(res) { - OutTraceD("Direct3DCreate9Ex: ERROR res=%x SDKVERSION=%x\n", res, sdkversion); + OutTraceD3D("Direct3DCreate9Ex: ERROR res=%x(%s)\n", res, ExplainDDError(res)); return res; } + dwD3DVersion = 9; lpd3d = *ppD3D; SetHook((void *)(*(DWORD *)lpd3d + 0), extQueryInterfaceD3D9, (void **)&pQueryInterfaceD3D9, "QueryInterface(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 16), extGetAdapterCount9, (void **)&pGetAdapterCount9, "GetAdapterCount(D9)"); @@ -460,10 +555,7 @@ HRESULT WINAPI extDirect3DCreate9Ex(UINT sdkversion, IDirect3D9Ex **ppD3D) SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode9, (void **)&pGetAdapterDisplayMode9, "GetAdapterDisplayMode(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 64), extCreateDevice, (void **)&pCreateDevice9, "CreateDevice(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 80), extCreateDeviceEx, (void **)&pCreateDeviceEx, "CreateDeviceEx(D9)"); - - OutTraceD("Direct3DCreate9Ex: SDKVERSION=%x pCreateDeviceEx=%x\n", - sdkversion, pDirect3DCreate9Ex); - + OutTraceD3D("Direct3DCreate9Ex: d3d=%x\n", lpd3d); return res; } @@ -471,9 +563,9 @@ UINT WINAPI extGetAdapterCount8(void *lpd3d) { UINT res; res=(*pGetAdapterCount8)(lpd3d); - OutTraceD("GetAdapterCount(8): count=%d\n", res); + OutTraceDW("GetAdapterCount(8): count=%d\n", res); if(dxw.dwFlags2 & HIDEMULTIMONITOR) { - OutTraceD("GetAdapterCount: HIDEMULTIMONITOR count=1\n"); + OutTraceDW("GetAdapterCount: HIDEMULTIMONITOR count=1\n"); res=1; } return res; @@ -483,9 +575,9 @@ UINT WINAPI extGetAdapterCount9(void *lpd3d) { UINT res; res=(*pGetAdapterCount9)(lpd3d); - OutTraceD("GetAdapterCount(9): count=%d\n", res); + OutTraceDW("GetAdapterCount(9): count=%d\n", res); if(dxw.dwFlags2 & HIDEMULTIMONITOR) { - OutTraceD("GetAdapterCount: HIDEMULTIMONITOR count=1\n"); + OutTraceDW("GetAdapterCount: HIDEMULTIMONITOR count=1\n"); res=1; } return res; @@ -494,24 +586,24 @@ UINT WINAPI extGetAdapterCount9(void *lpd3d) HRESULT WINAPI extGetAdapterIdentifier8(void *pd3dd, UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9 *pIdentifier) { HRESULT res; - OutTraceD("GetAdapterIdentifier(8): Adapter=%d flags=%x\n", Adapter, Flags); + OutTraceD3D("GetAdapterIdentifier(8): Adapter=%d flags=%x\n", Adapter, Flags); res=pGetAdapterIdentifier8(pd3dd, Adapter, Flags, pIdentifier); - OutTraceD("GetAdapterIdentifier(8): ret=%x\n", res); + OutTraceD3D("GetAdapterIdentifier(8): ret=%x\n", res); return res; } HRESULT WINAPI extGetAdapterIdentifier9(void *pd3dd, UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9 *pIdentifier) { HRESULT res; - OutTraceD("GetAdapterIdentifier(9): Adapter=%d flags=%x\n", Adapter, Flags); + OutTraceD3D("GetAdapterIdentifier(9): Adapter=%d flags=%x\n", Adapter, Flags); res=pGetAdapterIdentifier9(pd3dd, Adapter, Flags, pIdentifier); - OutTraceD("GetAdapterIdentifier(9): ret=%x\n", res); + OutTraceD3D("GetAdapterIdentifier(9): ret=%x\n", res); return res; } HRESULT WINAPI extReset(void *pd3dd, D3DPRESENT_PARAMETERS* pPresentationParameters) { - OutTraceD("Reset: SUPPRESSED\n"); + OutTraceDW("Reset: SUPPRESSED\n"); return D3D_OK; } @@ -531,12 +623,12 @@ HRESULT WINAPI extGetDisplayMode8(void *lpd3d, D3DDISPLAYMODE *pMode) { HRESULT res; res=(*pGetDisplayMode8)(lpd3d, pMode); - OutTraceD("DEBUG: GetDisplayMode(8): size=(%dx%d) RefreshRate=%d Format=%d\n", + OutTraceD3D("DEBUG: GetDisplayMode(8): size=(%dx%d) RefreshRate=%d Format=%d\n", pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format); if(dxw.dwFlags2 & KEEPASPECTRATIO){ pMode->Width=dxw.iSizX; pMode->Height=dxw.iSizY; - OutTraceD("DEBUG: GetDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + OutTraceD3D("DEBUG: GetDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); } return res; } @@ -545,12 +637,12 @@ HRESULT WINAPI extGetDisplayMode9(void *lpd3d, UINT iSwapChain, D3DDISPLAYMODE * { HRESULT res; res=(*pGetDisplayMode9)(lpd3d, iSwapChain, pMode); - OutTraceD("DEBUG: GetDisplayMode(9): SwapChain=%d size=(%dx%d) RefreshRate=%d Format=%d\n", + OutTraceD3D("DEBUG: GetDisplayMode(9): SwapChain=%d size=(%dx%d) RefreshRate=%d Format=%d\n", iSwapChain, pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format); if(dxw.dwFlags2 & KEEPASPECTRATIO){ pMode->Width=dxw.iSizX; pMode->Height=dxw.iSizY; - OutTraceD("DEBUG: GetDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + OutTraceD3D("DEBUG: GetDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); } return res; } @@ -558,7 +650,7 @@ HRESULT WINAPI extGetDisplayMode9(void *lpd3d, UINT iSwapChain, D3DDISPLAYMODE * HRESULT WINAPI extEnumAdapterModes8(void *lpd3d, UINT Adapter, UINT Mode, D3DDISPLAYMODE* pMode) { HRESULT res; - OutTraceD("EnumAdapterModes(8): adapter=%d mode=%d pMode=%x\n", Adapter, Mode, pMode); + OutTraceD3D("EnumAdapterModes(8): adapter=%d mode=%d pMode=%x\n", Adapter, Mode, pMode); res=(*pEnumAdapterModes8)(lpd3d, Adapter, Mode, pMode); if(res) OutTraceE("EnumAdapterModes ERROR: err=%x(%s)\n", res, ExplainDDError(res)); return res; @@ -567,7 +659,7 @@ HRESULT WINAPI extEnumAdapterModes8(void *lpd3d, UINT Adapter, UINT Mode, D3DDIS HRESULT WINAPI extEnumAdapterModes9(void *lpd3d, UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode) { HRESULT res; - OutTraceD("EnumAdapterModes(9): adapter=%d format=%x mode=%d pMode=%x\n", Adapter, Format, Mode, pMode); + OutTraceD3D("EnumAdapterModes(9): adapter=%d format=%x mode=%d pMode=%x\n", Adapter, Format, Mode, pMode); res=(*pEnumAdapterModes9)(lpd3d, Adapter, Format, Mode, pMode); if(res) OutTraceE("EnumAdapterModes ERROR: err=%x(%s)\n", res, ExplainDDError(res)); return res; @@ -577,12 +669,12 @@ HRESULT WINAPI extGetAdapterDisplayMode8(void *lpd3d, UINT Adapter, D3DDISPLAYMO { HRESULT res; res=(*pGetAdapterDisplayMode8)(lpd3d, Adapter, pMode); - OutTraceD("DEBUG: GetAdapterDisplayMode(8): size=(%dx%d) RefreshRate=%d Format=%d\n", + OutTraceD3D("DEBUG: GetAdapterDisplayMode(8): size=(%dx%d) RefreshRate=%d Format=%d\n", pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format); if(dxw.dwFlags2 & KEEPASPECTRATIO){ pMode->Width=dxw.iSizX; pMode->Height=dxw.iSizY; - OutTraceD("DEBUG: GetAdapterDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + OutTraceDW("DEBUG: GetAdapterDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); } return res; } @@ -591,12 +683,12 @@ HRESULT WINAPI extGetAdapterDisplayMode9(void *lpd3d, UINT Adapter, D3DDISPLAYMO { HRESULT res; res=(*pGetAdapterDisplayMode9)(lpd3d, Adapter, pMode); - OutTraceD("DEBUG: GetAdapterDisplayMode(9): size=(%dx%d) RefreshRate=%d Format=%d\n", + OutTraceD3D("DEBUG: GetAdapterDisplayMode(9): size=(%dx%d) RefreshRate=%d Format=%d\n", pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format); if(dxw.dwFlags2 & KEEPASPECTRATIO){ pMode->Width=dxw.iSizX; pMode->Height=dxw.iSizY; - OutTraceD("DEBUG: GetAdapterDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + OutTraceDW("DEBUG: GetAdapterDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); } return res; } @@ -631,7 +723,7 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, D3DDISPLAYMODE mode; int Windowed; - OutTraceD("CreateDevice: D3DVersion=%d lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n", + OutTraceD3D("CreateDevice: D3DVersion=%d lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n", dwD3DVersion, lpd3d, adapter, hfocuswindow, behaviorflags, ppresentparam->BackBufferWidth, ppresentparam->BackBufferHeight); memcpy(param, ppresentparam, (dwD3DVersion == 9)?56:52); @@ -652,33 +744,35 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, workarea.left, workarea.top, workarea.right-workarea.left, workarea.bottom-workarea.top, dxw.GethWnd(), NULL, NULL, NULL); if (hfocuswindow) - OutTraceD("CreateDevice: updated hfocuswindow=%x pos=(%d,%d) size=(%d,%d)\n", + OutTraceDW("CreateDevice: updated hfocuswindow=%x pos=(%d,%d) size=(%d,%d)\n", hfocuswindow, workarea.left, workarea.top, workarea.right-workarea.left, workarea.bottom-workarea.top); else - OutTraceD("CreateDevice: CreateWindowEx ERROR err=%d\n", GetLastError()); + OutTraceDW("CreateDevice: CreateWindowEx ERROR err=%d\n", GetLastError()); dxw.SethWnd(hfocuswindow, dxw.GethWnd()); } - tmp = param; - OutTraceD("D3D%d::CreateDevice\n", dwD3DVersion); - OutTraceD(" Adapter = %i\n", adapter); - OutTraceD(" DeviceType = %i\n", devicetype); - OutTraceD(" hFocusWindow = 0x%x\n", hfocuswindow); - OutTraceD(" BehaviorFlags = 0x%x\n", behaviorflags); - OutTraceD(" BackBufferWidth = %i\n", *(tmp ++)); - OutTraceD(" BackBufferHeight = %i\n", *(tmp ++)); - OutTraceD(" BackBufferFormat = %i\n", *(tmp ++)); - OutTraceD(" BackBufferCount = %i\n", *(tmp ++)); - OutTraceD(" MultiSampleType = %i\n", *(tmp ++)); - if(dwD3DVersion == 9) OutTraceD(" MultiSampleQuality = %i\n", *(tmp ++)); - OutTraceD(" SwapEffect = 0x%x\n", *(tmp ++)); - OutTraceD(" hDeviceWindow = 0x%x\n", *(tmp ++)); - OutTraceD(" Windowed = %i\n", (Windowed=*(tmp ++))); - OutTraceD(" EnableAutoDepthStencil = %i\n", *(tmp ++)); - OutTraceD(" AutoDepthStencilFormat = %i\n", *(tmp ++)); - OutTraceD(" Flags = 0x%x\n", *(tmp ++)); - OutTraceD(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++)); - OutTraceD(" PresentationInterval = 0x%x\n", *(tmp ++)); + if(IsTraceDW){ + tmp = param; + OutTrace("D3D%d::CreateDevice\n", dwD3DVersion); + OutTrace(" Adapter = %i\n", adapter); + OutTrace(" DeviceType = %i\n", devicetype); + OutTrace(" hFocusWindow = 0x%x\n", hfocuswindow); + OutTrace(" BehaviorFlags = 0x%x\n", behaviorflags); + OutTrace(" BackBufferWidth = %i\n", *(tmp ++)); + OutTrace(" BackBufferHeight = %i\n", *(tmp ++)); + OutTrace(" BackBufferFormat = %i\n", *(tmp ++)); + OutTrace(" BackBufferCount = %i\n", *(tmp ++)); + OutTrace(" MultiSampleType = %i\n", *(tmp ++)); + if(dwD3DVersion == 9) OutTrace(" MultiSampleQuality = %i\n", *(tmp ++)); + OutTrace(" SwapEffect = 0x%x\n", *(tmp ++)); + OutTrace(" hDeviceWindow = 0x%x\n", *(tmp ++)); + OutTrace(" Windowed = %i\n", (Windowed=*(tmp ++))); + OutTrace(" EnableAutoDepthStencil = %i\n", *(tmp ++)); + OutTrace(" AutoDepthStencilFormat = %i\n", *(tmp ++)); + OutTrace(" Flags = 0x%x\n", *(tmp ++)); + OutTrace(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++)); + OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++)); + } //((LPDIRECT3D9)lpd3d)->GetAdapterDisplayMode(0, &mode); if(dwD3DVersion == 9) @@ -686,7 +780,7 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, else (*pGetAdapterDisplayMode8)(lpd3d, 0, &mode); param[2] = mode.Format; - OutTraceD(" Current Format = 0x%x\n", mode.Format); + OutTraceDW(" Current Format = 0x%x\n", mode.Format); //param[0]=param[1]=0; @@ -710,56 +804,16 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, } if(res){ - OutTraceD("FAILED! %x\n", res); + OutTraceDW("FAILED! %x\n", res); return res; } - OutTraceD("SUCCESS! device=%x\n", *ppd3dd); + OutTraceDW("SUCCESS! device=%x\n", *ppd3dd); if(dwD3DVersion == 8){ - void *pReset; - pReset=NULL; // to avoid assert condition - SetHook((void *)(**(DWORD **)ppd3dd + 0), extQueryInterfaceDev8, (void **)&pQueryInterfaceDev8, "QueryInterface(D8)"); - SetHook((void *)(**(DWORD **)ppd3dd + 24), extGetDirect3D, (void **)&pGetDirect3D, "GetDirect3D(D8)"); - SetHook((void *)(**(DWORD **)ppd3dd + 32), extGetDisplayMode8, (void **)&pGetDisplayMode8, "GetDisplayMode(D8)"); - SetHook((void *)(**(DWORD **)ppd3dd + 52), extCreateAdditionalSwapChain, (void **)&pCreateAdditionalSwapChain, "CreateAdditionalSwapChain(D8)"); - SetHook((void *)(**(DWORD **)ppd3dd + 56), extReset, (void **)&pReset, "Reset(D8)"); - SetHook((void *)(**(DWORD **)ppd3dd + 60), extPresent, (void **)&pPresent, "Present(D8)"); - if(dxw.dwFlags2 & DISABLEGAMMARAMP){ - SetHook((void *)(**(DWORD **)ppd3dd + 72), extSetGammaRamp, (void **)&pSetGammaRamp, "SetGammaRamp(D8)"); - SetHook((void *)(**(DWORD **)ppd3dd + 76), extGetGammaRamp, (void **)&pGetGammaRamp, "GetGammaRamp(D8)"); - } - if(dxw.dwFlags2 & WIREFRAME){ - SetHook((void *)(**(DWORD **)ppd3dd + 200), extSetRenderState, (void **)&pSetRenderState, "SetRenderState(D8)"); - SetHook((void *)(**(DWORD **)ppd3dd + 204), extGetRenderState, (void **)&pGetRenderState, "GetRenderState(D8)"); - (*pSetRenderState)((void *)*ppd3dd, D3DRS_FILLMODE, D3DFILL_WIREFRAME); - } + HookD3DDevice8(ppd3dd); } else { - void *pReset; - pReset=NULL; // to avoid assert condition - SetHook((void *)(**(DWORD **)ppd3dd + 0), extQueryInterfaceDev9, (void **)&pQueryInterfaceDev9, "QueryInterface(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 24), extGetDirect3D, (void **)&pGetDirect3D, "GetDirect3D(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 32), extGetDisplayMode9, (void **)&pGetDisplayMode9, "GetDisplayMode(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 52), extCreateAdditionalSwapChain, (void **)&pCreateAdditionalSwapChain, "CreateAdditionalSwapChain(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 64), extReset, (void **)&pReset, "Reset(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 68), extPresent, (void **)&pPresent, "Present(D9)"); - if(dxw.dwFlags2 & DISABLEGAMMARAMP){ - SetHook((void *)(**(DWORD **)ppd3dd + 84), extSetGammaRamp, (void **)&pSetGammaRamp, "SetGammaRamp(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 88), extGetGammaRamp, (void **)&pGetGammaRamp, "GetGammaRamp(D9)"); - } - //SetHook((void *)(**(DWORD **)ppd3dd +188), extSetViewport, (void **)&pSetViewport, "SetViewport(D9)"); - //SetHook((void *)(**(DWORD **)ppd3dd +192), extGetViewport, (void **)&pGetViewport, "GetViewport(D9)"); - if(dxw.dwFlags2 & WIREFRAME){ - SetHook((void *)(**(DWORD **)ppd3dd + 228), extSetRenderState, (void **)&pSetRenderState, "SetRenderState(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 232), extGetRenderState, (void **)&pGetRenderState, "GetRenderState(D9)"); - (*pSetRenderState)((void *)*ppd3dd, D3DRS_FILLMODE, D3DFILL_WIREFRAME); - } - // experiments .... - //SetHook((void *)(**(DWORD **)ppd3dd +280), extValidateDevice, (void **)&pValidateDevice, "ValidateDevice(D9)"); - //SetHook((void *)(**(DWORD **)ppd3dd + 28), extGetDeviceCapsD3D, (void **)&pGetDeviceCapsD3D, "GetDeviceCaps(D9)"); - //void *pNull=0; - //SetHook((void *)(**(DWORD **)ppd3dd + 344), extProbe, &pNull, "Probe-CreateVertexDeclaration(D9)"); - //SetHook((void *)(**(DWORD **)ppd3dd + 28), extProbe, &pNull, "Probe-GetDeviceCaps(D9)"); + HookD3DDevice9(ppd3dd); } GetHookInfo()->IsFullScreen = dxw.IsFullScreen(); @@ -785,30 +839,32 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); tmp = param; - OutTraceD("D3D%d::CreateDeviceEx\n", dwD3DVersion); - OutTraceD(" Adapter = %i\n", adapter); - OutTraceD(" DeviceType = %i\n", devicetype); - OutTraceD(" hFocusWindow = 0x%x\n", hfocuswindow); - OutTraceD(" BehaviorFlags = 0x%x\n", behaviorflags); - OutTraceD(" BackBufferWidth = %i\n", *(tmp ++)); - OutTraceD(" BackBufferHeight = %i\n", *(tmp ++)); - OutTraceD(" BackBufferFormat = %i\n", *(tmp ++)); - OutTraceD(" BackBufferCount = %i\n", *(tmp ++)); - OutTraceD(" MultiSampleType = %i\n", *(tmp ++)); - OutTraceD(" MultiSampleQuality = %i\n", *(tmp ++)); - OutTraceD(" SwapEffect = 0x%x\n", *(tmp ++)); - OutTraceD(" hDeviceWindow = 0x%x\n", *(tmp ++)); - OutTraceD(" Windowed = %i\n", (Windowed=*(tmp ++))); - OutTraceD(" EnableAutoDepthStencil = %i\n", *(tmp ++)); - OutTraceD(" AutoDepthStencilFormat = %i\n", *(tmp ++)); - OutTraceD(" Flags = 0x%x\n", *(tmp ++)); - OutTraceD(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++)); - OutTraceD(" PresentationInterval = 0x%x\n", *(tmp ++)); + if(IsTraceDW){ + OutTrace("D3D%d::CreateDeviceEx\n", dwD3DVersion); + OutTrace(" Adapter = %i\n", adapter); + OutTrace(" DeviceType = %i\n", devicetype); + OutTrace(" hFocusWindow = 0x%x\n", hfocuswindow); + OutTrace(" BehaviorFlags = 0x%x\n", behaviorflags); + OutTrace(" BackBufferWidth = %i\n", *(tmp ++)); + OutTrace(" BackBufferHeight = %i\n", *(tmp ++)); + OutTrace(" BackBufferFormat = %i\n", *(tmp ++)); + OutTrace(" BackBufferCount = %i\n", *(tmp ++)); + OutTrace(" MultiSampleType = %i\n", *(tmp ++)); + OutTrace(" MultiSampleQuality = %i\n", *(tmp ++)); + OutTrace(" SwapEffect = 0x%x\n", *(tmp ++)); + OutTrace(" hDeviceWindow = 0x%x\n", *(tmp ++)); + OutTrace(" Windowed = %i\n", (Windowed=*(tmp ++))); + OutTrace(" EnableAutoDepthStencil = %i\n", *(tmp ++)); + OutTrace(" AutoDepthStencilFormat = %i\n", *(tmp ++)); + OutTrace(" Flags = 0x%x\n", *(tmp ++)); + OutTrace(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++)); + OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++)); + } //((LPDIRECT3D9)lpd3d)->GetAdapterDisplayMode(0, &mode); (*pGetAdapterDisplayMode9)(lpd3d, 0, &mode); param[2] = mode.Format; - OutTraceD(" Current Format = 0x%x\n", mode.Format); + OutTraceDW(" Current Format = 0x%x\n", mode.Format); //param[7] = 0; //hDeviceWindow param[7] = (DWORD)dxw.GethWnd(); //hDeviceWindow @@ -819,29 +875,12 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); if(res){ - OutTraceD("FAILED! %x\n", res); + OutTraceDW("FAILED! %x\n", res); return res; } - OutTraceD("SUCCESS!\n"); + OutTraceDW("SUCCESS!\n"); - void *pReset; - pReset=NULL; // to avoid assert condition - SetHook((void *)(**(DWORD **)ppd3dd + 0), extQueryInterfaceDev9, (void **)&pQueryInterfaceDev9, "QueryInterface(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 32), extGetDisplayMode9, (void **)&pGetDisplayMode9, "GetDisplayMode(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 52), extCreateAdditionalSwapChain, (void **)&pCreateAdditionalSwapChain, "CreateAdditionalSwapChain(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 64), extReset, (void **)&pReset, "Reset(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 68), extPresent, (void **)&pPresent, "Present(D9)"); - if(dxw.dwFlags2 & DISABLEGAMMARAMP){ - SetHook((void *)(**(DWORD **)ppd3dd + 84), extSetGammaRamp, (void **)&pSetGammaRamp, "SetGammaRamp(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 88), extGetGammaRamp, (void **)&pGetGammaRamp, "GetGammaRamp(D9)"); - } - //SetHook((void *)(**(DWORD **)ppd3dd +188), extSetViewport, (void **)&pSetViewport, "SetViewport(D9)"); - //SetHook((void *)(**(DWORD **)ppd3dd +192), extGetViewport, (void **)&pGetViewport, "GetViewport(D9)"); - if(dxw.dwFlags2 & WIREFRAME){ - SetHook((void *)(**(DWORD **)ppd3dd + 228), extSetRenderState, (void **)&pSetRenderState, "SetRenderState(D9)"); - SetHook((void *)(**(DWORD **)ppd3dd + 232), extGetRenderState, (void **)&pGetRenderState, "GetRenderState(D9)"); - (*pSetRenderState)((void *)*ppd3dd, D3DRS_FILLMODE, D3DFILL_WIREFRAME); - } + HookD3DDevice9(ppd3dd); GetHookInfo()->IsFullScreen = dxw.IsFullScreen(); GetHookInfo()->DXVersion=(short)dwD3DVersion; @@ -873,7 +912,7 @@ HRESULT WINAPI extSetViewport(void *pd3dd, D3DVIEWPORT9 *pViewport) RECT client; POINT p={0,0}; (*pGetClientRect)(dxw.GethWnd(), &client); - OutTraceD("SetViewport: declared pos=(%d,%d) size=(%d,%d) depth=(%f;%f)\n", + OutTraceD3D("SetViewport: declared pos=(%d,%d) size=(%d,%d) depth=(%f;%f)\n", pViewport->X, pViewport->Y, pViewport->Width, pViewport->Height, pViewport->MinZ, pViewport->MaxZ); if(IsDebug) OutTrace("SetViewport: DEBUG win=(%d,%d) screen=(%d,%d)\n", client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight()); @@ -881,7 +920,7 @@ HRESULT WINAPI extSetViewport(void *pd3dd, D3DVIEWPORT9 *pViewport) pViewport->Y = (pViewport->Y * (int)client.bottom) / (int)dxw.GetScreenHeight(); pViewport->Width = (pViewport->Width * (int)client.right) / (int)dxw.GetScreenWidth(); pViewport->Height = (pViewport->Height * (int)client.bottom) / (int)dxw.GetScreenHeight(); - OutTraceD("SetViewport: remapped pos=(%d,%d) size=(%d,%d)\n", + OutTraceDW("SetViewport: remapped pos=(%d,%d) size=(%d,%d)\n", pViewport->X, pViewport->Y, pViewport->Width, pViewport->Height); return (*pSetViewport)(pd3dd, pViewport); } @@ -898,21 +937,23 @@ HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3d, D3DPRESENT_PARAMETERS * AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); tmp = param; - OutTraceD("D3D%d::CreateAdditionalSwapChain\n", dwD3DVersion); - OutTraceD(" BackBufferWidth = %i\n", *(tmp ++)); - OutTraceD(" BackBufferHeight = %i\n", *(tmp ++)); - OutTraceD(" BackBufferFormat = %i\n", *(tmp ++)); - OutTraceD(" BackBufferCount = %i\n", *(tmp ++)); - OutTraceD(" MultiSampleType = %i\n", *(tmp ++)); - if(dwD3DVersion == 9) OutTraceD(" MultiSampleQuality = %i\n", *(tmp ++)); - OutTraceD(" SwapEffect = 0x%x\n", *(tmp ++)); - OutTraceD(" hDeviceWindow = 0x%x\n", *(tmp ++)); - OutTraceD(" Windowed = %i\n", (Windowed=*(tmp ++))); - OutTraceD(" EnableAutoDepthStencil = %i\n", *(tmp ++)); - OutTraceD(" AutoDepthStencilFormat = %i\n", *(tmp ++)); - OutTraceD(" Flags = 0x%x\n", *(tmp ++)); - OutTraceD(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++)); - OutTraceD(" PresentationInterval = 0x%x\n", *(tmp ++)); + if(IsTraceDW){ + OutTrace("D3D%d::CreateAdditionalSwapChain\n", dwD3DVersion); + OutTrace(" BackBufferWidth = %i\n", *(tmp ++)); + OutTrace(" BackBufferHeight = %i\n", *(tmp ++)); + OutTrace(" BackBufferFormat = %i\n", *(tmp ++)); + OutTrace(" BackBufferCount = %i\n", *(tmp ++)); + OutTrace(" MultiSampleType = %i\n", *(tmp ++)); + if(dwD3DVersion == 9) OutTrace(" MultiSampleQuality = %i\n", *(tmp ++)); + OutTrace(" SwapEffect = 0x%x\n", *(tmp ++)); + OutTrace(" hDeviceWindow = 0x%x\n", *(tmp ++)); + OutTrace(" Windowed = %i\n", (Windowed=*(tmp ++))); + OutTrace(" EnableAutoDepthStencil = %i\n", *(tmp ++)); + OutTrace(" AutoDepthStencilFormat = %i\n", *(tmp ++)); + OutTrace(" Flags = 0x%x\n", *(tmp ++)); + OutTrace(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++)); + OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++)); + } //((LPDIRECT3D9)lpd3d)->GetAdapterDisplayMode(0, &mode); if (dwD3DVersion == 9) @@ -920,7 +961,7 @@ HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3d, D3DPRESENT_PARAMETERS * else (*pGetAdapterDisplayMode8)(lpd3d, 0, &mode); param[2] = mode.Format; - OutTraceD(" Current Format = 0x%x\n", mode.Format); + OutTraceDW(" Current Format = 0x%x\n", mode.Format); if(dwD3DVersion == 9){ param[7] = 0; //hDeviceWindow @@ -954,11 +995,11 @@ HRESULT WINAPI extD3D10CreateDevice( { HRESULT res; D3D10_VIEWPORT ViewPort; - OutTraceD("D3D10CreateDevice: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion); + OutTraceD3D("D3D10CreateDevice: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion); //return 0x887a0004; res=(*pD3D10CreateDevice)(pAdapter, DriverType, Software, Flags, SDKVersion, ppDevice); if(res){ - OutTraceD("D3D10CreateDevice: ret=%x\n", res); + OutTraceE("D3D10CreateDevice: ret=%x(%s)\n", res, ExplainDDError(res)); return res; } SetHook((void *)(*(DWORD *)*ppDevice + 100), extRSSetViewports, (void **)&pRSSetViewports, "RSSetViewports(D10)"); @@ -969,10 +1010,12 @@ HRESULT WINAPI extD3D10CreateDevice( ViewPort.MinDepth=1.0; ViewPort.MaxDepth=1.0; (*pRSSetViewports)((void *)*ppDevice, 1, (D3D11_VIEWPORT *)&ViewPort); - OutTraceD("D3D10CreateDevice: ret=%x\n", res); + OutTraceD3D("D3D10CreateDevice: ret=%x\n", res); return res; } +// -- log revised to here ... + HRESULT WINAPI extD3D10CreateDevice1( IDXGIAdapter *pAdapter, D3D10_DRIVER_TYPE DriverType, @@ -983,10 +1026,10 @@ HRESULT WINAPI extD3D10CreateDevice1( ID3D10Device **ppDevice) { HRESULT res; - OutTraceD("D3D10CreateDevice1: DriverType=%x Flags=%x HardwareLevel=%x SDKVersion=%x\n", DriverType, Flags, HardwareLevel, SDKVersion); + OutTraceDW("D3D10CreateDevice1: DriverType=%x Flags=%x HardwareLevel=%x SDKVersion=%x\n", DriverType, Flags, HardwareLevel, SDKVersion); res=(*pD3D10CreateDevice1)(pAdapter, DriverType, Software, Flags, HardwareLevel, SDKVersion, ppDevice); SetHook((void *)(*(DWORD *)*ppDevice + 100), extRSSetViewports, (void **)&pRSSetViewports, "RSSetViewports(D10)"); - OutTraceD("D3D10CreateDevice1: ret=%x\n", res); + OutTraceDW("D3D10CreateDevice1: ret=%x\n", res); return res; } @@ -1001,12 +1044,12 @@ HRESULT WINAPI extD3D10CreateDeviceAndSwapChain( ID3D10Device **ppDevice) { HRESULT res; - OutTraceD("D3D10CreateDeviceAndSwapChain: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion); + OutTraceDW("D3D10CreateDeviceAndSwapChain: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion); //return 0x887a0004; pSwapChainDesc->OutputWindow = dxw.GethWnd(); pSwapChainDesc->Windowed = true; res=(*pD3D10CreateDeviceAndSwapChain)(pAdapter, DriverType, Software, Flags, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice); - OutTraceD("D3D10CreateDeviceAndSwapChain ret=%x\n", res); + OutTraceDW("D3D10CreateDeviceAndSwapChain ret=%x\n", res); return res; } @@ -1021,12 +1064,12 @@ HRESULT WINAPI extD3D10CreateDeviceAndSwapChain1( ID3D10Device **ppDevice) { HRESULT res; - OutTraceD("D3D10CreateDeviceAndSwapChain1: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion); + OutTraceDW("D3D10CreateDeviceAndSwapChain1: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion); //return 0x887a0004; pSwapChainDesc->OutputWindow = dxw.GethWnd(); pSwapChainDesc->Windowed = true; res=(*pD3D10CreateDeviceAndSwapChain1)(pAdapter, DriverType, Software, Flags, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice); - OutTraceD("D3D10CreateDeviceAndSwapChain1 ret=%x\n", res); + OutTraceDW("D3D10CreateDeviceAndSwapChain1 ret=%x\n", res); return res; } @@ -1043,16 +1086,16 @@ HRESULT WINAPI extD3D11CreateDevice( ID3D11DeviceContext **ppImmediateContext) { HRESULT res; - OutTraceD("D3D11CreateDevice: DriverType=%x Flags=%x FeatureLevels=%x SDKVersion=%x\n", DriverType, Flags, FeatureLevels, SDKVersion); + OutTraceDW("D3D11CreateDevice: DriverType=%x Flags=%x FeatureLevels=%x SDKVersion=%x\n", DriverType, Flags, FeatureLevels, SDKVersion); //return 0x887a0004; res=(*pD3D11CreateDevice)(pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext); if(res){ - OutTraceD("D3D11CreateDevice: ret=%x\n", res); + OutTraceDW("D3D11CreateDevice: ret=%x\n", res); return res; } SetHook((void *)(*(DWORD *)ppImmediateContext + 148), extRSSetViewports, (void **)&pRSSetViewports, "RSSetViewports(D11)"); //SetHook((void *)(*(DWORD *)ppImmediateContext + 152), extRSSetScissorRects, (void **)&pRSSetScissorRects, "RSSetScissorRects(D11)"); - OutTraceD("D3D11CreateDevice ret=%x\n", res); + OutTraceDW("D3D11CreateDevice ret=%x\n", res); return res; } @@ -1071,16 +1114,16 @@ HRESULT WINAPI extD3D11CreateDeviceAndSwapChain( ID3D11DeviceContext **ppImmediateContext) { HRESULT res; - OutTraceD("D3D11CreateDeviceAndSwapChain\n"); + OutTraceDW("D3D11CreateDeviceAndSwapChain\n"); return 0x887a0004; res=(*pD3D11CreateDeviceAndSwapChain)(pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice, pFeatureLevel, ppImmediateContext); - OutTraceD("D3D11CreateDeviceAndSwapChain ret=%x\n", res); + OutTraceDW("D3D11CreateDeviceAndSwapChain ret=%x\n", res); return res; } void WINAPI extRSSetViewports(ID3D11DeviceContext *This, UINT NumViewports, D3D11_VIEWPORT *pViewports) { - OutTraceD("RSSetViewports: NumViewports=%d\n", NumViewports); + OutTraceDW("RSSetViewports: NumViewports=%d\n", NumViewports); if(NumViewports==1){ pViewports->TopLeftX=dxw.iPosX; @@ -1095,7 +1138,7 @@ void WINAPI extRSSetViewports(ID3D11DeviceContext *This, UINT NumViewports, D3D1 HRESULT WINAPI extQueryInterfaceD3D8(void *obj, REFIID riid, void** ppvObj) { HRESULT res; - OutTraceD("D3D::QueryInterface(8)\n"); + OutTraceDW("D3D::QueryInterface(8)\n"); res=pQueryInterfaceD3D8(obj, riid, ppvObj); return res; } @@ -1103,7 +1146,7 @@ HRESULT WINAPI extQueryInterfaceD3D8(void *obj, REFIID riid, void** ppvObj) HRESULT WINAPI extQueryInterfaceDev8(void *obj, REFIID riid, void** ppvObj) { HRESULT res; - OutTraceD("Device::QueryInterface(8)\n"); + OutTraceDW("Device::QueryInterface(8)\n"); res=pQueryInterfaceDev8(obj, riid, ppvObj); return res; } @@ -1111,7 +1154,7 @@ HRESULT WINAPI extQueryInterfaceDev8(void *obj, REFIID riid, void** ppvObj) HRESULT WINAPI extQueryInterfaceD3D9(void *obj, REFIID riid, void** ppvObj) { HRESULT res; - OutTraceD("D3D::QueryInterface(9)\n"); + OutTraceDW("D3D::QueryInterface(9)\n"); res=pQueryInterfaceD3D9(obj, riid, ppvObj); return res; } @@ -1119,32 +1162,21 @@ HRESULT WINAPI extQueryInterfaceD3D9(void *obj, REFIID riid, void** ppvObj) HRESULT WINAPI extQueryInterfaceDev9(void *obj, REFIID riid, void** ppvObj) { HRESULT res; - void *pReset; - OutTraceD("Device::QueryInterface(9): lpd3dd=%x refiid=%x\n", obj, riid); + OutTraceDW("Device::QueryInterface(9): lpd3dd=%x refiid=%x\n", obj, riid); res=pQueryInterfaceDev9(obj, riid, ppvObj); if(res){ - OutTraceD("Device::QueryInterface(9): ERROR ret=%x\n", res); + OutTraceDW("Device::QueryInterface(9): ERROR ret=%x\n", res); return res; } - OutTraceD("Device::QueryInterface(9): ppvObj=%x\n", *ppvObj); + OutTraceDW("Device::QueryInterface(9): ppvObj=%x\n", *ppvObj); switch(*(DWORD *)&riid){ + case 0x7385E5DF: // IID_IDirect3DDevice8 + HookD3DDevice8(ppvObj); + break; case 0xD0223B96: // IID_IDirect3DDevice9 - OutTraceD("Device hook for IID_IDirect3DDevice9 interface\n"); - pReset=NULL; // to avoid assert condition - SetHook((void *)(**(DWORD **)ppvObj + 0), extQueryInterfaceDev9, (void **)&pQueryInterfaceDev9, "QueryInterface(D9)"); - SetHook((void *)(**(DWORD **)ppvObj + 32), extGetDisplayMode9, (void **)&pGetDisplayMode9, "GetDisplayMode(D9)"); - SetHook((void *)(**(DWORD **)ppvObj + 52), extCreateAdditionalSwapChain, (void **)&pCreateAdditionalSwapChain, "CreateAdditionalSwapChain(D9)"); - SetHook((void *)(**(DWORD **)ppvObj + 64), extReset, (void **)&pReset, "Reset(D9)"); - SetHook((void *)(**(DWORD **)ppvObj + 68), extPresent, (void **)&pPresent, "Present(D9)"); - //SetHook((void *)(**(DWORD **)ppvObj +188), extSetViewport, (void **)&pSetViewport, "SetViewport(D9)"); - //SetHook((void *)(**(DWORD **)ppvObj +192), extGetViewport, (void **)&pGetViewport, "GetViewport(D9)"); - if(dxw.dwFlags2 & WIREFRAME){ - SetHook((void *)(**(DWORD **)ppvObj + 228), extSetRenderState, (void **)&pSetRenderState, "SetRenderState(D9)"); - SetHook((void *)(**(DWORD **)ppvObj + 232), extGetRenderState, (void **)&pGetRenderState, "GetRenderState(D9)"); - (*pSetRenderState)((void *)*ppvObj, D3DRS_FILLMODE, D3DFILL_WIREFRAME); - } + HookD3DDevice9(ppvObj); break; } @@ -1159,19 +1191,51 @@ HRESULT WINAPI extGetDirect3D(void *lpdd3dd, IDirect3D9 **ppD3D9) HRESULT WINAPI extCheckFullScreen(void) { - OutTraceD("CheckFullScreen\n"); + OutTraceDW("CheckFullScreen\n"); return 0; } void WINAPI extSetGammaRamp(void *lpdd3dd, UINT iSwapChain, DWORD Flags, D3DGAMMARAMP *pRamp) { - OutTraceD("SetGammaRamp: dd3dd=%x SwapChain=%d flags=%x\n", lpdd3dd, iSwapChain, Flags); + OutTraceDW("SetGammaRamp: dd3dd=%x SwapChain=%d flags=%x\n", lpdd3dd, iSwapChain, Flags); if (dxw.dwFlags2 & DISABLEGAMMARAMP) return; (*pSetGammaRamp)(lpdd3dd, iSwapChain, Flags, pRamp); } void WINAPI extGetGammaRamp(void *lpdd3dd, UINT iSwapChain, D3DGAMMARAMP *pRamp) { - OutTraceD("GetGammaRamp: dd3dd=%x SwapChain=%d\n", lpdd3dd, iSwapChain); + OutTraceDW("GetGammaRamp: dd3dd=%x SwapChain=%d\n", lpdd3dd, iSwapChain); (*pGetGammaRamp)(lpdd3dd, iSwapChain, pRamp); } + +void WINAPI extSetCursorPosition9(void *lpdd3dd, int X, int Y, DWORD Flags) +{ + OutTraceDW("SetCursorPosition: dd3dd=%x pos=(%d,%d) flags=%x\n", lpdd3dd, X, Y, Flags); + if(dxw.dwFlags2 & KEEPCURSORFIXED) return; + // to do: proper scaling..... + //(*pSetCursorPosition9)(lpdd3dd, X, Y, Flags); +} + +void WINAPI extSetCursorPosition8(void *lpdd3dd, int X, int Y, DWORD Flags) +{ + OutTraceDW("SetCursorPosition: dd3dd=%x pos=(%d,%d) flags=%x\n", lpdd3dd, X, Y, Flags); + if(dxw.dwFlags2 & KEEPCURSORFIXED) return; + // to do: proper scaling..... + //(*pSetCursorPosition8)(lpdd3dd, X, Y, Flags); +} + +ULONG WINAPI extAddRef9(void *lpdd3dd) +{ + ULONG res; + res=(*pAddRef9)(lpdd3dd); + OutTraceD3D("AddRef(9): dd3dd=%x res=%x\n", lpdd3dd, res); + return res; +} + +ULONG WINAPI extRelease9(void *lpdd3dd) +{ + ULONG res; + res=(*pRelease9)(lpdd3dd); + OutTraceD3D("Release(9): dd3dd=%x res=%x\n", lpdd3dd, res); + return res; +} \ No newline at end of file diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 4b69d10..9de086d 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -9,8 +9,8 @@ // exported API DWORD gD3DVersion; // quick & dirty .... -//#undef OutTraceD -//#define OutTraceD OutTrace +//#undef OutTraceDW +//#define OutTraceDW OutTrace typedef HRESULT (WINAPI *Direct3DCreateDevice_Type)(GUID FAR *, LPDIRECT3D, LPDIRECTDRAWSURFACE, LPDIRECT3D *, LPUNKNOWN); typedef HRESULT (WINAPI *Direct3DCreate_Type)(UINT, LPDIRECT3D *, LPUNKNOWN); @@ -106,6 +106,7 @@ int HookDirect3D7(HMODULE module, int version){ void *tmp; HINSTANCE hinst; LPDIRECT3D lpd3d=NULL; + HRESULT res; gD3DVersion = version; @@ -122,22 +123,22 @@ int HookDirect3D7(HMODULE module, int version){ if(tmp) pDirect3DCreateDevice = (Direct3DCreateDevice_Type)tmp; break; case 7: - hinst = LoadLibrary("d3dim.dll"); + hinst = (*pLoadLibraryA)("d3dim.dll"); if (hinst){ pDirect3DCreate = - (Direct3DCreate_Type)GetProcAddress(hinst, "Direct3DCreate"); + (Direct3DCreate_Type)(*pGetProcAddress)(hinst, "Direct3DCreate"); if(pDirect3DCreate){ - lpd3d = (LPDIRECT3D)extDirect3DCreate(0x0700, &lpd3d, NULL); - if(lpd3d) lpd3d->Release(); + res = extDirect3DCreate(0x0700, &lpd3d, NULL); + if(res == DD_OK) lpd3d->Release(); } } else { - hinst = LoadLibrary("d3dim700.dll"); + hinst = (*pLoadLibraryA)("d3dim700.dll"); pDirect3DCreate = - (Direct3DCreate_Type)GetProcAddress(hinst, "Direct3DCreate"); + (Direct3DCreate_Type)(*pGetProcAddress)(hinst, "Direct3DCreate"); if(pDirect3DCreate){ - lpd3d = (LPDIRECT3D)extDirect3DCreate(0x0700, &lpd3d, NULL); - if(lpd3d) lpd3d->Release(); + res = extDirect3DCreate(0x0700, &lpd3d, NULL); + if(res == DD_OK) lpd3d->Release(); } } break; @@ -149,12 +150,12 @@ FARPROC Remap_d3d7_ProcAddress(LPCSTR proc, HMODULE hModule) { if (!strcmp(proc,"Direct3DCreate") && !pDirect3DCreate){ pDirect3DCreate=(Direct3DCreate_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreate); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreate); return (FARPROC)extDirect3DCreate; } if (!strcmp(proc,"Direct3DCreateDevice") && !pDirect3DCreateDevice){ pDirect3DCreateDevice=(Direct3DCreateDevice_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreateDevice); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirect3DCreateDevice); return (FARPROC)extDirect3DCreateDevice; } // NULL -> keep the original call address @@ -165,17 +166,17 @@ HRESULT WINAPI extDirect3DCreateDevice(GUID FAR *lpGUID, LPDIRECT3D lpd3ddevice, { HRESULT res; - OutTraceD("Direct3DCreateDevice: guid=%x d3ddevice=%x dds=%x UnkOuter=%x\n", + OutTraceD3D("Direct3DCreateDevice: guid=%x d3ddevice=%x dds=%x UnkOuter=%x\n", lpGUID, lpd3ddevice, surf, pUnkOuter); res=(*pDirect3DCreateDevice)(lpGUID, lpd3ddevice, surf, lplpd3ddevice, pUnkOuter); if(res) OutTraceE("Direct3DCreateDevice ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("Direct3DCreateDevice: d3ddevice=%x\n", *lplpd3ddevice); + else OutTraceD3D("Direct3DCreateDevice: d3ddevice=%x\n", *lplpd3ddevice); return res; } void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int dxversion) { - OutTraceD("HookDirect3DSession: d3d=%x d3dversion=%d\n", *lplpdd, dxversion); + OutTraceDW("HookDirect3DSession: d3d=%x d3dversion=%d\n", *lplpdd, dxversion); gD3DVersion = dxversion; @@ -213,7 +214,7 @@ void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int dxversion) void HookDirect3DDevice(void **lpd3ddev, int dxversion) { - OutTraceD("HookDirect3DDevice: d3ddev=%x d3dversion=%d\n", lpd3ddev, dxversion); + OutTraceDW("HookDirect3DDevice: d3ddev=%x d3dversion=%d\n", lpd3ddev, dxversion); gD3DVersion = dxversion; @@ -250,7 +251,7 @@ HRESULT WINAPI extDirect3DCreate(UINT SDKVersion, LPDIRECT3D *lplpd3d, LPUNKNOWN { HRESULT res; - OutTraceD("Direct3DCreate: SDKVersion=%x UnkOuter=%x\n", SDKVersion, pUnkOuter); + OutTraceD3D("Direct3DCreate: SDKVersion=%x UnkOuter=%x\n", SDKVersion, pUnkOuter); res=(*pDirect3DCreate)(SDKVersion, lplpd3d, pUnkOuter); if(res) { @@ -259,13 +260,13 @@ HRESULT WINAPI extDirect3DCreate(UINT SDKVersion, LPDIRECT3D *lplpd3d, LPUNKNOWN } HookDirect3DSession((LPDIRECTDRAW *)lplpd3d, SDKVersion); - OutTraceD("Direct3DCreate: d3d=%x\n", *lplpd3d); + OutTraceD3D("Direct3DCreate: d3d=%x\n", *lplpd3d); return res; } void HookViewport(LPDIRECT3DVIEWPORT *lpViewport, int dxversion) { - OutTraceD("HookViewport: Viewport=%x d3dversion=%d\n", *lpViewport, dxversion); + OutTraceDW("HookViewport: Viewport=%x d3dversion=%d\n", *lpViewport, dxversion); switch(dxversion){ case 1: @@ -284,7 +285,7 @@ HRESULT WINAPI extQueryInterfaceD3(void *lpd3d, REFIID riid, LPVOID *ppvObj) HRESULT res; int d3dversion; - OutTraceD("QueryInterface(D3): d3d=%x REFIID=%x obj=%x\n", lpd3d, riid.Data1, ppvObj); + OutTraceD3D("QueryInterface(D3): d3d=%x REFIID=%x obj=%x\n", lpd3d, riid.Data1, ppvObj); d3dversion=0; res=(*pQueryInterfaceD3)(lpd3d, riid, ppvObj); switch(riid.Data1){ @@ -293,7 +294,7 @@ HRESULT WINAPI extQueryInterfaceD3(void *lpd3d, REFIID riid, LPVOID *ppvObj) case 0xbb223240: d3dversion=6; break; case 0xf5049e77: d3dversion=7; break; } - if(d3dversion) OutTraceD("QueryInterface(D3): hooking version=%d\n", d3dversion); + if(d3dversion) OutTraceDW("QueryInterface(D3): hooking version=%d\n", d3dversion); switch(d3dversion){ case 1: SetHook((void *)(**(DWORD **)ppvObj + 12), extInitialize, (void **)&pInitialize, "Initialize"); @@ -319,10 +320,10 @@ HRESULT WINAPI extInitialize(void *lpd3d) { HRESULT res; - OutTraceD("Initialize: d3d=%x\n", lpd3d); + OutTraceD3D("Initialize: d3d=%x\n", lpd3d); res=(*pInitialize)(lpd3d); if(res) OutTraceE("Initialize ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("Initialize: OK\n"); + else OutTraceD3D("Initialize: OK\n"); return res; } @@ -333,7 +334,7 @@ typedef struct { static void DumpD3DDevideDesc(LPD3DDEVICEDESC d3, char *label) { - if(IsTraceD){ + if(IsTraceD3D){ OutTrace("EnumDevices: CALLBACK dev=%s Size=%d Flags=%x ", label, d3->dwSize, d3->dwFlags); if(d3->dwFlags & D3DDD_COLORMODEL) OutTrace("ColorModel=%x ", d3->dcmColorModel); if(d3->dwFlags & D3DDD_DEVCAPS) OutTrace("DevCaps=%x ", d3->dwDevCaps); @@ -353,7 +354,7 @@ static void DumpD3DDevideDesc(LPD3DDEVICEDESC d3, char *label) HRESULT WINAPI extDeviceProxy(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC lpd3ddd1, LPD3DDEVICEDESC lpd3ddd2, LPVOID arg) { HRESULT res; - OutTraceD("EnumDevices: CALLBACK GUID=%x(%s) DeviceDescription=\"%s\", DeviceName=\"%s\", arg=%x\n", lpGuid->Data1, ExplainGUID(lpGuid), lpDeviceDescription, lpDeviceName, ((CallbackArg *)arg)->arg); + OutTraceDW("EnumDevices: CALLBACK GUID=%x(%s) DeviceDescription=\"%s\", DeviceName=\"%s\", arg=%x\n", lpGuid->Data1, ExplainGUID(lpGuid), lpDeviceDescription, lpDeviceName, ((CallbackArg *)arg)->arg); DumpD3DDevideDesc(lpd3ddd1, "HWDEV"); DumpD3DDevideDesc(lpd3ddd2, "SWDEV"); if(dxw.dwFlags4 & NOPOWER2FIX){ @@ -369,7 +370,7 @@ HRESULT WINAPI extDeviceProxy(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR else { res = (*(((CallbackArg *)arg)->cb))(lpGuid, lpDeviceDescription, lpDeviceName, lpd3ddd1, lpd3ddd2, ((CallbackArg *)arg)->arg); } - OutTraceD("EnumDevices: CALLBACK ret=%x\n", res); + OutTraceDW("EnumDevices: CALLBACK ret=%x\n", res); return res; } @@ -378,12 +379,12 @@ HRESULT WINAPI extEnumDevices(void *lpd3d, LPD3DENUMDEVICESCALLBACK cb, LPVOID a HRESULT res; CallbackArg Arg; - OutTraceD("EnumDevices: d3d=%x arg=%x\n", lpd3d, arg); + OutTraceD3D("EnumDevices: d3d=%x arg=%x\n", lpd3d, arg); Arg.cb= &cb; Arg.arg=arg; res=(*pEnumDevices)(lpd3d, (LPD3DENUMDEVICESCALLBACK)extDeviceProxy, (LPVOID)&Arg); if(res) OutTraceE("EnumDevices ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("EnumDevices: OK\n"); + else OutTraceD3D("EnumDevices: OK\n"); return res; } @@ -391,10 +392,10 @@ HRESULT WINAPI extCreateLight(void *lpd3d, LPDIRECT3DLIGHT *lpLight, IUnknown *p { HRESULT res; - OutTraceD("CreateLight: d3d=%x\n", lpd3d); + OutTraceD3D("CreateLight: d3d=%x\n", lpd3d); res=(*pCreateLight)(lpd3d, lpLight, p0); if(res) OutTraceE("CreateLight ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("CreateLight: OK\n"); + else OutTraceD3D("CreateLight: OK\n"); return res; } @@ -402,10 +403,10 @@ HRESULT WINAPI extCreateMaterial(void *lpd3d, LPDIRECT3DMATERIAL *lpMaterial, IU { HRESULT res; - OutTraceD("CreateMaterial: d3d=%x\n", lpd3d); + OutTraceD3D("CreateMaterial: d3d=%x\n", lpd3d); res=(*pCreateMaterial)(lpd3d, lpMaterial, p0); if(res) OutTraceE("CreateMaterial ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("CreateMaterial: OK\n"); + else OutTraceD3D("CreateMaterial: OK\n"); return res; } @@ -413,10 +414,10 @@ HRESULT WINAPI extCreateViewport(void *lpd3d, LPDIRECT3DVIEWPORT *lpViewport, IU { HRESULT res; - OutTraceD("CreateViewport: d3d=%x\n", lpd3d); + OutTraceD3D("CreateViewport: d3d=%x\n", lpd3d); res=(*pCreateViewport)(lpd3d, lpViewport, p0); if(res) OutTraceE("CreateViewport ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("CreateViewport: Viewport=%x\n", *lpViewport); + else OutTraceD3D("CreateViewport: Viewport=%x\n", *lpViewport); HookViewport(lpViewport, gD3DVersion); return res; } @@ -425,12 +426,12 @@ HRESULT WINAPI extFindDevice(void *lpd3d, LPD3DFINDDEVICESEARCH p1, LPD3DFINDDEV { HRESULT res; - OutTraceD("FindDevice: d3d=%x devsearch=%x (size=%d flags=%x caps=%x primcaps=%x colormodel=%x hw=%x guid=%x) p2=%x\n", + OutTraceD3D("FindDevice: d3d=%x devsearch=%x (size=%d flags=%x caps=%x primcaps=%x colormodel=%x hw=%x guid=%x) p2=%x\n", lpd3d, p1, p1->dwSize, p1->dwFlags, p1->dwCaps, p1->dpcPrimCaps, p1->dcmColorModel, p1->bHardware, p1->guid, p2); res=(*pFindDevice)(lpd3d, p1, p2); if(res) OutTraceE("FindDevice ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else { - OutTraceD("FindDevice: GUID=%x.%x.%x.%x\n", p2->guid.Data1, p2->guid.Data2, p2->guid.Data3, p2->guid.Data4); + OutTraceD3D("FindDevice: GUID=%x.%x.%x.%x\n", p2->guid.Data1, p2->guid.Data2, p2->guid.Data3, p2->guid.Data4); DumpD3DDevideDesc(&(p2->ddHwDesc), "HWDEV"); DumpD3DDevideDesc(&(p2->ddSwDesc), "SWDEV"); } @@ -441,12 +442,12 @@ HRESULT WINAPI extSetViewport(void *lpvp, LPD3DVIEWPORT vpd) { HRESULT res; - OutTraceD("SetViewport: viewport=%x viewportd=%x size=%d pos=(%d,%d) dim=(%dx%d) scale=(%fx%f) maxXYZ=(%f,%f,%f) minZ=%f\n", + OutTraceD3D("SetViewport: viewport=%x viewportd=%x size=%d pos=(%d,%d) dim=(%dx%d) scale=(%fx%f) maxXYZ=(%f,%f,%f) minZ=%f\n", lpvp, vpd, vpd->dwSize, vpd->dwX, vpd->dwY, vpd->dwHeight, vpd->dwWidth, vpd->dvScaleX, vpd->dvScaleY, vpd->dvMaxX, vpd->dvMaxY, vpd->dvMaxZ, vpd->dvMinZ); res=(*pSetViewport)(lpvp, vpd); if(res) OutTraceE("SetViewport ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("SetViewport: OK\n"); + else OutTraceD3D("SetViewport: OK\n"); return res; } @@ -454,10 +455,10 @@ HRESULT WINAPI extGetViewport(void *lpvp, LPD3DVIEWPORT vpd) { HRESULT res; - OutTraceD("GetViewport: viewport=%x viewportd=%x\n", lpvp, vpd); + OutTraceD3D("GetViewport: viewport=%x viewportd=%x\n", lpvp, vpd); res=(*pGetViewport)(lpvp, vpd); if(res) OutTraceE("GetViewport ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("GetViewport: OK size=%d pos=(%d,%d) dim=(%dx%d) scale=(%fx%f) maxXYZ=(%f,%f,%f) minZ=%f\n", + else OutTraceD3D("GetViewport: OK size=%d pos=(%d,%d) dim=(%dx%d) scale=(%fx%f) maxXYZ=(%f,%f,%f) minZ=%f\n", vpd->dwSize, vpd->dwX, vpd->dwY, vpd->dwHeight, vpd->dwWidth, vpd->dvScaleX, vpd->dvScaleY, vpd->dvMaxX, vpd->dvMaxY, vpd->dvMaxZ, vpd->dvMinZ); return res; @@ -467,10 +468,10 @@ HRESULT WINAPI extInitializeVP(void *lpvp, LPDIRECT3D lpd3d) { HRESULT res; - OutTraceD("Initialize(VP): viewport=%x d3d=%x\n", lpvp, lpd3d); + OutTraceD3D("Initialize(VP): viewport=%x d3d=%x\n", lpvp, lpd3d); res=(*pInitializeVP)(lpvp, lpd3d); if(res) OutTraceE("Initialize(VP) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("Initialize(VP): OK \n"); + else OutTraceD3D("Initialize(VP): OK \n"); return res; } @@ -478,14 +479,14 @@ HRESULT WINAPI extCreateDevice2(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE { HRESULT res; - OutTraceD("CreateDevice(D3D2): d3d=%x GUID=%x(%s) lpdds=%x\n", lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds); + OutTraceD3D("CreateDevice(D3D2): d3d=%x GUID=%x(%s) lpdds=%x\n", lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds); res=(*pCreateDevice2)(lpd3d, Guid, lpdds, lplpd3dd); if(res) { OutTraceE("CreateDevice(D3D2) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } else - OutTraceD("CreateDevice(D3D2): lpd3dd=%x\n", lpd3d, *lplpd3dd); + OutTraceD3D("CreateDevice(D3D2): lpd3dd=%x\n", lpd3d, *lplpd3dd); HookDirect3DDevice((void **)lplpd3dd, 2); return res; @@ -501,7 +502,7 @@ HRESULT WINAPI extCreateDevice3(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE4 GUID IID_IDirect3DRampDevice = {0xF2086B20,0x259F,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56}; GUID IID_IDirect3DMMXDevice = {0x881949a1,0xd6f3,0x11d0,0x89,0xab,0x00,0xa0,0xc9,0x05,0x41,0x29}; - OutTraceD("CreateDevice(D3D3): d3d=%x GUID=%x(%s) lpdds=%x\n", lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds); + OutTraceD3D("CreateDevice(D3D3): d3d=%x GUID=%x(%s) lpdds=%x\n", lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds); res=(*pCreateDevice3)(lpd3d, Guid, lpdds, lplpd3dd, unk); //res=(*pCreateDevice3)(lpd3d, IID_IDirect3DMMXDevice, lpdds, lplpd3dd, unk); if(res) { @@ -528,7 +529,7 @@ HRESULT WINAPI extCreateDevice3(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE4 HRESULT WINAPI extD3DInitialize(void *d3dd, LPDIRECT3D lpd3d, LPGUID lpGuid, LPD3DDEVICEDESC lpd3dd) { HRESULT res; - OutTrace("Initialize: d3dd=%x lpd3d=%x GUID=%x lpd3ddd=%x\n", d3dd, lpd3d, lpGuid->Data1, lpd3dd); + OutTraceD3D("Initialize: d3dd=%x lpd3d=%x GUID=%x lpd3ddd=%x\n", d3dd, lpd3d, lpGuid->Data1, lpd3dd); res=(*pD3DInitialize)(d3dd, lpd3d, lpGuid, lpd3dd); if(res) OutTraceE("Initialize ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); DumpD3DDevideDesc(lpd3dd, "INIT"); @@ -538,7 +539,7 @@ HRESULT WINAPI extD3DInitialize(void *d3dd, LPDIRECT3D lpd3d, LPGUID lpGuid, LPD HRESULT WINAPI extD3DGetCaps(void *d3dd, LPD3DDEVICEDESC lpd3dd ,LPD3DDEVICEDESC lpd3dd2) { HRESULT res; - OutTrace("GetCaps(D3D): d3dd=%x lpd3dd=%x lpd3dd2=%x \n", d3dd, lpd3dd, lpd3dd2); + OutTraceD3D("GetCaps(D3D): d3dd=%x lpd3dd=%x lpd3dd2=%x \n", d3dd, lpd3dd, lpd3dd2); res=(*pD3DGetCaps)(d3dd, lpd3dd, lpd3dd2); if(res) OutTraceE("GetCaps(D3D) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); DumpD3DDevideDesc(lpd3dd, "HWDEV"); @@ -586,16 +587,16 @@ char *ExplainRenderstateValue(DWORD Value) HRESULT WINAPI extSetRenderState2(void *d3dd, D3DRENDERSTATETYPE State, DWORD Value) { HRESULT res; - OutTraceD("SetRenderState(2): d3dd=%x State=%x(%s) Value=%x\n", d3dd, State, ExplainD3DRenderState(State), Value); + OutTraceD3D("SetRenderState(2): d3dd=%x State=%x(%s) Value=%x\n", d3dd, State, ExplainD3DRenderState(State), Value); if((dxw.dwFlags4 & ZBUFFERALWAYS) && (State == D3DRENDERSTATE_ZFUNC)) { DWORD OldValue; OldValue = Value; Value = D3DCMP_ALWAYS; - OutTraceD("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(OldValue)); + OutTraceDW("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(OldValue)); } if((dxw.dwFlags2 & WIREFRAME) && (State == D3DRENDERSTATE_FILLMODE)){ Value = D3DFILL_WIREFRAME; - OutTraceD("SetRenderState: FIXED State=FILLMODE Value=D3DFILL_WIREFRAME\n"); + OutTraceDW("SetRenderState: FIXED State=FILLMODE Value=D3DFILL_WIREFRAME\n"); } res=(*pSetRenderState2)(d3dd, State, Value); if(res) OutTraceE("SetRenderState(2): res=%x(%s)\n", res, ExplainDDError(res)); @@ -605,19 +606,19 @@ HRESULT WINAPI extSetRenderState2(void *d3dd, D3DRENDERSTATETYPE State, DWORD Va HRESULT WINAPI extSetRenderState3(void *d3dd, D3DRENDERSTATETYPE State, DWORD Value) { HRESULT res; - OutTraceD("SetRenderState(3): d3dd=%x State=%x(%s) Value=%x\n", d3dd, State, ExplainD3DRenderState(State), Value); + OutTraceD3D("SetRenderState(3): d3dd=%x State=%x(%s) Value=%x\n", d3dd, State, ExplainD3DRenderState(State), Value); if((dxw.dwFlags4 & ZBUFFERALWAYS) && (State == D3DRENDERSTATE_ZFUNC)) { DWORD OldValue; OldValue = Value; Value = D3DCMP_ALWAYS; - OutTraceD("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(OldValue)); + OutTraceDW("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(OldValue)); } if((dxw.dwFlags2 & WIREFRAME) && (State == D3DRENDERSTATE_FILLMODE)){ Value = D3DFILL_WIREFRAME; - OutTraceD("SetRenderState: FIXED State=FILLMODE Value=D3DFILL_WIREFRAME\n"); + OutTraceDW("SetRenderState: FIXED State=FILLMODE Value=D3DFILL_WIREFRAME\n"); } if((dxw.dwFlags4 & DISABLEFOGGING) && (State == D3DRENDERSTATE_FOGENABLE)){ - OutTraceD("SetRenderState: FIXED State=FOGENABLE Value=FALSE\n"); + OutTraceDW("SetRenderState: FIXED State=FOGENABLE Value=FALSE\n"); Value = FALSE; } res=(*pSetRenderState3)(d3dd, State, Value); @@ -628,7 +629,7 @@ HRESULT WINAPI extSetRenderState3(void *d3dd, D3DRENDERSTATETYPE State, DWORD Va HRESULT WINAPI extBeginScene1(void *d3dd) { HRESULT res; - OutTraceD("BeginScene(1): d3dd=%x\n", d3dd); + OutTraceD3D("BeginScene(1): d3dd=%x\n", d3dd); res=(*pBeginScene1)(d3dd); if(res) OutTraceE("BeginScene(1): res=%x(%s)\n", res, ExplainDDError(res)); return res; @@ -637,7 +638,7 @@ HRESULT WINAPI extBeginScene1(void *d3dd) HRESULT WINAPI extBeginScene2(void *d3dd) { HRESULT res; - OutTraceD("BeginScene(2): d3dd=%x\n", d3dd); + OutTraceD3D("BeginScene(2): d3dd=%x\n", d3dd); if(dxw.dwFlags4 & ZBUFFERCLEAN){ HRESULT res2; LPDIRECT3DVIEWPORT2 vp; @@ -651,7 +652,7 @@ HRESULT WINAPI extBeginScene2(void *d3dd) d3dRect.y1 = vpd.dwY; d3dRect.x2 = vpd.dwX + vpd.dwWidth; d3dRect.y2 = vpd.dwY + vpd.dwHeight; - OutTraceD("d3dRect=(%d,%d)-(%d,%d)\n", d3dRect.x1, d3dRect.y1, d3dRect.x2, d3dRect.y2); + OutTraceDW("d3dRect=(%d,%d)-(%d,%d)\n", d3dRect.x1, d3dRect.y1, d3dRect.x2, d3dRect.y2); vp->Clear(1, &d3dRect, D3DCLEAR_ZBUFFER); } } @@ -663,7 +664,7 @@ HRESULT WINAPI extBeginScene2(void *d3dd) HRESULT WINAPI extBeginScene3(void *d3dd) { HRESULT res; - OutTraceD("BeginScene(3): d3dd=%x\n", d3dd); + OutTraceD3D("BeginScene(3): d3dd=%x\n", d3dd); if(dxw.dwFlags4 & (ZBUFFERCLEAN|ZBUFFER0CLEAN)){ HRESULT res2; LPDIRECT3DVIEWPORT3 vp; @@ -677,7 +678,7 @@ HRESULT WINAPI extBeginScene3(void *d3dd) d3dRect.y1 = vpd.dwY; d3dRect.x2 = vpd.dwX + vpd.dwWidth; d3dRect.y2 = vpd.dwY + vpd.dwHeight; - OutTraceD("d3dRect=(%d,%d)-(%d,%d)\n", d3dRect.x1, d3dRect.y1, d3dRect.x2, d3dRect.y2); + OutTraceDW("d3dRect=(%d,%d)-(%d,%d)\n", d3dRect.x1, d3dRect.y1, d3dRect.x2, d3dRect.y2); if(dxw.dwFlags4 & ZBUFFERCLEAN )vp->Clear2(1, &d3dRect, D3DCLEAR_ZBUFFER, 0, 1.0, 0); if(dxw.dwFlags4 & ZBUFFER0CLEAN)vp->Clear2(1, &d3dRect, D3DCLEAR_ZBUFFER, 0, 0.0, 0); } @@ -690,7 +691,7 @@ HRESULT WINAPI extBeginScene3(void *d3dd) HRESULT WINAPI extEndScene1(void *d3dd) { HRESULT res; - OutTraceD("EndScene(1): d3dd=%x\n", d3dd); + OutTraceD3D("EndScene(1): d3dd=%x\n", d3dd); res=(*pEndScene1)(d3dd); //dxw.ShowOverlay(); if(res) OutTraceE("EndScene(1): res=%x(%s)\n", res, ExplainDDError(res)); @@ -700,7 +701,7 @@ HRESULT WINAPI extEndScene1(void *d3dd) HRESULT WINAPI extEndScene2(void *d3dd) { HRESULT res; - OutTraceD("EndScene(2): d3dd=%x\n", d3dd); + OutTraceD3D("EndScene(2): d3dd=%x\n", d3dd); res=(*pEndScene2)(d3dd); //dxw.ShowOverlay(); if(res) OutTraceE("EndScene(2): res=%x(%s)\n", res, ExplainDDError(res)); @@ -710,7 +711,7 @@ HRESULT WINAPI extEndScene2(void *d3dd) HRESULT WINAPI extEndScene3(void *d3dd) { HRESULT res; - OutTraceD("EndScene(3): d3dd=%x\n", d3dd); + OutTraceD3D("EndScene(3): d3dd=%x\n", d3dd); res=(*pEndScene3)(d3dd); //dxw.ShowOverlay(); if(res) OutTraceE("EndScene(3): res=%x(%s)\n", res, ExplainDDError(res)); @@ -720,7 +721,7 @@ HRESULT WINAPI extEndScene3(void *d3dd) HRESULT WINAPI extGetCaps3(void *d3dd, LPD3DDEVICEDESC hd, LPD3DDEVICEDESC sd) { HRESULT res; - OutTraceD("GetCaps(3): d3dd=%x hd=%x sd=%x\n", d3dd, hd, sd); + OutTraceD3D("GetCaps(3): d3dd=%x hd=%x sd=%x\n", d3dd, hd, sd); res=(*pGetCaps3)(d3dd, hd, sd); if(res) { OutTraceE("GetCaps(3): res=%x(%s)\n", res, ExplainDDError(res)); diff --git a/dll/imelib.cpp b/dll/imelib.cpp index 4c5327b..ee89cdc 100644 --- a/dll/imelib.cpp +++ b/dll/imelib.cpp @@ -35,49 +35,49 @@ FARPROC Remap_ImeLib_ProcAddress(LPCSTR proc, HMODULE hModule) BOOL WINAPI extImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue) { - OutTraceD("ImmNotifyIME: hIMC=%x dwAction=%x dwIndex=%x dwValue=%x\n", hIMC, dwAction, dwIndex, dwValue); + OutTraceDW("ImmNotifyIME: hIMC=%x dwAction=%x dwIndex=%x dwValue=%x\n", hIMC, dwAction, dwIndex, dwValue); return(*pImmNotifyIME)(hIMC, dwAction, dwIndex, dwValue); } HIMC WINAPI extImmCreateContext(void) { - OutTraceD("ImmCreateContext\n"); + OutTraceDW("ImmCreateContext\n"); return(*pImmCreateContext)(); } BOOL WINAPI extImmDestroyContext(HIMC hIMC) { - OutTraceD("ImmDestroyContext: hIMC=%x\n", hIMC); + OutTraceDW("ImmDestroyContext: hIMC=%x\n", hIMC); return(*pImmDestroyContext)(hIMC); } BOOL WINAPI extImmSetOpenStatus(HIMC hIMC, BOOL fOpen) { - OutTraceD("ImmSetOpenStatus: hIMC=%x fOpen=%x\n", hIMC, fOpen); + OutTraceDW("ImmSetOpenStatus: hIMC=%x fOpen=%x\n", hIMC, fOpen); return(*pImmSetOpenStatus)(hIMC, fOpen); } HIMC WINAPI extImmAssociateContext(HWND hwnd, HIMC hIMC) { - OutTraceD("ImmAssociateContext: hwnd=%x hIMC=%x\n", hwnd, hIMC); + OutTraceDW("ImmAssociateContext: hwnd=%x hIMC=%x\n", hwnd, hIMC); //return NULL; return(*pImmAssociateContext)(hwnd, hIMC); } BOOL WINAPI extImmSetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm) { - OutTraceD("ImmSetCompositionWindow: hIMC=%x lpCompForm=%x\n", hIMC, lpCompForm); + OutTraceDW("ImmSetCompositionWindow: hIMC=%x lpCompForm=%x\n", hIMC, lpCompForm); return(*pImmSetCompositionWindow)(hIMC, lpCompForm); } BOOL WINAPI extImmSetCompositionString(HIMC hIMC, DWORD dwIndex, LPVOID lpComp, DWORD dwCompLen, LPVOID lpRead, DWORD dwReadLen) { - OutTraceD("ImmSetCompositionString: hIMC=%x dwIndex=%x lpComp=%x dwCompLen=%x dwRead=%x dwReadLen=%x\n", hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen); + OutTraceDW("ImmSetCompositionString: hIMC=%x dwIndex=%x lpComp=%x dwCompLen=%x dwRead=%x dwReadLen=%x\n", hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen); return (*pImmSetCompositionString)(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen); } BOOL WINAPI extImmGetOpenStatus(HIMC hIMC) { - OutTraceD("ImmGetOpenStatus: hIMC=%x\n", hIMC); + OutTraceDW("ImmGetOpenStatus: hIMC=%x\n", hIMC); return(*pImmGetOpenStatus)(hIMC); } diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 9d90216..46edc39 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -40,6 +40,7 @@ static HookEntry_Type TimeHooks[]={ {"SleepEx", (FARPROC)SleepEx, (FARPROC *)&pSleepEx, (FARPROC)extSleepEx}, {"SetTimer", (FARPROC)SetTimer, (FARPROC *)&pSetTimer, (FARPROC)extSetTimer}, {"QueryPerformanceCounter", (FARPROC)NULL, (FARPROC *)&pQueryPerformanceCounter, (FARPROC)extQueryPerformanceCounter}, + {"QueryPerformanceFrequency", (FARPROC)NULL, (FARPROC *)&pQueryPerformanceFrequency, (FARPROC)extQueryPerformanceFrequency}, {0, NULL, 0, 0} // terminator }; @@ -64,6 +65,26 @@ void HookKernel32(HMODULE module) if(dxw.dwFlags2 & TIMESTRETCH) HookLibrary(module, TimeHooks, libname); if(dxw.dwFlags2 & FAKEVERSION) HookLibrary(module, VersionHooks, libname); if(dxw.dwFlags4 & SUPPRESSCHILD) HookLibrary(module, SuppressChildHooks, libname); + +#if 0 + if(dxw.dwFlags2 & TIMESTRETCH){ + HINSTANCE hinst; + LARGE_INTEGER myPerfCount; + hinst = LoadLibrary("kernel32.dll"); + pQueryPerformanceFrequency=(QueryPerformanceFrequency_Type)GetProcAddress(hinst, "QueryPerformanceFrequency"); + pQueryPerformanceCounter=(QueryPerformanceCounter_Type)GetProcAddress(hinst, "QueryPerformanceCounter"); + pGetTickCount=(GetTickCount_Type)GetProcAddress(hinst, "GetTickCount"); + if(pQueryPerformanceFrequency){ + HookAPI(hinst, "kernel32.dll", pQueryPerformanceFrequency, "QueryPerformanceFrequency", extQueryPerformanceFrequency); + HookAPI(hinst, "kernel32.dll", pQueryPerformanceCounter, "QueryPerformanceCounter", extQueryPerformanceCounter); + extQueryPerformanceFrequency(&myPerfCount); + } + if(pGetTickCount){ + HookAPI(hinst, "kernel32.dll", pGetTickCount, "GetTickCount", extGetTickCount); + extGetTickCount(); + } + } +#endif } void HookKernel32Init() @@ -78,6 +99,14 @@ FARPROC Remap_kernel32_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; + if (dxw.dwFlags4 & NOPERFCOUNTER){ + if( !strcmp(proc, "QueryPerformanceCounter") || + !strcmp(proc, "QueryPerformanceFrequency")){ + OutTraceDW("GetProcAddress: HIDING proc=%s\n", proc); + return NULL; + } + } + if (addr=RemapLibrary(proc, hModule, Hooks)) return addr; if(dxw.dwFlags3 & BUFFEREDIOFIX) @@ -106,14 +135,14 @@ extern void HookModule(HMODULE, int); int WINAPI extIsDebuggerPresent(void) { - OutTraceD("extIsDebuggerPresent: return FALSE\n"); + OutTraceDW("extIsDebuggerPresent: return FALSE\n"); return FALSE; } BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { BOOL ret; - OutTraceD("GetDiskFreeSpace: RootPathName=\"%s\"\n", lpRootPathName); + OutTraceDW("GetDiskFreeSpace: RootPathName=\"%s\"\n", lpRootPathName); ret=(*pGetDiskFreeSpaceA)(lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters); if(!ret) OutTraceE("GetDiskFreeSpace: ERROR err=%d at %d\n", GetLastError(), __LINE__); *lpNumberOfFreeClusters = 16000; @@ -142,7 +171,7 @@ BIGENOUGH 0x20000000 // surely positive !!! void WINAPI extGlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) { (*pGlobalMemoryStatus)(lpBuffer); - OutTraceD("GlobalMemoryStatus: Length=%x MemoryLoad=%x " + OutTraceDW("GlobalMemoryStatus: Length=%x MemoryLoad=%x " "TotalPhys=%x AvailPhys=%x TotalPageFile=%x AvailPageFile=%x TotalVirtual=%x AvailVirtual=%x\n", lpBuffer->dwMemoryLoad, lpBuffer->dwTotalPhys, lpBuffer->dwAvailPhys, lpBuffer->dwTotalPageFile, lpBuffer->dwAvailPageFile, lpBuffer->dwTotalVirtual, lpBuffer->dwAvailVirtual); @@ -200,7 +229,7 @@ BOOL WINAPI extGetVersionEx(LPOSVERSIONINFO lpVersionInfo) return ret; } - OutTraceD("GetVersionEx: version=%d.%d build=(%d)\n", + OutTraceDW("GetVersionEx: version=%d.%d build=(%d)\n", lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwBuildNumber); if(dxw.dwFlags2 & FAKEVERSION) { @@ -208,7 +237,7 @@ BOOL WINAPI extGetVersionEx(LPOSVERSIONINFO lpVersionInfo) lpVersionInfo->dwMajorVersion = WinVersions[dxw.FakeVersionId].bMajor; lpVersionInfo->dwMinorVersion = WinVersions[dxw.FakeVersionId].bMinor; lpVersionInfo->dwBuildNumber = 0; - OutTraceD("GetVersionEx: FIXED version=%d.%d build=(%d) os=\"%s\"\n", + OutTraceDW("GetVersionEx: FIXED version=%d.%d build=(%d) os=\"%s\"\n", lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwBuildNumber, WinVersions[dxw.FakeVersionId].sName); } @@ -234,14 +263,14 @@ DWORD WINAPI extGetVersion(void) if (dwVersion < 0x80000000) dwBuild = (DWORD)(HIWORD(dwVersion)); - OutTraceD("GetVersion: version=%d.%d build=(%d)\n", dwMajorVersion, dwMinorVersion, dwBuild); + OutTraceDW("GetVersion: version=%d.%d build=(%d)\n", dwMajorVersion, dwMinorVersion, dwBuild); if(dxw.dwFlags2 & FAKEVERSION) { dwVersion = WinVersions[dxw.FakeVersionId].bMajor | (WinVersions[dxw.FakeVersionId].bMinor << 8); dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); dwBuild = (DWORD)(HIWORD(dwVersion)); - OutTraceD("GetVersion: FIXED version=%d.%d build=(%d) os=\"%s\"\n", + OutTraceDW("GetVersion: FIXED version=%d.%d build=(%d) os=\"%s\"\n", dwMajorVersion, dwMinorVersion, dwBuild, WinVersions[dxw.FakeVersionId].sName); } @@ -330,7 +359,7 @@ HMODULE WINAPI LoadLibraryExWrapper(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFl int idx; libhandle=(*pLoadLibraryExA)(lpFileName, hFile, dwFlags); - OutTraceD("%s: FileName=%s hFile=%x Flags=%x(%s) hmodule=%x\n", api, lpFileName, hFile, dwFlags, ExplainLoadLibFlags(dwFlags), libhandle); + OutTraceDW("%s: FileName=%s hFile=%x Flags=%x(%s) hmodule=%x\n", api, lpFileName, hFile, dwFlags, ExplainLoadLibFlags(dwFlags), libhandle); if(!libhandle){ OutTraceE("%s: ERROR FileName=%s err=%d\n", api, lpFileName, GetLastError()); return libhandle; @@ -348,6 +377,13 @@ HMODULE WINAPI LoadLibraryExWrapper(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFl SysLibs[idx]=libhandle; } if (idx == -1) HookModule(libhandle, 0); +#if 0 + switch(idx){ + case SYSLIBIDX_DIRECTDRAW: HookDirectDraw(libhandle, 0); break; + case SYSLIBIDX_DIRECT3D8: HookDirect3D(libhandle, 8); break; + case SYSLIBIDX_DIRECT3D9: HookDirect3D(libhandle, 9); break; + } +#endif return libhandle; } @@ -393,7 +429,7 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) // If this parameter is an ordinal value, it must be in the low-order word; // the high-order word must be zero. - OutTraceD("GetProcAddress: hModule=%x proc=%s\n", hModule, ProcToString(proc)); + OutTraceDW("GetProcAddress: hModule=%x proc=%s\n", hModule, ProcToString(proc)); for(idx=0; idxHighPart, lpPerformanceCount->LowPart); return ret; } + +BOOL WINAPI extQueryPerformanceFrequency(LARGE_INTEGER *lpPerformanceFrequency) +{ + BOOL ret; + if(dxw.dwFlags4 & NOPERFCOUNTER){ + LARGE_INTEGER myPerfFrequency; + myPerfFrequency.LowPart = 0L; + myPerfFrequency.HighPart = 0L; + *lpPerformanceFrequency=myPerfFrequency; + ret = 0; + } + else + ret=(*pQueryPerformanceFrequency)(lpPerformanceFrequency); + OutTraceDW("QueryPerformanceFrequency: ret=%x Frequency=%x-%x\n", ret, lpPerformanceFrequency->HighPart, lpPerformanceFrequency->LowPart); + return ret; +} \ No newline at end of file diff --git a/dll/msvfw.cpp b/dll/msvfw.cpp index 41be6d0..bc33d64 100644 --- a/dll/msvfw.cpp +++ b/dll/msvfw.cpp @@ -30,7 +30,7 @@ void HookMSV4WLibs(HMODULE module) LRESULT WINAPI extICSendMessage(HIC hic, UINT wMsg, DWORD_PTR dw1, DWORD_PTR dw2) { LRESULT res; - OutTraceD("ICSendMessage: hic=%x wMsg=%x dw1=%x dw2=%x\n", hic, wMsg, dw1, dw2); + OutTraceDW("ICSendMessage: hic=%x wMsg=%x dw1=%x dw2=%x\n", hic, wMsg, dw1, dw2); return 0; res=(*pICSendMessage)(hic, wMsg, dw1, dw2); return res; @@ -38,7 +38,7 @@ LRESULT WINAPI extICSendMessage(HIC hic, UINT wMsg, DWORD_PTR dw1, DWORD_PTR dw2 HIC WINAPI extICOpen(DWORD fccType, DWORD fccHandler, UINT wMode) { - OutTraceD("ICOpen: fccType=%x fccHandler=%x wMode=%x\n", fccType, fccHandler, wMode); + OutTraceDW("ICOpen: fccType=%x fccHandler=%x wMode=%x\n", fccType, fccHandler, wMode); return (HIC)0; } diff --git a/dll/ole32.cpp b/dll/ole32.cpp index dd0c95c..5dadd01 100644 --- a/dll/ole32.cpp +++ b/dll/ole32.cpp @@ -52,7 +52,7 @@ static void HookAdditionalModules() if(hModule){ // --- and now it exists ... HookModule(hModule, 0); // ... then hook it and .. AddedModules[i].Hooked=TRUE; // .. mark it as already hooked - OutTraceD("CoCreateInstance: hooked module=%s hmodule=%x\n", AddedModules[i].ModuleName, hModule); + OutTraceDW("CoCreateInstance: hooked module=%s hmodule=%x\n", AddedModules[i].ModuleName, hModule); //CloseHandle(hModule); // do NOT close this handle } } @@ -73,36 +73,36 @@ static HRESULT STDAPICALLTYPE myCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnk if(res) OutTraceE("CoCreateInstance: ERROR res=%x\n", res); else - OutTraceD("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv); + OutTraceDW("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv); if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){ LPDIRECTDRAW lpOldDDraw; - OutTraceD("CoCreateInstance: CLSID_DirectDraw object\n"); + OutTraceDW("CoCreateInstance: CLSID_DirectDraw object\n"); switch (*(DWORD *)&riid){ case 0x6C14DB80: - OutTraceD("DirectDrawCreate: IID_DirectDraw RIID\n"); + OutTraceDW("DirectDrawCreate: IID_DirectDraw RIID\n"); res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0); - if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); break; case 0xB3A6F3E0: - OutTraceD("DirectDrawCreate: IID_DirectDraw2 RIID\n"); + OutTraceDW("DirectDrawCreate: IID_DirectDraw2 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); - if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv); - if(res)OutTraceD("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); break; case 0x9c59509a: - OutTraceD("DirectDrawCreate: IID_DirectDraw4 RIID\n"); + OutTraceDW("DirectDrawCreate: IID_DirectDraw4 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); - if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv); - if(res)OutTraceD("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); case 0x15e65ec0: - OutTraceD("CoCreateInstance: IID_DirectDraw7 RIID\n"); + OutTraceDW("CoCreateInstance: IID_DirectDraw7 RIID\n"); res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0); - if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); break; case 0xe436ebb3: break; @@ -118,43 +118,43 @@ static HRESULT STDAPICALLTYPE myCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnk HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv) { HRESULT res; - OutTraceD("CoCreateInstance: rclsid=%x UnkOuter=%x ClsContext=%x refiid=%x(%s)\n", + OutTraceDW("CoCreateInstance: rclsid=%x UnkOuter=%x ClsContext=%x refiid=%x(%s)\n", rclsid, pUnkOuter, dwClsContext, riid.Data1, ExplainGUID((GUID *)&riid)); res=(*pCoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv); if(res) OutTraceE("CoCreateInstance: ERROR res=%x\n", res); else - OutTraceD("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv); + OutTraceDW("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv); if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){ LPDIRECTDRAW lpOldDDraw; - OutTraceD("CoCreateInstance: CLSID_DirectDraw object\n"); + OutTraceDW("CoCreateInstance: CLSID_DirectDraw object\n"); switch (*(DWORD *)&riid){ case 0x6C14DB80: - OutTraceD("DirectDrawCreate: IID_DirectDraw RIID\n"); + OutTraceDW("DirectDrawCreate: IID_DirectDraw RIID\n"); res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0); - if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); break; case 0xB3A6F3E0: - OutTraceD("DirectDrawCreate: IID_DirectDraw2 RIID\n"); + OutTraceDW("DirectDrawCreate: IID_DirectDraw2 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); - if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv); - if(res)OutTraceD("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); break; case 0x9c59509a: - OutTraceD("DirectDrawCreate: IID_DirectDraw4 RIID\n"); + OutTraceDW("DirectDrawCreate: IID_DirectDraw4 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); - if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv); - if(res)OutTraceD("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); case 0x15e65ec0: - OutTraceD("CoCreateInstance: IID_DirectDraw7 RIID\n"); + OutTraceDW("CoCreateInstance: IID_DirectDraw7 RIID\n"); res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0); - if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); break; case 0xe436ebb3: break; @@ -172,7 +172,7 @@ HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOute HRESULT res; DWORD i; - OutTraceD("CoCreateInstanceEx: rclsid=%x UnkOuter=%x ClsContext=%x Count=%d\n", + OutTraceDW("CoCreateInstanceEx: rclsid=%x UnkOuter=%x ClsContext=%x Count=%d\n", rclsid, punkOuter, dwClsCtx, dwCount); res=(*pCoCreateInstanceEx)(rclsid, punkOuter, dwClsCtx, pServerInfo, dwCount, pResults); @@ -194,40 +194,40 @@ HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOute // quartz.dll must be hooked. if (*(DWORD *)&rclsid==0xe436ebb3){ HMODULE qlib; - OutTraceD("CoCreateInstanceEx: CLSID_FilterGraph RIID=%x\n", *(DWORD *)&riid); + OutTraceDW("CoCreateInstanceEx: CLSID_FilterGraph RIID=%x\n", *(DWORD *)&riid); qlib=(*pLoadLibraryA)("quartz.dll"); - OutTraceD("CoCreateInstanceEx: quartz lib handle=%x\n", qlib); + OutTraceDW("CoCreateInstanceEx: quartz lib handle=%x\n", qlib); HookModule(qlib, 0); } if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){ LPDIRECTDRAW lpOldDDraw; - OutTraceD("CoCreateInstanceEx: CLSID_DirectDraw object\n"); + OutTraceDW("CoCreateInstanceEx: CLSID_DirectDraw object\n"); switch (*(DWORD *)&riid){ case 0x6C14DB80: - OutTraceD("DirectDrawCreateEx: IID_DirectDraw RIID\n"); + OutTraceDW("DirectDrawCreateEx: IID_DirectDraw RIID\n"); res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0); - if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); break; case 0xB3A6F3E0: - OutTraceD("DirectDrawCreateEx: IID_DirectDraw2 RIID\n"); + OutTraceDW("DirectDrawCreateEx: IID_DirectDraw2 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); - if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv); - if(res)OutTraceD("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); break; case 0x9c59509a: - OutTraceD("DirectDrawCreateEx: IID_DirectDraw4 RIID\n"); + OutTraceDW("DirectDrawCreateEx: IID_DirectDraw4 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); - if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv); - if(res)OutTraceD("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); case 0x15e65ec0: - OutTraceD("CoCreateInstanceEx: IID_DirectDraw7 RIID\n"); + OutTraceDW("CoCreateInstanceEx: IID_DirectDraw7 RIID\n"); res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0); - if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); + if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); break; case 0xe436ebb3: break; @@ -244,7 +244,7 @@ HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOute HRESULT WINAPI extCoInitialize(LPVOID pvReserved) { HRESULT res; - OutTraceD("CoInitialize: Reserved=%x\n", pvReserved); + OutTraceDW("CoInitialize: Reserved=%x\n", pvReserved); res=(*pCoInitialize)(pvReserved); return res; } diff --git a/dll/opengl.cpp b/dll/opengl.cpp index 5c83dfb..5f6606a 100644 --- a/dll/opengl.cpp +++ b/dll/opengl.cpp @@ -49,7 +49,7 @@ static FARPROC wglRemapLibrary(LPCSTR proc, HookEntry_Type *Hooks) Hook=&Hooks[i]; if (!strcmp(proc,Hook->APIName)){ if (Hook->StoreAddress) *(Hook->StoreAddress)=(*pwglGetProcAddress)(proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), (Hook->StoreAddress) ? *(Hook->StoreAddress) : 0); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), (Hook->StoreAddress) ? *(Hook->StoreAddress) : 0); return Hook->HookerAddress; } } @@ -154,7 +154,7 @@ void HookOpenGLLibs(HMODULE module, char *customlib) if (!customlib) customlib=DefOpenGLModule; - OutTraceD("HookOpenGLLibs module=%x lib=\"%s\" forced=%x\n", module, customlib, (dxw.dwFlags3 & FORCEHOOKOPENGL)?1:0); + OutTraceDW("HookOpenGLLibs module=%x lib=\"%s\" forced=%x\n", module, customlib, (dxw.dwFlags3 & FORCEHOOKOPENGL)?1:0); if (dxw.dwFlags3 & FORCEHOOKOPENGL) ForceHookOpenGL(module); else @@ -169,14 +169,14 @@ void WINAPI extglViewport(GLint x, GLint y, GLsizei width, GLsizei height POINT p={0,0}; //if (dxw.dwFlags2 & HANDLEFPS) if(dxw.HandleFPS()) return; (*pGetClientRect)(dxw.GethWnd(), &client); - OutTraceD("glViewport: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); + OutTraceDW("glViewport: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); if(IsDebug) OutTrace("glViewport: DEBUG win=(%d,%d) screen=(%d,%d)\n", client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight()); x = (x * (GLint)client.right) / (GLint)dxw.GetScreenWidth(); y = (y * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight(); width = (width * (GLint)client.right) / (GLint)dxw.GetScreenWidth(); height = (height * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight(); - OutTraceD("glViewport: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); + OutTraceDW("glViewport: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); (*pglViewport)(x, y, width, height); } @@ -186,19 +186,19 @@ void WINAPI extglScissor(GLint x, GLint y, GLsizei width, GLsizei height) POINT p={0,0}; //if (dxw.dwFlags2 & HANDLEFPS) if(dxw.HandleFPS()) return; (*pGetClientRect)(dxw.GethWnd(), &client); - OutTraceD("glScissor: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); + OutTraceDW("glScissor: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); x = (x * (GLint)client.right) / (GLint)dxw.GetScreenWidth(); y = (y * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight(); width = (width * (GLint)client.right) / (GLint)dxw.GetScreenWidth(); height = (height * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight(); - OutTraceD("glScissor: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); + OutTraceDW("glScissor: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); (*pglScissor)(x, y, width, height); } void WINAPI extglGetIntegerv(GLenum pname, GLint *params) { (*pglGetIntegerv)(pname, params); - OutTraceD("glGetIntegerv: pname=%d\n", pname); + OutTraceDW("glGetIntegerv: pname=%d\n", pname); } void WINAPI extglDrawBuffer(GLenum mode) @@ -224,8 +224,8 @@ void WINAPI extglDrawBuffer(GLenum mode) void WINAPI extglPolygonMode(GLenum face, GLenum mode) { - OutTraceD("glPolygonMode: face=%x mode=%x\n", face, mode); - //OutTraceD("glPolygonMode: extglPolygonMode=%x pglPolygonMode=%x\n", extglPolygonMode, pglPolygonMode); + OutTraceDW("glPolygonMode: face=%x mode=%x\n", face, mode); + //OutTraceDW("glPolygonMode: extglPolygonMode=%x pglPolygonMode=%x\n", extglPolygonMode, pglPolygonMode); if(dxw.dwFlags2 & WIREFRAME) mode = GL_LINE; // trick to set wireframe mode.... (*pglPolygonMode)(face, mode); return; @@ -233,7 +233,7 @@ void WINAPI extglPolygonMode(GLenum face, GLenum mode) void WINAPI extglGetFloatv(GLenum pname, GLboolean *params) { - OutTraceD("glGetFloatv: pname=%x\n", pname); + OutTraceDW("glGetFloatv: pname=%x\n", pname); (*pglGetFloatv)(pname, params); return; } @@ -247,22 +247,22 @@ void WINAPI extglClear(GLbitfield mask) HGLRC WINAPI extwglCreateContext(HDC hdc) { HGLRC ret; - OutTraceD("wglCreateContext: hdc=%x\n", hdc); + OutTraceDW("wglCreateContext: hdc=%x\n", hdc); // v2.02.31: don't let it use desktop hdc if(dxw.IsDesktop(WindowFromDC(hdc))){ HDC oldhdc = hdc; hdc=(*pGDIGetDC)(dxw.GethWnd()); - OutTraceD("wglCreateContext: remapped desktop hdc=%x->%x\n", oldhdc, hdc); + OutTraceDW("wglCreateContext: remapped desktop hdc=%x->%x\n", oldhdc, hdc); } ret=(*pwglCreateContext)(hdc); if(ret){ HWND hwnd; hwnd=WindowFromDC(hdc); dxw.SethWnd(hwnd); - OutTraceD("wglCreateContext: SET hwnd=%x\n", hwnd); + OutTraceDW("wglCreateContext: SET hwnd=%x\n", hwnd); } else { - OutTraceD("wglCreateContext: ERROR err=%x\n", GetLastError()); + OutTraceDW("wglCreateContext: ERROR err=%x\n", GetLastError()); } return ret; } @@ -271,7 +271,7 @@ PROC WINAPI extwglGetProcAddress(LPCSTR proc) { PROC procaddr; - OutTraceD("wglGetProcAddress: proc=%s\n", proc); + OutTraceDW("wglGetProcAddress: proc=%s\n", proc); procaddr=Remap_wgl_ProcAddress(proc); if (!procaddr) procaddr=(*pwglGetProcAddress)(proc); return procaddr; @@ -287,18 +287,18 @@ BOOL WINAPI extwglMakeCurrent(HDC hdc, HGLRC hglrc) { BOOL ret; - OutTraceD("wglMakeCurrent: hdc=%x hglrc=%x\n", hdc, hglrc); + OutTraceDW("wglMakeCurrent: hdc=%x hglrc=%x\n", hdc, hglrc); // v2.02.31: don't let it use desktop hdc if(dxw.IsDesktop(WindowFromDC(hdc))){ HDC oldhdc = hdc; hdc=(*pGDIGetDC)(dxw.GethWnd()); - OutTraceD("wglMakeCurrent: remapped desktop hdc=%x->%x\n", oldhdc, hdc); + OutTraceDW("wglMakeCurrent: remapped desktop hdc=%x->%x\n", oldhdc, hdc); } ret=(*pwglMakeCurrent)(hdc, hglrc); if(ret){ HWND hWnd; hWnd = WindowFromDC(hdc); - OutTraceD("wglMakeCurrent: setting hwnd=%x\n", hWnd); + OutTraceDW("wglMakeCurrent: setting hwnd=%x\n", hWnd); dxw.SethWnd(hWnd); } return ret; diff --git a/dll/smack.cpp b/dll/smack.cpp index bb71d1a..7215425 100644 --- a/dll/smack.cpp +++ b/dll/smack.cpp @@ -26,7 +26,7 @@ FARPROC Remap_smack_ProcAddress(LPCSTR proc, HMODULE hModule) { if (!strcmp(proc,"_SmackOpen@12") && !pSmackOpen){ pSmackOpen=(SmackOpen_Type)(*pGetProcAddress)(hModule, proc); - OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pSmackOpen); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pSmackOpen); return (FARPROC)extSmackOpen; } // NULL -> keep the original call address @@ -36,12 +36,12 @@ FARPROC Remap_smack_ProcAddress(LPCSTR proc, HMODULE hModule) SmackStruct * WINAPI extSmackOpen(HANDLE SmackFile, UINT32 flags, INT32 unknown) { SmackStruct *ret; - OutTraceD("SmackOpen: SmackFile=%x flags=%x unknown=%x\n", SmackFile, flags, unknown); + OutTraceDW("SmackOpen: SmackFile=%x flags=%x unknown=%x\n", SmackFile, flags, unknown); if(!pSmackOpen) OutTraceE("ASSERT: NULL pSmackOpen\n"); ret=(*pSmackOpen)(SmackFile, flags, unknown); - OutTraceD("SmackOpen: ret=%x\n", ret); + OutTraceDW("SmackOpen: ret=%x\n", ret); if (ret) { - OutTraceD("SmackOpen: version=%x screen=(%dx%d) frame_count=%d frame_number=%d\n", + OutTraceDW("SmackOpen: version=%x screen=(%dx%d) frame_count=%d frame_number=%d\n", ret->version, ret->width, ret->height, ret->frame_count, ret->frame_number); //ret->width=800; //ret->height=600; diff --git a/dll/syslibs.h b/dll/syslibs.h index 965b91a..2d78da2 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -120,6 +120,7 @@ typedef DWORD (WINAPI *SetFilePointer_Type)(HANDLE, LONG, PLONG, DWORD); typedef BOOL (WINAPI *CloseHandle_Type)(HANDLE); typedef BOOL (WINAPI *QueryPerformanceFrequency_Type)(LARGE_INTEGER *); typedef BOOL (WINAPI *QueryPerformanceCounter_Type)(LARGE_INTEGER *); +typedef BOOL (WINAPI *QueryPerformanceFrequency_Type)(LARGE_INTEGER *); // ole32.dll: typedef HRESULT (STDAPICALLTYPE *CoCreateInstance_Type)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*); @@ -129,8 +130,10 @@ typedef HRESULT (STDAPICALLTYPE *CoInitialize_Type)(LPVOID); // user32.dll: typedef HDC (WINAPI *BeginPaint_Type)(HWND, LPPAINTSTRUCT); typedef LRESULT (WINAPI *CallWindowProc_Type)(WNDPROC, HWND, UINT, WPARAM, LPARAM); -typedef LONG (WINAPI *ChangeDisplaySettings_Type)(DEVMODE *, DWORD); -typedef LONG (WINAPI *ChangeDisplaySettingsEx_Type)(LPCTSTR, DEVMODE *, HWND, DWORD, LPVOID); +typedef LONG (WINAPI *ChangeDisplaySettingsA_Type)(DEVMODEA *, DWORD); +typedef LONG (WINAPI *ChangeDisplaySettingsExA_Type)(LPCTSTR, DEVMODEA *, HWND, DWORD, LPVOID); +typedef LONG (WINAPI *ChangeDisplaySettingsW_Type)(DEVMODEW *, DWORD); +typedef LONG (WINAPI *ChangeDisplaySettingsExW_Type)(LPCTSTR, DEVMODEW *, HWND, DWORD, LPVOID); typedef BOOL (WINAPI *ClientToScreen_Type)(HWND, LPPOINT); typedef BOOL (WINAPI *ClipCursor_Type)(const RECT *); typedef HWND (WINAPI *CreateDialogIndirectParam_Type)(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); @@ -314,8 +317,10 @@ DXWEXTERN CoInitialize_Type pCoInitialize DXWINITIALIZED; // user32.dll: DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED; DXWEXTERN CallWindowProc_Type pCallWindowProc DXWINITIALIZED; -DXWEXTERN ChangeDisplaySettings_Type pChangeDisplaySettings DXWINITIALIZED; -DXWEXTERN ChangeDisplaySettingsEx_Type pChangeDisplaySettingsEx DXWINITIALIZED; +DXWEXTERN ChangeDisplaySettingsA_Type pChangeDisplaySettingsA DXWINITIALIZED; +DXWEXTERN ChangeDisplaySettingsExA_Type pChangeDisplaySettingsExA DXWINITIALIZED; +DXWEXTERN ChangeDisplaySettingsW_Type pChangeDisplaySettingsW DXWINITIALIZED; +DXWEXTERN ChangeDisplaySettingsExW_Type pChangeDisplaySettingsExW DXWINITIALIZED; DXWEXTERN ClientToScreen_Type pClientToScreen DXWINITIALIZED; DXWEXTERN ClipCursor_Type pClipCursor DXWINITIALIZED; DXWEXTERN CreateDialogIndirectParam_Type pCreateDialogIndirectParam DXWINITIALIZED; @@ -495,8 +500,10 @@ extern HRESULT STDAPICALLTYPE extCoInitialize(LPVOID); // user32.dll: extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT); extern LRESULT WINAPI extCallWindowProc(WNDPROC, HWND, UINT, WPARAM, LPARAM); -extern LONG WINAPI extChangeDisplaySettings(DEVMODE *, DWORD); -extern LONG WINAPI extChangeDisplaySettingsEx(LPCTSTR, DEVMODE *, HWND, DWORD, LPVOID); +extern LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *, DWORD); +extern LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR, DEVMODEA *, HWND, DWORD, LPVOID); +extern LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *, DWORD); +extern LONG WINAPI extChangeDisplaySettingsExW(LPCTSTR, DEVMODEW *, HWND, DWORD, LPVOID); extern BOOL WINAPI extClientToScreen(HWND, LPPOINT); extern BOOL WINAPI extClipCursor(LPRECT); extern HWND WINAPI extCreateDialogIndirectParam(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); diff --git a/dll/user32.cpp b/dll/user32.cpp index 228ffb0..e3b1e52 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -15,8 +15,10 @@ static HookEntry_Type Hooks[]={ {"UpdateWindow", (FARPROC)NULL, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow}, //{"GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement}, //{"SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement}, - {"ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettings, (FARPROC)extChangeDisplaySettings}, - {"ChangeDisplaySettingsExA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsEx, (FARPROC)extChangeDisplaySettingsEx}, + {"ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsA, (FARPROC)extChangeDisplaySettingsA}, + {"ChangeDisplaySettingsExA", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsExA, (FARPROC)extChangeDisplaySettingsExA}, + {"ChangeDisplaySettingsW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsW, (FARPROC)extChangeDisplaySettingsW}, // ref. by Knights of Honor + {"ChangeDisplaySettingsExW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsExW, (FARPROC)extChangeDisplaySettingsExW}, {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint}, {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint}, {"ShowCursor", (FARPROC)ShowCursor, (FARPROC *)&pShowCursor, (FARPROC)extShowCursor}, @@ -199,7 +201,74 @@ extern HRESULT WINAPI sBlt(char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURF extern INT_PTR CALLBACK extDialogWindowProc(HWND, UINT, WPARAM, LPARAM); -LONG WINAPI MyChangeDisplaySettings(char *fname, DEVMODE *lpDevMode, DWORD dwflags) +LONG WINAPI MyChangeDisplaySettings(char *fname, BOOL WideChar, void *lpDevMode, DWORD dwflags) +{ + HRESULT res; + DWORD dmFields, dmBitsPerPel, dmPelsWidth, dmPelsHeight; + + // v2.02.32: reset the emulated DC used in EMULATEDC mode + dxw.ResetEmulatedDC(); + + if(lpDevMode){ + if(WideChar){ + dmFields=((DEVMODEW *)lpDevMode)->dmFields; + dmPelsWidth=((DEVMODEW *)lpDevMode)->dmPelsWidth; + dmPelsHeight=((DEVMODEW *)lpDevMode)->dmPelsHeight; + dmBitsPerPel=((DEVMODEW *)lpDevMode)->dmBitsPerPel; + } + else{ + dmFields=((DEVMODEA *)lpDevMode)->dmFields; + dmPelsWidth=((DEVMODEA *)lpDevMode)->dmPelsWidth; + dmPelsHeight=((DEVMODEA *)lpDevMode)->dmPelsHeight; + dmBitsPerPel=((DEVMODEA *)lpDevMode)->dmBitsPerPel; + } + } + + // save desired settings first v.2.1.89 + // v2.1.95 protect when lpDevMode is null (closing game... Jedi Outcast) + // v2.2.23 consider new width/height only when dmFields flags are set. + if(lpDevMode && (dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT))){ + RECT client; + dxw.SetScreenSize(dmPelsWidth, dmPelsHeight); + + // v2.02.31: when main win is bigger that expected resolution, you're in windowed fullscreen mode + //(*pGetClientRect)((dxw.dwFlags1 & FIXPARENTWIN) ? dxw.hParentWnd : dxw.GethWnd(), &client); + (*pGetClientRect)(dxw.GethWnd(), &client); + OutTraceDW("%s: current hWnd=%x size=(%d,%d)\n", fname, dxw.GethWnd(), client.right, client.bottom); + if((client.right>=(LONG)dmPelsWidth) && (client.bottom>=(LONG)dmPelsHeight)) { + OutTraceDW("%s: entering FULLSCREEN mode\n", fname); + dxw.SetFullScreen(TRUE); + } + } + + if ((dwflags==0 || dwflags==CDS_FULLSCREEN) && lpDevMode){ + if (dxw.dwFlags1 & EMULATESURFACE || !(dmFields & DM_BITSPERPEL)){ + OutTraceDW("%s: BYPASS res=DISP_CHANGE_SUCCESSFUL\n", fname); + return DISP_CHANGE_SUCCESSFUL; + } + else{ + DEVMODEA NewMode; + if(dwflags==CDS_FULLSCREEN) dwflags=0; // no FULLSCREEN + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &NewMode); + OutTraceDW("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> %d\n", + NewMode.dmPelsWidth, NewMode.dmPelsHeight, NewMode.dmBitsPerPel, dmBitsPerPel); + NewMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; + NewMode.dmBitsPerPel = dmBitsPerPel; + res=(*pChangeDisplaySettingsA)(&NewMode, 0); + if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); + return res; + } + } + else{ + if(WideChar) + return (*pChangeDisplaySettingsW)((LPDEVMODEW)lpDevMode, dwflags); + else + return (*pChangeDisplaySettingsA)((LPDEVMODEA)lpDevMode, dwflags); + } +} + +#if 0 +LONG WINAPI MyChangeDisplaySettingsA(char *fname, DEVMODEA *lpDevMode, DWORD dwflags) { HRESULT res; @@ -215,36 +284,83 @@ LONG WINAPI MyChangeDisplaySettings(char *fname, DEVMODE *lpDevMode, DWORD dwfla // v2.02.31: when main win is bigger that expected resolution, you're in windowed fullscreen mode //(*pGetClientRect)((dxw.dwFlags1 & FIXPARENTWIN) ? dxw.hParentWnd : dxw.GethWnd(), &client); (*pGetClientRect)(dxw.GethWnd(), &client); - OutTraceD("%s: current hWnd=%x size=(%d,%d)\n", fname, dxw.GethWnd(), client.right, client.bottom); + OutTraceDW("%s: current hWnd=%x size=(%d,%d)\n", fname, dxw.GethWnd(), client.right, client.bottom); if((client.right>=(LONG)lpDevMode->dmPelsWidth) && (client.bottom>=(LONG)lpDevMode->dmPelsHeight)) { - OutTraceD("%s: entering FULLSCREEN mode\n", fname); + OutTraceDW("%s: entering FULLSCREEN mode\n", fname); dxw.SetFullScreen(TRUE); } } if ((dwflags==0 || dwflags==CDS_FULLSCREEN) && lpDevMode){ if (dxw.dwFlags1 & EMULATESURFACE || !(lpDevMode->dmFields & DM_BITSPERPEL)){ - OutTraceD("%s: BYPASS res=DISP_CHANGE_SUCCESSFUL\n", fname); + OutTraceDW("%s: BYPASS res=DISP_CHANGE_SUCCESSFUL\n", fname); return DISP_CHANGE_SUCCESSFUL; } else{ - DEVMODE NewMode; + DEVMODEA NewMode; if(dwflags==CDS_FULLSCREEN) dwflags=0; // no FULLSCREEN EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &NewMode); - OutTraceD("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> %d\n", + OutTraceDW("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> %d\n", NewMode.dmPelsWidth, NewMode.dmPelsHeight, NewMode.dmBitsPerPel, lpDevMode->dmBitsPerPel); NewMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; NewMode.dmBitsPerPel = lpDevMode->dmBitsPerPel; - res=(*pChangeDisplaySettings)(&NewMode, 0); + res=(*pChangeDisplaySettingsA)(&NewMode, 0); if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); return res; } } else - return (*pChangeDisplaySettings)(lpDevMode, dwflags); + return (*pChangeDisplaySettingsA)(lpDevMode, dwflags); } +LONG WINAPI MyChangeDisplaySettingsW(char *fname, DEVMODEW *lpDevMode, DWORD dwflags) +{ + HRESULT res; + + // v2.02.32: reset the emulated DC used in EMULATEDC mode + dxw.ResetEmulatedDC(); + + // save desired settings first v.2.1.89 + // v2.1.95 protect when lpDevMode is null (closing game... Jedi Outcast) + // v2.2.23 consider new width/height only when dmFields flags are set. + if(lpDevMode && (lpDevMode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT))){ + RECT client; + dxw.SetScreenSize(lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight); + // v2.02.31: when main win is bigger that expected resolution, you're in windowed fullscreen mode + //(*pGetClientRect)((dxw.dwFlags1 & FIXPARENTWIN) ? dxw.hParentWnd : dxw.GethWnd(), &client); + (*pGetClientRect)(dxw.GethWnd(), &client); + OutTraceDW("%s: current hWnd=%x size=(%d,%d)\n", fname, dxw.GethWnd(), client.right, client.bottom); + if((client.right>=(LONG)lpDevMode->dmPelsWidth) && (client.bottom>=(LONG)lpDevMode->dmPelsHeight)) { + OutTraceDW("%s: entering FULLSCREEN mode\n", fname); + dxw.SetFullScreen(TRUE); + } + } + + if ((dwflags==0 || dwflags==CDS_FULLSCREEN) && lpDevMode){ + if (dxw.dwFlags1 & EMULATESURFACE || !(lpDevMode->dmFields & DM_BITSPERPEL)){ + OutTraceDW("%s: BYPASS res=DISP_CHANGE_SUCCESSFUL\n", fname); + return DISP_CHANGE_SUCCESSFUL; + } + else{ + DEVMODEA NewMode; + if(dwflags==CDS_FULLSCREEN) dwflags=0; // no FULLSCREEN + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &NewMode); + OutTraceDW("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> %d\n", + NewMode.dmPelsWidth, NewMode.dmPelsHeight, NewMode.dmBitsPerPel, + lpDevMode->dmBitsPerPel); + NewMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; + NewMode.dmBitsPerPel = lpDevMode->dmBitsPerPel; + res=(*pChangeDisplaySettingsA)(&NewMode, 0); + if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); + return res; + } + } + else + return (*pChangeDisplaySettingsW)(lpDevMode, dwflags); +} +#endif + void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) { LPWINDOWPOS wp; @@ -259,7 +375,7 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) static int BorderY=-1; int cx, cy; - OutTraceD("%s: GOT hwnd=%x pos=(%d,%d) dim=(%d,%d) Flags=%x(%s)\n", + OutTraceDW("%s: GOT hwnd=%x pos=(%d,%d) dim=(%d,%d) Flags=%x(%s)\n", ApiName, hwnd, wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags)); if (dxw.dwFlags1 & PREVENTMAXIMIZE){ @@ -268,7 +384,7 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) if(wp->cx>MaxX) { wp->cx=MaxX; UpdFlag=1; } if(wp->cy>MaxY) { wp->cy=MaxY; UpdFlag=1; } if (UpdFlag) - OutTraceD("%s: SET max dim=(%d,%d)\n", ApiName, wp->cx, wp->cy); + OutTraceDW("%s: SET max dim=(%d,%d)\n", ApiName, wp->cx, wp->cy); } if ((wp->flags & (SWP_NOMOVE|SWP_NOSIZE))==(SWP_NOMOVE|SWP_NOSIZE)) return; //v2.02.13 @@ -276,7 +392,7 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){ extern void CalculateWindowPos(HWND, DWORD, DWORD, LPWINDOWPOS); CalculateWindowPos(hwnd, MaxX, MaxY, wp); - OutTraceD("%s: LOCK pos=(%d,%d) dim=(%d,%d)\n", ApiName, wp->x, wp->y, wp->cx, wp->cy); + OutTraceDW("%s: LOCK pos=(%d,%d) dim=(%d,%d)\n", ApiName, wp->x, wp->y, wp->cx, wp->cy); } if ((dxw.dwFlags2 & KEEPASPECTRATIO) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){ @@ -290,7 +406,7 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) (*pGetWindowRect)(hwnd, &full); BorderX= full.right - full.left - client.right; BorderY= full.bottom - full.top - client.bottom; - OutTraceD("%s: KEEPASPECTRATIO window borders=(%d,%d)\n", ApiName, BorderX, BorderY); + OutTraceDW("%s: KEEPASPECTRATIO window borders=(%d,%d)\n", ApiName, BorderX, BorderY); } extern LRESULT LastCursorPos; switch (LastCursorPos){ @@ -302,7 +418,7 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) case HTTOPRIGHT: cx = BorderX + ((wp->cy - BorderY) * dxw.GetScreenWidth()) / dxw.GetScreenHeight(); if(cx!=wp->cx){ - OutTraceD("%s: KEEPASPECTRATIO adjusted cx=%d->%d\n", ApiName, wp->cx, cx); + OutTraceDW("%s: KEEPASPECTRATIO adjusted cx=%d->%d\n", ApiName, wp->cx, cx); wp->cx = cx; } break; @@ -310,7 +426,7 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) case HTRIGHT: cy = BorderY + ((wp->cx - BorderX) * dxw.GetScreenHeight()) / dxw.GetScreenWidth(); if(cy!=wp->cy){ - OutTraceD("%s: KEEPASPECTRATIO adjusted cy=%d->%d\n", ApiName, wp->cy, cy); + OutTraceDW("%s: KEEPASPECTRATIO adjusted cy=%d->%d\n", ApiName, wp->cy, cy); wp->cy = cy; } break; @@ -326,7 +442,7 @@ void dxwFixMinMaxInfo(char *ApiName, HWND hwnd, LPARAM lParam) if (dxw.dwFlags1 & PREVENTMAXIMIZE){ LPMINMAXINFO lpmmi; lpmmi=(LPMINMAXINFO)lParam; - OutTraceD("%s: GOT MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, + OutTraceDW("%s: GOT MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y); lpmmi->ptMaxPosition.x=0; lpmmi->ptMaxPosition.y=0; @@ -338,7 +454,7 @@ void dxwFixMinMaxInfo(char *ApiName, HWND hwnd, LPARAM lParam) lpmmi->ptMaxSize.x = dxw.GetScreenWidth(); lpmmi->ptMaxSize.y = dxw.GetScreenHeight(); } - OutTraceD("%s: SET PREVENTMAXIMIZE MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, + OutTraceDW("%s: SET PREVENTMAXIMIZE MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y); } // v2.1.75: added logic to fix win coordinates to selected ones. @@ -346,13 +462,13 @@ void dxwFixMinMaxInfo(char *ApiName, HWND hwnd, LPARAM lParam) if (dxw.dwFlags1 & LOCKWINPOS){ LPMINMAXINFO lpmmi; lpmmi=(LPMINMAXINFO)lParam; - OutTraceD("%s: GOT MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, + OutTraceDW("%s: GOT MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y); lpmmi->ptMaxPosition.x=dxw.iPosX; lpmmi->ptMaxPosition.y=dxw.iPosY; lpmmi->ptMaxSize.x = dxw.iSizX ? dxw.iSizX : dxw.GetScreenWidth(); lpmmi->ptMaxSize.y = dxw.iSizY ? dxw.iSizY : dxw.GetScreenHeight(); - OutTraceD("%s: SET LOCKWINPOS MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, + OutTraceDW("%s: SET LOCKWINPOS MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y); } } @@ -367,7 +483,7 @@ static LRESULT WINAPI FixWindowProc(char *ApiName, HWND hwnd, UINT Msg, WPARAM w switch(Msg){ case WM_ERASEBKGND: - OutTraceD("%s: prevent erase background\n", ApiName); + OutTraceDW("%s: prevent erase background\n", ApiName); return 1; // 1=erased break; // useless case WM_GETMINMAXINFO: @@ -385,11 +501,11 @@ static LRESULT WINAPI FixWindowProc(char *ApiName, HWND hwnd, UINT Msg, WPARAM w if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()) return 0; if (dxw.dwFlags1 & PREVENTMAXIMIZE){ if ((wParam == SIZE_MAXIMIZED)||(wParam == SIZE_MAXSHOW)){ - OutTraceD("%s: prevent screen SIZE to fullscreen wparam=%d(%s) size=(%d,%d)\n", ApiName, + OutTraceDW("%s: prevent screen SIZE to fullscreen wparam=%d(%s) size=(%d,%d)\n", ApiName, wParam, ExplainResizing(wParam), HIWORD(lParam), LOWORD(lParam)); return 0; // checked //lParam = MAKELPARAM(dxw.GetScreenWidth(), dxw.GetScreenHeight()); - //OutTraceD("%s: updated SIZE wparam=%d(%s) size=(%d,%d)\n", ApiName, + //OutTraceDW("%s: updated SIZE wparam=%d(%s) size=(%d,%d)\n", ApiName, // wParam, ExplainResizing(wParam), HIWORD(lParam), LOWORD(lParam)); } } @@ -442,10 +558,10 @@ static POINT FixMessagePt(HWND hwnd, POINT point) BOOL WINAPI extDDInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase) { if(lpRect) - OutTraceD("InvalidateRect: hwnd=%x rect=(%d,%d)-(%d,%d) erase=%x\n", + OutTraceDW("InvalidateRect: hwnd=%x rect=(%d,%d)-(%d,%d) erase=%x\n", hwnd, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, bErase); else - OutTraceD("InvalidateRect: hwnd=%x rect=NULL erase=%x\n", + OutTraceDW("InvalidateRect: hwnd=%x rect=NULL erase=%x\n", hwnd, bErase); return (*pInvalidateRect)(hwnd, NULL, bErase); @@ -454,10 +570,10 @@ BOOL WINAPI extDDInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase) BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase) { if(lpRect) - OutTraceD("InvalidateRect: hwnd=%x rect=(%d,%d)-(%d,%d) erase=%x\n", + OutTraceDW("InvalidateRect: hwnd=%x rect=(%d,%d)-(%d,%d) erase=%x\n", hwnd, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, bErase); else - OutTraceD("InvalidateRect: hwnd=%x rect=NULL erase=%x\n", + OutTraceDW("InvalidateRect: hwnd=%x rect=NULL erase=%x\n", hwnd, bErase); return (*pInvalidateRect)(hwnd, NULL, bErase); @@ -467,10 +583,10 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow) { BOOL res; - OutTraceD("ShowWindow: hwnd=%x, CmdShow=%x(%s)\n", hwnd, nCmdShow, ExplainShowCmd(nCmdShow)); + OutTraceDW("ShowWindow: hwnd=%x, CmdShow=%x(%s)\n", hwnd, nCmdShow, ExplainShowCmd(nCmdShow)); if (dxw.dwFlags1 & PREVENTMAXIMIZE){ if(nCmdShow==SW_MAXIMIZE){ - OutTraceD("ShowWindow: suppress maximize\n"); + OutTraceDW("ShowWindow: suppress maximize\n"); nCmdShow=SW_SHOWNORMAL; } } @@ -486,12 +602,12 @@ LONG WINAPI extGetWindowLong(HWND hwnd, int nIndex) res=(*pGetWindowLong)(hwnd, nIndex); - OutTraceD("GetWindowLong: hwnd=%x, Index=%x(%s) res=%x\n", hwnd, nIndex, ExplainSetWindowIndex(nIndex), res); + OutTraceDW("GetWindowLong: hwnd=%x, Index=%x(%s) res=%x\n", hwnd, nIndex, ExplainSetWindowIndex(nIndex), res); if(nIndex==GWL_WNDPROC){ WNDPROC wp; wp=WhndGetWindowProc(hwnd); - OutTraceD("GetWindowLong: remapping WindowProc res=%x -> %x\n", res, (LONG)wp); + OutTraceDW("GetWindowLong: remapping WindowProc res=%x -> %x\n", res, (LONG)wp); if(wp) res=(LONG)wp; // if not found, don't alter the value. } @@ -502,19 +618,19 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) { LONG res; - OutTraceD("SetWindowLong: hwnd=%x, Index=%x(%s) Val=%x\n", + OutTraceDW("SetWindowLong: hwnd=%x, Index=%x(%s) Val=%x\n", hwnd, nIndex, ExplainSetWindowIndex(nIndex), dwNewLong); //if(!hwnd) hwnd=dxw.GethWnd(); if (dxw.dwFlags1 & LOCKWINSTYLE){ if(nIndex==GWL_STYLE){ - OutTraceD("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong); + OutTraceDW("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong); //return 1; return (*pGetWindowLong)(hwnd, nIndex); } if(nIndex==GWL_EXSTYLE){ - OutTraceD("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong); + OutTraceDW("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong); //return 1; return (*pGetWindowLong)(hwnd, nIndex); } @@ -524,21 +640,21 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) if(nIndex==GWL_STYLE){ dwNewLong &= ~WS_MAXIMIZE; if(dxw.IsDesktop(hwnd)){ - OutTraceD("SetWindowLong: GWL_STYLE %x suppress MAXIMIZE\n", dwNewLong); + OutTraceDW("SetWindowLong: GWL_STYLE %x suppress MAXIMIZE\n", dwNewLong); dwNewLong |= WS_OVERLAPPEDWINDOW; dwNewLong &= ~(WS_DLGFRAME|WS_MAXIMIZE|WS_VSCROLL|WS_HSCROLL|WS_CLIPSIBLINGS); } } // v2.02.32: disable topmost for main window only if(dxw.IsDesktop(hwnd) && (nIndex==GWL_EXSTYLE)){ - OutTraceD("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong); + OutTraceDW("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong); dwNewLong = dwNewLong & ~(WS_EX_TOPMOST); } } if (dxw.dwFlags1 & FIXWINFRAME){ if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD)){ - OutTraceD("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong); + OutTraceDW("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong); dwNewLong |= WS_OVERLAPPEDWINDOW; dwNewLong &= ~WS_CLIPSIBLINGS; } @@ -550,7 +666,7 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) // GPL fix if(dxw.IsRealDesktop(hwnd)) { hwnd=dxw.GethWnd(); - OutTraceD("SetWindowLong: DESKTOP hwnd, FIXING hwnd=%x\n",hwnd); + OutTraceDW("SetWindowLong: DESKTOP hwnd, FIXING hwnd=%x\n",hwnd); } // end of GPL fix @@ -566,7 +682,7 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) res=(*pSetWindowLong)(hwnd, nIndex, dwNewLong); } - OutTraceD("SetWindowLong: hwnd=%x, nIndex=%x, Val=%x, res=%x\n", hwnd, nIndex, dwNewLong, res); + OutTraceDW("SetWindowLong: hwnd=%x, nIndex=%x, Val=%x, res=%x\n", hwnd, nIndex, dwNewLong, res); return res; } @@ -574,7 +690,7 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c { BOOL res; - OutTraceD("SetWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n", + OutTraceDW("SetWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n", hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags); //if ((hwnd != dxw.GethWnd()) || !dxw.IsFullScreen()){ @@ -589,7 +705,7 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c // Note: any attempt to change the window position, no matter where and how, through the // SetWindowPos API is causing resizing to the default 1:1 pixed size in Commandos. // in such cases, there is incompatibility between LOCKWINPOS and LOCKWINSTYLE. - OutTraceD("SetWindowPos: locked position\n"); + OutTraceDW("SetWindowPos: locked position\n"); return 1; } @@ -603,7 +719,7 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c if(cx>MaxX) { cx=MaxX; UpdFlag=1; } if(cy>MaxY) { cy=MaxY; UpdFlag=1; } if (UpdFlag) - OutTraceD("SetWindowPos: using max dim=(%d,%d)\n", cx, cy); + OutTraceDW("SetWindowPos: using max dim=(%d,%d)\n", cx, cy); } // useful??? to be demonstrated.... @@ -615,7 +731,7 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c dwCurStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); AdjustWindowRect(&rect, dwCurStyle, FALSE); cx=rect.right; cy=rect.bottom; - OutTraceD("SetWindowPos: main form hwnd=%x fixed size=(%d,%d)\n", hwnd, cx, cy); + OutTraceDW("SetWindowPos: main form hwnd=%x fixed size=(%d,%d)\n", hwnd, cx, cy); res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); @@ -627,12 +743,12 @@ HDWP WINAPI extDeferWindowPos(HDWP hWinPosInfo, HWND hwnd, HWND hWndInsertAfter, // v2.02.31: heavily used by "Imperialism II" !!! HDWP res; - OutTraceD("DeferWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n", + OutTraceDW("DeferWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n", hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags); if(dxw.IsFullScreen()){ dxw.MapClient(&X, &Y, &cx, &cy); - OutTraceD("DeferWindowPos: remapped pos=(%d,%d) dim=(%d,%d)\n", X, Y, cx, cy); + OutTraceDW("DeferWindowPos: remapped pos=(%d,%d) dim=(%d,%d)\n", X, Y, cx, cy); } res=(*pGDIDeferWindowPos)(hWinPosInfo, hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); @@ -691,7 +807,7 @@ HCURSOR WINAPI extSetCursor(HCURSOR hCursor) HCURSOR ret; ret=(*pSetCursor)(hCursor); - OutTraceD("GDI.SetCursor: Cursor=%x, ret=%x\n", hCursor, ret); + OutTraceDW("GDI.SetCursor: Cursor=%x, ret=%x\n", hCursor, ret); //MessageBox(0, "SelectPalette", "GDI32.dll", MB_OK | MB_ICONEXCLAMATION); return ret; } @@ -902,7 +1018,7 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT int ret; // a rarely used API, but responsible for a painful headache: needs hooking for "Commandos 2", "Alien Nations". - OutTraceD("MapWindowPoints: hWndFrom=%x%s hWndTo=%x%s cPoints=%d FullScreen=%x\n", + OutTraceDW("MapWindowPoints: hWndFrom=%x%s hWndTo=%x%s cPoints=%d FullScreen=%x\n", hWndFrom, dxw.IsDesktop(hWndFrom)?"(DESKTOP)":"", hWndTo, dxw.IsDesktop(hWndTo)?"(DESKTOP)":"", cPoints, dxw.IsFullScreen()); @@ -920,7 +1036,7 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT // should scale the retcode ??? ret=(*pMapWindowPoints)(hWndFrom, hWndTo, lpPoints, cPoints); - OutTraceD("MapWindowPoints: ret=%x (%d,%d)\n", ret, (ret&0xFFFF0000)>>16, ret&0x0000FFFF); + OutTraceDW("MapWindowPoints: ret=%x (%d,%d)\n", ret, (ret&0xFFFF0000)>>16, ret&0x0000FFFF); return ret; } @@ -929,14 +1045,14 @@ HWND WINAPI extGetDesktopWindow(void) // V2.1.73: correct ??? HWND res; - OutTraceD("GetDesktopWindow: FullScreen=%x\n", dxw.IsFullScreen()); + OutTraceDW("GetDesktopWindow: FullScreen=%x\n", dxw.IsFullScreen()); if (dxw.IsFullScreen()){ - OutTraceD("GetDesktopWindow: returning main window hwnd=%x\n", dxw.GethWnd()); + OutTraceDW("GetDesktopWindow: returning main window hwnd=%x\n", dxw.GethWnd()); return dxw.GethWnd(); } else{ res=(*pGetDesktopWindow)(); - OutTraceD("GetDesktopWindow: returning desktop window hwnd=%x\n", res); + OutTraceDW("GetDesktopWindow: returning desktop window hwnd=%x\n", res); return res; } } @@ -946,7 +1062,7 @@ int WINAPI extGetSystemMetrics(int nindex) HRESULT res; res=(*pGetSystemMetrics)(nindex); - OutTraceD("GetSystemMetrics: index=%x(%s), res=%d\n", nindex, ExplainsSystemMetrics(nindex), res); + OutTraceDW("GetSystemMetrics: index=%x(%s), res=%d\n", nindex, ExplainsSystemMetrics(nindex), res); // if you have a bypassed setting, use it first! if(pSetDevMode){ @@ -955,13 +1071,13 @@ int WINAPI extGetSystemMetrics(int nindex) case SM_CXSCREEN: case SM_CXVIRTUALSCREEN: // v2.02.31 res = pSetDevMode->dmPelsWidth; - OutTraceD("GetDeviceCaps: fix HORZRES cap=%d\n", res); + OutTraceDW("GetDeviceCaps: fix HORZRES cap=%d\n", res); return res; case SM_CYFULLSCREEN: case SM_CYSCREEN: case SM_CYVIRTUALSCREEN: // v2.02.31 res = pSetDevMode->dmPelsHeight; - OutTraceD("GetDeviceCaps: fix VERTRES cap=%d\n", res); + OutTraceDW("GetDeviceCaps: fix VERTRES cap=%d\n", res); return res; } } @@ -971,18 +1087,18 @@ int WINAPI extGetSystemMetrics(int nindex) case SM_CXSCREEN: case SM_CXVIRTUALSCREEN: // v2.02.31 res= dxw.GetScreenWidth(); - OutTraceD("GetSystemMetrics: fix SM_CXSCREEN=%d\n", res); + OutTraceDW("GetSystemMetrics: fix SM_CXSCREEN=%d\n", res); break; case SM_CYFULLSCREEN: case SM_CYSCREEN: case SM_CYVIRTUALSCREEN: // v2.02.31 res= dxw.GetScreenHeight(); - OutTraceD("GetSystemMetrics: fix SM_CYSCREEN=%d\n", res); + OutTraceDW("GetSystemMetrics: fix SM_CYSCREEN=%d\n", res); break; case SM_CMONITORS: if((dxw.dwFlags2 & HIDEMULTIMONITOR) && res>1) { res=1; - OutTraceD("GetSystemMetrics: fix SM_CMONITORS=%d\n", res); + OutTraceDW("GetSystemMetrics: fix SM_CMONITORS=%d\n", res); } break; } @@ -992,7 +1108,7 @@ int WINAPI extGetSystemMetrics(int nindex) ATOM WINAPI extRegisterClassExA(WNDCLASSEX *lpwcx) { - OutTraceD("RegisterClassEx: PROXED ClassName=%s style=%x(%s)\n", + OutTraceDW("RegisterClassEx: PROXED ClassName=%s style=%x(%s)\n", lpwcx->lpszClassName, lpwcx->style, ExplainStyle(lpwcx->style)); return (*pRegisterClassExA)(lpwcx); } @@ -1019,7 +1135,7 @@ static HWND WINAPI extCreateWindowCommon( // no maximized windows in any case if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - OutTraceD("%s: handling PREVENTMAXIMIZE mode\n", ApiName); + OutTraceDW("%s: handling PREVENTMAXIMIZE mode\n", ApiName); dwStyle &= ~WS_MAXIMIZE; //dwStyle &= ~(WS_MAXIMIZE | WS_POPUP); //dwExStyle &= ~WS_EX_TOPMOST; @@ -1071,7 +1187,7 @@ static HWND WINAPI extCreateWindowCommon( } nWidth=screen.right; nHeight=screen.bottom; - OutTraceD("%s: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); + OutTraceDW("%s: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } else { // invalid parent coordinates: use initial placement, but leave the size. @@ -1082,7 +1198,7 @@ static HWND WINAPI extCreateWindowCommon( //} nWidth=dxw.iSizX; nHeight=dxw.iSizY; - OutTraceD("%s: renewed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); + OutTraceDW("%s: renewed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } dxw.SetFullScreen(TRUE); if(dxw.Coordinates==DXW_DESKTOP_WORKAREA){ @@ -1093,7 +1209,7 @@ static HWND WINAPI extCreateWindowCommon( nWidth=workarea.right; nHeight=workarea.bottom; dwStyle=0; - OutTraceD("%s: WORKAREA win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); + OutTraceDW("%s: WORKAREA win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } else if(dxw.Coordinates==DXW_DESKTOP_FULL){ RECT workarea; @@ -1103,7 +1219,7 @@ static HWND WINAPI extCreateWindowCommon( nWidth=workarea.right; nHeight=workarea.bottom; dwStyle=0; - OutTraceD("%s: FULLDESKTOP win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); + OutTraceDW("%s: FULLDESKTOP win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } } @@ -1112,7 +1228,7 @@ static HWND WINAPI extCreateWindowCommon( wndh= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); else wndh= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - OutTraceD("%s: windowed mode ret=%x\n", ApiName, wndh); + OutTraceDW("%s: windowed mode ret=%x\n", ApiName, wndh); return wndh; } @@ -1120,14 +1236,14 @@ static HWND WINAPI extCreateWindowCommon( // Age of Empires.... if (dwStyle & WS_CHILD){ dxw.MapClient(&x, &y, &nWidth, &nHeight); - OutTraceD("%s: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n", + OutTraceDW("%s: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } // needed for Diablo, that creates a new control parent window that must be // overlapped to the directdraw surface. else if (dwExStyle & WS_EX_CONTROLPARENT){ dxw.MapWindow(&x, &y, &nWidth, &nHeight); - OutTraceD("%s: fixed WS_EX_CONTROLPARENT pos=(%d,%d) size=(%d,%d)\n", + OutTraceDW("%s: fixed WS_EX_CONTROLPARENT pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } @@ -1149,7 +1265,7 @@ static HWND WINAPI extCreateWindowCommon( extern void AdjustWindowPos(HWND, DWORD, DWORD); (*pSetWindowLong)(wndh, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW); (*pSetWindowLong)(wndh, GWL_EXSTYLE, 0); - OutTraceD("%s: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", ApiName, wndh); + OutTraceDW("%s: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", ApiName, wndh); AdjustWindowPos(wndh, nWidth, nHeight); (*pShowWindow)(wndh, SW_SHOWNORMAL); } @@ -1161,13 +1277,13 @@ static HWND WINAPI extCreateWindowCommon( if ((dwStyle & WS_CHILD) && (dxw.dwFlags1 & HOOKCHILDWIN)){ long res; pWindowProc = (WNDPROC)(*pGetWindowLong)(wndh, GWL_WNDPROC); - OutTraceD("Hooking CHILD wndh=%x WindowProc %x->%x\n", wndh, pWindowProc, extChildWindowProc); + OutTraceDW("Hooking CHILD wndh=%x WindowProc %x->%x\n", wndh, pWindowProc, extChildWindowProc); res=(*pSetWindowLong)(wndh, GWL_WNDPROC, (LONG)extChildWindowProc); WhndStackPush(wndh, pWindowProc); if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError()); } - OutTraceD("%s: ret=%x\n", ApiName, wndh); + OutTraceDW("%s: ret=%x\n", ApiName, wndh); return wndh; } @@ -1197,13 +1313,13 @@ HWND WINAPI extCreateWindowExW( HINSTANCE hInstance, LPVOID lpParam) { - if(IsTraceD){ + if(IsTraceDDRAW){ char xString[20], yString[20]; if (x==CW_USEDEFAULT) strcpy(xString,"CW_USEDEFAULT"); else sprintf(xString,"%d", x); if (y==CW_USEDEFAULT) strcpy(yString,"CW_USEDEFAULT"); else sprintf(yString,"%d", y); - OutTraceD("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", + OutTraceDW("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", lpClassName, lpWindowName, xString, yString, nWidth, nHeight, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); } @@ -1227,13 +1343,13 @@ HWND WINAPI extCreateWindowExA( HINSTANCE hInstance, LPVOID lpParam) { - if(IsTraceD){ + if(IsTraceDDRAW){ char xString[20], yString[20]; if (x==CW_USEDEFAULT) strcpy(xString,"CW_USEDEFAULT"); else sprintf(xString,"%d", x); if (y==CW_USEDEFAULT) strcpy(yString,"CW_USEDEFAULT"); else sprintf(yString,"%d", y); - OutTraceD("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", + OutTraceDW("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", ClassToStr(lpClassName), lpWindowName, xString, yString, nWidth, nHeight, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); } @@ -1274,7 +1390,7 @@ int WINAPI extFillRect(HDC hdc, const RECT *lprc, HBRUSH hbr) { int res; RECT rc; - OutTraceD("FillRect: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom); + OutTraceDW("FillRect: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom); // when not in fullscreen mode, just proxy the call // better not: some games may use excessive coordinates: see "Premier Manager 98" @@ -1285,9 +1401,11 @@ int WINAPI extFillRect(HDC hdc, const RECT *lprc, HBRUSH hbr) if(rc.top < 0) rc.top = 0; if((DWORD)rc.right > dxw.GetScreenWidth()) rc.right = dxw.GetScreenWidth(); if((DWORD)rc.bottom > dxw.GetScreenHeight()) rc.bottom = dxw.GetScreenHeight(); - if(OBJ_DC == GetObjectType(hdc)) dxw.MapWindow(&rc); - //else dxw.MapClient(&rc); - OutTraceD("FillRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); + if(dxw.IsFullScreen()){ + if(OBJ_DC == GetObjectType(hdc)) dxw.MapWindow(&rc); + //else dxw.MapClient(&rc); + OutTraceDW("FillRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); + } res=(*pFillRect)(hdc, &rc, hbr); return res; @@ -1297,7 +1415,7 @@ int WINAPI extFrameRect(HDC hdc, const RECT *lprc, HBRUSH hbr) { int res; RECT rc; - OutTraceD("FrameRect: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom); + OutTraceDW("FrameRect: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom); // when not in fullscreen mode, just proxy the call if(!dxw.IsFullScreen()) return (*pFrameRect)(hdc, lprc, hbr); @@ -1309,7 +1427,7 @@ int WINAPI extFrameRect(HDC hdc, const RECT *lprc, HBRUSH hbr) if((DWORD)rc.right > dxw.GetScreenWidth()) rc.right = dxw.GetScreenWidth(); if((DWORD)rc.bottom > dxw.GetScreenHeight()) rc.bottom = dxw.GetScreenHeight(); dxw.MapClient(&rc); - OutTraceD("FrameRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); + OutTraceDW("FrameRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); } res=(*pFrameRect)(hdc, &rc, hbr); @@ -1356,7 +1474,7 @@ BOOL WINAPI extClipCursor(RECT *lpRectArg) } if (pClipCursor) res=(*pClipCursor)(lpRect); - if (lpRect) OutTraceD("ClipCursor: REMAPPED rect=(%d,%d)-(%d,%d) res=%x\n", lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, res); + if (lpRect) OutTraceDW("ClipCursor: REMAPPED rect=(%d,%d)-(%d,%d) res=%x\n", lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, res); return TRUE; } @@ -1370,7 +1488,7 @@ BOOL WINAPI extGetClipCursor(LPRECT lpRect) // proxy.... if (!(dxw.dwFlags1 & ENABLECLIPPING)) { ret=(*pGetClipCursor)(lpRect); - if(IsTraceD){ + if(IsTraceDDRAW){ if (lpRect) OutTrace("GetClipCursor: PROXED rect=(%d,%d)-(%d,%d) ret=%d\n", lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, ret); @@ -1388,7 +1506,7 @@ BOOL WINAPI extGetClipCursor(LPRECT lpRect) lpRect->right = dxw.GetScreenWidth(); lpRect->bottom = dxw.GetScreenHeight(); } - OutTraceD("GetClipCursor: rect=(%d,%d)-(%d,%d) ret=%d\n", + OutTraceDW("GetClipCursor: rect=(%d,%d)-(%d,%d) ret=%d\n", lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, TRUE); } @@ -1397,7 +1515,7 @@ BOOL WINAPI extGetClipCursor(LPRECT lpRect) LONG WINAPI extEnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, DEVMODE *lpDevMode) { - OutTraceD("EnumDisplaySettings: Devicename=%s ModeNum=%x\n", lpszDeviceName, iModeNum); + OutTraceDW("EnumDisplaySettings: Devicename=%s ModeNum=%x\n", lpszDeviceName, iModeNum); if(pSetDevMode && iModeNum==ENUM_CURRENT_SETTINGS){ lpDevMode=pSetDevMode; return 1; @@ -1406,29 +1524,56 @@ LONG WINAPI extEnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, DEVMO return (*pEnumDisplaySettings)(lpszDeviceName, iModeNum, lpDevMode); } -LONG WINAPI extChangeDisplaySettings(DEVMODE *lpDevMode, DWORD dwflags) +LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *lpDevMode, DWORD dwflags) { - if(IsTraceD){ - OutTrace("ChangeDisplaySettings: lpDevMode=%x flags=%x", lpDevMode, dwflags); - if (lpDevMode) OutTrace(" fields=%x(%s) size=(%d x %d) bpp=%d", - lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), + if(IsTraceDDRAW){ + OutTrace("ChangeDisplaySettingsA: lpDevMode=%x flags=%x", lpDevMode, dwflags); + if (lpDevMode) OutTrace(" DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d", + lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); OutTrace("\n"); } - return MyChangeDisplaySettings("ChangeDisplaySettings", lpDevMode, dwflags); + return MyChangeDisplaySettings("ChangeDisplaySettingsA", FALSE, lpDevMode, dwflags); } -LONG WINAPI extChangeDisplaySettingsEx(LPCTSTR lpszDeviceName, DEVMODE *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) +LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags) { - if(IsTraceD){ - OutTrace("ChangeDisplaySettingsEx: DeviceName=%s lpDevMode=%x flags=%x", lpszDeviceName, lpDevMode, dwflags); - if (lpDevMode) OutTrace(" size=(%d x %d) bpp=%d", + if(IsTraceDDRAW){ + OutTrace("ChangeDisplaySettingsW: lpDevMode=%x flags=%x", lpDevMode, dwflags); + if (lpDevMode) OutTrace(" DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d", + lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); OutTrace("\n"); } - return MyChangeDisplaySettings("ChangeDisplaySettingsEx", lpDevMode, dwflags); + return MyChangeDisplaySettings("ChangeDisplaySettingsW", TRUE, lpDevMode, dwflags); +} + +LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR lpszDeviceName, DEVMODEA *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) +{ + if(IsTraceDDRAW){ + OutTrace("ChangeDisplaySettingsEx: DeviceName=%s lpDevMode=%x flags=%x", lpszDeviceName, lpDevMode, dwflags); + if (lpDevMode) OutTrace(" DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d", + lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), + lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); + OutTrace("\n"); + } + + return MyChangeDisplaySettings("ChangeDisplaySettingsExA", FALSE, lpDevMode, dwflags); +} + +LONG WINAPI extChangeDisplaySettingsExW(LPCTSTR lpszDeviceName, DEVMODEW *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) +{ + if(IsTraceDDRAW){ + OutTrace("ChangeDisplaySettingsEx: DeviceName=%ls lpDevMode=%x flags=%x", lpszDeviceName, lpDevMode, dwflags); + if (lpDevMode) OutTrace(" DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d", + lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), + lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); + OutTrace("\n"); + } + + return MyChangeDisplaySettings("ChangeDisplaySettingsExW", TRUE, lpDevMode, dwflags); } HDC WINAPI extGDIGetDC(HWND hwnd) @@ -1436,10 +1581,10 @@ HDC WINAPI extGDIGetDC(HWND hwnd) HDC ret; HWND lochwnd; - OutTraceD("GDI.GetDC: hwnd=%x\n", hwnd); + OutTraceDW("GDI.GetDC: hwnd=%x\n", hwnd); lochwnd=hwnd; if (dxw.IsRealDesktop(hwnd)) { - OutTraceD("GDI.GetDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + OutTraceDW("GDI.GetDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); lochwnd=dxw.GethWnd(); } @@ -1449,7 +1594,7 @@ HDC WINAPI extGDIGetDC(HWND hwnd) ret=(*pGDIGetDC)(lochwnd); if(ret){ - OutTraceD("GDI.GetDC: hwnd=%x ret=%x\n", lochwnd, ret); + OutTraceDW("GDI.GetDC: hwnd=%x ret=%x\n", lochwnd, ret); } else{ int err; @@ -1458,7 +1603,7 @@ HDC WINAPI extGDIGetDC(HWND hwnd) if((err==ERROR_INVALID_WINDOW_HANDLE) && (lochwnd!=hwnd)){ ret=(*pGDIGetDC)(hwnd); if(ret) - OutTraceD("GDI.GetDC: hwnd=%x ret=%x\n", hwnd, ret); + OutTraceDW("GDI.GetDC: hwnd=%x ret=%x\n", hwnd, ret); else OutTraceE("GDI.GetDC ERROR: hwnd=%x err=%d at %d\n", hwnd, GetLastError(), __LINE__); } @@ -1473,10 +1618,10 @@ HDC WINAPI extGDIGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) HDC ret; HWND lochwnd; - OutTraceD("GDI.GetDCEx: hwnd=%x hrgnClip=%x flags=%x(%s)\n", hwnd, hrgnClip, flags, ExplainGetDCExFlags(flags)); + OutTraceDW("GDI.GetDCEx: hwnd=%x hrgnClip=%x flags=%x(%s)\n", hwnd, hrgnClip, flags, ExplainGetDCExFlags(flags)); lochwnd=hwnd; if (dxw.IsRealDesktop(hwnd)) { - OutTraceD("GDI.GetDCEx: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + OutTraceDW("GDI.GetDCEx: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); lochwnd=dxw.GethWnd(); } @@ -1486,7 +1631,7 @@ HDC WINAPI extGDIGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) ret=(*pGDIGetDC)(lochwnd); if(ret){ - OutTraceD("GDI.GetDCEx: hwnd=%x ret=%x\n", lochwnd, ret); + OutTraceDW("GDI.GetDCEx: hwnd=%x ret=%x\n", lochwnd, ret); } else{ int err; @@ -1495,7 +1640,7 @@ HDC WINAPI extGDIGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) if((err==ERROR_INVALID_WINDOW_HANDLE) && (lochwnd!=hwnd)){ ret=(*pGDIGetDCEx)(hwnd, hrgnClip, flags); if(ret) - OutTraceD("GDI.GetDCEx: hwnd=%x ret=%x\n", hwnd, ret); + OutTraceDW("GDI.GetDCEx: hwnd=%x ret=%x\n", hwnd, ret); else OutTraceE("GDI.GetDCEx ERROR: hwnd=%x err=%d at %d\n", hwnd, GetLastError(), __LINE__); } @@ -1508,17 +1653,17 @@ HDC WINAPI extGDIGetWindowDC(HWND hwnd) { HDC ret; HWND lochwnd; - OutTraceD("GDI.GetWindowDC: hwnd=%x\n", hwnd); + OutTraceDW("GDI.GetWindowDC: hwnd=%x\n", hwnd); lochwnd=hwnd; if (dxw.IsRealDesktop(hwnd)) { - OutTraceD("GDI.GetWindowDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + OutTraceDW("GDI.GetWindowDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); lochwnd=dxw.GethWnd(); } ret=(*pGDIGetWindowDC)(lochwnd); if(ret){ - OutTraceD("GDI.GetWindowDC: hwnd=%x ret=%x\n", lochwnd, ret); + OutTraceDW("GDI.GetWindowDC: hwnd=%x ret=%x\n", lochwnd, ret); } else{ int err; @@ -1527,7 +1672,7 @@ HDC WINAPI extGDIGetWindowDC(HWND hwnd) if((err==ERROR_INVALID_WINDOW_HANDLE) && (lochwnd!=hwnd)){ ret=(*pGDIGetWindowDC)(hwnd); if(ret) - OutTraceD("GDI.GetWindowDC: hwnd=%x ret=%x\n", hwnd, ret); + OutTraceDW("GDI.GetWindowDC: hwnd=%x ret=%x\n", hwnd, ret); else OutTraceE("GDI.GetWindowDC ERROR: hwnd=%x err=%d at %d\n", hwnd, GetLastError(), __LINE__); } @@ -1539,7 +1684,7 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) { int res; - OutTraceD("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC); + OutTraceDW("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC); if (dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); if(dxw.dwFlags3 & EMULATEDC) @@ -1557,7 +1702,7 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); // proxy part ... - OutTraceD("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen()); + OutTraceDW("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen()); hdc=(*pBeginPaint)(hwnd, lpPaint); // if not in fullscreen mode, that's all! @@ -1569,11 +1714,11 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) if(dxw.dwFlags1 & MAPGDITOPRIMARY) { if(pGetDC && dxw.lpDDSPrimHDC){ extGetDC(dxw.lpDDSPrimHDC,&PrimHDC); - OutTraceD("GDI.BeginPaint: redirect hdc=%x -> PrimHDC=%x\n", hdc, PrimHDC); + OutTraceDW("GDI.BeginPaint: redirect hdc=%x -> PrimHDC=%x\n", hdc, PrimHDC); hdc=PrimHDC; } else { - OutTraceD("GDI.BeginPaint: hdc=%x\n", hdc); + OutTraceDW("GDI.BeginPaint: hdc=%x\n", hdc); } } @@ -1593,19 +1738,19 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) BOOL ret; HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc); - OutTraceD("GDI.EndPaint: hwnd=%x lpPaint=%x\n", hwnd, lpPaint); + OutTraceDW("GDI.EndPaint: hwnd=%x lpPaint=%x\n", hwnd, lpPaint); if((dxw.dwFlags3 & EMULATEDC) && dxw.IsFullScreen()){ ret=dxw.ReleaseEmulatedDC(hwnd); ret=(*pEndPaint)(hwnd, lpPaint); - OutTraceD("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); + OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); return ret; } // proxy part ... ret=(*pEndPaint)(hwnd, lpPaint); - OutTraceD("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); + OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); //return ret; @@ -1617,7 +1762,7 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) if(dxw.dwFlags1 & MAPGDITOPRIMARY) { if(pReleaseDC && dxw.lpDDSPrimHDC){ extReleaseDC(dxw.lpDDSPrimHDC, PrimHDC); - OutTraceD("GDI.EndPaint: released hdc=%x\n", PrimHDC); + OutTraceDW("GDI.EndPaint: released hdc=%x\n", PrimHDC); } } @@ -1628,7 +1773,7 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT { HWND RetHWND; isWithinDialog=TRUE; - OutTraceD("CreateDialogIndirectParam: hInstance=%x lpTemplate=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", + OutTraceDW("CreateDialogIndirectParam: hInstance=%x lpTemplate=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", hInstance, "tbd", hWndParent, lpDialogFunc, lParamInit); if(dxw.IsFullScreen() && hWndParent==NULL) hWndParent=dxw.GethWnd(); RetHWND=(*pCreateDialogIndirectParam)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); @@ -1637,7 +1782,7 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT if(!(*pSetWindowLong)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); - OutTraceD("CreateDialogIndirectParam: hwnd=%x\n", RetHWND); + OutTraceDW("CreateDialogIndirectParam: hwnd=%x\n", RetHWND); isWithinDialog=FALSE; //if (IsDebug) EnumChildWindows(RetHWND, (WNDENUMPROC)TraceChildWin, (LPARAM)RetHWND); return RetHWND; @@ -1647,7 +1792,7 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW { HWND RetHWND; isWithinDialog=TRUE; - OutTraceD("CreateDialogParam: hInstance=%x lpTemplateName=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", + OutTraceDW("CreateDialogParam: hInstance=%x lpTemplateName=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", hInstance, "tbd", hWndParent, lpDialogFunc, lParamInit); if(hWndParent==NULL) hWndParent=dxw.GethWnd(); RetHWND=(*pCreateDialogParam)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, lParamInit); @@ -1656,7 +1801,7 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW if(!(*pSetWindowLong)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); - OutTraceD("CreateDialogParam: hwnd=%x\n", RetHWND); + OutTraceDW("CreateDialogParam: hwnd=%x\n", RetHWND); isWithinDialog=FALSE; //if (IsDebug) EnumChildWindows(RetHWND, (WNDENUMPROC)TraceChildWin, (LPARAM)RetHWND); return RetHWND; @@ -1665,18 +1810,18 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint) { BOOL ret; - OutTraceD("MoveWindow: hwnd=%x xy=(%d,%d) size=(%d,%d) repaint=%x indialog=%x fullscreen=%x\n", + OutTraceDW("MoveWindow: hwnd=%x xy=(%d,%d) size=(%d,%d) repaint=%x indialog=%x fullscreen=%x\n", hwnd, X, Y, nWidth, nHeight, bRepaint, isWithinDialog, dxw.IsFullScreen()); if(dxw.IsDesktop(hwnd)){ // v2.1.93: happens in "Emergency Fighters for Life" ... // what is the meaning of this? is it related to video stretching? - OutTraceD("MoveWindow: prevent moving desktop win\n"); + OutTraceDW("MoveWindow: prevent moving desktop win\n"); return TRUE; } if((hwnd==dxw.GethWnd()) || (hwnd==dxw.hParentWnd)){ - OutTraceD("MoveWindow: prevent moving main win\n"); + OutTraceDW("MoveWindow: prevent moving main win\n"); return TRUE; } @@ -1702,9 +1847,9 @@ BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL nWidth = (nWidth * client.right) / dxw.GetScreenWidth(); nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight(); } - OutTraceD("MoveWindow: DEBUG client=(%d,%d) screen=(%d,%d)\n", + OutTraceDW("MoveWindow: DEBUG client=(%d,%d) screen=(%d,%d)\n", client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - OutTraceD("MoveWindow: hwnd=%x child=%x relocated to xy=(%d,%d) size=(%d,%d)\n", + OutTraceDW("MoveWindow: hwnd=%x child=%x relocated to xy=(%d,%d) size=(%d,%d)\n", hwnd, isChild, X, Y, nWidth, nHeight); } else{ @@ -1718,7 +1863,7 @@ BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL Y=upleft.y; nWidth=screen.right; nHeight=screen.bottom; - OutTraceD("MoveWindow: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", X, Y, nWidth, nHeight); + OutTraceDW("MoveWindow: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", X, Y, nWidth, nHeight); } } @@ -1775,22 +1920,22 @@ BOOL WINAPI extScrollDC(HDC hDC, int dx, int dy, const RECT *lprcScroll, const R HWND WINAPI extGetTopWindow(HWND hwnd) { HWND ret; - OutTraceD("GetTopWindow: hwnd=%x fullscreen=%x\n", hwnd, dxw.IsFullScreen()); + OutTraceDW("GetTopWindow: hwnd=%x fullscreen=%x\n", hwnd, dxw.IsFullScreen()); // a fullscreen program is supposed to be always top Z-order on the desktop! ret = (dxw.IsFullScreen() && dxw.IsDesktop(hwnd)) ? dxw.GethWnd() : (*pGetTopWindow)(hwnd); - OutTraceD("GetTopWindow: ret=%x\n", ret); + OutTraceDW("GetTopWindow: ret=%x\n", ret); return ret; } LONG WINAPI extTabbedTextOutA(HDC hdc, int X, int Y, LPCTSTR lpString, int nCount, int nTabPositions, const LPINT lpnTabStopPositions, int nTabOrigin) { BOOL res; - OutTraceD("TabbedTextOut: hdc=%x xy=(%d,%d) nCount=%d nTP=%d nTOS=%d str=(%d)\"%s\"\n", + OutTraceDW("TabbedTextOut: hdc=%x xy=(%d,%d) nCount=%d nTP=%d nTOS=%d str=(%d)\"%s\"\n", hdc, X, Y, nCount, nTabPositions, nTabOrigin, lpString); if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&X, &Y); - OutTraceD("TextOut: fixed dest=(%d,%d)\n", X, Y); + OutTraceDW("TextOut: fixed dest=(%d,%d)\n", X, Y); } res=(*pTabbedTextOutA)(hdc, X, Y, lpString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin); @@ -1803,7 +1948,7 @@ BOOL WINAPI extDestroyWindow(HWND hWnd) BOOL res; OutTraceB("DestroyWindow: hwnd=%x\n", hWnd); if (hWnd == dxw.GethWnd()) { - OutTraceD("DestroyWindow: destroy main hwnd=%x\n", hWnd); + OutTraceDW("DestroyWindow: destroy main hwnd=%x\n", hWnd); dxw.SethWnd(NULL); } res=(*pDestroyWindow)(hWnd); @@ -1816,7 +1961,7 @@ BOOL WINAPI extCloseWindow(HWND hWnd) BOOL res; OutTraceB("CloseWindow: hwnd=%x\n", hWnd); if (hWnd == dxw.GethWnd()) { - OutTraceD("CloseWindow: close main hwnd=%x\n", hWnd); + OutTraceDW("CloseWindow: close main hwnd=%x\n", hWnd); dxw.SethWnd(NULL); } res=(*pCloseWindow)(hWnd); @@ -1828,7 +1973,7 @@ BOOL WINAPI extSetSysColors(int cElements, const INT *lpaElements, const COLORRE { // v2.02.32: added to avoid SysColors changes by "Western Front" BOOL ret; - OutTraceD("SetSysColors: Elements=%d\n", cElements); + OutTraceDW("SetSysColors: Elements=%d\n", cElements); if(dxw.dwFlags3 & LOCKSYSCOLORS) return TRUE; @@ -1840,10 +1985,10 @@ BOOL WINAPI extSetSysColors(int cElements, const INT *lpaElements, const COLORRE BOOL WINAPI extUpdateWindow(HWND hwnd) { BOOL ret; - OutTraceD("UpdateWindow: hwnd=%x\n", hwnd); + OutTraceDW("UpdateWindow: hwnd=%x\n", hwnd); if(dxw.IsRealDesktop(hwnd)){ - OutTraceD("UpdateWindow: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + OutTraceDW("UpdateWindow: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); hwnd=dxw.GethWnd(); } @@ -1855,15 +2000,15 @@ BOOL WINAPI extUpdateWindow(HWND hwnd) BOOL WINAPI extGetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) { BOOL ret; - OutTraceD("GetWindowPlacement: hwnd=%x\n", hwnd); + OutTraceDW("GetWindowPlacement: hwnd=%x\n", hwnd); if(dxw.IsRealDesktop(hwnd)){ - OutTraceD("GetWindowPlacement: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + OutTraceDW("GetWindowPlacement: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); hwnd=dxw.GethWnd(); } ret=(*pGetWindowPlacement)(hwnd, lpwndpl); - OutTraceD("GetWindowPlacement: flags=%x showCmd=%x MinPosition=(%d,%d) MaxPosition=(%d,%d) NormalPosition=(%d,%d)-(%d,%d)\n", + OutTraceDW("GetWindowPlacement: flags=%x showCmd=%x MinPosition=(%d,%d) MaxPosition=(%d,%d) NormalPosition=(%d,%d)-(%d,%d)\n", lpwndpl->flags, lpwndpl->showCmd, lpwndpl->ptMinPosition.x, lpwndpl->ptMinPosition.y, lpwndpl->ptMaxPosition.x, lpwndpl->ptMaxPosition.y, @@ -1873,7 +2018,7 @@ BOOL WINAPI extGetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) case SW_SHOW: if (dxw.IsFullScreen()){ lpwndpl->showCmd = SW_MAXIMIZE; - OutTraceD("GetWindowPlacement: forcing SW_MAXIMIZE state\n"); + OutTraceDW("GetWindowPlacement: forcing SW_MAXIMIZE state\n"); } break; } @@ -1884,14 +2029,14 @@ BOOL WINAPI extGetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) BOOL WINAPI extSetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) { BOOL ret; - OutTraceD("SetWindowPlacement: hwnd=%x\n", hwnd); + OutTraceDW("SetWindowPlacement: hwnd=%x\n", hwnd); if(dxw.IsRealDesktop(hwnd)){ - OutTraceD("SetWindowPlacement: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + OutTraceDW("SetWindowPlacement: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); hwnd=dxw.GethWnd(); } - OutTraceD("SetWindowPlacement: flags=%x showCmd=%x MinPosition=(%d,%d) MaxPosition=(%d,%d) NormalPosition=(%d,%d)-(%d,%d)\n", + OutTraceDW("SetWindowPlacement: flags=%x showCmd=%x MinPosition=(%d,%d) MaxPosition=(%d,%d) NormalPosition=(%d,%d)-(%d,%d)\n", lpwndpl->flags, lpwndpl->showCmd, lpwndpl->ptMinPosition.x, lpwndpl->ptMinPosition.y, lpwndpl->ptMaxPosition.x, lpwndpl->ptMaxPosition.y, @@ -1901,7 +2046,7 @@ BOOL WINAPI extSetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) case SW_SHOW: if (dxw.IsFullScreen()){ lpwndpl->showCmd = SW_MAXIMIZE; - OutTraceD("SetWindowPlacement: forcing SW_MAXIMIZE state\n"); + OutTraceDW("SetWindowPlacement: forcing SW_MAXIMIZE state\n"); } break; } @@ -1913,9 +2058,9 @@ BOOL WINAPI extSetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) HWND WINAPI extSetCapture(HWND hwnd) { HWND ret; - OutTraceD("SetCapture: hwnd=%x\n", hwnd); + OutTraceDW("SetCapture: hwnd=%x\n", hwnd); ret=(*pSetCapture)(hwnd); - OutTraceD("SetCapture: ret=%x\n", ret); + OutTraceDW("SetCapture: ret=%x\n", ret); return ret; } @@ -1923,7 +2068,7 @@ HWND WINAPI extGetActiveWindow(void) { HWND ret; ret=(*pGetActiveWindow)(); - OutTraceD("GetActiveWindow: ret=%x\n", ret); + OutTraceDW("GetActiveWindow: ret=%x\n", ret); STOPPER("GetActiveWindow"); return ret; } @@ -1932,7 +2077,7 @@ HWND WINAPI extGetForegroundWindow(void) { HWND ret; ret=(*pGetForegroundWindow)(); - OutTraceD("GetForegroundWindow: ret=%x\n", ret); + OutTraceDW("GetForegroundWindow: ret=%x\n", ret); STOPPER("GetForegroundWindow"); return ret; } \ No newline at end of file diff --git a/dll/winmm.cpp b/dll/winmm.cpp index 989dfe8..e11d78e 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -6,8 +6,8 @@ #include "MMSystem.h" -//#undef OutTraceD -//#define OutTraceD OutTrace +//#undef OutTraceDW +//#define OutTraceDW OutTrace static HookEntry_Type Hooks[]={ {"mciSendCommandA", NULL, (FARPROC *)&pmciSendCommand, (FARPROC)extmciSendCommand}, @@ -50,18 +50,18 @@ MMRESULT WINAPI exttimeSetEvent(UINT uDelay, UINT uResolution, LPTIMECALLBACK lp { MMRESULT res; //uDelay = uDelay * 8; - OutTraceD("timeSetEvent: Delay=%d Resolution=%d Event=%x\n", uDelay, uResolution, fuEvent); + OutTraceDW("timeSetEvent: Delay=%d Resolution=%d Event=%x\n", uDelay, uResolution, fuEvent); res=(*ptimeSetEvent)(uDelay, uResolution, lpTimeProc, dwUser, fuEvent); - OutTraceD("timeSetEvent: ret=%x\n", res); + OutTraceDW("timeSetEvent: ret=%x\n", res); return res; } MMRESULT WINAPI exttimeKillEvent(UINT uTimerID) { MMRESULT res; - OutTraceD("timeKillEvent: TimerID=%x\n", uTimerID); + OutTraceDW("timeKillEvent: TimerID=%x\n", uTimerID); res=(*ptimeKillEvent)(uTimerID); - OutTraceD("timeKillEvent: ret=%x\n", res); + OutTraceDW("timeKillEvent: ret=%x\n", res); return res; } @@ -84,7 +84,7 @@ MCIERROR WINAPI extmciSendCommand(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdw MCI_ANIM_RECT_PARMS *pr; MCI_OVLY_WINDOW_PARMSW *pw; - OutTraceD("mciSendCommand: IDDevice=%x msg=%x(%s) Command=%x(%s)\n", + OutTraceDW("mciSendCommand: IDDevice=%x msg=%x(%s) Command=%x(%s)\n", IDDevice, uMsg, ExplainMCICommands(uMsg), fdwCommand, ExplainMCIFlags(uMsg, fdwCommand)); if(dxw.IsFullScreen()){ diff --git a/dll/wintrust.cpp b/dll/wintrust.cpp index e641d0c..d2c1406 100644 --- a/dll/wintrust.cpp +++ b/dll/wintrust.cpp @@ -28,8 +28,8 @@ FARPROC Remap_trust_ProcAddress(LPCSTR proc, HMODULE hModule) LONG WINAPI extWinVerifyTrust(HWND hWnd, GUID *pgActionID, LPVOID pWVTData) { LONG ret; - OutTraceD("WinVerifyTrust: hwnd=%x pgActionID=%x pWVTData=%x\n", hWnd, pgActionID, pWVTData); + OutTraceDW("WinVerifyTrust: hwnd=%x pgActionID=%x pWVTData=%x\n", hWnd, pgActionID, pWVTData); ret = (*pWinVerifyTrust)(hWnd, pgActionID, pWVTData); - OutTraceD("WinVerifyTrust: ret=%x\n", ret); + OutTraceDW("WinVerifyTrust: ret=%x\n", ret); return ret; } diff --git a/dll/wndproc.cpp b/dll/wndproc.cpp index 9a68ce8..102b820 100644 --- a/dll/wndproc.cpp +++ b/dll/wndproc.cpp @@ -32,7 +32,7 @@ void WhndStackPush(HWND hwnd, WNDPROC wndproc) // wndproc values of 0xFFFFxxxx type seems to be error codes rather than valid callback addresses .... // v2.02.36 using CallWindowProc you can pass WinProc handles, so you don't need to eliminate them! //if (((DWORD)wndproc & 0xFFFF0000) == 0xFFFF0000) return; - //OutTraceD("DEBUG: WNDPROC STACK push hwnd=%x, wndproc=%x\n", hwnd, wndproc); + //OutTraceDW("DEBUG: WNDPROC STACK push hwnd=%x, wndproc=%x\n", hwnd, wndproc); // try update first... for(StackIdx=0; StackIdxm_ZBufferClean); DDX_Check(pDX, IDC_ZBUFFER0CLEAN, cTarget->m_ZBuffer0Clean); DDX_Check(pDX, IDC_NOPOWER2FIX, cTarget->m_NoPower2Fix); + DDX_Check(pDX, IDC_NOPERFCOUNTER, cTarget->m_NoPerfCounter); } BEGIN_MESSAGE_MAP(CTabCompat, CDialog) diff --git a/host/TabDirectX.cpp b/host/TabDirectX.cpp index a2daaa8..0efd812 100644 --- a/host/TabDirectX.cpp +++ b/host/TabDirectX.cpp @@ -43,6 +43,7 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_NOPIXELFORMAT, cTarget->m_NoPixelFormat); DDX_Check(pDX, IDC_NOALPHACHANNEL, cTarget->m_NoAlphaChannel); DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter); + DDX_Check(pDX, IDC_ADDPROXYLIBS, cTarget->m_AddProxyLibs); //DDX_Check(pDX, IDC_SAVECAPS, cTarget->m_SaveCaps); } diff --git a/host/TabLogs.cpp b/host/TabLogs.cpp index 1a8802f..fa8be17 100644 --- a/host/TabLogs.cpp +++ b/host/TabLogs.cpp @@ -36,12 +36,14 @@ void CTabLogs::DoDataExchange(CDataExchange* pDX) CDialog::DoDataExchange(pDX); CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); //extern BOOL gbDebug; - DDX_Check(pDX, IDC_OUTTRACE, cTarget->m_OutTrace); + DDX_Check(pDX, IDC_OUTPROXYTRACE, cTarget->m_OutProxyTrace); + DDX_Check(pDX, IDC_OUTD3DTRACE, cTarget->m_OutD3DTrace); + DDX_Check(pDX, IDC_OUTDDRAWTRACE, cTarget->m_OutDDRAWTrace); DDX_Check(pDX, IDC_OUTDEBUG, cTarget->m_OutDebug); DDX_Check(pDX, IDC_CURSORTRACE, cTarget->m_CursorTrace); DDX_Check(pDX, IDC_LOGENABLED, cTarget->m_LogEnabled); DDX_Check(pDX, IDC_OUTWINMESSAGES, cTarget->m_OutWinMessages); - DDX_Check(pDX, IDC_OUTDXTRACE, cTarget->m_OutDXTrace); + DDX_Check(pDX, IDC_OUTDWTRACE, cTarget->m_OutDWTrace); DDX_Check(pDX, IDC_IMPORTTABLE, cTarget->m_ImportTable); DDX_Check(pDX, IDC_OUTREGISTRY, cTarget->m_RegistryOp); DDX_Check(pDX, IDC_TRACEHOOKS, cTarget->m_TraceHooks); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 3ea2c6c..3b21729 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -26,11 +26,13 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_DCEmulationMode = 0; // default: no emulation m_HookDI = FALSE; m_ModifyMouse = TRUE; // default true !! - m_OutTrace = FALSE; + m_OutProxyTrace = FALSE; m_OutDebug = FALSE; m_CursorTrace = FALSE; m_OutWinMessages = FALSE; - m_OutDXTrace = FALSE; + m_OutDWTrace = FALSE; + m_OutD3DTrace = FALSE; + m_OutDDRAWTrace = FALSE; m_DXProxed = FALSE; m_HandleDC = FALSE; m_HandleExceptions = FALSE; @@ -58,6 +60,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_ZBufferAlways = FALSE; m_DisableFogging = FALSE; m_NoPower2Fix = FALSE; + m_NoPerfCounter = FALSE; + m_AddProxyLibs = FALSE; m_UnNotify = FALSE; m_Windowize = TRUE; // default true !! m_HookDLLs = TRUE; // default true !! diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 7b6605f..481d228 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -29,12 +29,14 @@ public: int m_DCEmulationMode; BOOL m_HookDI; BOOL m_ModifyMouse; - BOOL m_OutTrace; + BOOL m_OutProxyTrace; BOOL m_OutDebug; BOOL m_CursorTrace; BOOL m_LogEnabled; BOOL m_OutWinMessages; - BOOL m_OutDXTrace; + BOOL m_OutDWTrace; + BOOL m_OutD3DTrace; + BOOL m_OutDDRAWTrace; BOOL m_DXProxed; BOOL m_AssertDialog; BOOL m_ImportTable; @@ -120,6 +122,8 @@ public: BOOL m_ZBuffer0Clean; BOOL m_ZBufferAlways; BOOL m_NoPower2Fix; + BOOL m_NoPerfCounter; + BOOL m_AddProxyLibs; BOOL m_DisableFogging; BOOL m_SuppressIME; BOOL m_SetCompatibility; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index c0832924cc68477b5aa6ca5524ce96e4b639835a..b9b4f78f4efff8ce02f6db86229206df89e9050f 100644 GIT binary patch delta 6057 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 D`-S$; diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp index 3bf2421..ae5e66d 100644 --- a/host/dxwndhost.cpp +++ b/host/dxwndhost.cpp @@ -213,4 +213,4 @@ char *GetTSCaption(int shift) ":6",":8",":12",":16"}; if (shift<-8 || shift>8) return "???"; return sTSCaption[shift+8]; -} \ No newline at end of file +} diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index e819ac9..7bae9e6 100644 --- a/host/dxwndhost.rc +++ b/host/dxwndhost.rc @@ -95,6 +95,13 @@ BEGIN MENUITEM "&Resume", ID_TASK_RESUME MENUITEM "&Kill", ID_TASK_KILL END + POPUP "Desktop color depth" + BEGIN + MENUITEM " 8 BPP", ID_DESKTOPCOLORDEPTH_8BPP + MENUITEM "16 BPP", ID_DESKTOPCOLORDEPTH_16BPP + MENUITEM "24 BPP", ID_DESKTOPCOLORDEPTH_24BPP + MENUITEM "32 BPP", ID_DESKTOPCOLORDEPTH_32BPP + END MENUITEM "Move to Tray", ID_FILE_GOTOTRAYICON MENUITEM "e&Xit", ID_DXAPP_EXIT END @@ -285,16 +292,18 @@ IDD_TAB_LOG DIALOGEX 0, 0, 300, 240 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - GROUPBOX "dxwnd.log logs",IDC_STATIC,7,3,129,145 + GROUPBOX "dxwnd.log logs",IDC_STATIC,7,3,129,173 CONTROL "Enable Trace",IDC_LOGENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,25,73,12 - CONTROL "DxWnd",IDC_OUTTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,46,73,12 - CONTROL "DirectX trace",IDC_OUTDXTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,58,73,12 - CONTROL "Win Events",IDC_OUTWINMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,70,73,12 - CONTROL "Cursor/Mouse",IDC_CURSORTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,82,73,12 - CONTROL "Import Table",IDC_IMPORTTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,94,73,12 - CONTROL "Debug",IDC_OUTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,106,73,12 - CONTROL "Registry op.",IDC_OUTREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,118,73,12 - CONTROL "Hook op.",IDC_TRACEHOOKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,130,73,12 + CONTROL "DirectX full trace",IDC_OUTPROXYTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,82,73,12 + CONTROL "DxWnd hacks",IDC_OUTDWTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,46,73,12 + CONTROL "Win Events",IDC_OUTWINMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,94,73,12 + CONTROL "Cursor/Mouse",IDC_CURSORTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,106,73,12 + CONTROL "Import Table",IDC_IMPORTTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,118,73,12 + CONTROL "Debug",IDC_OUTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,130,73,12 + CONTROL "Registry op.",IDC_OUTREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,142,73,12 + CONTROL "Hook op.",IDC_TRACEHOOKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,154,73,12 + CONTROL "Direct3D trace",IDC_OUTD3DTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,70,73,12 + CONTROL "DirectDraw Trace",IDC_OUTDDRAWTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,58,73,12 END IDD_TAB_DIRECTX DIALOGEX 0, 0, 300, 240 @@ -316,7 +325,7 @@ BEGIN GROUPBOX "DirectX Version Hook",IDC_STATIC,6,3,98,103,WS_GROUP GROUPBOX "Emulation",IDC_STATIC,7,109,98,80,WS_GROUP CONTROL "Auto Primary Surface Refresh",IDC_AUTOREFRESH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,16,126,9 - GROUPBOX "DirectDraw Surface handling",IDC_STATIC,112,3,181,186 + GROUPBOX "DirectDraw Surface handling",IDC_STATIC,112,3,181,230 CONTROL "switch VIDEO to SYSTEM on fail",IDC_VIDEOTOSYSTEMMEM, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,118,28,126,9 CONTROL "Suppress DX common errors",IDC_SUPPRESSDXERRORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,40,127,10 @@ -332,6 +341,7 @@ BEGIN CONTROL "by default set no ALPHACHANNEL",IDC_NOALPHACHANNEL, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,160,123,12 CONTROL "Fix ddraw ref counter",IDC_FIXREFCOUNTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,172,123,12 + CONTROL "Add proxy libs",IDC_ADDPROXYLIBS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,184,123,12 END IDD_TAB_INPUT DIALOGEX 0, 0, 300, 240 @@ -445,6 +455,7 @@ BEGIN CONTROL "Clean ZBUFFER @1.0 fix",IDC_ZBUFFERCLEAN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,116,109,12 CONTROL "Clean ZBUFFER @0.0 fix",IDC_ZBUFFER0CLEAN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,104,109,12 CONTROL "Textures not power of 2 fix",IDC_NOPOWER2FIX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,92,109,12 + CONTROL "Disable performance counter",IDC_NOPERFCOUNTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,80,109,12 END IDD_TAB_SYSLIBS DIALOGEX 0, 0, 300, 240 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 9e726045e659c6d6d6cef803809cf72077cab7e6..4eb07bf6733fbf9f605ec580742f71ab6564c2c7 100644 GIT binary patch delta 7370 zcmb_h3v^Z0nLht{+&sBSE;pBuU~+RwLWB@5Atb!LKzNFfrHl^-Fd%h+GDr|bK_pOg zrhrUj$NU`y2~_DUL=A*;6dbrxrV9~hWI8@5MM#~lwu>S<&{h_Z`TlcmQm}1|+MV@f z@BQzypZ|03TXQ~8Q)|^073!L%5#Xd$O_RC-TyJe{b%~l*gF+MS+esVs_>~!`SU>{c z0pfsoAQ4Cck^wK!1xNw90vK0I1AKrV=mDey0iYYu9q0*U0$IQnBLq7%A7(a`UPBtyYi*a_${^FA6e!N_|u`-qdGmd}Y6xXAIK%yKOmc+oJE9 zE9aoMBsppk3dzk_E_|1|@cn5(crSI~z2w4w$%XHd3*RLd-b>!bcabIGeH-6JE@Hf2 z>F_KFf-qkAECTX9K=>|$$hL*=QWm~Tej|kMA{(9Idt1L@_n7taO9XH_f6-v|;$Ve7)e`eC z+pRaeZsn=NX4pyrZGP;VT~?kY6XrTnm;`OtWQ#~#{Q;$$O*L;0ky8<~a#{+!>ninh zk0XmO?l!$V(X0D%=ZL}}J%n67%LNw2XsdWq7i%NWvMY~*D?^zN$4&Fva@9i`URO80y0t#|!9%NKW7?KKGbXy!@Tfg& zMR>Lz(TA#*SMyXPJ}Rb3tqJ6*mXiT>AW)(7tg+O~89ZqV23_q8t*O?8F_u`1ZthC@ zsz(whdngT*beB@BE+is!1B{aXg;ancX9P zB%rG+T_&iXWc61|yi+OQuB$>__D)V9v5q2%-29?Zm^2o(cwsQS57{GCG`U`#PRVel zJJ2PdqFwwkM0mAjJ#SCDm42=u3^V{+fwoy*ij}t`|B;lRtsao@V-)tfm2S!ZiNXQkAfT?67UmvB;a%VuAm;T1 z@H3zpcn>(K#tiI3*SXrTp5;*=8wa|JU+jmL>8@^SvyeMyqE@Z##*L#bAL|L0pF`s) zq@vC7R1rJrcg*biRDBr#;J1{KAg5Lil&MuSyLFM;6d*QE-EF*jAvr$O)(5LozZ<0v zoyo(4khHO_!t3j(!k7rDDEY+oq^&AKb9zPi$V87)#1Cw{V2#A_EQ;0 zhEirz<=Ox#vo6FXr>Ka=t5rYm$yG|vP&H>Vn)a@nsBb*pgBwZ zqs|@6=bd}30Eh23bDEwxRjuRN(@J{lWPUqOFL(M+{^f3ygL}!Z{Fi=5l}%LFN?h}( z6>W;{jnMYzEYI%dB9qtL=`zXI`_mo#nV)*{*#l;2Q_at7h%4{bhw#~jy02-{hck(W z^Rt#dj-##QQ_*)5)$GeJ@{u|t+!X#(fcWrJ&PZT=FPhAs{gj5PC%;(D(MF?)uYW?m zrV&>U5s$r0rS<=Z0mjes+tYN~ZgFZl1?^xWoh9CIry1a?JZSm#a@}u__tP7sre6!& z;StnK>SCSG_EpdxQlqYlXo*YQSXaP}aTKtxkD)wj+m9GG2{mYx>?xnm)?i=^0^hVg zo*x}YYgNrJy{dA(-ww^C=M9GqEsc7SK3Z3it0AuXUm9j-ETG?5Jm-(ln3j_zG!h)j z=Mf92H%ER#rd_#&R_jhPhmM*hdPKLIAI0U9FC8K`pw(~F?W)JA!Nawy$YXn+rYoc( z&jswjdRmLa-|uKsd-O(=WCm4rJirYVlwn`2rBqTi>*BfU5}b0?Nh8}Hwwr3>+~p$t zq7gBky@@kBuuc!y!F@PL)%ZW9cIhEH7ROcl$Zz}Kr}GwvJ$lFvU8FN9oca;`Y@w;Y z5nC$^tEw5CN)z}!10vAy6lK&m8JTv8rJwMq=97h-`Vc%$#UJ#yh!?P#X=m0Ozs5Z4 zu&YL6p{_19w<)`dObqB#aE!kQfk(NU^>VshWLxaQMWY|W5E1m?Vk>MP-favczK~Dz z?fEB+dgA8!Wb%bZJ!t2hG)|L9c?R$7MP9pLta&O;oxP0B%rws%9KC{gr{QR}UAWBr z&`^|y!rse4R3CiKS0iPq=DXa5M9^!KoKkoceEQaIcD;UKTUa4561@Rnzw z=i(E@!-&@qJGKS6Tufl|bMk6YXaL02v?cjyD`?_s#P#f|UP2t+Kn1GdV=qnQRd<>B zu-Aol{ABA-1}CpD%IvZ^)=`VAu23d7E&zLrS6e3y_I^kiTzieO?Xp_ysNq-+JFv-G zL~7{7?(_t&KL(!}zCBeH2YtQpu(41dM2WJR7j?&0Vs>rNj1Ss^Vl6oR1CwVJl3&jz zm6{fIq7L=y8b5D9*uZ@g4Zmu(y%PU&vPl^?Ptm1V9#1+m2d2fGvCGvRdZ9X!RAj}0 zs`D57&3s(@2e_92uv6>lT40HgX15z$NER+~9(h`s?hd3#;AGy*O%I)2I^SZh?f>smPU^q&ef1{HAwbeorav#j$8U3mIBpiM0 zw)7i$-GCwvvtH7_Y8+@>`zc5-Ngd0Vqau-s{+n0sh;U~n{1(>5Ih?=K935(U=jZrF zn%?>0zqTrV%_HiV(|^N~bbk3A+uGRMkh$^+n2qJyC|qO9a0%`2TxctB#T~0vAiy7l zQYmt&^+jzI+DD@_7_)+!-pCeo$hp6tCGS`~ z!p2XgE_?l*G`=%nk?`?^vm;c->FOUKPXT>1}h zBI2hXJmyj#ZtX_>xG|qhy0=ZTxaxwQ&i}Q`8hXRiMG>2yQpsMQHA+_*6AB#(JQGOd y_y?@rmI#~12bUTnc_Nu!r#?j1(vS6D8C%r5^K&MA$x9A5E`DW5{EfV1_x}edYMo&K literal 374272 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

ixl#l777CNam9{Bc4H!6$m2})FN>ate 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 t->flags |= HOOKDI; if(dlg->m_ModifyMouse) t->flags |= MODIFYMOUSE; - if(dlg->m_OutTrace) t->tflags |= OUTDDRAWTRACE; + if(dlg->m_OutProxyTrace) t->tflags |= OUTPROXYTRACE; if(dlg->m_OutDebug) t->tflags |= OUTDEBUG; if(dlg->m_CursorTrace) t->tflags |= OUTCURSORTRACE; if(dlg->m_LogEnabled) t->tflags |= OUTTRACE; if(dlg->m_OutWinMessages) t->tflags |= OUTWINMESSAGES; - if(dlg->m_OutDXTrace) t->tflags |= OUTPROXYTRACE; + if(dlg->m_OutDWTrace) t->tflags |= OUTDXWINTRACE; + if(dlg->m_OutDDRAWTrace) t->tflags |= OUTDDRAWTRACE; + if(dlg->m_OutD3DTrace) t->tflags |= OUTD3DTRACE; if(dlg->m_DXProxed) t->tflags |= DXPROXED; if(dlg->m_AssertDialog) t->tflags |= ASSERTDIALOG; if(dlg->m_ImportTable) t->tflags |= OUTIMPORTTABLE; @@ -158,6 +164,8 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_ZBuffer0Clean) t->flags4 |= ZBUFFER0CLEAN; if(dlg->m_ZBufferAlways) t->flags4 |= ZBUFFERALWAYS; if(dlg->m_NoPower2Fix) t->flags4 |= NOPOWER2FIX; + if(dlg->m_NoPerfCounter) t->flags4 |= NOPERFCOUNTER; + if(dlg->m_AddProxyLibs) t->flags4 |= ADDPROXYLIBS; if(dlg->m_DisableFogging) t->flags4 |= DISABLEFOGGING; if(dlg->m_SuppressIME) t->flags2 |= SUPPRESSIME; if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT; @@ -281,12 +289,14 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0; dlg->m_ModifyMouse = t->flags & MODIFYMOUSE ? 1 : 0; - dlg->m_OutTrace = t->tflags & OUTDDRAWTRACE ? 1 : 0; + dlg->m_OutProxyTrace = t->tflags & OUTPROXYTRACE ? 1 : 0; dlg->m_OutDebug = t->tflags & OUTDEBUG ? 1 : 0; dlg->m_CursorTrace = t->tflags & OUTCURSORTRACE ? 1 : 0; dlg->m_LogEnabled = t->tflags & OUTTRACE ? 1 : 0; dlg->m_OutWinMessages = t->tflags & OUTWINMESSAGES ? 1 : 0; - dlg->m_OutDXTrace = t->tflags & OUTPROXYTRACE ? 1 : 0; + dlg->m_OutDWTrace = t->tflags & OUTDXWINTRACE ? 1 : 0; + dlg->m_OutD3DTrace = t->tflags & OUTD3DTRACE ? 1 : 0; + dlg->m_OutDDRAWTrace = t->tflags & OUTDDRAWTRACE ? 1 : 0; dlg->m_DXProxed = t->tflags & DXPROXED ? 1 : 0; dlg->m_AssertDialog = t->tflags & ASSERTDIALOG ? 1 : 0; dlg->m_ImportTable = t->tflags & OUTIMPORTTABLE ? 1 : 0; @@ -317,6 +327,8 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ZBuffer0Clean = t->flags4 & ZBUFFER0CLEAN ? 1 : 0; dlg->m_ZBufferAlways = t->flags4 & ZBUFFERALWAYS ? 1 : 0; dlg->m_NoPower2Fix = t->flags4 & NOPOWER2FIX ? 1 : 0; + dlg->m_NoPerfCounter = t->flags4 & NOPERFCOUNTER ? 1 : 0; + dlg->m_AddProxyLibs = t->flags4 & ADDPROXYLIBS ? 1 : 0; dlg->m_DisableFogging = t->flags4 & DISABLEFOGGING ? 1 : 0; dlg->m_SaveLoad = t->flags & SAVELOAD ? 1 : 0; dlg->m_SlowDown = t->flags & SLOWDOWN ? 1 : 0; @@ -1423,6 +1435,18 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point) case ID_FILE_IMPORT: OnImport(); break; + case ID_DESKTOPCOLORDEPTH_8BPP: + OnDesktopcolordepth8bpp(); + break; + case ID_DESKTOPCOLORDEPTH_16BPP: + OnDesktopcolordepth16bpp(); + break; + case ID_DESKTOPCOLORDEPTH_24BPP: + OnDesktopcolordepth24bpp(); + break; + case ID_DESKTOPCOLORDEPTH_32BPP: + OnDesktopcolordepth32bpp(); + break; } CListView::OnRButtonDown(nFlags, point); } @@ -1555,3 +1579,57 @@ void CDxwndhostView::OnRun() CreateProcess(NULL, TargetMaps[i].path, 0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, path, &sinfo, &pinfo); } } + +void SwitchToColorDepth(int bpp) +{ + DEVMODE CurrentDevMode; + BOOL res; + char MsgBuf[256+1]; + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &CurrentDevMode); + sprintf(MsgBuf, "ChangeDisplaySettings: color depth %d -> %d BPP\n", CurrentDevMode.dmBitsPerPel, bpp); + if(MessageBoxEx(0, MsgBuf, "Warning", MB_OKCANCEL | MB_ICONQUESTION, NULL)!=IDOK) return; + //OutTraceDW("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> 16\n", + // CurrentDevMode.dmPelsWidth, CurrentDevMode.dmPelsHeight, CurrentDevMode.dmBitsPerPel); + CurrentDevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; + CurrentDevMode.dmBitsPerPel = bpp; + res=ChangeDisplaySettings(&CurrentDevMode, CDS_UPDATEREGISTRY); + if(res!=DISP_CHANGE_SUCCESSFUL) { + char *err; + switch(res){ + case DISP_CHANGE_BADDUALVIEW: err="BADDUALVIEW"; break; + case DISP_CHANGE_BADFLAGS: err="BADFLAGS"; break; + case DISP_CHANGE_BADMODE: err="BADMODE"; break; + case DISP_CHANGE_BADPARAM: err="BADPARAM"; break; + case DISP_CHANGE_FAILED: err="FAILED"; break; + case DISP_CHANGE_NOTUPDATED: err="NOTUPDATED"; break; + case DISP_CHANGE_RESTART: err="RESTART"; break; + default: err="???"; break; + } + sprintf(MsgBuf, "ChangeDisplaySettings ERROR res=%s err=%d\n", err, GetLastError()); + MessageBoxEx(0, MsgBuf, "Error", MB_OKCANCEL | MB_ICONQUESTION, NULL); + } +} + +void CDxwndhostView::OnDesktopcolordepth8bpp() +{ + // TODO: Add your command handler code here + SwitchToColorDepth(8); +} + +void CDxwndhostView::OnDesktopcolordepth16bpp() +{ + // TODO: Add your command handler code here + SwitchToColorDepth(16); +} + +void CDxwndhostView::OnDesktopcolordepth24bpp() +{ + // TODO: Add your command handler code here + SwitchToColorDepth(24); +} + +void CDxwndhostView::OnDesktopcolordepth32bpp() +{ + // TODO: Add your command handler code here + SwitchToColorDepth(32); +} diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index d3597de..c7ee42c 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -86,6 +86,10 @@ protected: afx_msg void OnViewPalette(); afx_msg void OnViewTimeSlider(); afx_msg void OnExit(); + afx_msg void OnDesktopcolordepth8bpp(); + afx_msg void OnDesktopcolordepth16bpp(); + afx_msg void OnDesktopcolordepth24bpp(); + afx_msg void OnDesktopcolordepth32bpp(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };