diff --git a/Debug/.gitattributes b/Debug/.gitattributes new file mode 100644 index 0000000..b110a24 --- /dev/null +++ b/Debug/.gitattributes @@ -0,0 +1 @@ +*.{dll,exe} filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/Debug/ddraw.dll b/Debug/ddraw.dll new file mode 100644 index 0000000..a4a427a --- /dev/null +++ b/Debug/ddraw.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57380350f6215b3dadaf6f920ebbf18fd2ec95162c1722bafac6f8b949eb851b +size 458240 diff --git a/Debug/ddraw.ilk b/Debug/ddraw.ilk new file mode 100644 index 0000000..8641d7b Binary files /dev/null and b/Debug/ddraw.ilk differ diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 1bf27d1..c3eb578 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -41,7 +41,7 @@ #define CLIENTREMAPPING 0x08000000 // hooks ClientToRect, RectToClient, GetClientRect, GetWinRect #define HANDLEALTF4 0x10000000 // forces quitting the program when receiving Alt-F4 key #define LOCKWINPOS 0x20000000 // prevent the program to change its own windows properties -#define HOOKCHILDWIN 0x40000000 // hook CHILD windows to alter placement coordinates (UNUSED) +#define HOOKCHILDWIN 0x40000000 // hook CHILD windows to alter placement coordinates #define MESSAGEPROC 0x80000000 // process peek/get messages // second flags DWORD dxw.dwFlags2: @@ -246,8 +246,14 @@ #define ANCHORED 0x10000000 // Anchored position & size, mo stretching or sliding is allowed #define CLEARTEXTUREFOURCC 0x20000000 // Clear DDSCAPS2_FOURCC bit and makes texture load without codec #define NODDEXCLUSIVEMODE 0x40000000 // Do not allow ddraw EXCLUSIVE mode also in non windowed mode +#define COPYNOSHIMS 0x80000000 // Create a hiden and temporary copy of the target exe so that shims are not applied // eighth flags DWORD dxw.dwFlags8: +#define FORCEWAIT 0x00000001 // Forces DDBLT/DDFLIP WAIT flags +#define FORCENOWAIT 0x00000002 // Forces DDBLT/DDFLIP NOWAIT flags +#define FORCEVSYNC 0x00000004 // Forces hardware VSync +#define FORCENOVSYNC 0x00000008 // Forces NO hardware VSync +#define VSYNCSCANLINE 0x00000010 // Activates WaitForVerticalBlank algorythm based on reaching a given scan line // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general @@ -258,7 +264,7 @@ //#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 OUTDEBUG 0x00000100 // detailed debugging information #define OUTREGISTRY 0x00000200 // log registry operations #define TRACEHOOKS 0x00000400 // log hook operations #define OUTD3DTRACE 0x00000800 // traces DxWnd direct3d screen handling @@ -306,6 +312,7 @@ typedef struct TARGETMAP short SwapEffect; short MaxDdrawInterface; short SlowRatio; + short ScanLine; }TARGETMAP; typedef struct diff --git a/build/dxwnd.dll b/build/dxwnd.dll index bc6f660..0c4260e 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4af08fde73eb963389ed3ef80c024a9aaf6a711bfc70f8b2c2091c9c75dfbbad -size 700928 +oid sha256:d7f4c6f63e720e5a4a2275522d0d414d00fba3b80e28751a6db8e1f0613483f0 +size 706560 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index bfd397d..6e6fa7e 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2e87504512135e86893727a9d1fec372ce4ad78e50f6b897ddf819bc6fd3d9db -size 665600 +oid sha256:4c369251987e49585a3cb5776a808fafe262ccf2d6b0ef0265275ba2080189ac +size 667136 diff --git a/build/dxwnd.ini b/build/dxwnd.ini deleted file mode 100644 index d7d96dd..0000000 --- a/build/dxwnd.ini +++ /dev/null @@ -1,349 +0,0 @@ -[window] -exportpath=D:\DxWnd.develop\v2_03_97_beta\build\exports\ -posx=-592 -posy=438 -sizx=436 -sizy=417 -exepath=D:\Games\Warhammer 40.000 Dark Omen\PRG_ENG\ -debug=1 -autohide=0 -checkadmin=0 -namefromfolder=0 -multiprocesshook=0 -updatepaths=1 -defaultcoord=0 -defaultposx=50 -defaultposy=50 -defaultsizx=800 -defaultsizy=600 -[target] -title0=Warhammer 40K Rites of War -path0=D:\Games\Warhammer 40.000 Rites of War\RoWDemo.exe -startfolder0= -launchpath0= -module0= -opengllib0= -notes0=After installing the game copy the "Map" -folder from the CD to the \nRites of War\ directory on your hard drive.\n\nThis will fix the issue where the game crashes when starting a campaign. -registry0= -ver0=0 -monitorid0=0 -coord0=0 -flag0=685772838 -flagg0=1207959680 -flagh0=20 -flagi0=138412036 -flagj0=4224 -flagk0=65536 -flagl0=0 -flagm0=0 -tflag0=0 -dflag0=0 -posx0=50 -posy0=50 -sizx0=800 -sizy0=600 -maxfps0=0 -initts0=0 -winver0=0 -maxres0=-1 -swapeffect0=0 -maxddinterface0=7 -slowratio0=2 -initresw0=0 -initresh0=0 -title1=Adrenix mod -path1=D:\Games\Adrenix\Adrenix.exe -startfolder1= -launchpath1= -module1= -opengllib1= -notes1= -registry1= -ver1=0 -monitorid1=-1 -coord1=0 -flag1=136314915 -flagg1=1207959552 -flagh1=8212 -flagi1=138412036 -flagj1=4224 -flagk1=2424840 -flagl1=0 -flagm1=0 -tflag1=-2147483647 -dflag1=0 -posx1=50 -posy1=50 -sizx1=0 -sizy1=0 -maxfps1=0 -initts1=0 -winver1=0 -maxres1=-1 -swapeffect1=0 -maxddinterface1=7 -slowratio1=2 -initresw1=800 -initresh1=600 -title2=Adrenix 3D -path2=D:\Games\Adrenix\AdrenixD.exe -startfolder2= -launchpath2= -module2= -opengllib2= -notes2= -registry2= -ver2=0 -monitorid2=0 -coord2=0 -flag2=134234150 -flagg2=1208025088 -flagh2=20 -flagi2=138412036 -flagj2=5248 -flagk2=65536 -flagl2=0 -flagm2=0 -tflag2=-2147477245 -dflag2=0 -posx2=50 -posy2=50 -sizx2=800 -sizy2=600 -maxfps2=0 -initts2=0 -winver2=0 -maxres2=-1 -swapeffect2=0 -maxddinterface2=7 -slowratio2=1 -initresw2=0 -initresh2=0 -title3=Minigolf master miniverse demo -path3=D:\Games\MiniGolf Master Demo\mvdemo.exe -startfolder3= -launchpath3= -module3= -opengllib3= -notes3= -registry3= -ver3=0 -monitorid3=-1 -coord3=0 -flag3=136314914 -flagg3=1207959552 -flagh3=20 -flagi3=138412036 -flagj3=4224 -flagk3=33882112 -flagl3=32768 -flagm3=0 -tflag3=0 -dflag3=0 -posx3=50 -posy3=50 -sizx3=800 -sizy3=600 -maxfps3=0 -initts3=0 -winver3=0 -maxres3=-1 -swapeffect3=0 -maxddinterface3=7 -slowratio3=2 -initresw3=640 -initresh3=480 -title4=Galapagos -module4= -opengllib4= -monitorid4=-1 -dflag4=0 -initresw4=640 -initresh4=480 -path4=D:\Games\Galapagos\GALA.EXE -startfolder4= -launchpath4= -notes4= -registry4= -ver4=7 -coord4=0 -flag4=137379894 -flagg4=1207959552 -flagh4=33300 -flagi4=138412036 -flagj4=469766272 -flagk4=67584 -flagl4=92340240 -flagm4=0 -tflag4=-2147477245 -posx4=150 -posy4=150 -sizx4=800 -sizy4=600 -maxfps4=0 -initts4=0 -winver4=0 -maxres4=-1 -swapeffect4=0 -maxddinterface4=7 -slowratio4=2 -title5=Incubation.exe -module5= -opengllib5= -monitorid5=-1 -dflag5=0 -initresw5=800 -initresh5=600 -path5=D:\Games\Incubation\Incubation.exe -startfolder5= -launchpath5= -notes5= -registry5= -ver5=0 -coord5=0 -flag5=681574434 -flagg5=1208221696 -flagh5=20 -flagi5=138412036 -flagj5=4224 -flagk5=65536 -flagl5=0 -flagm5=0 -tflag5=0 -posx5=50 -posy5=50 -sizx5=800 -sizy5=600 -maxfps5=0 -initts5=0 -winver5=0 -maxres5=-1 -swapeffect5=0 -maxddinterface5=7 -slowratio5=2 -title6=Autorun.exe -path6=D:\Games\Incubation\Autorun.exe -startfolder6= -launchpath6= -module6= -opengllib6= -notes6= -registry6= -ver6=0 -monitorid6=-1 -coord6=0 -flag6=136314914 -flagg6=1207959552 -flagh6=20 -flagi6=134217732 -flagj6=4224 -flagk6=65536 -flagl6=0 -flagm6=0 -tflag6=0 -dflag6=0 -posx6=50 -posy6=50 -sizx6=800 -sizy6=600 -maxfps6=0 -initts6=0 -winver6=0 -maxres6=-1 -swapeffect6=0 -maxddinterface6=7 -slowratio6=2 -initresw6=800 -initresh6=600 -title7=Warhammer 40.000 Dark Omen -path7=D:\Games\Warhammer 40.000 Dark Omen\PRG_ENG\ENGREL.EXE -startfolder7= -launchpath7= -module7= -opengllib7= -notes7= -registry7= -ver7=0 -monitorid7=-1 -coord7=0 -flag7=136314922 -flagg7=1207959552 -flagh7=4 -flagi7=138412036 -flagj7=4224 -flagk7=65536 -flagl7=0 -flagm7=0 -tflag7=-2147477245 -dflag7=0 -posx7=50 -posy7=50 -sizx7=800 -sizy7=600 -maxfps7=0 -initts7=0 -winver7=0 -maxres7=-1 -swapeffect7=0 -maxddinterface7=7 -slowratio7=2 -initresw7=800 -initresh7=600 -title8=Warhammer Dark Omen -path8=D:\Games\Warhammer 40.000 Dark Omen\PRG_ENG\ENGREL.EXE -startfolder8= -launchpath8= -module8= -opengllib8= -notes8=Dark Omen needs a d3drm.dll file to run:\n- This file can be located in the CD's \DIRECTX -folder.\n- Copy the file into the "Dark Omen\PRG_ENG" directory.\n\nSound issues:\nDark Omen can sometimes produce a burst of white noise from the speakers.\nUsing the Timing option "CPU slow down" may fix this issue. -registry8=[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Dark Omen\1.0\Options\Options]\n"Selected"="4"\n"HardwareSelected"="252"\n"SoftwareSelected"="228"\n"MMXSelected"="256"\n"ToolTips"="1"\n"MusicVolume"="408"\n"SFXVolume"="816"\n"SoftwareSoundQuality"="2"\n"SoftwareParticleQuality"="2"\n"MMXSoundQuality"="2"\n"MMXParticaleQuality"="1"\n"HardwareSoundQuality"="2"\n"HardwareParticleQuality"="2"\n"InformationNum"="11"\n -ver8=0 -monitorid8=-1 -coord8=0 -flag8=136314922 -flagg8=1207959552 -flagh8=9236 -flagi8=1212153860 -flagj8=4224 -flagk8=67584 -flagl8=0 -flagm8=0 -tflag8=0 -dflag8=0 -posx8=50 -posy8=50 -sizx8=800 -sizy8=600 -maxfps8=0 -initts8=0 -winver8=0 -maxres8=-1 -swapeffect8=0 -maxddinterface8=7 -slowratio8=2 -initresw8=800 -initresh8=600 -[texture] -MinTexX=0 -MinTexY=0 -MaxTexX=0 -MaxTexY=0 -[keymapping] -timetoggle= -timefast= -timeslow= -altf4= -cliptoggle= -refresh= -logtoggle= -plogtoggle= -fpstoggle= -printscreen= -corner= -freezetime= -fullscreen= -workarea= -desktop= -minimize= -restore= -kill= diff --git a/build/dxwnd.log b/build/dxwnd.log deleted file mode 100644 index afd4dc3..0000000 --- a/build/dxwnd.log +++ /dev/null @@ -1,32 +0,0 @@ -OnRun idx=8 prog="D:\Games\Warhammer 40.000 Dark Omen\PRG_ENG\ENGREL.EXE" -self elevation -export virtual registry -setwindowshook mode -OnRun idx=8 prog="D:\Games\Warhammer 40.000 Dark Omen\PRG_ENG\ENGREL.EXE" -self elevation -export virtual registry -setwindowshook mode -OnRun idx=8 prog="D:\Games\Warhammer 40.000 Dark Omen\PRG_ENG\ENGREL.EXE" -self elevation -export virtual registry -setwindowshook mode -OnRun idx=8 prog="D:\Games\Warhammer 40.000 Dark Omen\PRG_ENG\ENGREL.EXE" -self elevation -export virtual registry -setwindowshook mode -OnRun idx=9 prog="D:\Games\If-18 Carrier Strike Fighter\if18.exe" -setwindowshook mode -OnRun idx=9 prog="D:\Games\If-18 Carrier Strike Fighter\if18.exe" -setwindowshook mode -OnRun idx=9 prog="D:\Games\If-18 Carrier Strike Fighter\if18.exe" -setwindowshook mode -OnRun idx=9 prog="D:\Games\If-18 Carrier Strike Fighter\if18.exe" -setwindowshook mode -OnRun idx=9 prog="D:\Games\If-18 Carrier Strike Fighter\if18.exe" -setwindowshook mode -OnRun idx=9 prog="D:\Games\If-18 Carrier Strike Fighter\if19.exe" -setwindowshook mode -OnRun idx=9 prog="D:\Games\If-18 Carrier Strike Fighter\if19.exe" -setwindowshook mode -OnRun idx=9 prog="D:\Games\If-18 Carrier Strike Fighter\if19.exe" -setwindowshook mode diff --git a/build/dxwnd.reg b/build/dxwnd.reg deleted file mode 100644 index 79a481e..0000000 --- a/build/dxwnd.reg +++ /dev/null @@ -1,16 +0,0 @@ -[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Dark Omen\1.0\Options\Options] -"Selected"="4" -"HardwareSelected"="252" -"SoftwareSelected"="228" -"MMXSelected"="256" -"ToolTips"="1" -"MusicVolume"="408" -"SFXVolume"="816" -"SoftwareSoundQuality"="2" -"SoftwareParticleQuality"="2" -"MMXSoundQuality"="2" -"MMXParticaleQuality"="1" -"HardwareSoundQuality"="2" -"HardwareParticleQuality"="2" -"InformationNum"="11" - diff --git a/build/exports/Crimson Skies.dxw b/build/exports/Crimson Skies.dxw index d8e69fa..9d127d1 100644 --- a/build/exports/Crimson Skies.dxw +++ b/build/exports/Crimson Skies.dxw @@ -1,11 +1,11 @@ [target] title0=Crimson Skies -path0=D:\Games\Crimson_Skies\crimson.exe +path0=F:\Games\Crimson Skies\crimson.exe module0= opengllib0= ver0=7 coord0=0 -flag0=140525606 +flag0=677396518 flagg0=1207959568 flagh0=20 flagi0=4194596 @@ -30,3 +30,13 @@ notes0= flagk0=65536 swapeffect0=0 registry0= +startfolder0= +monitorid0=0 +flagl0=512 +flagm0=0 +dflag0=0 +maxddinterface0=7 +slowratio0=1 +scanline0=1 +initresw0=0 +initresh0=0 diff --git a/build/exports/DOSBox-0.74.dxw b/build/exports/DOSBox-0.74.dxw new file mode 100644 index 0000000..261981c --- /dev/null +++ b/build/exports/DOSBox-0.74.dxw @@ -0,0 +1,36 @@ +[target] +title0=DOSBox-0.74 +path0=C:\Program Files (x86)\DOSBox-0.74\DOSBox.exe +startfolder0= +launchpath0= +module0=sdl.dll +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136314914 +flagg0=1208090624 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=4259840 +flagl0=4489216 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/Dinosaur Resurrection.dxw b/build/exports/Dinosaur Resurrection.dxw new file mode 100644 index 0000000..3ad193a --- /dev/null +++ b/build/exports/Dinosaur Resurrection.dxw @@ -0,0 +1,35 @@ +[target] +title0=Dinosaur Resurrection +path0=F:\Games\Dinosaur Resurrection\FALCOM\DIN\DIN_Win.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=8388608 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=640 +initresh0=480 diff --git a/build/exports/Need for Speed 5 Porsche Unleashed.dxw b/build/exports/Need for Speed 5 Porsche Unleashed.dxw new file mode 100644 index 0000000..a42a283 --- /dev/null +++ b/build/exports/Need for Speed 5 Porsche Unleashed.dxw @@ -0,0 +1,35 @@ +[target] +title0=Need for Speed 5 Porsche Unleashed +path0=F:\Games\Need for Speed 5\Porsche.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=32768 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/exports/Ultimate Spiderman.dxw b/build/exports/Ultimate Spiderman.dxw new file mode 100644 index 0000000..538362e --- /dev/null +++ b/build/exports/Ultimate Spiderman.dxw @@ -0,0 +1,36 @@ +[target] +title0=Ultimate Spiderman +path0=F:\Games\Ultimate Spiderman\USM.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673202214 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=1073746048 +flagk0=65536 +flagl0=1048576 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/dxwnd.log b/build/exports/dxwnd.log index ef57fae..af4a6d5 100644 --- a/build/exports/dxwnd.log +++ b/build/exports/dxwnd.log @@ -1,6 +1,12 @@ -OnRun idx=7 prog="F:\Games\Warhammer 40K Rites Of War\RoW.exe" +OnRun idx=23 prog="D:\Games\Crimson_Skies\crimson.exe" setwindowshook mode -OnRun idx=7 prog="F:\Games\Warhammer 40K Rites Of War\RoW.exe" -setwindowshook mode -OnRun idx=7 prog="F:\Games\Warhammer 40K Rites Of War\RoW.exe" +OnRun idx=23 prog="D:\Games\Crimson_Skies\crimson.exe" setwindowshook mode +OnRun idx=23 prog="D:\Games\Crimson_Skies\crimson.exe" +injectsuspended mode +InjectSuspended: exe=D:\Games\Crimson_Skies\crimson.exe dir=D:\Games\Crimson_Skies +Target handle=844 +NT Header offset=F8 +AddressOfEntryPoint=1F7056 ImageBase=400000 +Thread start address=5f7056 +wait cycle 0 eip=5f7056 diff --git a/build/help/Colormanagement.html b/build/help/Colormanagement.html index 2094666..732078d 100644 --- a/build/help/Colormanagement.html +++ b/build/help/Colormanagement.html @@ -51,7 +51,7 @@ Previous - Next + Next
diff --git a/build/help/Commandlinearguments.html b/build/help/Commandlinearguments.html index 022a37b..34f4118 100644 --- a/build/help/Commandlinearguments.html +++ b/build/help/Commandlinearguments.html @@ -86,6 +86,18 @@

Enables debug features. Not recommended!

+ +

/R:n

+ +

Automatically starts DxWnd iconized to the system tray, runs the nth program in the configuration file, and exits DxWnd.

+ + + +

/q

+ +

Quiet mode. DxWnd will not produce message dialogs.

+ +

diff --git a/build/help/Generic.html b/build/help/Generic.html index b179e05..8107856 100644 --- a/build/help/Generic.html +++ b/build/help/Generic.html @@ -89,7 +89,7 @@

SAVELOAD

-

Optimizes the CPU load, but only for DirectDraw operations (DirectX1 to DirectX7).

+

Optimizes the CPU load, but only for DirectDraw operations (DirectX1 to DirectX9).

diff --git a/build/help/Screenresolution.html b/build/help/Screenresolution.html index 9232d73..350051b 100644 --- a/build/help/Screenresolution.html +++ b/build/help/Screenresolution.html @@ -49,7 +49,7 @@
Parent - Previous + Previous Next diff --git a/build/help/Windowsizeposition.html b/build/help/Windowsizeposition.html new file mode 100644 index 0000000..3f0f703 --- /dev/null +++ b/build/help/Windowsizeposition.html @@ -0,0 +1,100 @@ + + + + Window size & position + + + + + + + + + + + + + + + + + +
+
+

Window size & position

+ +
+ The configuration panel ›› Video ››
+
+
+ Parent + + Previous + + Next + +
+
+
+
+ +

+
+ + + + + + + + + + + + + + + + +

Free

+

Allows you to move and resize the window freely, with commands from inside the application (through system calls) or from external user commands (such as grabbing the window border to stretch or move the window).

+

Floating

+

Move and resize operations are allowed only from user commands, but internal operations are intercepted and neutralized.

+

Locked size

+

It is only possible to move the window from user external commands, and the window can't be stretched or altered from internal operations.

+

Anchored

+

The window will remain fixed in its original position.

+
+
+

+
+ + + + + + diff --git a/build/help/js/hndsd.js b/build/help/js/hndsd.js index bdec263..1b31a5a 100644 --- a/build/help/js/hndsd.js +++ b/build/help/js/hndsd.js @@ -1 +1 @@ -var aTl=[['Introduction.html','Introduction'],['Gettingstarted.html','Getting%20started'],['TheInterface.html','The%20Interface'],['File.html','File'],['Hook.html','Hook'],['Edit.html','Edit'],['Move.html','Move'],['Log1.html','Log'],['Globalsettings.html','Global%20settings'],['Flags.html','Flags'],['Texturelimits.html','Texture%20limits'],['FunctionKeys.html','Function%20Keys'],['HotKeys.html','Hot%20Keys'],['Tools.html','Tools'],['Window1.html','Window'],['Process.html','Process'],['Desktoptaskbar.html','Desktop%20taskbar'],['Desktopcolordepth.html','Desktop%20color%20depth'],['View.html','View'],['Status.html','Status'],['TimeSlider.html','Time%20Slider'],['Palette1.html','Palette'],['Desktop.html','Desktop'],['Shims.html','Shims'],['Help.html','Help'],['ProgramList.html','Program%20List'],['DxWndintheSystemTray.html','DxWnd%20in%20the%20System%20Tray'],['Theconfigurationpanel.html','The%20configuration%20panel'],['Main.html','Main'],['Generic.html','Generic'],['Position.html','Position'],['Hook1.html','Hook'],['Injectionmode.html','Injection%20mode'],['Hookflags.html','Hook%20flags'],['Sonprocesshook.html','Son%20process%20hook'],['Additionallibrarieshook.html','Additional%20libraries%20hook'],['Video.html','Video'],['Windowshandling.html','Windows%20handling'],['Initialvirtualcolorsetting.html','Initial%20virtual%20color%20setting'],['Colormanagement.html','Color%20management'],['Screenresolution.html','Screen%20resolution'],['Input.html','Input'],['Cursorvisibility.html','Cursor%20visibility'],['DirectInput.html','DirectInput'],['Cursorhandling.html','Cursor%20handling'],['Messagehandling.html','Message%20handling'],['Keyboardhandling.html','Keyboard%20handling'],['DirectX.html','DirectX'],['DirectXVersionHook.html','DirectX%20Version%20Hook'],['Emulation.html','Emulation'],['Filtering.html','Filtering'],['DirectDrawSurfacehandling.html','DirectDraw%20Surface%20handling'],['AEROhandling.html','AERO%20handling'],['DirectX2.html','DirectX%282%29'],['Ddrawtweaks.html','Ddraw%20tweaks'],['Direct3D.html','Direct3D'],['Direct3Dtweaks.html','Direct3D%20tweaks'],['Texturehandling.html','Texture%20handling'],['Direct3Dwindowtweaks.html','Direct3D%20window%20tweaks'],['SwapEffect.html','Swap%20Effect'],['3Deffects1.html','3D%20effects'],['Timing.html','Timing'],['FrameperSecond.html','Frame%20per%20Second'],['Systemspeed.html','System%20speed'],['TimeStretching.html','Time%20Stretching'],['Logs.html','Logs'],['dxwndlogs.html','dxwnd%20logs'],['logoptions.html','log%20options'],['loggedinfo.html','logged%20info'],['Libs.html','Libs'],['GDI.html','GDI'],['OpenGL.html','OpenGL'],['Smack.html','Smack'],['MMmultimedia.html','MM%20%28multimedia%29'],['Compatibility.html','Compatibility'],['Tweaks.html','Tweaks'],['Registry.html','Registry'],['FakeVersion.html','Fake%20Version'],['GOG.html','GOG'],['IOtweaks.html','I/O%20tweaks'],['Registry1.html','Registry'],['Notes.html','Notes'],['Configurationfile.html','Configuration%20file'],['Window.html','Window'],['Language.html','Language'],['Position1.html','Position'],['Texture.html','Texture'],['Keymapping.html','Keymapping'],['Examples.html','Examples'],['SnowBoardRacer.html','SnowBoard%3A%20Racer'],['RobinHoodTheLegendofSherwood.html','Robin%20Hood%20%2D%20The%20Legend%20of%20Sherwood'],['Specialkeys.html','Special%20keys'],['Commandlinearguments.html','Command%20line%20arguments']];var oWl=['hotpatch',[[33,1]],'content',[[54,1],[70,1],[57,1],[24,1],[79,1]],'otherwise',[[66,1],[11,1]],'examples',[[51,1],[54,2],[88,2],[56,1]],'beginning',[[32,1],[29,1],[33,1],[67,2]],'capabilities',[[54,2]],'exclamation',[[81,1]],'queues',[[68,1]],'matching',[[57,1]],'become',[[79,1]],'fortunately',[[31,1]],'integer',[[75,1]],'altf4',[[87,1],[91,1]],'surviving',[[0,1]],'few',[[82,1],[92,1],[1,1],[3,1],[2,1],[0,2]],'rare',[[54,1],[49,1],[75,1],[31,1]],'row',[[2,1],[11,1]],'itself',[[37,1],[48,1],[29,2],[2,1],[28,1]],'meanwhile',[[0,1]],'elements',[[28,1],[54,1],[62,1],[39,1]],'configure',[[83,1],[29,1]],'application',[[0,5],[45,3],[16,2],[68,1],[37,1],[5,3],[51,1],[29,1],[54,1],[71,1],[2,1],[91,2],[3,2],[40,1],[11,1],[7,2]],'idea',[[30,1],[75,1]],'buttons',[[44,1]],'attempting',[[13,1],[75,1]],'speed',[[63,1],[87,2],[0,1],[75,2],[20,1],[91,1],[64,5],[11,2]],'article',[[23,1]],'terminating',[[2,1]],'recovered',[[48,1]],'ahlgrens',[[51,1]],'channel',[[51,2]],'enumerate',[[56,1]],'let',[[5,1],[75,1],[0,3]],'preventmaximize',[[37,1]],'increments',[[64,1]],'hookglut32',[[71,1]],'key',[[87,1],[46,4],[43,1],[12,1],[75,2],[91,4],[11,2]],'blocks',[[75,1]],'limitresources',[[75,1]],'combination',[[75,1]],'stretching',[[49,1],[29,1],[70,2],[87,1],[45,1],[48,1],[20,2],[52,1],[91,3],[64,3]],'shows',[[19,2],[90,1],[16,1],[20,1],[64,1],[21,1],[22,1],[23,1],[26,1],[2,2],[24,1],[43,1],[89,1]],'when',[[73,3],[19,1],[50,1],[0,3],[56,1],[84,2],[39,4],[9,2],[29,4],[51,4],[54,10],[2,3],[4,1],[91,5],[32,1],[30,3],[28,1],[31,1],[44,4],[62,3],[68,1],[64,7],[37,3],[25,1],[43,6],[72,1],[75,4],[85,1],[33,1],[11,2]],'fake',[[77,2],[11,1],[30,5]],'detailed',[[18,1],[68,1]],'glpixelzoom',[[71,2]],'whoever',[[24,1],[0,1]],'config',[[92,1],[37,1]],'downloaded',[[0,1]],'reference',[[30,1],[54,2]],'works',[[9,1],[49,1],[54,1],[31,1],[60,1],[13,1],[32,2],[48,1],[33,1],[56,1]],'prompting',[[29,1]],'never',[[75,2],[0,2]],'from',[[87,1],[1,1],[67,1],[0,3],[39,3],[59,1],[9,1],[29,1],[49,1],[51,3],[2,3],[54,3],[4,1],[60,1],[71,1],[32,3],[80,2],[40,3],[79,3],[82,1],[30,2],[31,1],[44,1],[45,5],[13,1],[52,1],[92,1],[64,1],[37,2],[25,1],[72,1],[75,3],[3,1],[33,3],[58,1]],'virtual',[[73,1],[49,2],[51,2],[54,3],[38,1],[50,1],[44,1],[80,3],[79,2]],'lockreservedpalette',[[39,1]],'filling',[[1,1]],'bypassmci',[[73,1]],'incorrect',[[56,2],[54,2]],'shutting',[[32,1]],'suppresses',[[45,1],[54,2],[70,1],[56,1],[79,1],[39,1]],'specification',[[54,1],[84,5]],'cleans',[[60,1]],'module',[[31,1],[75,1]],'approximately',[[20,2]],'crashing',[[32,1]],'declaring',[[38,3]],'situation',[[45,1],[33,2]],'videogame',[[0,1]],'block',[[75,1],[32,1]],'direct3d9',[[48,1]],'timestamp',[[67,6]],'rid',[[15,1]],'assembly',[[33,1],[64,3]],'operate',[[2,1],[54,1]],'calculated',[[19,1]],'hookgdi',[[70,1]],'fifth',[[75,1]],'fixtextout',[[70,1]],'enable',[[46,1],[9,1],[44,1]],'scrolling',[[51,2],[44,1]],'api',[[39,3],[64,1],[70,2],[71,1],[44,2],[45,1],[75,3],[56,1],[33,4],[35,1]],'series',[[44,1],[37,1]],'each',[[79,1],[30,1],[28,1],[45,1],[50,1],[67,3],[64,2],[27,1],[15,1],[51,1],[54,1],[66,1],[2,1],[34,2],[48,1],[33,2],[18,1],[57,1]],'differently',[[25,1]],'operation',[[63,1],[51,4],[70,1],[50,1],[75,2],[32,1],[3,1],[56,1],[79,1]],'task',[[19,3],[31,1],[0,1],[28,2],[45,1],[29,2],[25,2],[2,1],[4,1],[91,2],[32,2],[11,2]],'playable',[[54,1]],'sound',[[75,1]],'forget',[[0,1]],'necrodrome',[[44,1]],'ordering',[[56,2]],'set',[[1,1],[19,1],[0,1],[84,2],[49,2],[29,1],[51,4],[54,5],[71,1],[80,2],[91,2],[10,1],[40,2],[79,1],[46,1],[30,4],[28,2],[31,2],[44,3],[52,1],[20,1],[64,4],[5,1],[17,1],[37,1],[63,2],[76,4],[43,2],[75,7],[11,1]],'whenever',[[73,1],[54,1],[80,1],[43,1],[0,1],[85,1],[48,1],[64,1]],'overwrite',[[66,2]],'keys',[[87,3],[46,3],[80,2],[0,1],[12,2],[13,1],[91,2],[11,9]],'boolean',[[84,3]],'predefined',[[1,1]],'sys',[[39,1]],'pixels',[[85,2],[50,1],[0,1]],'246',[[39,1]],'found',[[33,1],[2,1],[0,2]],'disabledisablealttab',[[75,1]],'currently',[[84,1],[26,1],[14,2],[25,1],[19,1],[2,1],[0,2],[70,2],[3,1],[35,1],[37,1]],'wouldn',[[51,1]],'access',[[35,1],[64,1],[43,2],[18,1]],'dynamically',[[20,1]],'pity',[[0,1]],'injection',[[0,1],[34,2],[75,1],[32,3],[24,1],[2,1]],'100%',[[44,1],[75,1],[0,1]],'necessary',[[33,1],[40,1],[64,1]],'versions',[[84,1],[54,1],[33,1],[43,1],[56,2]],'wm_activateapp',[[37,1]],'nopixelformat',[[51,1]],'lighter',[[39,1]],'cpus',[[75,2]],'unsupported',[[75,3],[84,1]],'wm_windowposchanging',[[45,1]],'tweaked',[[54,1]],'nobanner',[[29,1]],'preventing',[[45,1],[39,1],[71,1],[44,1]],'clicks',[[45,1]],'pending',[[45,1]],'placed',[[1,1],[30,1],[44,2]],'acceleration',[[54,1],[75,1]],'regardless',[[0,2]],'retrieve',[[45,1]],'released',[[51,1],[54,1]],'singleprocaffinity',[[75,2]],'source',[[0,5]],'leave',[[48,1]],'definitions',[[46,1]],'print',[[11,1]],'wow32registry',[[76,1]],'saves',[[3,1],[11,1]],'closely',[[32,1]],'adjusts',[[77,1]],'greater',[[62,2],[32,1]],'read',[[51,2],[54,1],[76,2],[80,1]],'fourcc',[[54,3]],'lacks',[[56,1]],'setsyscolors',[[39,1]],'simple',[[2,1],[0,1]],'type',[[54,1],[68,1],[79,3],[43,1]],'blue',[[80,1]],'object',[[30,1]],'sizes',[[73,1],[56,1],[54,1]],'getting',[[15,1],[1,1]],'changing',[[37,2],[78,1],[32,1]],'reaction',[[45,1]],'romsteady',[[24,1]],'keeps',[[45,1],[43,2],[44,1]],'architectures',[[0,1]],'noted',[[62,1]],'stored',[[85,1],[82,1]],'invokes',[[60,1]],'even',[[51,3],[54,1],[80,1],[43,3],[0,6],[75,1],[91,1],[3,1],[11,1],[84,1]],'tweak',[[54,1],[75,2]],'well',[[91,1],[54,1],[29,1],[45,2],[48,1],[32,1],[75,1],[33,1],[11,1],[37,1]],'network',[[0,1]],'directsound',[[35,2]],'figures',[[62,1]],'serve',[[9,1]],'comments',[[81,1]],'clock',[[64,4]],'50%',[[64,1]],'unwanted',[[37,1],[32,1]],'tray',[[26,5],[92,2],[3,3],[19,1],[2,1]],'lockwinstyle',[[37,1]],'max',[[63,1],[75,1],[10,1],[40,1]],'zeta',[[56,2]],'possibility',[[91,1],[68,1],[79,1],[11,1]],'destroywindow',[[70,1]],'special',[[87,1],[46,2],[91,2],[57,1],[11,7]],'under',[[33,1]],'started',[[37,1],[9,1],[1,1],[2,1],[0,2]],'five',[[45,1]],'selected',[[63,1],[59,1],[23,1],[25,3],[6,4],[30,1],[3,1],[40,1],[7,2],[5,2]],'kind',[[24,1]],'including',[[34,1],[22,1],[3,1],[58,1]],'than',[[1,1],[30,4],[28,1],[0,2],[62,3],[56,1],[63,1],[49,1],[54,3],[2,1],[43,1],[40,1],[11,2]],'themselves',[[45,1],[15,1],[51,1]],'space',[[33,1],[75,1]],'behavior',[[78,1],[30,1],[44,1],[4,1],[0,7],[77,1],[91,1],[92,1],[57,1],[84,1],[37,1]],'restarts',[[29,1]],'sharing',[[0,1]],'2ms',[[63,1]],'enum16bitmodes',[[56,1]],'hooker',[[0,2]],'skipdevtypehid',[[43,1]],'invoking',[[52,1]],'detail',[[11,1],[91,1]],'attempt',[[37,1],[75,1],[0,2]],'big',[[75,1]],'background',[[30,2],[51,1]],'izer',[[0,1]],'apes',[[43,1]],'unchecked',[[46,1]],'writes',[[68,1],[9,1],[1,1]],'mix',[[70,1]],'showhwcursor',[[42,1]],'where',[[50,1],[44,1],[5,1],[37,1],[51,1],[54,1],[70,1],[66,1],[2,2],[3,1],[57,1],[33,2],[11,1]],'composition',[[56,1],[49,1]],'situations',[[51,1]],'quarterblt',[[62,1]],'encourage',[[0,1]],'address',[[33,4],[51,1],[75,1]],'viewfinder',[[44,1]],'expects',[[37,1]],'japanese',[[0,1]],'listening',[[43,1]],'automatically',[[45,3],[34,3],[48,1],[29,1],[30,2]],'bilinearfilter',[[50,1]],'calculate',[[75,1]],'editing',[[82,1]],'won',[[45,1],[2,2]],'experience',[[30,1]],'editor',[[57,1],[7,1]],'quit',[[11,2],[91,2]],'launch',[[81,1],[80,1],[28,1]],'bilinear2xfilter',[[50,1]],'isn',[[33,1],[13,1],[51,1]],'1000th',[[63,1]],'pointing',[[25,1]],'directinput',[[43,10]],'fit',[[49,1],[70,2],[71,1],[50,1]],'posx',[[85,4]],'double',[[26,1],[1,2],[25,1],[50,1]],'machine',[[54,1],[0,1]],'bug',[[49,1]],'imported',[[2,1]],'classification',[[30,1]],'looping',[[72,1],[44,1]],'addrelativetime',[[67,1]],'now',[[49,1],[75,1],[70,1],[0,2]],'arguments',[[92,2],[28,1]],'short',[[68,1],[29,1]],'needed',[[25,1],[32,1]],'explicit',[[73,1],[51,1]],'final',[[52,1]],'exceptions',[[75,2],[82,1]],'techniques',[[0,1]],'closes',[[14,1]],'update',[[51,2],[1,1],[33,1],[62,1],[58,1]],'pressing',[[12,1]],'onward',[[45,1],[75,1],[0,2]],'tigerhawkt3',[[24,1]],'while',[[30,2],[0,5],[45,1],[67,1],[16,2],[56,2],[37,1],[9,1],[51,1],[54,1],[3,2],[33,1],[11,4]],'gameplay',[[11,1]],'alone',[[48,1]],'time',[[87,3],[1,1],[62,1],[0,9],[20,7],[68,1],[64,14],[63,1],[29,1],[60,2],[34,1],[48,1],[75,1],[85,1],[91,4],[18,1],[11,8]],'height',[[19,1],[30,6],[85,3],[10,2],[86,2],[40,2]],'managed',[[25,1],[49,1]],'malfunctioning',[[45,1]],'behaviour',[[33,1]],'extracting',[[57,1]],'involves',[[49,1]],'duration',[[67,1]],'such',[[87,1],[30,1],[0,2],[44,2],[45,4],[62,1],[67,1],[81,1],[64,1],[39,1],[37,2],[84,1],[51,2],[29,1],[43,1],[75,2],[32,1],[79,1]],'synchronization',[[24,1]],'annoying',[[0,2]],'worms',[[37,1]],'lack',[[49,1]],'suppressime',[[75,1]],'side',[[75,1],[0,1]],'exported',[[3,1],[56,1]],'codec',[[54,1]],'render',[[58,1]],'intercepted',[[68,1],[70,1],[19,1],[33,1],[64,1]],'impossible',[[45,2]],'unfortunately',[[33,1],[54,1],[0,1]],'written',[[37,1],[0,2]],'right',[[26,1],[54,1],[25,1],[80,1],[2,1],[44,2],[81,1],[32,1],[33,1],[37,1]],'selection',[[30,2]],'child',[[58,1],[34,5],[81,1],[33,2],[37,2]],'monitors',[[54,1],[37,1]],'way',[[51,5],[54,1],[30,1],[0,5],[4,1],[45,1],[62,1],[84,1]],'binplayer',[[34,1]],'moving',[[58,1],[64,1],[44,2]],'ads',[[46,1]],'easier',[[57,2],[67,1]],'reg',[[76,2],[82,1],[0,1]],'confirm',[[3,1],[29,1]],'uselastcore',[[75,1]],'measures',[[67,1]],'directx7',[[48,1],[29,1]],'there',[[1,1],[0,5],[44,1],[45,1],[56,1],[64,1],[9,1],[51,2],[60,1],[82,1],[3,1],[57,1],[33,2],[40,1]],'creating',[[51,1],[54,1]],'beneath',[[29,1]],'disabled',[[46,1],[40,1],[0,1]],'offered',[[67,1]],'replace',[[57,1],[54,1],[75,1]],'settings',[[0,1],[81,1],[42,1],[8,1],[5,4],[37,4],[39,1],[22,1],[29,1],[25,1],[80,1],[2,1],[82,1],[83,1],[32,1],[11,1]],'further',[[56,1],[0,1]],'boxes',[[29,1],[1,1]],'far',[[81,1],[51,1],[33,1],[37,1]],'appearance',[[81,1],[80,1]],'tabbed',[[27,1]],'priorities',[[15,1]],'mandatory',[[75,1]],'increase',[[91,1],[87,1],[0,1]],'f12',[[87,1],[11,1],[12,1]],'properly',[[54,1],[29,1],[71,1],[43,1],[45,1],[48,1],[75,2],[56,4],[64,1],[37,2]],'forbid',[[75,1]],'focus',[[43,3]],'stays',[[3,1]],'ollydbg',[[24,1]],'handleexceptions',[[75,1]],'infinite',[[86,2]],'restored',[[3,1]],'opens',[[7,1],[5,3]],'loop',[[72,2],[75,1],[46,2]],'createdevice',[[59,1]],'back',[[14,1],[43,1],[0,1]],'doesn',[[63,1],[92,1],[51,3],[54,1],[43,1],[48,1],[52,1],[75,2],[91,1],[11,1],[58,1]],'quite',[[49,1],[68,2],[70,1],[91,1],[2,1],[11,1]],'caps',[[54,1],[29,1]],'box',[[45,1],[31,1],[29,1]],'section',[[76,2],[57,1]],'bypass',[[73,1],[78,1],[75,1]],'crucial',[[0,1]],'only',[[1,2],[46,1],[30,4],[0,5],[39,1],[37,2],[63,1],[9,1],[29,3],[49,1],[51,4],[2,2],[43,2],[54,4],[60,2],[70,1],[32,2],[75,1],[33,2],[11,2],[78,2]],'alt',[[12,1],[46,3],[75,2],[87,3],[11,2],[91,1]],'blocking',[[33,1]],'harm',[[44,1]],'states',[[44,1]],'imperia',[[51,1]],'according',[[63,1],[54,1],[75,1],[30,1]],'requests',[[79,1]],'seemed',[[0,1]],'nowindowmove',[[58,1]],'occasionally',[[45,1]],'backs',[[51,1]],'ordinal',[[33,1]],'confirmonclose',[[29,1]],'depend',[[70,1],[64,1]],'800x600',[[30,1]],'heavy',[[75,1]],'swap',[[59,2]],'keeping',[[43,1]],'wireframe',[[60,3]],'displacement',[[44,1]],'modified',[[9,2]],'library',[[71,4],[24,1]],'regain',[[43,1]],'something',[[5,1],[0,1]],'suspend',[[63,1]],'higher',[[40,1],[11,1]],'same',[[38,3],[0,3],[45,1],[77,1],[63,2],[49,2],[51,1],[25,1],[70,1],[43,2],[34,2],[75,1],[85,3],[33,1]],'falling',[[0,1]],'obfuscation',[[33,1]],'threads',[[63,3]],'heights',[[10,1]],'reading',[[54,1]],'spot',[[67,1]],'chosen',[[49,1],[30,1],[28,1],[77,2],[12,1],[37,1]],'asian',[[0,1]],'unable',[[48,1],[32,1]],'compose',[[71,1]],'wow64registry',[[76,1]],'tasks',[[91,1],[11,2],[0,2]],'looks',[[84,1]],'320',[[85,1]],'was',[[54,3],[25,1],[70,1],[30,2],[24,1],[0,7],[44,1],[45,1],[3,2],[33,1],[79,1]],'manage',[[51,1],[75,1],[56,1],[57,1],[37,1]],'undesired',[[60,1]],'com',[[78,1],[48,1]],'galapagos',[[72,1]],'yellow',[[32,1]],'releases',[[56,1],[71,1],[28,1]],'messageproc',[[45,1],[44,1]],'probably',[[71,1],[30,1]],'tested',[[1,2]],'has',[[49,1],[46,1],[54,1],[19,1],[30,2],[0,3],[34,1],[75,2],[33,3],[7,2]],'region',[[44,1],[91,1],[62,1],[11,1]],'virtualpc',[[54,1]],'overheating',[[75,1]],'scrollable',[[67,1]],'shares',[[70,1]],'fpstoggle',[[87,1],[91,1]],'distorting',[[54,1]],'fixrefcounter',[[54,1]],'fast',[[11,1],[50,1]],'simulate',[[54,1]],'session',[[25,1],[66,1],[54,1]],'fully',[[70,1],[75,1]],'domain',[[51,1]],'received',[[45,1]],'again',[[43,1],[26,1],[91,1],[3,1],[11,1],[0,2]],'telling',[[48,1]],'code',[[51,1],[87,1],[24,3],[0,7],[2,1],[75,2],[33,1],[64,1]],'widescreen',[[30,1]],'outd3dtrace',[[68,1]],'windowed',[[30,1],[0,1],[44,1],[45,2],[68,1],[37,1],[49,1],[29,1],[51,3],[54,4],[2,2],[60,1],[70,4],[75,2],[11,2]],'measurement',[[75,1]],'wonderful',[[0,1]],'clipboard',[[11,1]],'involve',[[32,1]],'shortcut',[[5,1],[1,1],[2,1],[0,1]],'son',[[34,1]],'revert',[[39,1]],'supporthdmi',[[40,1]],'dxw',[[3,1]],'fixed',[[44,1],[19,1],[32,1]],'yes',[[19,1]],'disablegammaramp',[[39,1]],'devices',[[79,5],[43,4]],'unexpected',[[45,1]],'videotosystemmem',[[51,1]],'power2width',[[54,1]],'device',[[70,3],[79,2],[43,2]],'mind',[[68,1],[2,1],[0,2]],'point',[[44,1],[32,1]],'moved',[[91,1],[62,1],[44,1]],'running',[[1,1],[19,3],[0,3],[16,2],[56,2],[37,1],[63,1],[26,2],[14,2],[29,2],[51,1],[2,1],[54,2],[4,2],[60,1],[70,1],[75,1],[3,1],[33,1],[11,1]],'getcursorpos',[[44,1]],'one',[[1,1],[19,2],[31,1],[0,7],[45,1],[62,1],[67,1],[64,1],[37,2],[51,1],[54,1],[25,2],[70,1],[6,2],[80,1],[75,2],[3,1],[33,3],[79,1]],'overlaps',[[70,1],[44,1]],'directx8',[[48,2]],'eliminate',[[54,1]],'avoids',[[49,1]],'wm_windowposchanged',[[45,1]],'freestyle',[[54,1]],'forcehookopengl',[[71,1]],'zbuffer0clean',[[56,2]],'fakeversion',[[77,1]],'propose',[[9,1],[84,1]],'corrected',[[2,1],[51,1]],'1980x1080',[[40,1]],'texel',[[57,1]],'archive',[[1,1]],'self',[[9,1],[84,1]],'bits',[[17,1],[56,1],[22,1]],'timeout',[[45,1]],'main',[[58,1],[73,1],[51,1],[71,1],[2,1],[28,1],[80,1],[34,1],[81,1],[33,2],[37,3]],'instead',[[78,2],[49,2],[54,1],[25,1],[71,1],[82,1],[92,1],[33,2],[37,2]],'encoding',[[54,2]],'class',[[75,2]],'equivalent',[[25,1],[78,1],[44,1]],'modes',[[59,1],[49,1],[51,1],[70,1],[30,7],[43,2],[13,1],[75,1],[40,3],[56,3]],'keycode',[[87,1]],'order',[[5,1],[29,1],[37,3]],'performed',[[73,1]],'timing',[[63,1],[61,1],[75,1],[64,5]],'tools',[[80,1],[13,1]],'coded',[[45,1],[33,1],[2,1]],'resizeable',[[37,1]],'dealing',[[0,1]],'tweaking',[[54,1]],'unpredictable',[[0,1]],'captures',[[11,1]],'piece',[[0,1]],'open',[[25,1],[0,2]],'shared',[[0,1],[84,1],[70,1],[43,1],[24,1]],'fixd3dframe',[[58,1]],'button',[[30,3],[44,2]],'yourself',[[51,1],[0,1]],'text',[[54,2],[80,2],[30,1],[31,1],[81,1],[92,1],[40,2],[7,1],[84,1]],'opinion',[[51,1]],'callback',[[32,1]],'restore',[[12,1],[14,1],[15,1],[2,1]],'customized',[[57,1]],'continuously',[[44,1]],'form',[[79,1],[1,1]],'unnecessary',[[71,1]],'board',[[1,1]],'wrong',[[49,1],[75,1]],'inserting',[[72,1]],'layout',[[83,1]],'overridden',[[84,1]],'arranges',[[5,1]],'dual',[[0,1]],'kept',[[84,1]],'with',[[1,3],[19,1],[50,1],[0,8],[67,1],[56,2],[84,2],[9,2],[29,1],[49,2],[51,1],[2,3],[54,8],[60,3],[71,1],[80,2],[32,1],[57,2],[7,1],[30,5],[44,1],[81,2],[52,1],[20,1],[68,2],[64,5],[37,2],[26,1],[25,1],[70,2],[43,2],[34,2],[75,10],[33,1],[11,1],[58,1]],'keep',[[0,2],[44,2],[33,1],[30,2],[2,1]],'cds',[[79,1]],'loads',[[84,1]],'between',[[49,1],[51,1],[70,1],[62,1],[44,2],[67,1],[72,1],[56,2],[11,4]],'working',[[0,1],[51,1],[1,1],[92,1],[37,1]],'obsolete',[[54,1]],'following',[[59,1],[49,1],[25,1],[19,2],[30,1],[48,1],[40,1],[11,1],[84,1]],'lang',[[84,5],[92,1]],'sacrificing',[[54,1]],'nosysmembackbuf',[[54,1]],'wm_nchittest',[[44,2]],'madness',[[54,1]],'understand',[[0,1]],'direcx7',[[48,1]],'absolute',[[2,1]],'luigi',[[24,1]],'saving',[[9,1],[44,1]],'particular',[[57,1],[49,1],[0,1]],'just',[[1,2],[37,1],[0,3]],'maybe',[[0,1]],'possible',[[73,2],[54,1],[1,1],[30,1],[0,3],[45,1],[48,1],[75,1],[33,1],[64,1],[37,1]],'omit',[[71,1],[60,1]],'insert',[[79,1]],'smackopen',[[72,1]],'fixnchittest',[[44,1]],'extracted',[[57,1]],'like',[[1,4],[70,1],[80,1],[30,1],[0,5],[45,3],[34,1],[75,2],[33,1],[11,2]],'range',[[87,1],[64,1],[75,1]],'offending',[[45,2]],'option',[[67,2],[56,2],[39,2],[9,3],[29,1],[49,3],[51,5],[54,4],[60,1],[48,2],[91,2],[57,1],[7,2],[38,1],[30,2],[90,1],[45,3],[64,3],[37,1],[63,1],[89,2],[70,1],[43,1],[72,1],[34,4],[75,2],[3,1],[11,1]],'cpu',[[63,5],[54,1],[29,2],[0,1],[44,2],[75,3]],'significant',[[68,1]],'without',[[51,1],[29,1],[25,1],[43,1],[0,2],[2,1],[45,1],[62,1],[91,1],[56,1],[11,1],[64,1]],'folders',[[9,1]],'trilogy',[[33,1]],'screen',[[87,1],[19,1],[30,4],[0,3],[44,1],[50,1],[13,1],[52,1],[62,11],[64,1],[39,2],[37,4],[49,2],[29,2],[51,3],[71,2],[2,1],[72,2],[75,1],[91,1],[40,5],[11,5]],'file',[[1,4],[46,1],[67,2],[92,3],[84,1],[5,1],[9,4],[26,1],[25,2],[66,4],[76,2],[80,1],[82,3],[48,1],[3,3],[57,2],[10,1],[7,3]],'rely',[[54,1],[75,1]],'hardware',[[49,1],[54,7],[44,1],[0,1],[42,2],[75,3],[56,2],[35,1],[64,1]],'superchamps',[[43,1]],'wrapper',[[54,1]],'implemented',[[70,1],[33,1],[35,1]],'activated',[[64,1],[15,1],[32,1],[3,1],[2,2],[28,1]],'explained',[[0,1]],'movies',[[73,4],[51,1],[54,3],[45,1],[34,2],[72,2]],'net',[[0,1]],'titleless',[[37,1]],'specific',[[54,1],[30,2],[0,2],[45,1],[91,1],[64,1],[11,1]],'upwards',[[6,1]],'port',[[75,1],[84,1]],'resolves',[[51,1],[54,2]],'consuming',[[63,1]],'rerouting',[[78,2]],'eliminating',[[30,1]],'activate',[[54,1],[2,1],[26,1]],'drive',[[79,1],[1,2]],'intercept',[[46,1],[44,1],[0,1],[34,1],[75,3],[32,3],[33,1],[64,1],[37,1]],'finer',[[64,2]],'inclusion',[[56,1]],'makes',[[51,1],[54,2],[70,3],[62,1],[67,1],[45,2],[57,1],[84,1],[37,2]],'reported',[[9,1],[75,1]],'nod3dreset',[[56,1]],'basic',[[48,1],[32,1],[79,1],[0,3]],'know',[[0,1]],'recommended',[[92,1]],'imagehlp',[[75,2]],'dinput8',[[43,1]],'prevent',[[4,1],[39,1],[51,1],[58,1],[33,1],[37,1]],'640x360',[[40,1]],'protection',[[79,1]],'off”',[[44,1]],'blizzard',[[11,1],[75,1]],'unless',[[64,1],[0,1]],'want',[[0,1],[44,2],[48,1],[82,1],[30,1],[2,1]],'add',[[27,1],[1,2],[25,1],[80,1],[2,1],[0,1],[45,1],[34,1],[67,2],[81,1],[5,1]],'issues',[[75,1],[1,1],[56,2],[64,1],[71,1]],'skipfps',[[62,2]],'happy',[[29,1]],'combinations',[[17,1],[75,1]],'sizx',[[85,1]],'movement',[[45,1],[51,1],[43,1],[44,2]],'replication',[[71,1]],'described',[[75,1]],'discovered',[[75,1]],'cause',[[73,1],[84,1],[44,1],[45,1],[91,1],[33,2],[11,1],[58,1]],'allowing',[[72,1],[54,2],[32,3],[35,1],[0,1]],'injectson',[[34,1]],'“cursor',[[44,1]],'allocated',[[75,1]],'common',[[51,2],[1,1],[70,2],[88,1],[43,1],[0,1],[75,1],[33,1],[11,1],[64,1]],'portions',[[0,1]],'enablesonhook',[[34,1]],'refers',[[30,1]],'format',[[85,1],[22,1],[51,4],[10,1],[80,1],[87,1]],'different',[[49,1],[54,1],[25,1],[70,1],[31,2],[0,3],[50,1],[71,2],[48,2],[33,2],[56,3],[84,1]],'available',[[84,3],[54,4],[87,2],[44,1],[48,1],[75,3],[56,1],[64,1],[79,2]],'activating',[[34,1]],'zbufferbitdepths',[[54,1]],'matter',[[25,1],[33,1],[51,1]],'done',[[33,1]],'multiprocesshook',[[84,2]],'several',[[73,2],[51,1],[62,1],[0,3],[45,1],[75,1],[33,2],[37,1]],'options',[[88,1],[1,1],[62,1],[67,1],[81,1],[84,1],[37,1],[49,2],[29,1],[89,2],[48,4],[3,1]],'need',[[51,1],[29,1],[54,2],[31,1],[0,2],[45,1],[2,1],[82,1],[92,1],[56,1],[7,1]],'technological',[[0,1]],'hot',[[12,2],[46,3],[87,2],[33,2],[24,1]],'computers',[[60,1],[54,1],[0,1]],'preserved',[[30,1]],'force',[[37,2],[51,1],[71,1],[44,1]],'sizing',[[45,1]],'furthermore',[[49,1]],'extract',[[57,1]],'purpose',[[34,1],[78,1],[0,2]],'technology',[[48,1]],'hookglide',[[35,1]],'leaves',[[54,1],[51,1],[11,1],[90,1]],'don',[[44,1],[28,1],[68,1],[56,3],[64,1],[37,3],[51,3],[29,1],[75,2],[91,1],[79,1],[11,1],[58,1]],'wants',[[0,1]],'wikipedia',[[23,1]],'bilinear',[[24,1],[50,3]],'backbuffer',[[51,4],[54,3]],'zero',[[86,2],[75,1]],'service',[[49,1],[54,1]],'kill',[[45,1],[12,1],[15,1],[25,4],[37,1]],'push',[[0,1]],'dialog',[[29,1],[1,2]],'extended',[[30,1]],'win',[[91,1],[68,1],[70,1],[37,4]],'color',[[73,3],[38,2],[13,3],[52,1],[56,3],[39,2],[17,4],[22,3],[49,6],[51,3],[54,3],[2,1],[75,3],[57,1],[11,2]],'flush',[[45,1]],'interested',[[48,1]],'clones',[[25,1]],'sure',[[43,2]],'drop',[[54,1],[30,1],[1,1]],'accidentally',[[62,1]],'mark',[[81,1]],'accessed',[[12,1]],'cpumaxusage',[[63,1]],'fixfreelibrary',[[75,1]],'gets',[[91,1],[33,1],[11,1],[80,1]],'updates',[[51,1],[62,5]],'conditions',[[33,1],[13,1],[32,1]],'activity',[[11,1],[91,1]],'ddsd_pixelformat',[[51,1]],'generated',[[57,1],[67,1],[68,1]],'unnoticeable',[[44,1],[39,1]],'decelerate',[[11,1]],'supportsvga',[[40,1]],'break',[[49,1],[52,1]],'namely',[[19,1],[64,1],[44,1]],'200',[[85,1]],'disassembly',[[24,1]],'placement',[[30,1]],'card',[[40,1]],'unusual',[[49,1]],'dedicated',[[51,1],[44,1],[48,1],[75,2],[3,1],[64,1]],'debugger',[[32,3]],'remapmci',[[73,1]],'case',[[58,1],[9,1],[51,2],[54,1],[70,1],[44,1],[92,1],[68,1],[37,2]],'suppressdierrors',[[43,1]],'locate',[[1,1]],'will',[[88,1],[1,4],[30,1],[0,5],[45,1],[67,1],[81,1],[84,4],[27,1],[63,1],[9,1],[26,2],[25,1],[29,3],[2,4],[51,1],[66,4],[80,3],[75,4],[32,2],[3,3]],'else',[[0,3]],'overriding',[[11,1],[91,1]],'cross',[[44,1]],'state',[[4,2],[26,3],[46,1],[3,1],[92,1],[2,1]],'troubleshooting',[[1,1]],'always',[[54,1],[24,1],[0,1],[48,1],[3,1],[33,1],[84,1],[58,1]],'stretchmovies',[[73,1]],'preferred',[[7,1],[64,1]],'checked',[[29,2],[64,5],[62,2]],'thing',[[77,1],[0,1]],'injects',[[32,1],[91,1],[0,1]],'highlighted',[[25,1],[0,1]],'jetboat',[[43,1]],'deinterlace',[[54,2]],'choppy',[[63,1]],'alternative',[[51,1]],'slowdown',[[63,1]],'replaceprivops',[[75,1]],'unmount',[[79,1]],'not',[[73,1],[1,1],[19,1],[0,5],[77,1],[56,4],[35,1],[84,1],[49,2],[29,5],[51,4],[54,7],[2,1],[60,1],[71,1],[80,1],[48,1],[32,1],[40,1],[57,1],[38,1],[30,1],[31,3],[44,1],[45,4],[62,1],[92,1],[64,1],[37,4],[17,1],[26,1],[25,2],[70,1],[34,2],[72,1],[75,4],[85,1],[33,3],[11,3],[58,2]],'anymore',[[29,1]],'log',[[5,2],[65,1],[1,1],[25,3],[66,4],[67,6],[91,2],[68,1],[3,1],[11,3],[7,5]],'incompatibilities',[[9,1]],'maximum',[[54,1],[10,3],[40,1],[86,2]],'frontend',[[33,2],[28,3]],'implementing',[[33,1]],'desired',[[79,1],[30,3],[49,1]],'saved',[[80,1],[9,2]],'someone',[[0,2]],'ever',[[37,1]],'conversion',[[49,3],[52,1]],'replaces',[[57,1],[64,1],[75,1]],'addtimestamp',[[67,1]],'safely',[[70,1],[64,1],[0,1]],'acting',[[0,1]],'refer',[[71,1]],'nop',[[75,1]],'manipulated',[[64,1],[75,1]],'argument',[[84,1],[92,1]],'auriemma',[[24,1]],'most',[[54,4],[70,1],[31,1],[0,1],[44,1],[45,1],[60,1],[75,1],[85,1],[64,1],[37,1]],'impacts',[[54,1]],'occupy',[[37,1]],'since',[[63,1],[54,2],[1,1],[82,1],[0,1],[48,1],[75,2],[91,1],[11,1],[39,1]],'expect',[[45,1],[51,1]],'becomes',[[54,1],[43,1],[37,1]],'diagnostic',[[68,1]],'express',[[34,1]],'emulated',[[51,1],[21,1],[70,2],[80,1],[11,3]],'ansiwide',[[33,1]],'partially',[[89,1]],'view',[[7,1],[24,1],[67,1],[25,1],[18,2],[2,1]],'hooks',[[71,1],[43,2],[0,4],[34,2],[48,1],[72,1],[75,2],[35,1]],'bottom',[[6,2],[30,1]],'destruction',[[37,1]],'process',[[45,4],[12,1],[13,2],[63,1],[15,2],[51,1],[25,1],[54,1],[43,1],[34,5],[75,3],[32,2]],'harder',[[33,1],[34,1]],'notice',[[77,1],[31,1],[51,1]],'counter',[[54,2],[75,1],[64,2],[62,4]],'develop',[[0,2]],'might',[[49,1],[51,2],[24,1],[0,2],[45,1],[81,1],[82,1],[32,1],[91,1]],'depth',[[17,2],[73,3],[22,1],[49,2],[51,3],[54,1],[13,3],[75,1],[56,2],[11,1]],'gsky916',[[24,1]],'hooknoupdate',[[33,1]],'determining',[[29,1]],'existing',[[51,1],[76,1],[66,2],[30,1]],'rollercoaster',[[45,1]],'notification',[[29,1]],'clipcursor',[[44,1]],'filtermessages',[[45,1]],'1ms',[[63,2]],'debugging',[[72,1],[35,1],[32,1]],'microsoft',[[0,1]],'winrar',[[1,1]],'rather',[[54,2],[1,1],[30,3],[43,1],[28,1],[11,1]],'reliably',[[43,1]],'descriptor',[[54,1]],'output',[[67,1]],'exaggerated',[[62,1]],'behaves',[[44,1],[0,1]],'onto',[[79,1]],'borderless',[[30,1],[37,1]],'line',[[84,1],[54,1],[92,2],[67,3],[2,1]],'harmful',[[45,1]],'oses',[[75,3]],'directive',[[44,1]],'tell',[[29,1]],'files',[[1,1],[57,1],[0,4]],'merges',[[70,1]],'resolution',[[17,1],[63,1],[50,1],[13,1],[20,1],[40,12],[11,1]],'limitddraw',[[54,1]],'directinput8',[[43,3]],'fogging',[[60,2]],'browse',[[91,1],[11,1],[0,1]],'virus',[[0,2]],'24bpp',[[38,1]],'goes',[[3,1],[54,1]],'nonexclusive',[[43,1]],'usergb565',[[54,1]],'send',[[45,1],[37,4]],'startdebug',[[32,1]],'backbuf',[[54,1]],'texturedump',[[57,1]],'around',[[62,1]],'trace',[[68,2]],'install',[[25,1],[1,1]],'initialres',[[40,1]],'getperfcounter',[[75,1]],'soon',[[34,1],[75,1],[1,1]],'save',[[81,1],[9,1],[46,1],[3,1],[80,2]],'tough',[[37,1]],'query',[[75,1],[54,1],[64,1]],'libs',[[78,2],[48,1],[69,1],[35,1]],'transferred',[[49,1],[54,1]],'correctly',[[45,1],[51,2],[1,1],[33,1],[71,1]],'easportshack',[[75,1]],'bufferediofix',[[79,1]],'intercepts',[[46,1],[76,2],[0,2],[32,1],[33,1],[37,3]],'extension',[[71,1],[7,1],[72,1]],'called',[[49,1]],'managing',[[70,1],[49,3]],'mintexx',[[86,1]],'question',[[0,1]],'also',[[9,2],[26,1],[49,1],[54,1],[2,1],[0,1],[67,1],[77,1],[48,1],[33,1]],'debugview',[[67,1]],'software',[[75,1],[0,1]],'reserves',[[75,1]],'hide',[[9,1],[87,1],[30,2],[42,1],[16,1],[79,1],[37,3]],'simplified',[[51,1],[50,1],[0,1]],'settimer',[[64,1]],'instructions',[[75,2],[37,1]],'similar',[[78,1],[49,2],[54,2],[80,1],[4,1],[72,1],[75,2],[32,1],[56,1],[11,2]],'chance',[[45,1]],'down',[[63,1],[54,3],[30,1],[44,1],[6,1],[50,1],[12,1],[32,1],[68,1],[11,1]],'directory',[[9,1],[92,1]],'windowstyle',[[37,1]],'incredible',[[0,1]],'resized',[[37,4],[91,1],[30,1],[44,1]],'internally',[[49,3],[68,1]],'suspending',[[63,2]],'turns',[[3,1]],'graphical',[[1,1],[57,1],[2,1],[60,1]],'etc',[[0,1]],'admin',[[9,1],[29,1]],'unlockzorder',[[37,1]],'refusing',[[75,1]],'tiny',[[62,1],[1,1]],'screens',[[11,1]],'mech',[[54,1]],'directx',[[49,3],[51,1],[47,1],[53,1],[89,1],[90,1],[48,6]],'translation',[[24,1],[84,1]],'peek',[[45,1],[68,1]],'nosysmemprimary',[[54,2]],'standard',[[71,1],[52,1]],'noticing',[[62,1]],'slanted',[[89,1]],'direct3dcreate',[[56,1]],'bullet',[[0,1]],'win32',[[0,1]],'hash',[[57,1]],'categories',[[0,1]],'playing',[[73,1],[0,1]],'1280x800',[[40,1]],'recovering',[[13,1],[0,1]],'write',[[51,1],[1,2],[66,1],[0,1]],'added',[[66,1],[31,1],[0,2]],'blank',[[2,1]],'luckily',[[33,1]],'coop',[[43,1],[54,1]],'means',[[62,1],[0,1],[34,1],[86,2],[64,1],[40,1]],'hel',[[54,1]],'0x7c',[[87,1]],'feature',[[37,1],[75,2],[91,1],[11,1],[58,1]],'referenced',[[33,2]],'manipulate',[[75,1]],'parameters',[[70,2],[71,1]],'event',[[43,1],[32,1]],'simulates',[[75,1],[54,1],[79,1],[39,1]],'italian',[[84,1]],'scales',[[73,1],[70,1],[71,1],[50,1]],'expected',[[54,1],[75,1]],'routine',[[33,1]],'games',[[73,1],[1,2],[50,1],[0,6],[56,4],[39,2],[15,1],[29,1],[51,5],[54,4],[2,2],[60,2],[71,1],[91,1],[32,1],[40,1],[79,1],[38,1],[44,3],[45,2],[68,1],[64,2],[37,6],[78,3],[70,1],[43,1],[34,1],[75,8],[3,1],[11,1]],'compensate',[[90,1],[51,1],[70,1],[44,1]],'drawn',[[62,1],[64,1]],'your',[[7,1],[39,1],[79,1],[1,2],[24,1],[0,10],[91,3],[57,1],[11,5],[37,1]],'copies',[[54,1],[1,1]],'calling',[[0,1]],'shown',[[27,1],[44,1],[20,1],[25,1],[2,2],[0,1]],'scans',[[75,1]],'almost',[[0,1],[82,2],[30,1]],'published',[[0,1]],'cornerized',[[11,3]],'simultaneously',[[84,1]],'characteristics',[[27,1]],'processor',[[75,1]],'axes',[[44,1]],'html',[[24,1]],'part',[[11,1],[91,1]],'gives',[[64,1]],'pause',[[15,2]],'setappcompatdata',[[52,1],[75,1]],'shift',[[91,1],[12,1],[22,1]],'rdtsc',[[64,2]],'min',[[10,1]],'pcs',[[0,2]],'repaint',[[11,2],[91,2]],'within',[[45,1],[44,3],[71,1],[58,1]],'vice',[[79,1]],'segments',[[75,1]],'gamma',[[39,3]],'methods',[[59,1],[48,1],[51,1]],'chinese',[[24,1],[84,1]],'strangely',[[44,1]],'offscreen',[[54,1]],'separate',[[0,2],[75,1],[66,1],[37,1]],'reserved',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,1],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,2],[59,1],[9,1],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'helpful',[[48,1],[29,1]],'midtown',[[54,1]],'updated',[[72,1],[51,1],[85,1],[19,1],[33,2],[64,1]],'difference',[[11,1]],'nowinerrors',[[70,1]],'window',[[73,3],[87,1],[1,2],[19,1],[50,3],[0,5],[39,2],[9,1],[14,2],[23,1],[29,6],[2,1],[49,1],[51,2],[54,4],[71,1],[32,3],[91,4],[40,1],[30,20],[44,13],[45,5],[62,1],[12,1],[13,2],[20,1],[68,1],[64,1],[37,19],[83,2],[21,1],[22,1],[25,1],[26,1],[43,3],[70,5],[85,3],[75,2],[3,2],[33,1],[11,4],[58,8]],'remaps',[[51,1]],'redirected',[[70,1]],'affected',[[49,1]],'hdmi',[[40,1]],'planet',[[43,1]],'videogames',[[0,1]],'hookdirectsound',[[35,1]],'legacyalloc',[[75,1]],'stopping',[[4,1]],'intro',[[45,1],[34,1],[51,1],[72,1]],'strategy',[[70,1],[48,1]],'system',[[67,1],[0,4],[45,3],[77,1],[13,1],[52,1],[92,2],[64,2],[39,2],[17,1],[37,1],[26,3],[51,1],[54,4],[63,2],[2,1],[70,1],[76,2],[78,6],[84,1],[3,2],[33,2],[79,1]],'activates',[[29,1],[25,1],[30,1],[50,3],[45,1],[72,1],[84,1],[58,1]],'timefast',[[87,1],[91,1]],'unallocated',[[75,1]],'downwards',[[6,1]],'setcooperativelevel',[[54,1]],'development',[[24,1]],'defaultmessages',[[45,1]],'detecting',[[54,1],[32,1]],'executing',[[51,1]],'activities',[[70,1]],'arrives',[[0,1]],'procedure',[[46,1],[0,1]],'majority',[[33,1]],'protections',[[68,1]],'fastest',[[0,1]],'painting',[[11,1],[91,1]],'being',[[0,2],[45,2],[11,1],[37,1]],'sim',[[37,1]],'conflicts',[[66,1],[51,1]],'filtering',[[50,2]],'textures',[[71,2],[54,5],[56,3],[57,10],[60,2]],'logtoggle',[[87,1],[91,1]],'newer',[[45,1],[54,2],[43,1]],'showing',[[42,1],[29,1],[1,1],[54,1]],'traditional',[[43,1]],'autodetect',[[9,1],[84,1]],'regedit',[[80,1]],'implementation',[[33,1],[48,3],[71,1]],'winposchange',[[45,1]],'redirect',[[33,2]],'sends',[[37,1]],'stop',[[4,2]],'however',[[45,1],[48,1],[54,1],[64,1]],'ascending',[[5,1]],'keyboard',[[0,1],[44,1],[46,1],[43,4],[11,1]],'explore',[[25,2],[5,1]],'elevation',[[9,1],[84,1]],'interceptrdtsc',[[64,1]],'future',[[72,1],[35,1],[48,1]],'front',[[39,1]],'ask',[[17,1],[29,1]],'errors',[[73,1],[54,1],[51,2],[70,2],[79,1],[43,2]],'createsurface',[[51,1]],'warning',[[84,1]],'“intercept',[[11,1],[91,1]],'forceshel',[[54,1]],'slower',[[62,1],[49,1],[51,1]],'tries',[[15,1],[70,2],[48,1],[75,2],[64,1],[58,1]],'determines',[[49,1]],'doing',[[4,1],[46,1]],'remember',[[1,3]],'less',[[49,1],[62,1]],'advanced',[[54,1]],'single',[[75,2],[33,2],[71,1],[0,4]],'another',[[32,1],[0,1]],'noalphachannel',[[51,1]],'location',[[1,2],[31,1],[0,1]],'disk',[[75,1],[3,1],[79,4],[0,1]],'entry',[[1,2],[25,4],[6,4],[2,1],[0,1],[28,2],[34,1],[33,1],[5,2]],'beware',[[3,1],[84,1]],'movable',[[58,1]],'defaulting',[[45,1],[84,3]],'offset',[[54,2]],'looking',[[57,1],[43,1],[0,2]],'directdraw7',[[49,1]],'course',[[75,1],[0,1]],'follows',[[85,1],[87,1],[10,1],[2,1]],'caused',[[54,1]],'terminate',[[15,1],[29,2],[46,1],[51,1],[2,1],[87,1]],'32bpp',[[38,1],[54,1],[56,1]],'hacks',[[68,1],[0,1]],'msec',[[62,1]],'rect',[[70,1]],'geiss',[[24,1]],'fullscreenonly',[[29,1]],'useless',[[38,1],[48,1]],'availability',[[75,2]],'schema',[[49,1],[24,1],[32,1]],'supported',[[17,2],[51,1],[54,1],[2,1],[0,1],[75,2],[40,1],[84,1]],'vmware',[[54,1]],'internal',[[50,1],[75,1]],'above',[[63,1],[54,1],[89,1],[38,3],[30,1],[28,1],[32,1]],'inhibits',[[44,1],[29,1]],'joystick',[[43,1],[44,7]],'noticeably',[[50,1]],'fix',[[73,2],[31,1],[44,1],[45,1],[56,3],[37,3],[51,3],[54,3],[70,1],[71,3],[89,1],[72,1],[75,6],[91,1],[79,1],[11,1],[58,1]],'exists',[[66,1],[9,1],[29,1]],'startup',[[75,1],[9,1],[13,1],[84,1]],'alternate',[[33,1],[44,1]],'emulaterelmouse',[[43,1]],'figure',[[54,1],[62,1]],'issue',[[51,1],[54,5],[89,2],[60,1],[31,1],[90,1],[92,1],[37,1]],'sleep',[[64,1]],'stick',[[33,1]],'platform',[[77,1],[1,1],[56,1],[79,1]],'asks',[[25,1],[2,1],[29,1]],'defines',[[27,1]],'contained',[[54,1],[82,1]],'small',[[45,1],[62,1],[58,1]],'titles',[[75,1]],'period',[[45,1],[68,1]],'hiding',[[42,1]],'resulting',[[32,1]],'emulatesurface',[[49,3]],'environments',[[75,1]],'mount',[[79,1]],'8bpp',[[54,1],[75,2],[38,3]],'messages',[[1,2],[66,1],[0,1],[44,2],[45,15],[68,1],[37,3]],'choose',[[59,1],[54,1],[50,1],[28,1]],'widget',[[30,2],[54,1]],'celebrates',[[29,1]],'field',[[54,4],[1,2],[71,1],[30,1],[28,1],[45,1],[80,1],[81,1]],'legend',[[51,1],[90,2]],'trails',[[51,1],[60,1]],'resume',[[15,1]],'input',[[41,1],[45,1],[43,2]],'ini',[[9,2],[46,1],[80,1],[82,1],[0,2],[92,1],[57,1]],'interpolating',[[50,1]],'returnnullref',[[54,1]],'dirty',[[11,1],[91,1]],'handling',[[73,1],[46,1],[44,1],[45,1],[90,1],[52,1],[37,2],[51,1],[54,1],[70,1],[24,1],[72,1],[48,1],[91,1],[57,2]],'showfpsoverlay',[[62,1]],'drag',[[30,1],[1,1]],'two',[[0,1],[44,2],[48,1],[30,2],[28,1]],'rudimentary',[[44,1]],'splash',[[29,1]],'2016',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,1],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,1],[9,1],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'needadmincaps',[[29,1]],'automatic',[[42,1],[48,3],[57,1],[84,2]],'windowized',[[30,1]],'copying',[[54,2],[0,1]],'seems',[[75,1],[48,1],[37,1]],'320x200',[[40,2]],'backbuffers',[[49,1]],'actual',[[54,2],[80,2],[62,1]],'favorite',[[0,1]],'centers',[[30,1]],'forcefully',[[60,1]],'predetermined',[[54,1]],'needs',[[28,1],[39,1],[75,1],[33,2],[82,1],[37,1]],'specify',[[48,1],[1,1],[54,1],[31,1],[30,1]],'key_wow64_64key',[[76,2]],'verbose',[[11,1],[91,1]],'info',[[45,1],[68,1],[0,1]],'improvements',[[1,1],[0,2]],'frequent',[[62,1]],'receive',[[37,1],[45,1],[1,1]],'children',[[34,2]],'desktop',[[73,1],[38,1],[30,7],[0,1],[13,5],[16,3],[52,2],[56,1],[39,1],[17,2],[22,2],[49,2],[51,1],[54,1],[70,3],[34,1],[18,1],[11,5]],'modalstyle',[[37,1]],'recording',[[85,2]],'home',[[0,2]],'detects',[[73,1],[54,1],[48,1],[71,1],[2,1]],'events',[[45,2],[32,1],[68,3],[0,1]],'check',[[73,1],[9,1],[1,2],[3,1],[33,1],[56,1]],'names',[[57,1],[31,1]],'bought',[[0,1]],'diagonally',[[54,1]],'direcr3d',[[19,1]],'sting',[[54,1]],'lower',[[56,1]],'configuration',[[1,3],[19,1],[30,1],[0,7],[81,2],[92,2],[84,1],[27,2],[5,2],[37,1],[9,4],[25,2],[80,1],[2,2],[82,3],[34,3],[3,2],[10,1],[33,1],[57,1]],'packages',[[84,1]],'invisible',[[89,1],[37,1]],'periodically',[[45,2],[51,1],[62,1]],'every',[[51,1],[1,1],[33,1],[60,1],[44,1]],'ones',[[57,1]],'timesetevent',[[64,1]],'optimize',[[52,1],[29,1]],'directx1~6',[[48,2]],'font',[[70,2],[75,4]],'smallest',[[66,1]],'alphabetical',[[5,1]],'tool',[[67,1],[0,1]],'icons',[[19,1],[62,1],[0,1]],'d3d8',[[56,1],[48,1]],'autorefresh',[[51,1]],'rites',[[54,1]],'beginscene',[[60,1]],'intervention',[[48,1]],'click',[[44,1],[30,1],[1,1]],'hookgoglibs',[[78,2]],'dxwnd',[[87,1],[0,29],[15,2],[29,9],[80,2],[2,8],[24,2],[82,4],[48,5],[32,6],[91,2],[57,3],[46,2],[28,2],[44,1],[13,2],[68,3],[92,7],[64,2],[37,3],[33,10],[11,1],[88,1],[1,11],[19,4],[84,4],[9,5],[49,3],[51,2],[54,6],[66,3],[71,1],[4,1],[7,1],[65,1],[30,1],[31,4],[45,2],[62,2],[78,1],[26,8],[25,1],[70,1],[76,2],[34,1],[75,3],[85,3],[3,7]],'introduction',[[0,1]],'affect',[[92,1],[26,1],[62,1]],'timeslow',[[87,1],[91,1]],'edit',[[34,2],[54,1],[25,1],[82,1],[5,1]],'story',[[0,1]],'coordinate',[[85,1],[11,1],[30,1]],'letting',[[0,1]],'completion',[[43,1]],'emulateregistry',[[76,1]],'configurations',[[1,1],[30,1],[0,1]],'effects',[[0,2],[60,2],[56,1],[11,1],[44,1]],'nopower2fix',[[56,1]],'include',[[56,1],[57,1],[1,1]],'clear',[[13,1],[54,1],[3,1],[56,2],[60,1]],'emulating',[[54,1]],'requires',[[48,1],[29,1],[43,1],[2,1]],'considers',[[45,1]],'empties',[[45,1]],'compares',[[2,1]],'flag',[[73,2],[1,2],[19,1],[56,4],[39,1],[59,1],[51,6],[29,2],[54,13],[71,2],[60,1],[80,2],[91,1],[32,1],[57,2],[79,2],[46,1],[31,1],[30,3],[44,5],[45,2],[62,1],[20,1],[68,1],[64,5],[37,4],[63,2],[78,5],[70,2],[76,2],[43,5],[34,1],[72,2],[75,11],[85,1],[33,6]],'tracing',[[3,1],[72,1],[35,1]],'nomovies',[[73,1]],'languages',[[84,1]],'sims',[[51,1]],'characters',[[11,1]],'engine',[[33,2]],'resolving',[[60,1],[37,2]],'rendering',[[54,1],[11,1],[58,4]],'recognize',[[43,1]],'algorithm',[[31,1]],'outregistry',[[68,1]],'overrideregistry',[[76,1]],'menu',[[17,1],[26,1],[1,2],[25,2],[54,1],[2,2],[89,3],[90,1],[18,1]],'keymapping',[[87,1]],'approximate',[[54,1],[75,1]],'processed',[[54,1],[68,1],[56,1],[37,1]],'suspends',[[63,1]],'setcompatibility',[[52,1]],'day',[[0,1]],'handles',[[65,1],[49,1],[32,1]],'ddscl_fullscreen',[[54,1]],'forwards',[[49,2]],'forced',[[85,2],[42,1],[51,1],[76,2]],'includes',[[2,1],[44,1]],'directdraw1',[[49,1]],'removes',[[79,1]],'windowproc',[[33,3]],'provided',[[24,6],[28,1]],'registry',[[1,1],[76,9],[80,9],[82,1],[0,2],[13,1],[68,2],[37,1]],'accordingly',[[62,1]],'sections',[[62,1]],'normalize',[[64,1]],'creation',[[54,1],[32,2]],'drives',[[79,1]],'own',[[37,2],[84,1],[9,1],[75,2],[2,1],[0,2]],'coder',[[0,1]],'during',[[45,2],[59,1],[51,1],[72,1],[11,1]],'glide',[[35,2]],'33%',[[63,1]],'masks',[[43,1]],'000',[[54,1]],'backgrounds',[[39,1]],'simply',[[54,1],[49,1],[75,1],[79,2],[0,1]],'wherever',[[0,2]],'instance',[[1,1],[33,1],[30,1],[44,1]],'empty',[[45,1],[54,1],[1,1],[79,1],[30,1]],'frame',[[37,2],[51,2],[54,1],[19,1],[62,2],[58,1]],'help',[[56,1],[24,3],[57,1]],'asynchronous',[[79,2]],'next',[[85,1]],'locale',[[84,1]],'calls',[[73,3],[67,1],[56,1],[64,2],[37,2],[39,1],[78,2],[49,1],[70,3],[76,2],[34,1],[48,3],[75,1],[33,4]],'trying',[[75,1],[33,1],[2,1],[0,3]],'movements',[[43,1]],'thread',[[45,1],[72,1],[15,2],[1,1],[51,1]],'filter',[[45,1],[24,1],[50,2]],'date',[[84,1]],'tick',[[64,2],[67,1]],'adjust',[[54,1],[29,1],[20,1],[64,1]],'smk',[[72,1]],'detection',[[43,1]],'job',[[4,1]],'related',[[83,1],[23,1],[29,1],[70,1],[43,1],[62,1],[48,1],[20,1],[68,1]],'invoked',[[60,1],[37,1]],'behaviors',[[32,1]],'clientremapping',[[70,1]],'hence',[[0,1]],'stack',[[80,1]],'finetiming',[[64,1]],'folder',[[0,1],[9,2],[1,3],[31,3],[5,1]],'picture',[[19,1],[2,1]],'comp',[[45,1]],'becoming',[[49,1]],'thought',[[0,1]],'team',[[24,1]],'introduces',[[62,2],[44,1]],'features',[[54,1],[48,1],[92,1],[0,2]],'unskippable',[[45,1]],'suppressd3dext',[[56,1]],'play',[[34,1],[91,1]],'glactivetexture',[[71,1]],'causing',[[75,1]],'experimental',[[0,1],[58,1],[54,1],[59,1],[71,1],[37,2]],'logs',[[1,3],[66,3],[67,1],[68,8],[3,1],[65,2]],'had',[[38,1],[0,1]],'error',[[51,1],[75,2],[70,1],[2,1],[43,1]],'subfolder',[[57,2],[2,1]],'fields',[[40,2],[30,2]],'destroyed',[[37,1]],'limitfps',[[62,2]],'defined',[[45,1]],'coarse',[[20,1]],'client',[[62,1],[51,1],[70,2],[30,1],[50,2]],'fixwinframe',[[37,1]],'enableclipping',[[44,1]],'outwinmessages',[[68,1]],'sports',[[75,2]],'globalunlock',[[75,1]],'already',[[80,1],[32,1],[38,1],[60,1],[0,1]],'directx11',[[48,2]],'modal',[[58,1],[37,2]],'eminent',[[51,1]],'keepcursorfixed',[[44,1]],'fight',[[11,1]],'buffered',[[79,1]],'management',[[39,1]],'exist',[[80,1]],'trick',[[75,1],[91,1],[11,1],[58,1]],'frozen',[[0,1]],'freeze',[[11,1]],'functions',[[12,1],[29,1],[49,1],[54,2],[11,1]],'similarly',[[49,1]],'together',[[30,1],[0,1]],'their',[[73,2],[54,1],[2,1],[0,3],[45,2],[48,1],[37,1]],'compatible',[[49,2],[52,1]],'subset',[[26,1]],'palette',[[21,2],[49,1],[51,3],[54,1],[70,3],[18,1],[39,3]],'separated',[[33,1],[66,1]],'emulate',[[77,1],[76,1],[40,1],[43,1],[64,1]],'releasemouse',[[44,1]],'snowboard',[[54,1],[89,3],[56,1]],'solution',[[78,1],[37,1]],'confirmation',[[29,2],[25,1],[5,1]],'bypasses',[[70,1],[34,1],[73,1]],'for',[[50,1],[0,10],[56,1],[27,1],[15,1],[29,2],[80,1],[24,1],[82,2],[48,7],[91,1],[57,1],[79,3],[46,1],[28,2],[44,4],[81,1],[13,1],[68,1],[90,1],[86,4],[64,2],[37,2],[63,5],[89,1],[43,4],[33,2],[11,1],[73,2],[1,5],[84,4],[9,4],[23,1],[51,3],[54,5],[71,2],[10,1],[18,1],[7,1],[30,9],[31,1],[45,1],[62,3],[52,3],[25,2],[70,4],[34,2],[75,6],[85,1],[3,2]],'libraries',[[0,1],[78,1],[70,1],[43,3],[35,1]],'decrease',[[91,1],[87,1],[0,1]],'that',[[50,1],[0,22],[56,1],[15,1],[29,4],[2,3],[24,1],[82,1],[48,2],[32,6],[91,2],[57,2],[79,3],[38,1],[44,3],[13,2],[20,1],[68,3],[92,1],[64,5],[37,5],[63,3],[21,1],[22,1],[43,5],[33,3],[11,5],[73,3],[88,1],[1,3],[67,3],[84,2],[39,2],[49,3],[23,1],[51,6],[54,9],[60,1],[71,1],[40,2],[30,3],[62,6],[45,9],[78,1],[26,1],[70,4],[76,4],[34,1],[72,2],[75,12],[3,2],[58,1]],'appropriate',[[45,1],[43,2]],'area',[[73,1],[50,2],[44,1],[30,3],[62,1],[12,1],[81,1],[51,1],[70,3],[80,1],[91,2],[10,1],[11,6],[58,1]],'troubles',[[51,1]],'first',[[51,1],[25,1],[30,1],[0,3],[75,1],[32,2],[79,1],[7,1]],'reducing',[[63,1]],'troubleshoot',[[68,1]],'care',[[49,1],[37,1]],'syncronize',[[70,1]],'globalunock',[[75,1]],'native',[[76,1],[40,1],[43,1]],'asking',[[0,1]],'could',[[45,1],[48,1],[51,1],[70,1],[75,1],[0,2]],'plit',[[51,1]],'1000',[[62,2]],'top',[[0,1],[11,2],[37,2],[70,1],[6,2],[2,1]],'correct',[[64,1],[48,1],[44,2]],'below',[[90,1],[54,2],[20,1],[89,1],[2,1],[27,1]],'account',[[45,1],[51,1]],'codeproject',[[0,1]],'key”',[[11,1],[91,1]],'actually',[[75,1],[2,1],[37,1]],'step',[[6,2]],'resizing',[[45,1],[37,1]],'svga',[[40,1]],'sherwood',[[51,1],[90,2]],'thank',[[0,3]],'screenshot',[[11,1]],'filled',[[76,2]],'often',[[75,2],[0,1]],'fixsmackloop',[[72,1]],'plus',[[26,1]],'aero',[[49,3],[52,7]],'owner',[[0,1]],'export',[[9,1],[1,1],[25,1],[2,1],[0,1]],'formula',[[62,1]],'glut32',[[71,2]],'prefer',[[9,1]],'analyze',[[44,1],[68,1],[1,1]],'lose',[[43,1],[29,1]],'uprising',[[45,1],[37,1]],'notify',[[29,1]],'hidecdromempty',[[79,1]],'return',[[54,2],[51,1],[70,1],[75,2],[43,1]],'conveniently',[[75,1]],'bypassgoglibs',[[78,1]],'accelerate',[[11,1]],'slow',[[0,1],[63,1],[11,1],[44,2]],'supporters',[[24,1],[0,1]],'whole',[[37,1],[44,1],[58,1],[70,1],[30,3],[39,1]],'bit',[[75,3],[76,4],[56,2],[39,1]],'too',[[45,1]],'recent',[[17,1],[49,1],[54,1],[71,1],[0,2],[85,1],[75,1],[56,1]],'audio',[[75,1]],'sets',[[51,1],[87,1],[62,1],[48,1],[75,1],[84,1],[37,1]],'mechanism',[[30,1],[43,1]],'killed',[[45,2],[72,1]],'generate',[[51,1]],'opcodes',[[64,1],[75,3]],'ran',[[0,1]],'call',[[73,1],[78,1],[70,2],[71,1],[34,1],[52,1],[72,1],[33,3]],'alpha',[[51,2]],'mcisendstring',[[73,2]],'ime',[[75,2]],'mintexy',[[86,1]],'usually',[[11,1],[5,1],[49,1],[70,2],[0,1],[75,3],[64,1],[39,1]],'afford',[[75,1]],'unchanged',[[11,1]],'leftmost',[[20,1]],'approximation',[[51,1]],'cumulative',[[51,1]],'pump',[[45,1]],'maxtexx',[[86,1]],'yet',[[75,1],[0,1]],'stand',[[11,1]],'networking',[[11,1]],'resolutions',[[40,3]],'usual',[[0,1]],'provide',[[51,1],[1,1]],'logic',[[32,1],[31,1],[0,1]],'into',[[51,1],[1,1],[54,1],[50,1],[0,5],[45,1],[91,1],[57,1],[37,1]],'avoid',[[62,1],[44,1],[35,1],[37,1],[78,1],[51,1],[54,1],[66,1],[34,1],[48,1],[72,1],[75,1],[58,1]],'great',[[0,1]],'fixpixelzoom',[[71,1]],'collect',[[1,1]],'ratios',[[63,1],[30,1]],'referring',[[30,1]],'locks',[[51,1]],'refreshed',[[72,1],[51,1],[20,1]],'handled',[[49,1]],'those',[[56,1],[57,1]],'offscreenplain',[[49,1]],'logging',[[87,1],[91,1],[19,2],[11,2],[66,1]],'runtime',[[67,1],[1,1]],'calculates',[[30,1]],'terminates',[[56,1],[29,1]],'varying',[[54,1]],'windows',[[73,2],[79,1],[30,2],[0,2],[44,1],[45,4],[52,2],[77,2],[56,3],[84,1],[37,8],[9,1],[23,1],[29,1],[51,1],[43,1],[70,1],[71,1],[75,6],[32,1],[91,1],[33,1],[18,1],[58,1]],'patches',[[78,1],[75,1]],'using',[[73,1],[54,2],[1,1],[43,1],[30,1],[45,1],[0,3],[67,1],[75,1],[57,2],[64,1]],'either',[[75,1],[19,2],[2,1],[0,1]],'unacquire',[[43,3]],'disablefogging',[[60,1]],'fail',[[25,1],[45,1],[51,1]],'although',[[45,1],[0,1]],'successfully',[[75,1],[37,1]],'noimagehlp',[[75,1]],'artwork',[[0,1]],'win98',[[79,1]],'localized',[[92,1]],'multimedia',[[73,3],[64,1]],'selector',[[30,1],[84,1]],'correspond',[[54,1]],'timestretch',[[64,1]],'user',[[33,1]],'copy',[[59,1],[68,1],[79,2],[0,2]],'how',[[49,1],[29,1],[54,1],[0,2]],'icon',[[26,3],[80,1],[31,1],[2,5],[30,2],[81,1],[32,1],[3,1],[33,1]],'die',[[33,1],[2,1]],'switched',[[38,1]],'external',[[3,1],[92,1]],'condition',[[75,3],[51,1],[44,1]],'criteria',[[57,1]],'certain',[[78,2],[33,1],[0,1]],'pack',[[84,4]],'0x70',[[87,1]],'locking',[[11,1],[91,1]],'relative',[[43,2],[67,2]],'cooperative',[[54,2],[19,1],[43,1]],'texturehighlight',[[57,1]],'skewed',[[54,1]],'setcursorpos',[[44,1]],'configurable',[[62,1]],'smearing',[[51,1]],'blockpriorityclass',[[75,1]],'inject',[[32,1]],'exiting',[[3,1]],'pax',[[51,1]],'unresponsive',[[0,1]],'picker',[[30,1]],'bar',[[30,1],[37,1]],'maintaining',[[0,1]],'name',[[34,1],[78,1],[19,1],[71,1],[28,4]],'fullscr',[[11,1]],'black',[[51,1],[49,1],[54,3],[30,1]],'commands',[[26,1],[3,1],[2,2],[27,1]],'suppresschild',[[34,1]],'warnings',[[46,1]],'d3d9',[[48,1],[56,2],[24,1]],'match',[[57,1],[1,1]],'developer',[[24,2],[1,1]],'based',[[48,1],[62,1]],'basically',[[54,1]],'endless',[[75,2]],'modders',[[57,1]],'stretch',[[73,1],[85,1],[54,1],[20,1],[50,1],[64,5]],'gho',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,2],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,1],[9,1],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'clipper',[[70,1],[51,2]],'path',[[9,3],[1,3],[23,1],[25,1],[2,4],[28,3],[31,5]],'identical',[[80,1]],'theory',[[45,1]],'weren',[[54,1]],'unlock',[[51,1],[54,1],[87,1],[89,1],[11,1],[37,1]],'until',[[92,1],[2,1],[26,1]],'middle',[[44,2]],'showhints',[[29,1]],'potentially',[[45,1]],'encouragement',[[24,1]],'adds',[[67,2]],'lowering',[[15,1]],'here',[[83,1],[78,1],[85,1],[88,1],[28,1]],'frames',[[72,2],[56,2],[60,2]],'suppressed',[[45,1]],'advantages',[[33,1]],'reached',[[33,1]],'outdebugstring',[[67,1]],'args',[[71,1]],'current',[[19,1],[38,1],[0,1],[44,1],[84,1],[17,1],[21,1],[51,1],[2,1],[24,1],[48,1],[3,1],[11,2]],'refresh',[[37,2],[87,2],[91,1],[62,1],[11,1]],'michael',[[24,1]],'internet',[[0,1]],'compatibility',[[0,2],[77,1],[13,3],[52,1],[74,1],[59,1],[54,1],[29,1],[78,2],[48,1],[32,1],[75,2]],'afterward',[[37,1]],'delay',[[62,9],[44,2]],'wildly',[[62,1]],'corners',[[64,1]],'string',[[73,1],[67,1],[84,1]],'yfactor',[[71,1]],'must',[[45,1],[80,1],[92,1]],'turned',[[45,1],[43,1]],'disks',[[79,1]],'decided',[[0,1]],'suspended',[[32,1]],'closer',[[49,1]],'terminated',[[45,1],[85,1],[26,1]],'border',[[45,1],[58,1],[54,1],[30,1],[44,2]],'tight',[[72,1]],'choosing',[[1,1]],'emulation',[[49,2],[51,3],[54,2],[38,1],[70,1],[90,1],[11,1]],'processes',[[45,2],[34,2],[81,1]],'retrieved',[[80,1]],'notable',[[54,3],[75,1]],'flickering',[[70,1]],'affecting',[[25,1],[39,1]],'the',[[87,9],[50,12],[0,47],[77,7],[56,12],[27,4],[15,4],[29,13],[80,11],[2,26],[24,14],[82,3],[48,15],[32,22],[91,19],[57,7],[79,8],[46,7],[38,5],[28,11],[44,37],[81,4],[12,3],[13,4],[20,10],[68,7],[64,27],[5,10],[37,28],[63,9],[21,2],[22,1],[83,1],[89,8],[43,22],[90,7],[92,9],[33,30],[11,39],[73,8],[1,30],[19,15],[67,9],[16,2],[84,17],[39,10],[59,3],[9,8],[14,3],[23,3],[49,25],[51,41],[54,72],[4,4],[60,6],[66,2],[71,10],[10,1],[40,14],[18,1],[7,3],[30,54],[31,6],[45,16],[62,20],[42,2],[52,6],[17,2],[78,4],[26,11],[25,19],[70,21],[6,8],[76,10],[34,10],[72,8],[75,36],[3,10],[85,12],[58,8]],'speech',[[81,1]],'off',[[54,1],[1,1],[19,1],[91,5],[3,1],[11,3]],'perform',[[73,1],[56,1],[68,1]],'better',[[78,1],[49,1],[51,2],[54,1],[50,1],[13,1],[33,1],[11,1]],'surround',[[30,1]],'straight',[[54,1]],'result',[[73,1],[75,1]],'bear',[[0,1]],'twice',[[50,1]],'fixbindtexture',[[71,1]],'modern',[[51,1],[54,1],[60,1],[0,1],[75,2],[37,1]],'green',[[2,1]],'entries',[[76,2],[25,1],[2,1],[0,1],[56,1],[39,3]],'receives',[[70,1],[44,2]],'minimal',[[54,2],[44,1]],'allowed',[[54,1]],'located',[[0,1],[54,1],[92,1],[33,1],[5,1]],'handy',[[4,1]],'generic',[[29,1]],'adjustment',[[20,1]],'banner',[[29,1]],'mysterious',[[0,1]],'significantly',[[54,1]],'crashes',[[45,1],[13,1],[75,1],[0,1]],'execution',[[31,3],[32,2]],'hooknorun',[[33,1]],'progressive',[[51,1]],'required',[[54,1],[1,1]],'previous',[[67,1],[2,2],[60,1]],'full',[[73,1],[50,1],[54,1]],'everything',[[1,1],[0,2]],'specifications',[[51,1]],'dump',[[54,1],[57,2],[86,4]],'level',[[54,2],[29,1],[19,1],[43,2]],'shareddc',[[70,2]],'xfactor',[[71,1]],'routing',[[78,1]],'cubes',[[80,1]],'drawback',[[32,3]],'turning',[[11,1]],'rendered',[[56,1]],'vfw',[[73,1]],'english',[[84,4]],'guarantee',[[75,1]],'dll',[[84,3],[71,2],[24,3],[0,1],[34,1],[48,5],[75,3],[92,1],[56,1],[33,1],[64,2]],'making',[[45,1],[34,1],[49,1],[38,1],[43,2],[39,1]],'scaled',[[51,2],[49,1],[70,1],[71,1],[50,1]],'movie',[[73,3]],'taking',[[11,1]],'social',[[0,1]],'listen',[[45,1]],'exception',[[64,1],[75,3]],'opcode',[[64,1],[75,1]],'opengl32',[[71,1]],'detected',[[72,1],[13,1],[54,1],[75,1],[40,1]],'conversions',[[49,1]],'smack',[[72,4]],'seem',[[75,1]],'outimporttable',[[68,1]],'width',[[54,1],[19,1],[30,6],[85,3],[10,2],[40,2],[86,2]],'note',[[49,1],[54,1],[80,1],[30,1],[62,1],[68,1],[3,1],[40,1]],'release',[[0,3],[77,1],[51,1],[30,1],[44,1]],'simplify',[[28,1]],'dungeon',[[44,1]],'blitted',[[50,1],[54,1]],'horizontal',[[85,1],[51,1],[54,1]],'cover',[[73,1]],'function',[[71,1],[12,1],[87,1],[33,1],[11,2],[44,1]],'affinity',[[75,3]],'reserve',[[75,1]],'backbufattach',[[54,1]],'appear',[[63,1],[54,1],[51,1],[1,1],[79,1],[89,1]],'active',[[72,1],[3,1],[25,1],[43,1]],'temporary',[[49,1]],'behind',[[0,1]],'contents',[[45,1]],'handle',[[79,1],[29,1],[70,1],[2,2],[0,1],[45,1],[75,3],[33,1],[11,1],[37,1]],'designed',[[45,2],[29,1]],'size',[[58,1],[73,1],[22,1],[29,1],[49,1],[54,1],[50,2],[30,4],[62,1],[85,1],[56,1],[37,1]],'allow',[[3,1],[54,1],[0,3]],'“dave',[[54,1]],'useful',[[67,1],[13,1],[52,1],[68,1],[37,1],[39,1],[5,1],[9,1],[15,1],[51,1],[2,2],[91,3],[11,2]],'16bpp',[[38,1],[54,4]],'given',[[92,1],[40,2],[2,1],[27,1]],'surface',[[19,1],[50,4],[90,1],[56,2],[37,1],[49,14],[51,9],[54,12],[70,2],[60,1],[72,2],[91,1],[11,1],[58,2]],'noticeable',[[54,1],[39,1]],'vista',[[52,1]],'packs',[[84,1]],'improve',[[59,1],[54,2],[75,1],[0,2]],'project',[[24,1],[0,4]],'oddly',[[51,1]],'golf',[[37,1]],'1mhz',[[64,1]],'bpp',[[38,4]],'produces',[[70,1],[11,1],[62,1]],'tracehooks',[[68,1]],'tricky',[[45,1],[0,1]],'ubik',[[75,1]],'perfect',[[11,1]],'programming',[[0,1]],'usb',[[1,1]],'free',[[75,1]],'manual',[[82,1]],'along',[[75,1],[30,1],[68,1]],'rightmost',[[20,1]],'who',[[24,10]],'human',[[43,1]],'executable',[[1,1],[23,1],[29,1],[2,1],[28,1],[0,1],[33,1]],'classes',[[73,1]],'positive',[[73,1],[0,1]],'weird',[[11,1]],'realistic',[[62,1]],'keeper',[[44,1]],'specified',[[63,1]],'returns',[[73,1],[75,1]],'provides',[[18,1]],'new',[[37,1],[1,2],[25,1],[66,2],[30,1],[0,1],[43,1],[34,1],[85,1],[5,1]],'existed',[[0,1]],'shortcuts',[[0,1]],'installing',[[1,1]],'altering',[[39,1]],'little',[[29,1],[49,1],[0,2]],'attention',[[0,1]],'dragging',[[37,1],[20,1]],'adjacent',[[40,2],[50,1]],'choice',[[33,1],[40,2],[75,1]],'listbox',[[64,1]],'showtimestretch',[[64,1]],'determine',[[70,1]],'directed',[[48,1]],'cost',[[25,1],[54,1]],'providing',[[30,1]],'bother',[[0,1]],'textureformat',[[51,1]],'gray',[[2,1],[31,1]],'very',[[39,1],[15,1],[29,1],[51,1],[54,3],[70,1],[0,1],[75,2],[3,1],[79,1],[37,1]],'quality',[[54,1]],'join',[[0,1]],'clipping”',[[91,1]],'modules',[[31,1]],'limitscreenres',[[40,1]],'logged',[[68,1]],'physically',[[75,1]],'0x8ffffff',[[75,1]],'fixes',[[73,1],[89,2],[43,1],[24,1],[44,1],[72,1],[75,2],[90,1],[56,3]],'image',[[51,1],[89,1],[56,1],[11,1],[90,1]],'low',[[17,1]],'giving',[[37,1]],'ticks',[[64,1]],'outdebug',[[68,1]],'kills',[[25,1],[45,1],[15,1]],'inserts',[[5,1]],'though',[[45,1],[48,1],[51,1],[70,1],[33,1],[75,1]],'hidemultimonitor',[[37,1]],'older',[[45,1],[54,1],[40,1],[56,1],[84,1]],'learned',[[0,1]],'playback',[[72,1]],'bitmap',[[57,1],[54,1]],'functional',[[75,1]],'killing',[[2,1]],'long',[[45,3],[67,1],[0,1]],'longer',[[17,1],[9,1],[54,1],[0,1],[75,1],[40,1],[84,2]],'person',[[0,1]],'enabling',[[43,2]],'places',[[54,1],[44,1]],'duplicates',[[25,1]],'hooksmackw32',[[72,1]],'divide',[[75,1]],'refreshing',[[21,1],[37,1]],'applied',[[34,1],[54,1],[23,1],[68,1]],'cleared',[[84,1]],'setting',[[51,1],[1,1],[38,5],[43,1],[2,2],[0,1],[77,1],[48,1],[75,2],[84,1],[39,1]],'texture',[[51,2],[54,5],[71,2],[60,1],[10,3],[57,6],[86,9]],'hookopengl',[[71,1]],'improved',[[0,1]],'occupies',[[30,2]],'multiplication',[[91,1]],'foreground',[[45,1]],'configured',[[1,2],[25,1],[0,1]],'displaying',[[45,1]],'moves',[[6,4]],'scan',[[54,2]],'people',[[0,1]],'second',[[63,1],[21,1],[20,1],[19,2],[62,2],[0,3]],'discouraged',[[70,1]],'list',[[1,2],[23,1],[25,4],[6,2],[2,2],[0,2],[34,1],[3,1],[56,1],[79,1],[5,3]],'selectively',[[63,1]],'alphachannel',[[51,1]],'and',[[87,1],[0,33],[56,3],[35,1],[15,1],[29,3],[2,4],[24,5],[48,5],[32,2],[91,5],[57,3],[79,3],[44,10],[12,3],[20,4],[68,2],[64,6],[37,12],[63,2],[83,1],[22,1],[43,5],[33,5],[11,11],[73,4],[88,1],[1,7],[19,2],[67,1],[84,8],[39,3],[9,4],[49,9],[51,5],[54,14],[60,1],[66,1],[71,1],[10,2],[40,3],[30,13],[62,3],[45,10],[52,2],[78,3],[26,1],[25,3],[70,5],[76,1],[34,2],[72,3],[75,11],[3,3],[85,2],[58,2]],'individual',[[33,2]],'still',[[17,1],[64,1],[1,1],[29,1],[0,3],[3,1],[11,3],[37,1]],'powerful',[[75,1],[0,1]],'meaningless',[[45,1]],'racer',[[54,2],[89,2],[56,1]],'delicate',[[64,1]],'record',[[81,1],[80,1]],'before',[[54,1],[1,1],[38,1],[80,1],[0,1],[45,1],[75,1],[37,3]],'256',[[39,1],[2,1],[21,1]],'ignore',[[54,2],[51,1],[62,1],[37,1]],'lock',[[39,3],[51,3],[54,2],[87,1],[89,1],[91,2],[11,1],[37,1]],'refreshes',[[51,1]],'fps',[[87,1],[91,1],[19,1],[11,2],[62,12]],'various',[[18,1]],'mouse',[[51,2],[43,6],[30,2],[45,3],[44,17],[68,3],[84,1]],'forth',[[44,1],[45,1],[29,1]],'intercepting',[[32,1]],'modifymouse',[[44,1]],'virtualjoystick',[[44,1]],'starts',[[34,1],[75,1],[92,2],[3,1],[30,1]],'cutscenes',[[45,1]],'which',[[30,1],[44,1],[0,1],[77,1],[64,1],[39,1],[49,1],[29,1],[51,1],[54,4],[72,2],[75,1],[32,1]],'stores',[[0,1]],'war',[[54,1]],'policy',[[33,1]],'dedicate',[[0,1]],'start',[[70,1],[31,2],[0,2],[4,2],[85,1],[75,1],[92,1],[39,1]],'center',[[30,2],[43,1]],'lines',[[91,1],[11,1],[54,6]],'title',[[37,1],[62,2],[30,1]],'gaming',[[30,1],[0,1]],'differences',[[2,1]],'mci',[[73,4]],'controls',[[79,1]],'setzbufferbitdepths',[[54,1]],'require',[[44,1],[30,1],[1,1]],'diablo',[[75,2]],'activemovie',[[73,1]],'nofillrect',[[70,1]],'entirely',[[30,1],[91,1]],'syncpalette',[[70,1]],'exports',[[25,1],[56,1]],'switch',[[52,1],[51,1],[29,2]],'trouble',[[1,1],[0,1]],'work',[[11,2],[1,1],[30,1],[0,2],[84,1],[37,1],[17,1],[51,2],[2,2],[43,2],[75,1],[33,1],[7,1],[58,1]],'centering',[[44,1]],'deactivates',[[13,1]],'wait',[[45,1]],'gog',[[78,8]],'keepcursorwithin',[[44,1]],'sfb7',[[24,1],[0,2]],'references',[[24,1],[0,1]],'therefore',[[34,1]],'hooked',[[1,1],[19,1],[0,2],[28,2],[81,1],[16,2],[64,1],[37,2],[9,1],[14,3],[54,2],[80,1],[2,1],[75,1],[57,3],[11,3]],'avoiding',[[51,1],[46,1],[79,1],[44,1]],'you',[[88,1],[1,11],[50,1],[0,25],[56,1],[84,1],[59,1],[9,2],[29,10],[49,1],[51,1],[2,2],[54,6],[71,1],[80,3],[48,2],[82,1],[10,1],[57,1],[7,1],[79,3],[91,2],[38,1],[30,4],[28,3],[31,2],[44,2],[12,1],[20,2],[62,1],[81,3],[64,1],[5,1],[17,1],[63,1],[26,3],[83,1],[25,3],[92,3],[34,1],[85,2],[3,1],[11,6]],'happening',[[54,1],[0,1]],'left',[[0,3],[54,1],[11,1],[44,1]],'immediately',[[91,1],[29,1],[46,1],[11,1],[5,1]],'pathname',[[28,2]],'moto',[[54,1]],'memory',[[49,1],[51,3],[54,10],[52,1],[75,5],[33,1]],'used',[[19,1],[31,1],[30,4],[0,1],[44,1],[45,1],[50,1],[63,1],[9,2],[51,3],[80,2],[43,1],[85,1],[75,2],[33,1],[57,1]],'restores',[[4,1],[13,1],[14,1]],'roms',[[79,1]],'coming',[[1,1]],'user32',[[70,2],[64,1],[37,1]],'reliable',[[25,1]],'directdrawsurface',[[51,1],[54,1]],'segment',[[75,1]],'its',[[1,2],[0,5],[44,1],[45,1],[52,1],[64,1],[37,3],[63,1],[84,1],[9,1],[22,1],[29,2],[70,1],[2,2],[82,1],[4,1],[34,2],[75,2],[3,2],[33,2]],'victims',[[0,1]],'programmed',[[46,1]],'enables',[[9,1],[46,1],[92,1],[71,1],[35,1],[44,1]],'imports',[[3,1]],'sid',[[37,1]],'flushes',[[45,1]],'taskbar',[[14,1],[30,1],[45,1],[13,2],[16,3],[11,1],[37,2]],'buffer',[[49,3],[54,1],[56,2]],'sophisticated',[[33,1],[0,2]],'present',[[75,1]],'ratio',[[63,5],[54,1],[75,1],[30,7],[64,2]],'pixel',[[17,1],[22,1],[49,1],[51,4],[50,1]],'hookenabled',[[31,1]],'cursor',[[51,2],[87,1],[19,2],[44,10],[90,1],[42,4],[68,3],[91,1]],'key_wow64_32key',[[76,2]],'unpack',[[1,1]],'documentation',[[24,1]],'sporadic',[[51,1]],'react',[[45,2],[11,1],[91,1]],'introduced',[[51,1],[54,1]],'sort',[[5,2]],'negative',[[75,1]],'why',[[29,1],[25,1],[64,1],[0,4]],'suppressdxerrors',[[51,1]],'disablemaxwindowedmode',[[75,1]],'sometimes',[[78,2],[1,1],[25,1],[13,1],[11,1],[64,1]],'physical',[[79,2]],'problems',[[9,1],[1,1],[70,1],[88,1],[45,1],[64,1],[84,1]],'style',[[37,5]],'layer',[[70,1],[54,1]],'didn',[[45,1],[91,1],[79,1],[11,1]],'crazy',[[15,1]],'“slow',[[68,1]],'happens',[[70,1]],'hooking',[[29,1],[70,1],[71,1],[31,1],[0,2],[28,1],[48,3],[32,1],[68,1],[35,1]],'discussion',[[1,1]],'bring',[[37,1]],'hack',[[75,2],[57,2],[86,4]],'advantage',[[49,1],[0,1]],'prompt',[[3,1]],'context',[[70,3],[0,1]],'number',[[62,1],[66,1],[75,1],[33,1],[30,1],[28,1]],'rom',[[73,1]],'close',[[29,4],[14,1]],'nick',[[0,1]],'make',[[63,1],[64,1],[51,1],[54,1],[0,1],[33,1],[57,1],[37,2]],'bmx”',[[54,1]],'known',[[73,1],[1,1],[43,1],[91,1],[56,1],[11,1],[39,1]],'demonstrations',[[0,1]],'adjusting',[[64,1],[44,1]],'temporarily',[[11,1]],'portable',[[1,1]],'but',[[1,2],[50,1],[0,5],[56,1],[39,1],[9,1],[29,2],[49,8],[51,3],[2,2],[54,6],[4,1],[60,2],[48,1],[32,1],[80,1],[40,1],[82,1],[91,1],[38,3],[30,1],[28,1],[31,1],[44,1],[62,2],[64,2],[37,4],[17,1],[63,1],[26,1],[25,1],[70,1],[85,2],[75,3],[33,4],[11,2],[58,1]],'benefit',[[72,1]],'may',[[73,3],[0,3],[56,3],[59,1],[9,2],[29,3],[49,1],[54,8],[2,1],[60,1],[71,1],[48,1],[32,2],[79,1],[31,1],[45,2],[37,2],[17,1],[63,1],[25,1],[43,1],[72,1],[75,2],[33,1],[58,1]],'interfering',[[75,1]],'clearing',[[70,1]],'teachers',[[0,1]],'relied',[[75,1]],'proper',[[54,2],[25,1],[56,1],[2,1],[0,2]],'debug',[[9,2],[67,2],[0,1],[92,2],[68,1],[84,6]],'fixclipperarea',[[70,1]],'bigger',[[62,1]],'addresses',[[33,1]],'research',[[0,1]],'20msec',[[62,1]],'both',[[54,1],[33,1],[24,1],[62,1]],'any',[[79,1],[1,1],[46,1],[0,6],[45,4],[81,1],[13,1],[42,1],[92,2],[84,1],[37,2],[27,1],[26,1],[51,1],[54,1],[71,1],[80,2],[34,2],[91,1],[3,1],[40,1],[11,1],[57,1]],'typing',[[87,1]],'synchronized',[[75,1]],'anti',[[0,1]],'ensuring',[[45,1]],'systemmemory',[[54,2]],'slowing',[[68,1]],'default',[[50,2],[84,5],[39,1],[9,1],[29,1],[49,1],[71,1],[2,1],[24,1],[4,1],[51,5],[48,1],[32,1],[54,1],[57,1],[40,1],[30,2],[31,1],[92,1],[20,1],[37,2],[26,1],[70,1],[34,2],[75,2],[33,3]],'declare',[[52,1]],'store',[[85,1]],'normal',[[50,1],[91,1],[1,1],[11,3],[2,1]],'keepaspectratio',[[30,3]],'decently',[[37,1]],'evolution',[[0,2]],'slows',[[11,1],[50,1]],'plain',[[54,1]],'gettickcount',[[67,1]],'clip',[[11,1]],'creates',[[33,1],[54,1],[37,1]],'overlap',[[62,1]],'about',[[22,1],[1,1],[29,1],[19,1],[24,1],[0,1],[45,1],[91,1],[11,1],[37,1]],'artifacts',[[54,1],[60,1]],'gdinone',[[70,1]],'high',[[63,2]],'manually',[[9,1],[54,1],[92,1],[82,1]],'whose',[[56,1],[24,1],[0,1]],'value',[[73,1],[19,1],[62,2],[86,6],[64,3],[63,1],[51,1],[54,5],[76,2],[2,3],[75,3],[40,1],[33,1]],'can',[[1,8],[67,1],[0,2],[56,1],[84,3],[59,1],[9,3],[29,2],[49,1],[51,1],[2,3],[54,7],[80,2],[48,1],[91,5],[57,1],[79,1],[46,1],[30,2],[28,2],[31,1],[62,1],[13,1],[20,1],[68,2],[92,1],[64,3],[37,2],[63,2],[83,1],[26,1],[25,1],[70,2],[43,3],[34,1],[75,3],[11,5]],'koch',[[24,1]],'calculating',[[57,1]],'timers',[[64,4]],'interesting',[[49,1]],'breaks',[[78,1]],'programs',[[31,1],[0,3],[44,3],[45,4],[92,1],[56,1],[84,2],[37,3],[5,1],[9,1],[54,6],[70,1],[2,1],[43,1],[60,2],[75,2],[32,1],[33,1]],'operations',[[73,1],[62,2],[67,1],[45,1],[52,2],[68,6],[37,1],[49,2],[29,1],[76,2],[43,1],[72,1],[75,2],[91,1],[11,1]],'widechar',[[33,2]],'explorer',[[5,1]],'deletes',[[3,1],[25,1],[7,1],[5,1]],'important',[[80,1],[62,1],[82,1]],'takes',[[49,1],[0,1]],'disables',[[84,1],[75,1],[70,1],[40,1],[60,1],[44,1]],'uniquely',[[57,1]],'pieces',[[24,1]],'monitor',[[0,2],[45,1],[54,1],[40,1],[30,6],[37,2]],'unconnected',[[33,1]],'controlled',[[91,1],[44,4]],'checkadmin',[[84,2]],'receiving',[[44,1]],'move',[[0,1],[45,1],[5,2],[26,2],[54,2],[25,2],[6,1],[85,1],[91,2],[3,2],[11,3],[58,2]],'none',[[49,2],[48,2],[92,1],[57,1],[66,1],[0,1]],'extensions',[[56,1]],'fontbypass',[[75,1]],'hard',[[75,1],[1,1],[33,1],[79,1]],'supposed',[[44,1],[37,1]],'classic',[[40,1],[0,1]],'showfps',[[62,1]],'plocktoggle',[[87,1],[91,1]],'shooters',[[0,1]],'meier',[[37,1]],'typical',[[40,1]],'lockcolordepth',[[51,1]],'browser',[[24,1]],'upon',[[0,1]],'chat',[[0,1]],'cease',[[75,1]],'xyz',[[84,1]],'runs',[[9,1],[51,1],[25,1],[2,1],[28,1],[33,1],[11,1]],'exits',[[3,1],[0,1]],'multiple',[[84,1],[75,1],[25,1],[71,1],[79,1],[37,1]],'this',[[50,2],[0,13],[77,1],[56,10],[29,5],[80,2],[2,2],[24,1],[48,2],[32,6],[91,6],[57,2],[79,4],[46,2],[38,1],[28,1],[44,10],[81,2],[12,1],[13,2],[20,1],[68,3],[64,9],[5,1],[37,11],[63,4],[21,1],[89,2],[90,1],[92,1],[43,7],[33,12],[11,9],[73,2],[1,4],[19,1],[67,2],[84,2],[39,3],[59,1],[9,5],[49,4],[51,18],[54,23],[60,4],[71,3],[10,1],[40,1],[7,3],[30,4],[31,3],[45,10],[62,3],[17,1],[78,5],[25,5],[70,4],[34,6],[72,2],[75,16],[3,1],[85,1],[58,1]],'operated',[[0,1]],'elevate',[[29,1]],'more',[[1,1],[30,1],[0,4],[31,1],[62,1],[68,1],[56,1],[64,1],[63,2],[51,1],[23,1],[25,1],[54,1],[2,1],[43,1],[75,2],[32,1]],'polling',[[44,2]],'peekmessage',[[45,1]],'noflipemulation',[[51,1]],'essential',[[73,1],[29,1]],'determined',[[64,1]],'impact',[[56,1],[75,1]],'ago',[[0,1]],'accelerated',[[54,1],[49,1],[11,1],[64,1]],'factor',[[91,1],[20,1]],'associate',[[7,1]],'focused',[[30,1]],'information',[[37,1],[22,1],[23,1],[29,1],[19,2],[24,1],[82,1],[91,1],[68,1],[11,1],[18,1]],'ignored',[[70,1],[30,1],[54,1]],'forces',[[59,2],[51,1],[29,1],[54,6],[43,2],[42,2],[52,1],[91,1],[56,1],[11,1],[37,3]],'glories',[[0,1]],'directx10',[[48,2]],'lot',[[0,1]],'use',[[1,1],[19,1],[0,1],[81,1],[92,1],[68,1],[64,1],[37,1],[63,1],[78,2],[51,1],[54,4],[84,2],[71,2],[43,1],[60,1],[34,2],[48,1],[75,3],[33,2],[57,1]],'cdromdrivetype',[[79,1]],'involving',[[51,1]],'contributed',[[24,1]],'acquire',[[43,1],[29,1]],'ddrawex',[[48,1]],'swapeffect',[[59,1]],'represent',[[87,1]],'intended',[[11,1]],'affects',[[0,1],[44,1],[40,1],[39,1]],'ram',[[75,1]],'against',[[49,1]],'refuse',[[15,1]],'createprocess',[[34,2]],'contains',[[54,1],[1,1]],'auto',[[72,1],[9,1],[51,2]],'what',[[48,1],[29,1],[54,2],[70,1],[0,3]],'have',[[1,1],[30,2],[0,4],[44,1],[9,1],[15,1],[51,1],[54,3],[2,1],[43,1],[70,1],[72,1],[32,1],[33,1],[11,1],[79,1]],'concurrent',[[68,1]],'position',[[58,1],[87,1],[43,1],[44,5],[30,8],[85,4],[91,1],[20,1],[11,2],[37,1]],'hookdi',[[43,1]],'years',[[0,1]],'crash',[[54,1],[75,1],[3,1],[43,1]],'real',[[49,2],[75,1]],'paths',[[9,2]],'graphic',[[51,1],[54,2],[70,1],[33,1]],'ensures',[[72,1],[51,1]],'created',[[34,3],[51,1],[32,1],[54,2],[66,1],[37,1]],'other',[[30,2],[28,1],[0,3],[45,1],[13,1],[62,3],[56,2],[64,1],[37,2],[49,1],[29,2],[51,2],[70,3],[24,1],[43,2],[75,6],[91,1],[33,1],[11,1]],'efficient',[[54,1]],'128',[[56,1]],'element',[[75,1]],'simulator',[[44,1]],'functionality',[[0,1]],'ramp',[[39,2]],'quickly',[[91,1],[11,1],[68,1]],'olly',[[24,1]],'suppressing',[[52,1]],'clean',[[75,1],[89,1],[56,2],[60,1]],'fixmoviecolor',[[73,1]],'setwindowshook',[[32,2]],'gone',[[15,1]],'returned',[[51,1],[54,2],[40,1]],'append',[[66,1]],'hashed',[[57,1]],'discontinued',[[0,2]],'trail',[[90,1],[0,1]],'put',[[0,1]],'hijack',[[0,1]],'inactive',[[43,1],[0,1]],'defaults',[[28,1],[1,1]],'panel',[[5,2],[39,1],[77,1],[19,1],[64,1],[27,3]],'request',[[54,2]],'invoke',[[75,1]],'alternatively',[[1,1]],'they',[[73,1],[1,1],[30,1],[0,1],[67,1],[64,1],[39,3],[37,2],[54,2],[76,2],[80,1],[2,1],[43,2],[75,1],[91,2],[57,1],[33,3],[11,2]],'map',[[78,1],[11,1],[84,1]],'permissions',[[84,1],[9,1],[29,1]],'then',[[63,1],[9,1],[1,1],[25,1],[49,1],[12,1],[52,1],[91,1],[11,1],[37,2]],'language',[[83,1],[84,8]],'requested',[[51,1],[54,2]],'badly',[[11,1]],'ignoring',[[43,1]],'mention',[[28,1]],'replacement',[[57,1]],'toggle',[[91,3],[87,3],[11,7]],'ways',[[64,1],[0,2]],'power',[[54,1],[75,1],[56,2],[0,1]],'mainly',[[39,1],[9,1],[0,1]],'taken',[[32,1]],'ddraw',[[51,1],[48,1],[54,3],[70,2],[50,1],[89,1]],'platforms',[[17,1],[75,1],[76,2],[60,1],[0,1]],'identify',[[57,1]],'devoted',[[73,1]],'hid',[[43,2]],'unpleasant',[[44,1]],'rate',[[54,1],[62,1]],'windowing',[[11,1],[48,1]],'example',[[63,1],[51,1],[54,3],[30,1],[0,1],[28,1],[62,1],[56,1]],'because',[[15,1],[49,1],[51,1],[30,1],[2,1],[0,1],[60,1],[33,1],[37,1]],'additional',[[56,1],[54,1],[1,1],[19,1],[31,1],[35,1]],'rgb565',[[54,2]],'timetoggle',[[87,1],[91,1]],'translate',[[0,1]],'pitch',[[89,1],[49,1],[54,4]],'normally',[[44,1],[0,2]],'behave',[[75,1]],'reset',[[56,2],[59,1]],'repeated',[[45,1]],'would',[[49,1],[54,1],[25,1],[75,2]],'corresponding',[[51,1],[54,1],[25,1],[80,1],[62,1],[44,1],[48,1],[33,2],[84,3],[39,1]],'group',[[43,2]],'data',[[25,1],[51,2]],'reposition',[[54,1]],'improving',[[54,1]],'appended',[[62,1]],'hopefully',[[0,1]],'target',[[60,2]],'association',[[46,1]],'privileged',[[75,3]],'unlimited',[[40,1]],'smackw32',[[72,2]],'abnormally',[[2,1]],'mmporpg',[[0,1]],'blitfrombackbuffer',[[51,1]],'borders',[[39,1],[58,1],[37,2]],'compensates',[[44,1]],'warhammer',[[54,1]],'tables',[[0,1]],'original',[[49,1],[51,1],[25,1],[33,6],[24,1],[54,1]],'texturehack',[[57,1]],'four',[[30,2]],'hybridmode',[[49,1]],'contexts',[[70,1],[56,1]],'explicitly',[[75,1],[48,1],[51,1]],'contain',[[2,1],[29,1]],'developed',[[45,1],[54,1],[24,1],[0,1]],'activation',[[32,1],[28,1]],'applies',[[51,1]],'cpuslowdown',[[63,3]],'parent',[[28,1],[34,2],[37,3]],'idle',[[4,1],[26,1],[92,1],[19,1],[2,1]],'tycoon',[[45,1]],'grayscale',[[54,1]],'import',[[9,1],[1,2],[3,1],[68,2],[0,1]],'highlight',[[57,2]],'remap',[[70,2],[73,1],[60,1]],'aspect',[[54,1],[30,7],[0,1]],'custom',[[84,1],[78,2],[57,1],[71,2],[0,2]],'switching',[[75,2],[71,1],[64,1]],'flexible',[[54,1]],'counters',[[62,1]],'played',[[73,1]],'typically',[[37,1],[72,1],[40,1],[44,1]],'returning',[[75,1]],'hex',[[87,1]],'enter',[[31,1],[28,1]],'large',[[68,1]],'maxtexy',[[86,1]],'cleartarget',[[60,1]],'named',[[66,1],[0,1]],'sufficient',[[1,1]],'objects',[[54,2]],'diagonal',[[56,1]],'processing',[[51,1],[46,2],[44,1],[45,1],[10,1],[86,4]],'assign',[[11,1],[12,1]],'count',[[67,1]],'applications',[[54,1],[29,1],[75,1],[33,1],[62,1],[0,3]],'bundles',[[2,1]],'hookdi8',[[43,1]],'impress',[[0,1]],'minhook',[[24,1]],'see',[[87,1],[1,2],[19,2],[0,2],[56,2],[9,2],[23,1],[29,1],[51,2],[54,1],[48,1],[32,1],[10,1],[57,1],[18,1],[91,1],[30,1],[31,1],[45,1],[90,1],[13,4],[20,1],[92,1],[64,1],[5,3],[89,2],[25,2],[34,1],[75,1],[3,1],[11,7]],'ready',[[4,1],[26,2],[19,1],[2,2]],'refreshonresize',[[37,1]],'blit',[[72,2],[51,6],[49,1],[52,1],[50,1]],'involved',[[48,1],[0,2]],'success',[[70,1],[75,1]],'reduces',[[63,1]],'posy',[[85,1]],'directx1',[[29,1]],'fails',[[70,1],[33,1],[51,1]],'connected',[[44,1]],'ctrl',[[12,1]],'allows',[[28,1],[81,1],[12,1],[20,1],[64,1],[84,1],[63,1],[49,1],[25,2],[71,1],[80,1],[10,1],[79,1],[11,3]],'milliseconds',[[62,1]],'despite',[[75,1],[0,1]],'global',[[8,1],[5,2]],'invasive',[[0,1]],'clears',[[42,1]],'problem',[[49,1],[1,1],[75,3],[40,1],[56,3]],'resize',[[54,1],[91,2],[11,2],[37,2]],'loading',[[84,1]],'out',[[57,1]],'emulators',[[54,1]],'directdraw',[[19,1],[50,1],[0,2],[90,1],[52,1],[68,2],[39,1],[49,1],[29,1],[51,6],[54,9],[60,1],[70,4],[72,1],[75,2]],'vulnerable',[[45,1]],'tsuda',[[24,1]],'interlaced',[[54,2]],'altered',[[49,2],[33,1],[64,1],[0,1]],'toggles',[[11,7],[91,3]],'many',[[1,3],[68,1],[56,1],[24,1],[0,3]],'injected',[[0,1]],'happen',[[2,1],[44,1]],'alter',[[92,1],[20,1],[64,1],[0,2]],'expansions',[[72,1],[35,1]],'lockedsurface',[[49,1]],'resuming',[[63,1]],'obfuscated',[[33,3]],'act',[[38,1]],'directx9',[[48,3]],'direct3d8',[[56,1],[49,1]],'entire',[[30,2],[62,1],[11,1],[39,1]],'indicated',[[32,1]],'desire',[[62,1]],'transitioned',[[0,1]],'uses',[[0,1],[51,1],[92,1],[33,1],[30,1],[24,1]],'def',[[30,1]],'routines',[[33,2]],'narzou',[[24,1]],'take',[[45,1],[49,1],[51,1],[80,1],[37,1]],'cases',[[1,1],[31,1],[0,2],[30,1],[28,1],[44,3],[37,1],[59,1],[49,1],[51,2],[70,1],[48,1],[75,1],[33,5],[58,1]],'seen',[[19,1],[68,1]],'primary',[[49,12],[51,5],[54,5],[19,1],[50,2],[44,1],[30,1],[70,2],[72,1],[37,2]],'produce',[[63,1],[54,1],[2,1],[64,1]],'general',[[0,1],[75,1],[25,1],[37,1]],'hookdlls',[[33,1]],'installation',[[0,1]],'zbuffer',[[56,2],[54,1],[89,1]],'randomly',[[57,1],[62,1]],'corresponds',[[48,1],[11,1],[20,1]],'bitmaps',[[57,1]],'embedded',[[73,1],[84,1]],'email',[[0,1]],'inside',[[51,1]],'consider',[[91,1],[11,1],[68,1]],'resembles',[[32,1]],'values',[[9,1],[54,2],[70,1],[76,2],[30,3],[80,3],[87,1],[40,1],[39,1]],'last',[[9,2],[15,1],[48,1],[75,2],[30,1],[79,1]],'multi',[[30,1],[37,1]],'polls',[[44,1]],'discrepancy',[[54,1]],'subtopic',[[18,1]],'usable',[[66,1]],'systems',[[75,1],[51,1],[0,1]],'heavily',[[89,1]],'robin',[[51,1],[90,2]],'processmessage',[[72,1]],'priority',[[63,1],[15,1],[75,2]],'alters',[[54,1],[0,1]],'starting',[[1,1],[38,1],[40,1],[37,1]],'respectful',[[49,1]],'red',[[2,1]],'nowinposchanges',[[45,1]],'reason',[[75,1],[1,1],[25,1],[29,1],[0,1]],'whatever',[[40,1]],'doom',[[33,1]],'minimize',[[12,1],[14,1]],'dumped',[[57,1]],'tog',[[11,1]],'setdisplaymode',[[51,1]],'try',[[58,1],[84,1],[49,1],[1,2],[29,1],[51,1],[0,1],[91,1],[11,1],[37,1]],'particularly',[[49,1],[54,1]],'launcher',[[28,1]],'easily',[[45,1],[54,1],[64,1],[0,1]],'palettized',[[54,1],[75,1]],'referred',[[30,1]],'borrowed',[[30,1]],'strength',[[0,1]],'support',[[79,1],[54,1],[0,3]],'activateapp',[[37,2]],'seconds',[[45,2]],'neutralize',[[75,1]],'select',[[30,2]],'possibly',[[75,1],[37,1]],'handlealtf4',[[46,1]],'coordinates',[[73,2],[70,2],[19,1],[30,8],[44,5],[45,3],[85,1],[91,1]],'renderers',[[70,1]],'forcing',[[73,1],[51,1]],'loops',[[75,1]],'restoring',[[2,1],[9,1]],'term',[[0,1]],'tab',[[81,1],[75,2],[80,1],[84,1]],'dinput',[[43,1]],'potential',[[9,1]],'commander',[[54,1]],'resolve',[[88,1]],'visible',[[84,1],[26,1],[71,1],[11,1],[37,1]],'accurate',[[51,1],[62,1]],'entering',[[31,1]],'speeds',[[11,1]],'funkyfr3sh',[[24,1]],'glbindtexture',[[71,1]],'good',[[0,1]],'iconized',[[2,1],[92,1]],'hidehwcursor',[[42,1]],'outside',[[0,1],[30,1],[44,4]],'lets',[[17,1],[54,1]],'scaling',[[50,1]],'attribute',[[51,1]],'boundaries',[[57,1]],'sizy',[[85,1]],'program',[[85,1],[87,1],[1,10],[19,1],[0,5],[77,1],[56,1],[84,1],[27,1],[9,2],[14,3],[15,1],[29,3],[2,6],[24,1],[4,1],[54,5],[80,1],[32,6],[91,3],[46,2],[30,2],[28,4],[31,3],[44,3],[45,3],[52,1],[62,3],[68,2],[64,3],[5,2],[37,4],[63,3],[26,4],[81,1],[25,7],[70,4],[43,6],[92,1],[34,3],[72,1],[75,10],[3,1],[33,6],[11,6],[58,1]],'table',[[68,2]],'quarter',[[62,1]],'threaded',[[0,1]],'these',[[87,1],[1,1],[30,1],[0,5],[31,1],[45,2],[12,1],[64,1],[39,3],[78,1],[9,2],[49,1],[51,1],[54,1],[2,1],[60,1],[70,2],[34,1],[48,1],[75,1],[80,3],[57,1]],'enablehotkeys',[[46,1]],'nopaletteupdate',[[51,1]],'ignores',[[31,1]],'finds',[[73,1],[29,1],[57,1],[2,1]],'descriptive',[[28,1]],'look',[[79,1],[29,1]],'combined',[[75,1]],'old',[[54,3],[60,1],[0,5],[44,1],[43,1],[75,5],[68,1],[91,1],[79,1],[11,1],[64,2]],'interfere',[[43,1]],'executables',[[33,2],[68,1]],'some',[[1,2],[0,6],[56,3],[39,1],[59,1],[9,1],[29,1],[49,1],[51,4],[54,10],[60,1],[71,1],[82,1],[48,1],[32,4],[91,2],[40,1],[79,3],[46,1],[38,1],[31,2],[28,2],[44,7],[45,4],[81,1],[68,2],[64,1],[37,6],[17,1],[78,1],[22,1],[43,2],[34,1],[75,6],[33,3],[11,1],[58,1]],'cliptoggle',[[87,1],[91,1]],'colored',[[0,1]],'normalizeperfcount',[[64,1]],'sites',[[0,1]],'bilspelet',[[51,1]],'noddexclusivemode',[[54,1]],'hook',[[1,1],[19,1],[31,2],[44,1],[92,1],[68,1],[35,3],[37,1],[78,2],[26,1],[29,1],[71,3],[2,2],[43,2],[4,3],[34,6],[48,3],[32,2],[3,2],[33,6],[72,1]],'blt',[[51,1]],'parameter',[[31,1],[1,1]],'clumsy',[[0,2]],'built',[[1,2],[84,1],[0,1]],'comes',[[1,1],[56,1],[2,1],[82,1]],'colors',[[49,1],[21,1],[54,1],[50,1],[39,4]],'unique',[[33,1]],'opengl',[[49,1],[48,1],[71,11],[60,1],[0,1]],'ends',[[9,1]],'complex',[[32,1],[1,1]],'exactly',[[29,1]],'emulates',[[54,1],[43,1],[44,1]],'forceclipper',[[51,1]],'16bit',[[56,1]],'erase',[[66,1]],'modify',[[5,1],[48,1],[25,3],[27,1]],'exe',[[34,1],[1,1],[67,1],[0,1]],'iii',[[33,1]],'imposed',[[75,1]],'override',[[76,1],[79,1],[80,1]],'maximumres',[[40,1]],'toggling',[[11,1],[91,1]],'fine',[[64,1],[20,1]],'she',[[24,1]],'flipemulation',[[51,1]],'normalizes',[[64,1]],'fill',[[54,1],[11,1],[30,2]],'transformation',[[49,1]],'version',[[51,1],[1,1],[54,5],[19,3],[24,1],[28,1],[77,2],[48,3],[75,1],[92,1],[33,1]],'d3d',[[56,1],[58,4]],'consistent',[[25,1]],'decrement',[[54,1]],'suppressrelease',[[51,1],[37,1]],'expressed',[[62,1]],'noperfcounter',[[75,1]],'except',[[79,1],[30,1]],'control',[[0,1],[91,1],[64,3],[11,1]],'technique',[[48,2],[32,2],[33,3],[64,1]],'missing',[[76,2],[9,1],[84,1]],'surfaces',[[52,1],[49,1],[51,5],[54,4]],'method',[[51,3],[32,1],[54,2],[33,2],[60,2]],'disablemaxwinmode',[[75,1]],'rights',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,1],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,1],[9,2],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'exit',[[91,1],[46,1],[3,1],[11,1],[39,1]],'saveload',[[29,1]],'causes',[[78,1],[54,1],[44,1],[45,1],[77,1],[75,2],[92,1],[84,1]],'calculations',[[45,1]],'characteristic',[[49,1]],'game',[[1,3],[0,12],[39,2],[9,1],[29,2],[49,2],[51,9],[54,5],[48,1],[91,4],[79,1],[57,1],[46,1],[38,2],[44,4],[45,1],[90,1],[13,2],[37,5],[63,1],[89,1],[43,3],[72,1],[75,2],[3,3],[33,5],[11,7]],'upperleft',[[30,1]],'assume',[[64,1]],'initial',[[64,2],[38,1],[30,6],[2,1],[85,3],[40,2],[33,1],[5,1]],'direct3d',[[89,2],[55,1],[70,1],[60,4],[0,1],[68,2],[56,1],[58,1]],'tons',[[11,1],[91,1]],'once',[[21,1],[1,1],[26,1],[19,1],[43,1],[0,1],[20,1],[3,1],[33,1]],'recoverscreenmode',[[37,1]],'malfunctions',[[45,1]],'copes',[[54,1]],'flip',[[59,1],[51,5],[90,1]],'clipping',[[51,3],[87,1],[70,1],[91,1],[11,1],[44,4]],'filenames',[[57,2]],'storing',[[46,1]],'holds',[[82,1]],'made',[[49,1],[52,1],[70,1],[33,2],[0,1]],'uncommon',[[45,1],[68,1]],'restart',[[29,1]],'plan',[[57,1]],'flipex',[[59,1]],'stretches',[[73,1],[64,1]],'changes',[[49,1],[51,1],[70,1],[80,1],[30,1],[0,3],[34,1],[39,1]],'outcursortrace',[[68,1]],'pretending',[[0,1]],'inspect',[[20,1]],'refcount',[[54,2]],'colordepth',[[19,1]],'minimized',[[14,1]],'copyright',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,1],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,1],[9,1],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'nonresponsive',[[72,1]],'cornes',[[62,1]],'effect',[[59,2],[51,1],[46,1],[54,1],[71,1],[30,1],[60,1],[62,1],[80,1],[48,1],[75,2]],'interpolates',[[54,1]],'fullscreen',[[19,1],[30,6],[0,6],[44,1],[45,2],[68,1],[56,1],[39,2],[37,4],[49,1],[29,2],[51,1],[54,2],[43,2],[70,3],[85,1],[75,1],[11,3]],'blackwhite',[[54,1]],'life',[[33,1]],'10%',[[64,1]],'fixparentwin',[[37,1]],'web',[[24,1]],'down”',[[68,1]],'255',[[39,1]],'completely',[[32,1]],'informational',[[18,1]],'through',[[73,1],[9,1],[49,1],[70,2],[31,1],[44,1],[12,1],[11,1]],'kageyu',[[24,1]],'locksyscolors',[[39,1]],'suppressclipping',[[51,1]],'influences',[[49,1]],'fixpitch',[[54,1]],'suppress',[[51,3],[54,1],[70,2],[43,1],[34,1],[75,2],[56,2],[37,1]],'scale',[[70,2],[50,1]],'optimizations',[[49,1]],'fixglobalunlock',[[75,1]],'track',[[48,1],[54,1]],'legacy',[[75,2],[0,1]],'lost',[[45,1],[43,1],[0,1]],'are',[[73,3],[87,1],[1,2],[0,7],[56,4],[84,3],[39,1],[9,1],[49,6],[51,1],[54,3],[82,1],[48,3],[57,2],[46,1],[30,7],[44,5],[45,2],[12,1],[20,1],[52,1],[68,2],[64,3],[17,1],[63,1],[76,4],[43,2],[72,1],[75,4],[85,1],[33,2],[11,1]],'releasing',[[30,1]],'others',[[44,1]],'getsystemtime',[[64,1]],'fillrect',[[70,3]],'greatly',[[44,1]],'parallel',[[0,3]],'picks',[[75,1]],'notes',[[81,3]],'printscreen',[[43,1]],'leaving',[[4,1],[11,1],[54,1]],'filename',[[92,2],[66,1],[71,1],[28,1]],'proxy',[[24,2]],'colorfix',[[75,1]],'holding',[[12,1]],'centered',[[30,3]],'aeroboost',[[52,1]],'load',[[92,1],[84,3],[29,1]],'resources',[[0,1],[75,2],[84,2],[44,2]],'skip',[[45,2],[34,1],[43,1],[62,2]],'gdimode',[[49,1]],'results',[[54,2]],'hookchildwin',[[33,1]],'forcewinresize',[[37,1]],'directdraw8',[[56,1]],'experiencing',[[64,1]],'outdxwintrace',[[68,1]],'hogging',[[44,1]],'local',[[2,1]],'enough',[[51,1],[91,1],[33,3],[11,1]],'limits',[[10,1],[64,1]],'surfacebuffer',[[49,1]],'flow',[[20,1],[64,3],[0,2]],'gdi',[[49,3],[51,1],[70,12],[50,2],[44,2],[11,2]],'prevents',[[39,1],[54,1],[37,3]],'skips',[[73,1],[62,1]],'incredibly',[[0,1]],'detect',[[77,1],[48,1],[32,1],[44,1]],'queue',[[45,7],[51,2]],'replaced',[[57,1],[54,1]],'shims',[[18,1],[23,3]],'zbufferclean',[[56,1]],'emulatebuffer',[[49,2]],'extend',[[34,2],[0,1]],'run',[[1,5],[30,1],[0,9],[28,2],[31,1],[13,1],[68,1],[64,1],[39,2],[84,1],[54,1],[29,4],[25,1],[2,1],[75,2],[32,1],[3,1],[33,7],[40,1]],'interface',[[1,2],[19,1],[31,1],[0,1],[9,1],[15,1],[29,1],[49,1],[2,4],[43,1],[54,1],[32,3],[33,1]],'hood',[[51,1],[90,2]],'pure',[[70,1]],'cinematics',[[46,1]],'build',[[84,1]],'three',[[33,1],[43,1]],'random',[[34,1]],'over',[[30,2],[0,1]],'aqrit',[[24,1]],'aware',[[70,1],[11,1]],'relevant',[[13,1]],'distributed',[[78,1]],'mirra',[[54,1]],'fact',[[51,1],[0,1]],'definition',[[1,1]],'unnotify',[[75,1],[29,1]],'simulating',[[64,1],[75,2]],'accepts',[[92,1]],'interactions',[[70,1],[75,1]],'attachable',[[54,2]],'depending',[[48,1],[19,1],[30,1],[56,1]],'non',[[33,1],[43,2],[54,1]],'patching',[[33,3],[24,1]],'minimizes',[[9,1],[14,1]],'playability',[[44,1]],'diablotweak',[[75,1]],'clone',[[25,1]],'habit',[[44,1]],'description',[[1,1]],'immediate',[[80,1]],'patient',[[0,1]],'anywhere',[[0,1]],'compressed',[[54,1],[1,1]],'advancing',[[11,1]],'grow',[[68,1]],'duplicate',[[25,1]],'sleepwalker',[[37,1]],'resources_xyz',[[84,1]],'viewport',[[60,1]],'environment',[[0,4],[49,1],[52,1],[70,1],[28,1]],'sharedkeyboard',[[43,1]],'“force',[[91,1]],'somewhere',[[0,1]],'solutions',[[1,1]],'much',[[54,1],[0,1]],'erasing',[[13,1]],'selecting',[[25,1],[30,1]],'false',[[84,3]],'tells',[[9,1],[29,1],[33,2],[38,1],[62,1]],'performance',[[59,1],[54,2],[75,4],[64,3],[0,1]],'properties',[[77,1]],'cdrom',[[79,7]],'hurt',[[29,1]],'initially',[[92,1]],'please',[[0,1]],'embeds',[[64,1]],'poor',[[54,1]],'hacker',[[33,1]],'critical',[[51,1]],'resources_',[[84,1],[92,1]],'been',[[30,1],[0,1]],'producing',[[56,2],[62,1]],'mode',[[50,1],[56,2],[84,3],[39,1],[59,1],[9,2],[29,2],[49,9],[51,2],[54,10],[60,2],[48,2],[32,4],[79,1],[38,3],[30,3],[44,1],[13,3],[52,5],[68,1],[37,3],[70,3],[43,1],[85,1],[75,1],[11,11]],'injectsuspended',[[32,1]],'gui',[[85,2],[9,1],[84,1],[82,1]],'per',[[17,1],[21,1],[20,1],[19,2],[62,2]],'welcome',[[24,1]],'pronounced',[[54,1]],'uncompressed',[[54,3]],'null',[[54,1]],'after',[[5,1],[32,1],[3,1],[79,1],[2,2],[0,2]],'were',[[0,1],[75,2],[60,2],[37,1]],'clicking',[[26,2],[1,1],[25,2],[2,1],[0,1],[20,1]],'hidetaskbar',[[37,1]],'win7',[[45,1],[75,1]],'ansi',[[33,2]],'shortage',[[51,1]],'should',[[64,1],[54,2],[43,2],[0,1],[44,1],[45,3],[48,2],[75,3],[91,1],[57,1],[11,1],[37,2]],'white',[[60,1],[1,1]],'updating',[[37,1],[51,1],[2,1],[39,1]],'brings',[[49,1],[51,1]],'command',[[73,1],[1,1],[19,1],[28,1],[13,1],[20,1],[92,3],[84,1],[21,1],[26,2],[25,3],[91,2],[11,2]],'overlay',[[59,1],[54,5],[62,2],[64,1]],'terminateonclose',[[29,1]],'initializes',[[37,1]],'detour',[[33,1]],'improves',[[44,1]],'vast',[[33,1]],'generally',[[45,1],[34,1],[48,1],[54,1]],'continue',[[1,1],[75,1],[0,1]],'launching',[[28,1]],'windowize',[[30,1],[29,1]],'patch',[[33,1]],'usage',[[63,3],[54,1],[57,1]],'multitasking',[[75,1]],'define',[[25,1],[5,1]],'regwin32',[[80,1]],'discard',[[59,1]],'extra',[[54,1],[49,1],[0,1]],'getmessage',[[45,1],[68,1]],'find',[[88,1],[48,1],[0,1]],'actions',[[46,1],[32,1]],'occur',[[67,1]],'turn',[[1,1],[0,1]],'search',[[76,2],[33,1],[31,1],[84,1]],'later',[[0,2]],'limit',[[54,1],[75,1],[40,1],[62,2]],'minimalcaps',[[54,1]],'limited',[[33,1],[62,2],[75,1]],'“adopt”',[[0,1]],'show',[[26,2],[1,2],[29,3],[87,1],[60,2],[62,2],[45,1],[67,1],[42,1],[16,1],[3,2],[64,1]],'odd',[[54,2],[32,1]],'stretchtimers',[[64,1]],'mapping',[[87,1]],'principles',[[0,2]],'bad',[[44,1],[75,1],[32,1]],'core',[[75,6]],'pick',[[30,1]],'graphics',[[54,1],[48,2],[57,1],[60,1],[37,1]],'winmm',[[73,1],[64,1]],'depends',[[54,1]],'independently',[[32,1]],'likely',[[3,1],[75,1],[84,1]],'corner',[[30,1],[64,1],[62,1],[11,2]],'cossacks',[[51,1]],'rgb555',[[54,1]],'exclusive',[[19,1],[35,1],[54,1]],'whether',[[56,1],[25,1],[19,1],[2,1],[0,1]],'direct3d10',[[48,1]],'vertical',[[85,1],[51,1]],'complicated',[[70,1],[79,1]],'forceswapeffect',[[59,1]],'anyone',[[84,1],[0,1]],'able',[[54,1],[2,1],[11,1]],'capability',[[54,5],[51,2],[56,1],[0,1]],'computer',[[11,1],[1,1]],'performs',[[54,1],[29,1],[68,1],[44,1]],'hybrid',[[70,1],[49,1]],'versa',[[79,1]],'all',[[87,1],[50,1],[0,8],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,2],[47,1],[80,1],[2,3],[24,1],[82,2],[48,2],[32,2],[91,1],[57,4],[79,2],[46,2],[38,1],[28,1],[44,1],[81,1],[12,1],[13,2],[20,1],[36,1],[64,1],[5,1],[37,2],[63,2],[21,1],[22,1],[41,1],[68,4],[43,3],[69,1],[83,1],[86,1],[89,1],[90,1],[92,3],[33,6],[11,3],[73,1],[88,1],[1,2],[19,1],[67,1],[74,1],[16,1],[84,2],[39,1],[59,1],[9,1],[14,1],[23,1],[49,2],[51,1],[54,4],[4,1],[60,2],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,4],[31,1],[45,5],[62,1],[42,1],[52,2],[8,1],[17,1],[78,1],[26,1],[25,2],[70,2],[6,1],[76,1],[34,1],[72,2],[75,2],[3,4],[85,1],[58,2]],'displays',[[21,1],[23,1],[22,1],[24,1]],'delete',[[9,1],[25,1],[7,1],[5,1]],'meaning',[[37,1],[1,1]],'solaris',[[37,1]],'having',[[91,1],[1,1],[79,1],[11,2],[0,1]],'trigger',[[46,1]],'tweaks',[[54,1],[89,2],[75,1],[56,1],[79,1],[58,1]],'privileges',[[29,1]],'maximize',[[37,1]],'styles',[[75,1]],'bubble',[[81,1]],'near',[[54,1]],'visibility',[[42,2]],'constraint',[[45,1]],'depths',[[17,1],[56,1]],'flash',[[1,1]],'insist',[[37,1]],'nativeres',[[40,1]],'minimum',[[63,1],[85,2],[15,1],[10,3],[86,2]],'technical',[[11,1],[91,1]],'camera',[[11,1]],'them',[[88,1],[0,1],[44,1],[45,1],[92,1],[39,1],[37,1],[78,1],[21,1],[49,1],[43,1],[2,1],[48,2],[75,1],[57,1]],'produced',[[24,1]],'succeed',[[48,1]],'apis',[[68,1],[71,1],[64,2],[0,1]],'instruction',[[64,1]],'apply',[[33,1],[57,1],[78,1]],'metrics',[[75,3]],'disable',[[9,1],[29,1],[75,6],[60,2],[39,1]],'create',[[34,1],[51,1],[25,1],[19,1],[57,1],[0,1]],'efforts',[[0,1]],'hints',[[29,1],[24,1],[1,2]],'cleartexturefourcc',[[54,1]],'purposes',[[33,1],[75,1],[68,1]],'universal',[[33,1]],'darker',[[39,1]],'factors',[[20,1]],'hides',[[54,1],[16,1]],'change',[[39,1],[37,2],[54,1],[38,1],[13,1],[48,1],[75,1],[64,2],[5,1]],'directly',[[75,1],[33,3],[64,1],[28,1]],'suppressoverlay',[[54,1]],'mostly',[[51,1]],'via',[[44,1],[2,1],[1,2]],'failure',[[43,1]],'operating',[[4,1],[45,1],[13,1],[26,1],[0,1]],'recover',[[13,1],[37,1]],'repeatedly',[[37,1]],'sending',[[1,1]],'status',[[44,1],[19,3],[2,1],[18,1]],'administrator',[[84,1],[9,1],[29,2]],'attempts',[[75,1],[0,1]],'dlls',[[78,3],[92,1],[33,3],[31,1]],'iat',[[33,5]],'recurse',[[33,1]],'successful',[[43,1]],'enumadaptermodes',[[56,1]],'switches',[[84,1],[11,1],[51,1]],'complete',[[82,1]],'notextures',[[60,1]],'localization',[[84,1]],'flags',[[63,1],[9,1],[1,1],[54,3],[70,1],[30,1],[43,2],[13,1],[33,1],[57,1]],'operates',[[63,1]],'remains',[[11,1]],'optimizes',[[52,1],[29,1]],'western',[[39,1]],'getcaps',[[54,1]],'gdiemulatedc',[[70,1]],'does',[[51,2],[1,1],[38,1],[0,4],[45,1],[34,2],[32,1],[57,1],[64,1],[58,1]],'tricks',[[82,1],[0,2]],'interferences',[[51,1]],'resource',[[92,1],[51,1],[84,1]],'best',[[54,1],[0,2]],'ddscl_exclusive',[[54,3]],'coordinated',[[71,1]],'get',[[26,1],[1,1],[51,1],[62,1],[44,1],[45,4],[72,1],[75,1],[91,1],[56,1],[11,1]],'freelibrary',[[75,2]],'enabled',[[11,1],[51,1],[91,1],[70,1],[31,1],[2,2]],'gear',[[75,1]],'shaped',[[44,1]],'handler',[[75,1]],'video',[[73,1],[38,2],[0,1],[44,1],[13,1],[36,1],[56,2],[51,2],[54,7],[70,1],[2,1],[32,1],[40,1],[11,1]],'outddrawtrace',[[68,1]],'decelerated',[[64,1]],'0x4000000',[[75,1]],'hidedesktop',[[30,1]],'opened',[[0,1]],'reasonable',[[51,1]],'share',[[70,1],[0,1]],'interfaces',[[49,2]],'cannot',[[33,1],[2,1]],'distracting',[[30,1]],'locked',[[11,1],[49,1]],'presence',[[43,1]],'checking',[[45,1],[32,1],[29,1],[33,2],[44,1]],'ryan',[[24,1]],'sourceforge',[[1,1],[0,2]],'stretched',[[11,1],[64,1]],'slider',[[64,2],[20,5],[11,2],[18,1]],'solid',[[57,1]],'considered',[[30,1]],'searches',[[64,1]],'remaining',[[30,1],[37,1]],'schemes',[[79,1]],'widths',[[10,1]],'message',[[51,2],[29,2],[46,2],[2,1],[44,3],[45,7],[67,2],[37,5]],'types',[[43,1]],'dwzbufferbitdepths',[[54,2]],'prompts',[[25,1]],'display',[[27,1],[22,1],[51,2],[62,1],[91,1],[20,1],[11,1],[37,3]],'peekallmessages',[[45,2]]];window.bSearchDataLoaded=true; \ No newline at end of file +var aTl=[['Introduction.html','Introduction'],['Gettingstarted.html','Getting%20started'],['TheInterface.html','The%20Interface'],['File.html','File'],['Hook.html','Hook'],['Edit.html','Edit'],['Move.html','Move'],['Log1.html','Log'],['Globalsettings.html','Global%20settings'],['Flags.html','Flags'],['Texturelimits.html','Texture%20limits'],['FunctionKeys.html','Function%20Keys'],['HotKeys.html','Hot%20Keys'],['Tools.html','Tools'],['Window1.html','Window'],['Process.html','Process'],['Desktoptaskbar.html','Desktop%20taskbar'],['Desktopcolordepth.html','Desktop%20color%20depth'],['View.html','View'],['Status.html','Status'],['TimeSlider.html','Time%20Slider'],['Palette1.html','Palette'],['Desktop.html','Desktop'],['Shims.html','Shims'],['Help.html','Help'],['ProgramList.html','Program%20List'],['DxWndintheSystemTray.html','DxWnd%20in%20the%20System%20Tray'],['Theconfigurationpanel.html','The%20configuration%20panel'],['Main.html','Main'],['Generic.html','Generic'],['Position.html','Position'],['Hook1.html','Hook'],['Injectionmode.html','Injection%20mode'],['Hookflags.html','Hook%20flags'],['Sonprocesshook.html','Son%20process%20hook'],['Additionallibrarieshook.html','Additional%20libraries%20hook'],['Video.html','Video'],['Windowshandling.html','Windows%20handling'],['Initialvirtualcolorsetting.html','Initial%20virtual%20color%20setting'],['Colormanagement.html','Color%20management'],['Windowsizeposition.html','Window%20size%20%26amp%3B%20position'],['Screenresolution.html','Screen%20resolution'],['Input.html','Input'],['Cursorvisibility.html','Cursor%20visibility'],['DirectInput.html','DirectInput'],['Cursorhandling.html','Cursor%20handling'],['Messagehandling.html','Message%20handling'],['Keyboardhandling.html','Keyboard%20handling'],['DirectX.html','DirectX'],['DirectXVersionHook.html','DirectX%20Version%20Hook'],['Emulation.html','Emulation'],['Filtering.html','Filtering'],['DirectDrawSurfacehandling.html','DirectDraw%20Surface%20handling'],['AEROhandling.html','AERO%20handling'],['DirectX2.html','DirectX%282%29'],['Ddrawtweaks.html','Ddraw%20tweaks'],['Direct3D.html','Direct3D'],['Direct3Dtweaks.html','Direct3D%20tweaks'],['Texturehandling.html','Texture%20handling'],['Direct3Dwindowtweaks.html','Direct3D%20window%20tweaks'],['SwapEffect.html','Swap%20Effect'],['3Deffects1.html','3D%20effects'],['Timing.html','Timing'],['FrameperSecond.html','Frame%20per%20Second'],['Systemspeed.html','System%20speed'],['TimeStretching.html','Time%20Stretching'],['Logs.html','Logs'],['dxwndlogs.html','dxwnd%20logs'],['logoptions.html','log%20options'],['loggedinfo.html','logged%20info'],['Libs.html','Libs'],['GDI.html','GDI'],['OpenGL.html','OpenGL'],['Smack.html','Smack'],['MMmultimedia.html','MM%20%28multimedia%29'],['Compatibility.html','Compatibility'],['Tweaks.html','Tweaks'],['Registry.html','Registry'],['FakeVersion.html','Fake%20Version'],['GOG.html','GOG'],['IOtweaks.html','I/O%20tweaks'],['Registry1.html','Registry'],['Notes.html','Notes'],['Configurationfile.html','Configuration%20file'],['Window.html','Window'],['Language.html','Language'],['Position1.html','Position'],['Texture.html','Texture'],['Keymapping.html','Keymapping'],['Examples.html','Examples'],['SnowBoardRacer.html','SnowBoard%3A%20Racer'],['RobinHoodTheLegendofSherwood.html','Robin%20Hood%20%2D%20The%20Legend%20of%20Sherwood'],['Specialkeys.html','Special%20keys'],['Commandlinearguments.html','Command%20line%20arguments']];var oWl=['hotpatch',[[33,1]],'content',[[80,1],[55,1],[71,1],[24,1],[58,1]],'otherwise',[[11,1],[67,1]],'examples',[[52,1],[89,2],[55,2],[57,1]],'beginning',[[32,1],[29,1],[33,1],[68,2]],'capabilities',[[55,2]],'exclamation',[[82,1]],'queues',[[69,1]],'matching',[[58,1]],'become',[[80,1]],'fortunately',[[31,1]],'integer',[[76,1]],'altf4',[[88,1],[92,1]],'surviving',[[0,1]],'few',[[83,1],[1,1],[3,1],[93,1],[2,1],[0,2]],'rare',[[55,1],[76,1],[31,1],[50,1]],'row',[[2,1],[11,1]],'itself',[[37,1],[49,1],[29,2],[2,1],[28,1]],'meanwhile',[[0,1]],'elements',[[28,1],[63,1],[55,1],[39,1]],'configure',[[84,1],[29,1]],'application',[[46,3],[55,1],[0,5],[52,1],[16,2],[92,2],[69,1],[37,1],[5,3],[29,1],[41,1],[2,1],[72,1],[3,2],[40,1],[11,1],[7,2]],'idea',[[76,1],[30,1]],'buttons',[[45,1]],'attempting',[[76,1],[13,1]],'speed',[[11,2],[88,2],[76,2],[0,1],[92,1],[20,1],[64,1],[65,5]],'article',[[23,1]],'terminating',[[2,1]],'recovered',[[49,1]],'ahlgrens',[[52,1]],'channel',[[52,2]],'enumerate',[[57,1]],'let',[[5,1],[76,1],[0,3]],'preventmaximize',[[37,1]],'increments',[[65,1]],'hookglut32',[[72,1]],'key',[[88,1],[47,4],[76,2],[44,1],[12,1],[92,4],[11,2]],'blocks',[[76,1]],'limitresources',[[76,1]],'combination',[[76,1]],'stretching',[[49,1],[29,1],[46,1],[53,1],[50,1],[71,2],[88,1],[92,3],[20,2],[65,3]],'shows',[[19,2],[44,1],[90,1],[16,1],[20,1],[21,1],[22,1],[23,1],[26,1],[2,2],[24,1],[91,1],[65,1]],'when',[[73,1],[19,1],[0,3],[74,3],[39,4],[9,2],[29,4],[51,1],[2,3],[4,1],[32,1],[57,1],[65,7],[55,10],[30,3],[28,1],[31,1],[44,6],[45,4],[52,4],[92,5],[86,1],[69,1],[37,3],[63,3],[25,1],[76,4],[85,2],[33,1],[11,2]],'fake',[[78,2],[11,1],[30,5]],'detailed',[[18,1],[69,1]],'glpixelzoom',[[72,2]],'whoever',[[24,1],[0,1]],'config',[[93,1],[37,1]],'downloaded',[[0,1]],'reference',[[55,2],[30,1]],'works',[[9,1],[49,1],[55,1],[31,1],[50,1],[61,1],[13,1],[32,2],[33,1],[57,1]],'prompting',[[29,1]],'never',[[76,2],[0,2]],'from',[[73,1],[88,1],[1,1],[50,1],[0,3],[61,1],[39,3],[59,1],[9,1],[29,1],[80,3],[2,3],[60,1],[4,1],[32,3],[40,5],[65,1],[46,5],[55,3],[53,1],[30,2],[31,1],[45,1],[81,2],[13,1],[52,3],[68,1],[93,1],[37,2],[83,1],[25,1],[41,3],[76,3],[72,1],[3,1],[33,3]],'virtual',[[51,1],[55,3],[38,1],[50,2],[80,2],[45,1],[81,3],[52,2],[74,1]],'lockreservedpalette',[[39,1]],'filling',[[1,1]],'bypassmci',[[74,1]],'incorrect',[[55,2],[57,2]],'shutting',[[32,1]],'suppresses',[[80,1],[46,1],[55,2],[57,1],[71,1],[39,1]],'specification',[[55,1],[85,5]],'cleans',[[61,1]],'module',[[76,1],[31,1]],'approximately',[[20,2]],'crashing',[[32,1]],'declaring',[[38,3]],'situation',[[33,2],[46,1]],'videogame',[[0,1]],'block',[[76,1],[32,1]],'direct3d9',[[49,1]],'timestamp',[[68,6]],'rid',[[15,1]],'assembly',[[33,1],[65,3]],'operate',[[55,1],[2,1]],'calculated',[[19,1]],'hookgdi',[[71,1]],'fifth',[[76,1]],'fixtextout',[[71,1]],'enable',[[45,1],[47,1],[9,1]],'scrolling',[[45,1],[52,2]],'api',[[39,3],[65,1],[46,1],[76,3],[71,2],[45,2],[72,1],[57,1],[33,4],[35,1]],'series',[[45,1],[37,1]],'each',[[65,2],[46,1],[55,1],[30,1],[28,1],[67,1],[52,1],[68,3],[27,1],[15,1],[49,1],[51,1],[80,1],[2,1],[34,2],[33,2],[18,1],[58,1]],'differently',[[25,1]],'operation',[[51,1],[76,2],[71,1],[80,1],[52,4],[32,1],[3,1],[57,1],[64,1]],'task',[[46,1],[19,3],[31,1],[0,1],[28,2],[92,2],[29,2],[25,2],[2,1],[4,1],[32,2],[11,2]],'playable',[[55,1]],'sound',[[76,1]],'forget',[[0,1]],'necrodrome',[[45,1]],'ordering',[[57,2]],'set',[[1,1],[19,1],[50,2],[0,1],[77,4],[29,1],[47,1],[80,1],[10,1],[65,4],[55,5],[53,1],[30,4],[28,2],[31,2],[44,2],[45,3],[20,1],[52,4],[81,2],[64,2],[5,1],[17,1],[37,1],[92,2],[41,2],[76,7],[72,1],[85,2],[11,1]],'whenever',[[49,1],[55,1],[0,1],[44,1],[81,1],[74,1],[86,1],[65,1]],'overwrite',[[67,2]],'keys',[[88,3],[47,3],[0,1],[81,2],[12,2],[13,1],[92,2],[11,9]],'boolean',[[85,3]],'predefined',[[1,1]],'sys',[[39,1]],'pixels',[[51,1],[86,2],[0,1]],'246',[[39,1]],'found',[[33,1],[2,1],[0,2]],'disabledisablealttab',[[76,1]],'currently',[[26,1],[14,2],[25,1],[19,1],[2,1],[0,2],[71,2],[85,1],[3,1],[35,1],[37,1]],'wouldn',[[52,1]],'access',[[35,1],[65,1],[18,1],[44,2]],'dynamically',[[20,1]],'pity',[[0,1]],'injection',[[0,1],[34,2],[32,3],[76,1],[24,1],[2,1]],'100%',[[45,1],[76,1],[0,1]],'necessary',[[41,1],[33,1],[65,1]],'versions',[[85,1],[55,1],[33,1],[57,2],[44,1]],'wm_activateapp',[[37,1]],'nopixelformat',[[52,1]],'lighter',[[39,1]],'cpus',[[76,2]],'unsupported',[[76,3],[85,1]],'wm_windowposchanging',[[46,1]],'tweaked',[[55,1]],'nobanner',[[29,1]],'preventing',[[45,1],[72,1],[46,1],[39,1]],'clicks',[[46,1]],'pending',[[46,1]],'placed',[[45,2],[1,1],[30,1]],'acceleration',[[55,1],[76,1]],'regardless',[[0,2]],'retrieve',[[46,1]],'released',[[55,1],[52,1]],'singleprocaffinity',[[76,2]],'source',[[0,5]],'leave',[[49,1]],'definitions',[[47,1]],'print',[[11,1]],'wow32registry',[[77,1]],'saves',[[3,1],[11,1]],'closely',[[32,1]],'adjusts',[[78,1]],'greater',[[63,2],[32,1]],'read',[[81,1],[77,2],[52,2],[55,1]],'fourcc',[[55,3]],'lacks',[[57,1]],'setsyscolors',[[39,1]],'simple',[[2,1],[0,1]],'type',[[55,1],[80,3],[69,1],[44,1]],'blue',[[81,1]],'object',[[30,1]],'sizes',[[55,1],[57,1],[74,1]],'getting',[[15,1],[1,1]],'changing',[[37,2],[79,1],[32,1]],'reaction',[[46,1]],'romsteady',[[24,1]],'keeps',[[45,1],[46,1],[44,2]],'architectures',[[0,1]],'noted',[[63,1]],'stored',[[83,1],[86,1]],'invokes',[[61,1]],'even',[[55,1],[76,1],[44,3],[0,6],[81,1],[52,3],[85,1],[3,1],[92,1],[11,1]],'tweak',[[55,1],[76,2]],'well',[[49,1],[46,2],[29,1],[55,1],[76,1],[92,1],[32,1],[33,1],[11,1],[37,1]],'network',[[0,1]],'directsound',[[35,2]],'figures',[[63,1]],'serve',[[9,1]],'comments',[[82,1]],'clock',[[65,4]],'50%',[[65,1]],'unwanted',[[37,1],[32,1]],'tray',[[26,5],[93,3],[3,3],[19,1],[2,1]],'lockwinstyle',[[37,1]],'max',[[10,1],[41,1],[64,1],[76,1]],'zeta',[[57,2]],'possibility',[[92,1],[80,1],[11,1],[69,1]],'destroywindow',[[71,1]],'special',[[88,1],[92,2],[47,2],[11,7],[58,1]],'under',[[33,1]],'started',[[37,1],[9,1],[1,1],[2,1],[0,2]],'five',[[46,1]],'selected',[[64,1],[23,1],[25,3],[41,1],[6,4],[30,1],[60,1],[3,1],[7,2],[5,2]],'kind',[[24,1]],'including',[[34,1],[22,1],[59,1],[3,1]],'than',[[1,1],[55,3],[30,4],[28,1],[0,2],[44,1],[50,1],[64,1],[63,3],[41,1],[2,1],[57,1],[11,2]],'themselves',[[52,1],[15,1],[46,1]],'space',[[76,1],[33,1]],'behavior',[[58,1],[78,1],[30,1],[0,7],[4,1],[45,1],[85,1],[92,1],[93,1],[79,1],[37,1]],'restarts',[[29,1]],'sharing',[[0,1]],'2ms',[[64,1]],'enum16bitmodes',[[57,1]],'hooker',[[0,2]],'skipdevtypehid',[[44,1]],'invoking',[[53,1]],'detail',[[11,1],[92,1]],'attempt',[[37,1],[76,1],[0,2]],'big',[[76,1]],'background',[[30,2],[52,1]],'izer',[[0,1]],'apes',[[44,1]],'unchecked',[[47,1]],'writes',[[69,1],[9,1],[1,1]],'mix',[[71,1]],'showhwcursor',[[43,1]],'where',[[55,1],[67,1],[45,1],[52,1],[5,1],[37,1],[51,1],[71,1],[2,2],[3,1],[33,2],[11,1],[58,1]],'composition',[[57,1],[50,1]],'situations',[[52,1]],'quarterblt',[[63,1]],'encourage',[[0,1]],'address',[[76,1],[33,4],[52,1]],'viewfinder',[[45,1]],'expects',[[37,1]],'japanese',[[0,1]],'listening',[[44,1]],'automatically',[[34,3],[49,1],[29,1],[46,3],[93,1],[30,2]],'bilinearfilter',[[51,1]],'calculate',[[76,1]],'editing',[[83,1]],'won',[[2,2],[46,1]],'experience',[[30,1]],'editor',[[7,1],[58,1]],'quit',[[11,2],[92,2]],'launch',[[81,1],[82,1],[28,1]],'bilinear2xfilter',[[51,1]],'isn',[[33,1],[13,1],[52,1]],'1000th',[[64,1]],'pointing',[[25,1]],'directinput',[[44,10]],'fit',[[72,1],[51,1],[71,2],[50,1]],'posx',[[86,4]],'double',[[26,1],[1,2],[25,1],[51,1]],'machine',[[55,1],[0,1]],'bug',[[50,1]],'imported',[[2,1]],'classification',[[30,1]],'looping',[[45,1],[73,1]],'addrelativetime',[[68,1]],'now',[[76,1],[71,1],[50,1],[0,2]],'arguments',[[93,2],[28,1]],'short',[[69,1],[29,1]],'needed',[[25,1],[32,1]],'explicit',[[52,1],[74,1]],'final',[[53,1]],'exceptions',[[76,2],[83,1]],'techniques',[[0,1]],'closes',[[14,1]],'update',[[63,1],[59,1],[52,2],[1,1],[33,1]],'pressing',[[12,1]],'onward',[[46,1],[76,1],[0,2]],'tigerhawkt3',[[24,1]],'while',[[46,1],[55,1],[30,2],[0,5],[52,1],[16,2],[68,1],[37,1],[9,1],[3,2],[57,2],[33,1],[11,4]],'gameplay',[[11,1]],'alone',[[49,1]],'time',[[11,8],[88,3],[1,1],[0,9],[61,2],[92,4],[20,7],[86,1],[64,1],[69,1],[63,1],[49,1],[29,1],[76,1],[34,1],[18,1],[65,14]],'height',[[87,2],[41,2],[19,1],[30,6],[10,2],[86,3]],'managed',[[25,1],[50,1]],'malfunctioning',[[46,1]],'behaviour',[[33,1]],'extracting',[[58,1]],'involves',[[50,1]],'duration',[[68,1]],'such',[[88,1],[46,4],[30,1],[0,2],[44,1],[45,2],[52,2],[68,1],[39,1],[63,1],[37,2],[29,1],[76,2],[80,1],[82,1],[85,1],[32,1],[40,1],[65,1]],'synchronization',[[24,1]],'annoying',[[0,2]],'worms',[[37,1]],'lack',[[50,1]],'suppressime',[[76,1]],'side',[[76,1],[0,1]],'exported',[[3,1],[57,1]],'codec',[[55,1]],'render',[[59,1]],'intercepted',[[65,1],[69,1],[71,1],[19,1],[33,1],[40,1]],'impossible',[[46,2]],'unfortunately',[[55,1],[33,1],[0,1]],'written',[[37,1],[0,2]],'right',[[26,1],[25,1],[55,1],[2,1],[82,1],[45,2],[81,1],[32,1],[33,1],[37,1]],'selection',[[30,2]],'child',[[34,5],[59,1],[33,2],[82,1],[37,2]],'monitors',[[55,1],[37,1]],'way',[[63,1],[46,1],[55,1],[30,1],[0,5],[4,1],[85,1],[52,5]],'binplayer',[[34,1]],'moving',[[45,2],[59,1],[65,1]],'ads',[[47,1]],'easier',[[68,1],[58,2]],'reg',[[83,1],[77,2],[0,1]],'confirm',[[3,1],[29,1]],'uselastcore',[[76,1]],'measures',[[68,1]],'directx7',[[49,1]],'there',[[65,1],[1,1],[46,1],[0,5],[45,1],[61,1],[52,2],[83,1],[9,1],[41,1],[3,1],[33,2],[57,1],[58,1]],'creating',[[55,1],[52,1]],'beneath',[[29,1]],'disabled',[[41,1],[47,1],[0,1]],'offered',[[68,1]],'replace',[[55,1],[76,1],[58,1]],'settings',[[0,1],[81,1],[8,1],[5,4],[37,4],[39,1],[22,1],[29,1],[25,1],[83,1],[2,1],[43,1],[82,1],[84,1],[32,1],[11,1]],'further',[[57,1],[0,1]],'boxes',[[29,1],[1,1]],'far',[[52,1],[33,1],[82,1],[37,1]],'appearance',[[81,1],[82,1]],'tabbed',[[27,1]],'priorities',[[15,1]],'mandatory',[[76,1]],'increase',[[92,1],[88,1],[0,1]],'f12',[[88,1],[11,1],[12,1]],'properly',[[65,1],[49,1],[29,1],[46,1],[55,1],[76,2],[44,1],[72,1],[57,4],[37,2]],'forbid',[[76,1]],'focus',[[44,3]],'stays',[[3,1]],'ollydbg',[[24,1]],'handleexceptions',[[76,1]],'infinite',[[87,2]],'restored',[[3,1]],'opens',[[7,1],[5,3]],'loop',[[47,2],[73,2],[76,1]],'createdevice',[[60,1]],'back',[[14,1],[44,1],[0,1]],'doesn',[[59,1],[49,1],[55,1],[53,1],[76,2],[44,1],[52,3],[92,1],[93,1],[11,1],[64,1]],'quite',[[11,1],[69,2],[92,1],[71,1],[50,1],[2,1]],'caps',[[55,1],[29,1]],'box',[[46,1],[31,1],[29,1]],'section',[[77,2],[58,1]],'bypass',[[76,1],[79,1],[74,1]],'crucial',[[0,1]],'only',[[79,2],[1,2],[55,4],[30,4],[0,5],[44,2],[50,1],[52,4],[61,2],[64,1],[39,1],[37,2],[9,1],[29,3],[47,1],[71,1],[2,2],[76,1],[32,2],[40,2],[33,2],[11,2]],'alt',[[12,1],[88,3],[47,3],[76,2],[11,2],[92,1]],'blocking',[[33,1]],'harm',[[45,1]],'states',[[45,1]],'imperia',[[52,1]],'according',[[55,1],[76,1],[30,1],[64,1]],'requests',[[80,1]],'seemed',[[0,1]],'nowindowmove',[[59,1]],'occasionally',[[46,1]],'backs',[[52,1]],'ordinal',[[33,1]],'confirmonclose',[[29,1]],'depend',[[71,1],[65,1]],'800x600',[[30,1]],'heavy',[[76,1]],'swap',[[60,2]],'keeping',[[44,1]],'wireframe',[[61,3]],'displacement',[[45,1]],'modified',[[9,2]],'library',[[72,4],[24,1]],'regain',[[44,1]],'something',[[5,1],[0,1]],'suspend',[[64,1]],'higher',[[41,1],[11,1]],'same',[[46,1],[38,3],[50,2],[44,2],[0,3],[52,1],[86,3],[64,2],[78,1],[25,1],[71,1],[76,1],[34,2],[33,1]],'falling',[[0,1]],'obfuscation',[[33,1]],'threads',[[64,3]],'heights',[[10,1]],'reading',[[55,1]],'spot',[[68,1]],'chosen',[[78,2],[50,1],[30,1],[28,1],[12,1],[37,1]],'asian',[[0,1]],'unable',[[49,1],[32,1]],'compose',[[72,1]],'wow64registry',[[77,1]],'tasks',[[92,1],[11,2],[0,2]],'looks',[[85,1]],'320',[[86,1]],'was',[[46,1],[25,1],[55,3],[30,2],[24,1],[0,7],[45,1],[71,1],[80,1],[3,2],[33,1]],'manage',[[58,1],[52,1],[76,1],[57,1],[37,1]],'undesired',[[61,1]],'com',[[79,1],[49,1]],'galapagos',[[73,1]],'yellow',[[32,1]],'releases',[[57,1],[72,1],[28,1]],'messageproc',[[45,1],[46,1]],'probably',[[72,1],[30,1]],'tested',[[1,2]],'has',[[47,1],[19,1],[30,2],[0,3],[50,1],[34,1],[55,1],[76,2],[33,3],[7,2]],'region',[[45,1],[63,1],[92,1],[11,1]],'virtualpc',[[55,1]],'overheating',[[76,1]],'scrollable',[[68,1]],'shares',[[71,1]],'fpstoggle',[[88,1],[92,1]],'distorting',[[55,1]],'fixrefcounter',[[55,1]],'fast',[[11,1],[51,1]],'simulate',[[55,1]],'session',[[25,1],[55,1],[67,1]],'fully',[[76,1],[71,1]],'domain',[[52,1]],'received',[[46,1]],'again',[[44,1],[26,1],[92,1],[3,1],[11,1],[0,2]],'telling',[[49,1]],'code',[[88,1],[76,2],[24,3],[0,7],[2,1],[52,1],[33,1],[65,1]],'widescreen',[[30,1]],'outd3dtrace',[[69,1]],'windowed',[[46,2],[55,4],[30,1],[0,1],[45,1],[50,1],[52,3],[61,1],[69,1],[37,1],[29,1],[76,2],[71,4],[2,2],[11,2]],'measurement',[[76,1]],'wonderful',[[0,1]],'clipboard',[[11,1]],'involve',[[32,1]],'shortcut',[[5,1],[1,1],[2,1],[0,1]],'son',[[34,1]],'revert',[[39,1]],'supporthdmi',[[41,1]],'dxw',[[3,1]],'fixed',[[45,1],[32,1],[19,1],[40,1]],'yes',[[19,1]],'disablegammaramp',[[39,1]],'devices',[[80,5],[44,4]],'unexpected',[[46,1]],'videotosystemmem',[[52,1]],'power2width',[[55,1]],'device',[[71,3],[80,2],[44,2]],'mind',[[69,1],[2,1],[0,2]],'point',[[45,1],[32,1]],'moved',[[45,1],[63,1],[92,1]],'running',[[1,1],[55,2],[19,3],[0,3],[61,1],[52,1],[16,2],[64,1],[37,1],[26,2],[14,2],[29,2],[71,1],[2,1],[76,1],[4,2],[3,1],[33,1],[11,1],[57,2]],'getcursorpos',[[45,1]],'one',[[1,1],[46,1],[19,2],[31,1],[0,7],[55,1],[81,1],[52,1],[68,1],[37,2],[63,1],[25,2],[71,1],[6,2],[76,2],[80,1],[3,1],[33,3],[65,1]],'overlaps',[[45,1],[71,1]],'directx8',[[49,2]],'eliminate',[[55,1]],'avoids',[[50,1]],'wm_windowposchanged',[[46,1]],'freestyle',[[55,1]],'forcehookopengl',[[72,1]],'zbuffer0clean',[[57,2]],'fakeversion',[[78,1]],'propose',[[85,1],[9,1]],'corrected',[[2,1],[52,1]],'1980x1080',[[41,1]],'texel',[[58,1]],'archive',[[1,1]],'self',[[85,1],[9,1]],'bits',[[17,1],[57,1],[22,1]],'timeout',[[46,1]],'main',[[59,1],[2,1],[28,1],[81,1],[34,1],[52,1],[72,1],[74,1],[33,2],[82,1],[37,3]],'instead',[[83,1],[55,1],[25,1],[50,2],[72,1],[93,1],[33,2],[79,2],[37,2]],'encoding',[[55,2]],'class',[[76,2]],'equivalent',[[25,1],[45,1],[79,1]],'modes',[[41,3],[71,1],[50,1],[30,7],[44,2],[60,1],[13,1],[52,1],[76,1],[57,3]],'keycode',[[88,1]],'order',[[5,1],[29,1],[37,3]],'performed',[[74,1]],'timing',[[64,1],[76,1],[62,1],[65,5]],'tools',[[81,1],[13,1]],'coded',[[33,1],[2,1],[46,1]],'resizeable',[[37,1]],'dealing',[[0,1]],'tweaking',[[55,1]],'unpredictable',[[0,1]],'captures',[[11,1]],'piece',[[0,1]],'open',[[25,1],[0,2]],'shared',[[0,1],[85,1],[71,1],[24,1],[44,1]],'fixd3dframe',[[59,1]],'button',[[45,2],[30,3]],'yourself',[[52,1],[0,1]],'text',[[41,2],[55,2],[30,1],[31,1],[81,2],[82,1],[85,1],[93,1],[7,1]],'opinion',[[52,1]],'callback',[[32,1]],'restore',[[12,1],[14,1],[15,1],[2,1]],'customized',[[58,1]],'continuously',[[45,1]],'form',[[80,1],[1,1]],'unnecessary',[[72,1]],'board',[[1,1]],'wrong',[[76,1],[50,1]],'inserting',[[73,1]],'layout',[[84,1]],'overridden',[[85,1]],'arranges',[[5,1]],'dual',[[0,1]],'kept',[[85,1]],'with',[[1,3],[19,1],[50,2],[0,8],[61,3],[59,1],[9,2],[29,1],[51,1],[71,2],[2,3],[82,2],[32,1],[40,1],[7,1],[57,2],[65,5],[55,8],[53,1],[30,5],[44,2],[45,1],[81,2],[52,1],[20,1],[68,1],[69,2],[37,2],[26,1],[25,1],[76,10],[34,2],[72,1],[85,2],[33,1],[11,1],[58,2]],'keep',[[0,2],[45,2],[33,1],[30,2],[2,1]],'cds',[[80,1]],'loads',[[85,1]],'between',[[63,1],[73,1],[71,1],[50,1],[45,2],[52,1],[68,1],[57,2],[11,4]],'working',[[0,1],[52,1],[1,1],[93,1],[37,1]],'obsolete',[[55,1]],'following',[[49,1],[41,1],[25,1],[19,2],[30,1],[50,1],[60,1],[85,1],[11,1]],'lang',[[85,5],[93,1]],'sacrificing',[[55,1]],'nosysmembackbuf',[[55,1]],'wm_nchittest',[[45,2]],'madness',[[55,1]],'understand',[[0,1]],'direcx7',[[49,1]],'absolute',[[2,1]],'luigi',[[24,1]],'saving',[[45,1],[9,1]],'particular',[[58,1],[50,1],[0,1]],'just',[[1,2],[37,1],[0,3]],'maybe',[[0,1]],'possible',[[65,1],[49,1],[1,1],[46,1],[55,1],[30,1],[0,3],[76,1],[74,2],[40,1],[33,1],[37,1]],'omit',[[61,1],[72,1]],'insert',[[80,1]],'smackopen',[[73,1]],'fixnchittest',[[45,1]],'extracted',[[58,1]],'like',[[1,4],[46,3],[71,1],[30,1],[0,5],[76,2],[34,1],[81,1],[33,1],[11,2]],'range',[[76,1],[88,1],[65,1]],'offending',[[46,2]],'option',[[73,1],[50,3],[61,1],[39,2],[9,3],[29,1],[49,2],[71,1],[91,1],[57,2],[7,2],[65,3],[46,3],[55,4],[38,1],[30,2],[44,1],[90,2],[52,5],[68,2],[92,2],[64,1],[37,1],[76,2],[34,4],[3,1],[11,1],[58,1]],'cpu',[[29,2],[55,1],[76,3],[0,1],[45,2],[64,5]],'significant',[[69,1]],'without',[[63,1],[29,1],[25,1],[46,1],[2,1],[0,2],[44,1],[52,1],[92,1],[57,1],[11,1],[65,1]],'folders',[[9,1]],'trilogy',[[33,1]],'dialogs',[[93,1]],'screen',[[73,2],[88,1],[19,1],[30,4],[0,3],[45,1],[50,2],[13,1],[52,3],[53,1],[92,1],[39,2],[37,4],[63,11],[51,1],[29,2],[41,5],[76,1],[2,1],[72,2],[11,5],[65,1]],'nth',[[93,1]],'file',[[1,4],[67,4],[81,1],[77,2],[68,2],[93,4],[5,1],[83,3],[9,4],[26,1],[25,2],[47,1],[49,1],[85,1],[3,3],[10,1],[7,3],[58,2]],'rely',[[55,1],[76,1]],'hardware',[[55,7],[76,3],[50,1],[0,1],[45,1],[43,2],[57,2],[35,1],[65,1]],'superchamps',[[44,1]],'wrapper',[[55,1]],'implemented',[[33,1],[35,1],[71,1]],'activated',[[65,1],[15,1],[32,1],[3,1],[2,2],[28,1]],'explained',[[0,1]],'movies',[[73,2],[46,1],[55,3],[34,2],[52,1],[74,4]],'net',[[0,1]],'titleless',[[37,1]],'specific',[[46,1],[55,1],[30,2],[0,2],[92,1],[11,1],[65,1]],'upwards',[[6,1]],'port',[[76,1],[85,1]],'resolves',[[55,2],[52,1]],'consuming',[[64,1]],'rerouting',[[79,2]],'eliminating',[[30,1]],'activate',[[55,1],[2,1],[26,1]],'drive',[[80,1],[1,2]],'intercept',[[65,1],[47,1],[76,3],[0,1],[45,1],[34,1],[32,3],[33,1],[37,1]],'finer',[[65,2]],'inclusion',[[57,1]],'makes',[[63,1],[37,2],[46,2],[55,2],[71,3],[85,1],[52,1],[68,1],[58,1]],'reported',[[76,1],[9,1]],'nod3dreset',[[57,1]],'basic',[[49,1],[32,1],[80,1],[0,3]],'know',[[0,1]],'recommended',[[93,1]],'imagehlp',[[76,2]],'dinput8',[[44,1]],'prevent',[[4,1],[39,1],[52,1],[59,1],[33,1],[37,1]],'640x360',[[41,1]],'protection',[[80,1]],'off”',[[45,1]],'blizzard',[[76,1],[11,1]],'unless',[[65,1],[0,1]],'want',[[0,1],[45,2],[49,1],[83,1],[30,1],[2,1]],'add',[[27,1],[1,2],[25,1],[46,1],[2,1],[0,1],[81,1],[34,1],[82,1],[68,2],[5,1]],'issues',[[72,1],[1,1],[76,1],[57,2],[65,1]],'skipfps',[[63,2]],'happy',[[29,1]],'combinations',[[17,1],[76,1]],'sizx',[[86,1]],'movement',[[45,2],[52,1],[46,1],[44,1]],'replication',[[72,1]],'described',[[76,1]],'discovered',[[76,1]],'cause',[[59,1],[46,1],[45,1],[85,1],[74,1],[92,1],[33,2],[11,1]],'allowing',[[73,1],[32,3],[55,2],[35,1],[0,1]],'injectson',[[34,1]],'“cursor',[[45,1]],'allocated',[[76,1]],'common',[[89,1],[1,1],[76,1],[71,2],[44,1],[0,1],[52,2],[33,1],[11,1],[65,1]],'portions',[[0,1]],'enablesonhook',[[34,1]],'refers',[[30,1]],'format',[[81,1],[22,1],[52,4],[10,1],[86,1],[88,1]],'different',[[49,2],[51,1],[25,1],[55,1],[50,1],[31,2],[0,3],[71,1],[72,2],[85,1],[33,2],[57,3]],'available',[[49,1],[88,2],[55,4],[76,3],[80,2],[45,1],[85,3],[57,1],[65,1]],'activating',[[34,1]],'zbufferbitdepths',[[55,1]],'matter',[[25,1],[33,1],[52,1]],'done',[[33,1]],'multiprocesshook',[[85,2]],'several',[[63,1],[46,1],[76,1],[0,3],[52,1],[74,2],[33,2],[37,1]],'options',[[1,1],[50,2],[90,2],[68,1],[37,1],[63,1],[49,4],[29,1],[89,1],[82,1],[85,1],[3,1]],'need',[[83,1],[29,1],[46,1],[55,2],[31,1],[0,2],[2,1],[52,1],[93,1],[57,1],[7,1]],'technological',[[0,1]],'hot',[[12,2],[88,2],[47,3],[33,2],[24,1]],'computers',[[55,1],[61,1],[0,1]],'preserved',[[30,1]],'force',[[45,1],[72,1],[52,1],[37,2]],'sizing',[[46,1]],'furthermore',[[50,1]],'extract',[[58,1]],'purpose',[[34,1],[79,1],[0,2]],'technology',[[49,1]],'hookglide',[[35,1]],'leaves',[[52,1],[91,1],[55,1],[11,1]],'don',[[28,1],[45,1],[52,3],[92,1],[69,1],[37,3],[59,1],[29,1],[76,2],[80,1],[57,3],[11,1],[65,1]],'wants',[[0,1]],'wikipedia',[[23,1]],'bilinear',[[24,1],[51,3]],'backbuffer',[[55,3],[52,4]],'zero',[[76,1],[87,2]],'service',[[55,1],[50,1]],'kill',[[12,1],[15,1],[25,4],[46,1],[37,1]],'push',[[0,1]],'dialog',[[29,1],[1,2]],'extended',[[30,1]],'win',[[92,1],[71,1],[69,1],[37,4]],'color',[[55,3],[38,2],[50,6],[53,1],[13,3],[52,3],[74,3],[39,2],[17,4],[22,3],[76,3],[2,1],[57,3],[11,2],[58,1]],'flush',[[46,1]],'interested',[[49,1]],'clones',[[25,1]],'sure',[[44,2]],'drop',[[55,1],[30,1],[1,1]],'accidentally',[[63,1]],'mark',[[82,1]],'accessed',[[12,1]],'cpumaxusage',[[64,1]],'fixfreelibrary',[[76,1]],'gets',[[81,1],[92,1],[33,1],[11,1]],'updates',[[63,5],[52,1]],'conditions',[[33,1],[13,1],[32,1]],'activity',[[11,1],[92,1]],'ddsd_pixelformat',[[52,1]],'generated',[[68,1],[69,1],[58,1]],'unnoticeable',[[45,1],[39,1]],'decelerate',[[11,1]],'supportsvga',[[41,1]],'break',[[53,1],[50,1]],'namely',[[45,1],[19,1],[65,1]],'200',[[86,1]],'disassembly',[[24,1]],'placement',[[30,1]],'card',[[41,1]],'unusual',[[50,1]],'dedicated',[[49,1],[76,2],[45,1],[52,1],[3,1],[65,1]],'remain',[[40,1]],'debugger',[[32,3]],'remapmci',[[74,1]],'case',[[59,1],[9,1],[55,1],[71,1],[45,1],[52,2],[93,1],[69,1],[37,2]],'suppressdierrors',[[44,1]],'locate',[[1,1]],'will',[[1,4],[46,1],[30,1],[0,5],[67,4],[81,3],[52,1],[68,1],[93,1],[64,1],[27,1],[9,1],[26,2],[25,1],[29,3],[2,4],[76,4],[82,1],[85,4],[89,1],[32,2],[3,3],[40,1]],'else',[[0,3]],'overriding',[[11,1],[92,1]],'cross',[[45,1]],'state',[[4,2],[26,3],[93,1],[3,1],[47,1],[2,1]],'troubleshooting',[[1,1]],'always',[[59,1],[49,1],[55,1],[24,1],[0,1],[85,1],[3,1],[33,1]],'stretchmovies',[[74,1]],'preferred',[[7,1],[65,1]],'checked',[[63,2],[29,2],[65,5]],'thing',[[78,1],[0,1]],'injects',[[32,1],[92,1],[0,1]],'highlighted',[[25,1],[0,1]],'jetboat',[[44,1]],'deinterlace',[[55,2]],'choppy',[[64,1]],'alternative',[[52,1]],'slowdown',[[64,1]],'replaceprivops',[[76,1]],'unmount',[[80,1]],'not',[[73,1],[1,1],[19,1],[50,2],[0,5],[61,1],[74,1],[35,1],[59,2],[49,1],[29,5],[71,1],[2,1],[32,1],[57,4],[65,1],[46,4],[55,7],[38,1],[30,1],[31,3],[45,1],[81,1],[52,4],[93,2],[86,1],[37,4],[17,1],[63,1],[26,1],[78,1],[25,2],[41,1],[76,4],[34,2],[72,1],[85,1],[33,3],[11,3],[58,1]],'anymore',[[29,1]],'log',[[5,2],[69,1],[1,1],[25,3],[66,1],[67,4],[92,2],[68,6],[3,1],[11,3],[7,5]],'incompatibilities',[[9,1]],'maximum',[[87,2],[10,3],[41,1],[55,1]],'frontend',[[33,2],[28,3]],'implementing',[[33,1]],'desired',[[80,1],[30,3],[50,1]],'saved',[[81,1],[9,2]],'someone',[[0,2]],'ever',[[37,1]],'conversion',[[53,1],[50,3]],'replaces',[[65,1],[76,1],[58,1]],'addtimestamp',[[68,1]],'safely',[[65,1],[71,1],[0,1]],'acting',[[0,1]],'refer',[[72,1]],'nop',[[76,1]],'manipulated',[[76,1],[65,1]],'argument',[[85,1],[93,1]],'auriemma',[[24,1]],'most',[[65,1],[46,1],[55,4],[71,1],[31,1],[0,1],[45,1],[61,1],[76,1],[86,1],[37,1]],'impacts',[[55,1]],'occupy',[[37,1]],'since',[[64,1],[83,1],[49,1],[1,1],[55,2],[76,2],[0,1],[92,1],[11,1],[39,1]],'expect',[[52,1],[46,1]],'becomes',[[44,1],[55,1],[37,1]],'diagnostic',[[69,1]],'express',[[34,1]],'emulated',[[81,1],[52,1],[21,1],[71,2],[11,3]],'ansiwide',[[33,1]],'partially',[[90,1]],'view',[[7,1],[24,1],[68,1],[25,1],[18,2],[2,1]],'hooks',[[73,1],[49,1],[76,2],[44,2],[0,4],[34,2],[72,1],[35,1]],'bottom',[[6,2],[30,1]],'destruction',[[37,1]],'process',[[46,4],[55,1],[44,1],[12,1],[13,2],[52,1],[64,1],[15,2],[25,1],[76,3],[34,5],[32,2]],'harder',[[33,1],[34,1]],'notice',[[78,1],[31,1],[52,1]],'counter',[[63,4],[55,2],[76,1],[65,2]],'develop',[[0,2]],'might',[[83,1],[46,1],[50,1],[24,1],[0,2],[82,1],[52,2],[32,1],[92,1]],'depth',[[17,2],[22,1],[55,1],[76,1],[50,2],[13,3],[52,3],[74,3],[57,2],[11,1]],'gsky916',[[24,1]],'hooknoupdate',[[33,1]],'determining',[[29,1]],'existing',[[77,1],[52,1],[67,2],[30,1]],'rollercoaster',[[46,1]],'notification',[[29,1]],'clipcursor',[[45,1]],'filtermessages',[[46,1]],'1ms',[[64,2]],'debugging',[[73,1],[35,1],[32,1]],'microsoft',[[0,1]],'winrar',[[1,1]],'rather',[[1,1],[55,2],[30,3],[44,1],[28,1],[11,1]],'reliably',[[44,1]],'descriptor',[[55,1]],'output',[[68,1]],'exaggerated',[[63,1]],'behaves',[[45,1],[0,1]],'onto',[[80,1]],'borderless',[[30,1],[37,1]],'line',[[85,1],[68,3],[55,1],[93,2],[2,1]],'harmful',[[46,1]],'oses',[[76,3]],'directive',[[45,1]],'tell',[[29,1]],'files',[[1,1],[58,1],[0,4]],'merges',[[71,1]],'resolution',[[17,1],[51,1],[41,12],[13,1],[20,1],[11,1],[64,1]],'limitddraw',[[55,1]],'directinput8',[[44,3]],'fogging',[[61,2]],'browse',[[92,1],[11,1],[0,1]],'virus',[[0,2]],'24bpp',[[38,1]],'goes',[[3,1],[55,1]],'nonexclusive',[[44,1]],'usergb565',[[55,1]],'send',[[46,1],[37,4]],'startdebug',[[32,1]],'backbuf',[[55,1]],'texturedump',[[58,1]],'around',[[63,1]],'trace',[[69,2]],'install',[[25,1],[1,1]],'initialres',[[41,1]],'getperfcounter',[[76,1]],'soon',[[76,1],[34,1],[1,1]],'save',[[81,2],[9,1],[3,1],[47,1],[82,1]],'tough',[[37,1]],'query',[[55,1],[76,1],[65,1]],'libs',[[49,1],[70,1],[79,2],[35,1]],'transferred',[[55,1],[50,1]],'correctly',[[72,1],[52,2],[46,1],[1,1],[33,1]],'easportshack',[[76,1]],'bufferediofix',[[80,1]],'intercepts',[[47,1],[0,2],[77,2],[32,1],[33,1],[37,3]],'extension',[[73,1],[72,1],[7,1]],'called',[[50,1]],'managing',[[71,1],[50,3]],'mintexx',[[87,1]],'question',[[0,1]],'also',[[78,1],[9,2],[26,1],[49,1],[55,1],[2,1],[0,1],[50,1],[68,1],[33,1]],'debugview',[[68,1]],'software',[[76,1],[0,1]],'reserves',[[76,1]],'hide',[[9,1],[88,1],[80,1],[43,1],[30,2],[16,1],[37,3]],'simplified',[[52,1],[51,1],[0,1]],'settimer',[[65,1]],'instructions',[[76,2],[37,1]],'similar',[[73,1],[55,2],[76,2],[50,2],[4,1],[81,1],[32,1],[57,1],[11,2],[79,1]],'chance',[[46,1]],'down',[[69,1],[51,1],[55,3],[30,1],[6,1],[45,1],[12,1],[32,1],[11,1],[64,1]],'directory',[[9,1],[93,1]],'windowstyle',[[37,1]],'incredible',[[0,1]],'resized',[[45,1],[92,1],[30,1],[37,4]],'internally',[[50,3],[69,1]],'suspending',[[64,2]],'turns',[[3,1]],'graphical',[[61,1],[1,1],[2,1],[58,1]],'etc',[[0,1]],'admin',[[9,1],[29,1]],'unlockzorder',[[37,1]],'refusing',[[76,1]],'tiny',[[63,1],[1,1]],'screens',[[11,1]],'mech',[[55,1]],'directx',[[49,6],[54,1],[50,3],[90,1],[48,1],[52,1],[91,1]],'translation',[[85,1],[24,1]],'peek',[[69,1],[46,1]],'nosysmemprimary',[[55,2]],'standard',[[53,1],[72,1]],'noticing',[[63,1]],'slanted',[[90,1]],'direct3dcreate',[[57,1]],'bullet',[[0,1]],'win32',[[0,1]],'hash',[[58,1]],'categories',[[0,1]],'playing',[[74,1],[0,1]],'1280x800',[[41,1]],'recovering',[[13,1],[0,1]],'write',[[52,1],[1,2],[67,1],[0,1]],'added',[[67,1],[31,1],[0,2]],'blank',[[2,1]],'luckily',[[33,1]],'coop',[[55,1],[44,1]],'means',[[63,1],[87,2],[41,1],[0,1],[34,1],[65,1]],'hel',[[55,1]],'0x7c',[[88,1]],'feature',[[59,1],[92,1],[76,2],[11,1],[37,1]],'referenced',[[33,2]],'manipulate',[[76,1]],'parameters',[[71,2],[72,1]],'event',[[44,1],[32,1]],'simulates',[[55,1],[76,1],[80,1],[39,1]],'italian',[[85,1]],'scales',[[72,1],[51,1],[74,1],[71,1]],'expected',[[55,1],[76,1]],'routine',[[33,1]],'games',[[1,2],[0,6],[61,2],[74,1],[39,2],[15,1],[29,1],[51,1],[71,1],[2,2],[80,1],[32,1],[57,4],[79,3],[65,2],[46,2],[55,4],[38,1],[44,1],[45,3],[52,5],[92,1],[69,1],[37,6],[41,1],[76,8],[34,1],[72,1],[3,1],[11,1]],'compensate',[[45,1],[52,1],[91,1],[71,1]],'drawn',[[63,1],[65,1]],'your',[[7,1],[39,1],[58,1],[1,2],[80,1],[24,1],[0,10],[92,3],[11,5],[37,1]],'copies',[[55,1],[1,1]],'calling',[[0,1]],'shown',[[27,1],[45,1],[20,1],[25,1],[2,2],[0,1]],'scans',[[76,1]],'almost',[[83,2],[30,1],[0,1]],'published',[[0,1]],'cornerized',[[11,3]],'simultaneously',[[85,1]],'characteristics',[[27,1]],'processor',[[76,1]],'axes',[[45,1]],'html',[[24,1]],'part',[[11,1],[92,1]],'gives',[[65,1]],'pause',[[15,2]],'setappcompatdata',[[76,1],[53,1]],'shift',[[92,1],[12,1],[22,1]],'rdtsc',[[65,2]],'min',[[10,1]],'pcs',[[0,2]],'repaint',[[11,2],[92,2]],'within',[[45,3],[59,1],[72,1],[46,1]],'vice',[[80,1]],'segments',[[76,1]],'gamma',[[39,3]],'methods',[[60,1],[49,1],[52,1]],'chinese',[[85,1],[24,1]],'strangely',[[45,1]],'offscreen',[[55,1]],'separate',[[0,2],[76,1],[67,1],[37,1]],'reserved',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,1],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,2],[59,1],[9,1],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[93,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'helpful',[[49,1],[29,1]],'midtown',[[55,1]],'updated',[[73,1],[86,1],[52,1],[19,1],[33,2],[65,1]],'difference',[[11,1]],'nowinerrors',[[71,1]],'window',[[88,1],[1,2],[19,1],[50,1],[0,5],[74,3],[84,2],[39,2],[59,8],[9,1],[14,2],[23,1],[29,6],[2,1],[51,3],[71,5],[32,3],[40,7],[65,1],[46,5],[55,4],[30,20],[44,3],[45,13],[12,1],[13,2],[20,1],[52,2],[69,1],[37,19],[63,1],[86,3],[21,1],[22,1],[41,1],[25,1],[26,1],[76,2],[92,4],[72,1],[3,2],[33,1],[11,4]],'remaps',[[52,1]],'redirected',[[71,1]],'affected',[[50,1]],'hdmi',[[41,1]],'planet',[[44,1]],'videogames',[[0,1]],'hookdirectsound',[[35,1]],'legacyalloc',[[76,1]],'stopping',[[4,1]],'intro',[[73,1],[34,1],[52,1],[46,1]],'strategy',[[71,1],[49,1]],'system',[[0,4],[77,2],[39,2],[71,1],[2,1],[80,1],[79,6],[40,1],[65,2],[46,3],[55,4],[53,1],[13,1],[52,1],[68,1],[93,3],[64,2],[37,1],[17,1],[78,1],[26,3],[85,1],[3,2],[33,2]],'activates',[[73,1],[59,1],[51,3],[29,1],[25,1],[46,1],[30,1],[85,1]],'timefast',[[88,1],[92,1]],'unallocated',[[76,1]],'downwards',[[6,1]],'setcooperativelevel',[[55,1]],'development',[[24,1]],'floating',[[40,1]],'defaultmessages',[[46,1]],'detecting',[[55,1],[32,1]],'executing',[[52,1]],'activities',[[71,1]],'arrives',[[0,1]],'procedure',[[47,1],[0,1]],'majority',[[33,1]],'protections',[[69,1]],'fastest',[[0,1]],'painting',[[11,1],[92,1]],'being',[[0,2],[46,2],[11,1],[37,1]],'sim',[[37,1]],'conflicts',[[52,1],[67,1]],'filtering',[[51,2]],'textures',[[61,2],[72,2],[55,5],[57,3],[58,10]],'logtoggle',[[88,1],[92,1]],'newer',[[46,1],[55,2],[44,1]],'showing',[[29,1],[1,1],[55,1],[43,1]],'traditional',[[44,1]],'autodetect',[[85,1],[9,1]],'regedit',[[81,1]],'implementation',[[33,1],[49,3],[72,1]],'winposchange',[[46,1]],'redirect',[[33,2]],'sends',[[37,1]],'stop',[[4,2]],'however',[[49,1],[46,1],[55,1],[65,1]],'ascending',[[5,1]],'keyboard',[[0,1],[45,1],[47,1],[11,1],[44,4]],'explore',[[25,2],[5,1]],'elevation',[[85,1],[9,1]],'interceptrdtsc',[[65,1]],'future',[[73,1],[35,1],[49,1]],'front',[[39,1]],'ask',[[17,1],[29,1]],'errors',[[52,2],[74,1],[55,1],[71,2],[80,1],[44,2]],'createsurface',[[52,1]],'warning',[[85,1]],'“intercept',[[11,1],[92,1]],'forceshel',[[55,1]],'slower',[[63,1],[50,1],[52,1]],'tries',[[59,1],[15,1],[49,1],[76,2],[71,2],[65,1]],'determines',[[50,1]],'doing',[[4,1],[47,1]],'remember',[[1,3]],'less',[[63,1],[50,1]],'advanced',[[55,1]],'single',[[72,1],[76,2],[33,2],[0,4]],'another',[[32,1],[0,1]],'noalphachannel',[[52,1]],'location',[[1,2],[31,1],[0,1]],'disk',[[3,1],[76,1],[80,4],[0,1]],'entry',[[1,2],[25,4],[6,4],[2,1],[0,1],[28,2],[34,1],[33,1],[5,2]],'beware',[[3,1],[85,1]],'movable',[[59,1]],'defaulting',[[85,3],[46,1]],'offset',[[55,2]],'looking',[[44,1],[58,1],[0,2]],'directdraw7',[[50,1]],'course',[[76,1],[0,1]],'follows',[[88,1],[10,1],[86,1],[2,1]],'caused',[[55,1]],'terminate',[[15,1],[29,2],[47,1],[52,1],[2,1],[88,1]],'32bpp',[[55,1],[38,1],[57,1]],'hacks',[[69,1],[0,1]],'msec',[[63,1]],'rect',[[71,1]],'geiss',[[24,1]],'fullscreenonly',[[29,1]],'useless',[[38,1],[49,1]],'availability',[[76,2]],'schema',[[50,1],[24,1],[32,1]],'supported',[[17,2],[41,1],[55,1],[2,1],[0,1],[76,2],[85,1],[52,1]],'vmware',[[55,1]],'internal',[[76,1],[40,2],[51,1]],'above',[[55,1],[38,3],[30,1],[28,1],[90,1],[32,1],[64,1]],'inhibits',[[45,1],[29,1]],'joystick',[[45,7],[44,1]],'noticeably',[[51,1]],'fix',[[73,1],[46,1],[55,3],[31,1],[90,1],[45,1],[52,3],[74,2],[92,1],[37,3],[59,1],[76,6],[71,1],[80,1],[72,3],[57,3],[11,1]],'exists',[[67,1],[9,1],[29,1]],'startup',[[85,1],[9,1],[13,1],[76,1]],'alternate',[[45,1],[33,1]],'emulaterelmouse',[[44,1]],'figure',[[55,1],[63,1]],'issue',[[55,5],[31,1],[90,2],[61,1],[52,1],[91,1],[93,1],[37,1]],'sleep',[[65,1]],'stick',[[33,1]],'platform',[[78,1],[1,1],[57,1],[80,1]],'asks',[[25,1],[2,1],[29,1]],'defines',[[27,1]],'contained',[[55,1],[83,1]],'small',[[63,1],[59,1],[46,1]],'titles',[[76,1]],'period',[[69,1],[46,1]],'hiding',[[43,1]],'resulting',[[32,1]],'emulatesurface',[[50,3]],'environments',[[76,1]],'mount',[[80,1]],'8bpp',[[55,1],[38,3],[76,2]],'messages',[[1,2],[46,15],[67,1],[0,1],[45,2],[69,1],[37,3]],'choose',[[51,1],[55,1],[60,1],[28,1]],'widget',[[55,1],[30,2]],'celebrates',[[29,1]],'field',[[1,2],[46,1],[55,4],[30,1],[28,1],[81,1],[72,1],[82,1]],'legend',[[52,1],[91,2]],'trails',[[61,1],[52,1]],'resume',[[15,1]],'input',[[46,1],[42,1],[44,2]],'ini',[[83,1],[9,2],[47,1],[0,2],[81,1],[93,1],[58,1]],'interpolating',[[51,1]],'returnnullref',[[55,1]],'dirty',[[11,1],[92,1]],'handling',[[73,1],[46,1],[55,1],[53,1],[45,1],[52,1],[74,1],[92,1],[37,2],[49,1],[47,1],[71,1],[24,1],[91,1],[58,2]],'showfpsoverlay',[[63,1]],'drag',[[30,1],[1,1]],'two',[[0,1],[45,2],[49,1],[30,2],[28,1]],'rudimentary',[[45,1]],'splash',[[29,1]],'2016',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,1],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,1],[9,1],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[93,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'needadmincaps',[[29,1]],'automatic',[[85,2],[49,3],[43,1],[58,1]],'windowized',[[30,1]],'copying',[[55,2],[0,1]],'seems',[[76,1],[49,1],[37,1]],'320x200',[[41,2]],'backbuffers',[[50,1]],'actual',[[63,1],[81,2],[55,2]],'favorite',[[0,1]],'centers',[[30,1]],'forcefully',[[61,1]],'predetermined',[[55,1]],'needs',[[28,1],[39,1],[83,1],[76,1],[33,2],[37,1]],'specify',[[49,1],[1,1],[55,1],[31,1],[30,1]],'key_wow64_64key',[[77,2]],'verbose',[[11,1],[92,1]],'info',[[46,1],[69,1],[0,1]],'improvements',[[1,1],[0,2]],'frequent',[[63,1]],'receive',[[37,1],[46,1],[1,1]],'children',[[34,2]],'desktop',[[55,1],[38,1],[30,7],[0,1],[50,2],[53,2],[13,5],[16,3],[52,1],[74,1],[39,1],[17,2],[22,2],[71,3],[34,1],[57,1],[18,1],[11,5]],'modalstyle',[[37,1]],'recording',[[86,2]],'home',[[0,2]],'detects',[[72,1],[49,1],[74,1],[55,1],[2,1]],'events',[[32,1],[46,2],[69,3],[0,1]],'check',[[9,1],[1,2],[3,1],[33,1],[57,1],[74,1]],'names',[[31,1],[58,1]],'bought',[[0,1]],'diagonally',[[55,1]],'direcr3d',[[19,1]],'sting',[[55,1]],'lower',[[57,1]],'configuration',[[1,3],[19,1],[30,1],[0,7],[81,1],[93,3],[27,2],[5,2],[37,1],[9,4],[83,3],[25,2],[2,2],[82,2],[34,3],[85,1],[3,2],[10,1],[33,1],[58,1]],'packages',[[85,1]],'invisible',[[90,1],[37,1]],'periodically',[[63,1],[52,1],[46,2]],'every',[[45,1],[61,1],[52,1],[1,1],[33,1]],'ones',[[58,1]],'timesetevent',[[65,1]],'optimize',[[53,1],[29,1]],'directx1~6',[[49,2]],'font',[[76,4],[71,2]],'smallest',[[67,1]],'alphabetical',[[5,1]],'tool',[[68,1],[0,1]],'icons',[[63,1],[19,1],[0,1]],'d3d8',[[57,1],[49,1]],'autorefresh',[[52,1]],'rites',[[55,1]],'beginscene',[[61,1]],'intervention',[[49,1]],'click',[[45,1],[30,1],[1,1]],'hookgoglibs',[[79,2]],'dxwnd',[[50,3],[0,29],[77,2],[15,2],[29,9],[47,2],[2,8],[24,2],[32,6],[79,1],[46,2],[28,2],[81,2],[13,2],[92,2],[86,3],[69,3],[37,3],[63,2],[83,4],[89,1],[33,10],[11,1],[88,1],[1,11],[19,4],[67,3],[9,5],[49,5],[66,1],[71,1],[4,1],[7,1],[65,2],[55,6],[30,1],[31,4],[45,1],[52,2],[93,10],[26,8],[25,1],[76,3],[34,1],[72,1],[85,4],[3,7],[58,3]],'introduction',[[0,1]],'affect',[[63,1],[26,1],[93,1]],'timeslow',[[88,1],[92,1]],'edit',[[83,1],[34,2],[25,1],[55,1],[5,1]],'story',[[0,1]],'coordinate',[[86,1],[11,1],[30,1]],'letting',[[0,1]],'completion',[[44,1]],'emulateregistry',[[77,1]],'configurations',[[1,1],[30,1],[0,1]],'effects',[[45,1],[61,2],[57,1],[11,1],[0,2]],'nopower2fix',[[57,1]],'include',[[58,1],[57,1],[1,1]],'clear',[[61,1],[13,1],[3,1],[55,1],[57,2]],'emulating',[[55,1]],'neutralized',[[40,1]],'requires',[[49,1],[29,1],[2,1],[44,1]],'anchored',[[40,1]],'considers',[[46,1]],'empties',[[46,1]],'compares',[[2,1]],'flag',[[73,2],[1,2],[19,1],[61,1],[74,2],[77,2],[39,1],[29,2],[47,1],[71,2],[60,1],[80,2],[32,1],[57,4],[79,5],[65,5],[46,2],[55,13],[31,1],[30,3],[44,5],[45,5],[52,6],[20,1],[81,2],[86,1],[64,2],[37,4],[63,1],[69,1],[92,1],[76,11],[34,1],[72,2],[33,6],[58,2]],'tracing',[[3,1],[73,1],[35,1]],'nomovies',[[74,1]],'languages',[[85,1]],'sims',[[52,1]],'characters',[[11,1]],'engine',[[33,2]],'resolving',[[61,1],[37,2]],'rendering',[[59,4],[55,1],[11,1]],'recognize',[[44,1]],'algorithm',[[31,1]],'outregistry',[[69,1]],'overrideregistry',[[77,1]],'menu',[[17,1],[26,1],[1,2],[25,2],[55,1],[2,2],[90,3],[91,1],[18,1]],'keymapping',[[88,1]],'approximate',[[55,1],[76,1]],'processed',[[55,1],[57,1],[69,1],[37,1]],'suspends',[[64,1]],'setcompatibility',[[53,1]],'day',[[0,1]],'handles',[[66,1],[50,1],[32,1]],'ddscl_fullscreen',[[55,1]],'forwards',[[50,2]],'forced',[[77,2],[52,1],[86,2],[43,1]],'includes',[[45,1],[2,1]],'directdraw1',[[50,1]],'removes',[[80,1]],'windowproc',[[33,3]],'provided',[[24,6],[28,1]],'registry',[[83,1],[1,1],[0,2],[81,9],[77,9],[13,1],[69,2],[37,1]],'accordingly',[[63,1]],'sections',[[63,1]],'normalize',[[65,1]],'creation',[[55,1],[32,2]],'drives',[[80,1]],'own',[[37,2],[85,1],[9,1],[76,2],[2,1],[0,2]],'coder',[[0,1]],'during',[[73,1],[52,1],[46,2],[11,1],[60,1]],'glide',[[35,2]],'33%',[[64,1]],'masks',[[44,1]],'000',[[55,1]],'backgrounds',[[39,1]],'simply',[[80,2],[55,1],[76,1],[50,1],[0,1]],'wherever',[[0,2]],'instance',[[45,1],[1,1],[33,1],[30,1]],'empty',[[46,1],[1,1],[55,1],[30,1],[80,1]],'frame',[[63,2],[59,1],[55,1],[19,1],[52,2],[37,2]],'help',[[57,1],[24,3],[58,1]],'asynchronous',[[80,2]],'next',[[86,1]],'locale',[[85,1]],'calls',[[40,1],[79,2],[50,1],[77,2],[74,3],[68,1],[37,2],[39,1],[49,3],[76,1],[71,3],[34,1],[57,1],[33,4],[65,2]],'trying',[[76,1],[33,1],[2,1],[0,3]],'movements',[[44,1]],'thread',[[73,1],[15,2],[46,1],[1,1],[52,1]],'filter',[[51,2],[46,1],[24,1]],'date',[[85,1]],'tick',[[68,1],[65,2]],'adjust',[[29,1],[55,1],[20,1],[65,1]],'smk',[[73,1]],'detection',[[44,1]],'job',[[4,1]],'related',[[63,1],[49,1],[23,1],[29,1],[71,1],[44,1],[20,1],[69,1],[84,1]],'invoked',[[61,1],[37,1]],'behaviors',[[32,1]],'clientremapping',[[71,1]],'hence',[[0,1]],'stack',[[81,1]],'finetiming',[[65,1]],'folder',[[0,1],[9,2],[1,3],[31,3],[5,1]],'picture',[[19,1],[2,1]],'comp',[[46,1]],'becoming',[[50,1]],'thought',[[0,1]],'team',[[24,1]],'introduces',[[45,1],[63,2]],'features',[[49,1],[93,1],[55,1],[0,2]],'unskippable',[[46,1]],'suppressd3dext',[[57,1]],'play',[[34,1],[92,1]],'glactivetexture',[[72,1]],'causing',[[76,1]],'experimental',[[0,1],[59,1],[72,1],[55,1],[60,1],[37,2]],'logs',[[1,3],[66,2],[67,3],[68,1],[3,1],[69,8]],'had',[[38,1],[0,1]],'error',[[52,1],[76,2],[71,1],[2,1],[44,1]],'subfolder',[[2,1],[58,2]],'fields',[[41,2],[30,2]],'destroyed',[[37,1]],'limitfps',[[63,2]],'defined',[[46,1]],'coarse',[[20,1]],'client',[[63,1],[52,1],[51,2],[71,2],[30,1]],'fixwinframe',[[37,1]],'enableclipping',[[45,1]],'outwinmessages',[[69,1]],'sports',[[76,2]],'globalunlock',[[76,1]],'already',[[81,1],[61,1],[32,1],[38,1],[0,1]],'directx11',[[49,2]],'modal',[[59,1],[37,2]],'eminent',[[52,1]],'keepcursorfixed',[[45,1]],'fight',[[11,1]],'buffered',[[80,1]],'management',[[39,1]],'exist',[[81,1]],'trick',[[59,1],[92,1],[76,1],[11,1]],'frozen',[[0,1]],'freeze',[[11,1]],'functions',[[12,1],[29,1],[55,2],[11,1],[50,1]],'similarly',[[50,1]],'together',[[30,1],[0,1]],'their',[[49,1],[46,2],[55,1],[2,1],[0,3],[74,2],[37,1]],'compatible',[[53,1],[50,2]],'subset',[[26,1]],'palette',[[21,2],[55,1],[71,3],[50,1],[52,3],[18,1],[39,3]],'separated',[[33,1],[67,1]],'emulate',[[44,1],[77,1],[78,1],[41,1],[65,1]],'releasemouse',[[45,1]],'snowboard',[[55,1],[57,1],[90,3]],'solution',[[79,1],[37,1]],'confirmation',[[29,2],[25,1],[5,1]],'bypasses',[[34,1],[71,1],[74,1]],'for',[[87,4],[0,10],[27,1],[15,1],[29,2],[47,1],[80,3],[24,1],[82,1],[91,1],[57,1],[46,1],[28,2],[44,4],[81,1],[13,1],[90,1],[92,1],[86,1],[64,5],[37,2],[63,3],[69,1],[83,2],[33,2],[11,1],[1,5],[74,2],[9,4],[23,1],[49,7],[51,1],[71,4],[10,1],[18,1],[7,1],[65,2],[55,5],[53,3],[30,9],[31,1],[45,4],[52,3],[25,2],[76,6],[34,2],[72,2],[85,4],[3,2],[58,1]],'libraries',[[0,1],[79,1],[71,1],[35,1],[44,3]],'decrease',[[92,1],[88,1],[0,1]],'that',[[50,3],[0,22],[61,1],[77,4],[15,1],[29,4],[80,3],[2,3],[24,1],[32,6],[57,1],[79,1],[46,9],[38,1],[44,5],[13,2],[20,1],[68,3],[92,2],[64,3],[37,5],[63,6],[69,3],[21,1],[22,1],[41,2],[83,1],[89,1],[33,3],[11,5],[73,2],[1,3],[74,3],[39,2],[59,1],[49,2],[23,1],[51,1],[71,4],[65,5],[55,9],[30,3],[45,3],[52,6],[93,1],[26,1],[76,12],[34,1],[72,1],[85,2],[3,2],[58,2]],'appropriate',[[46,1],[44,2]],'area',[[30,3],[45,1],[81,1],[12,1],[52,1],[74,1],[92,2],[63,1],[59,1],[51,2],[71,3],[82,1],[10,1],[11,6]],'troubles',[[52,1]],'first',[[25,1],[76,1],[30,1],[0,3],[80,1],[52,1],[32,2],[7,1]],'reducing',[[64,1]],'troubleshoot',[[69,1]],'care',[[50,1],[37,1]],'syncronize',[[71,1]],'globalunock',[[76,1]],'native',[[41,1],[77,1],[44,1]],'asking',[[0,1]],'could',[[49,1],[46,1],[52,1],[71,1],[76,1],[0,2]],'plit',[[52,1]],'1000',[[63,2]],'top',[[0,1],[11,2],[37,2],[71,1],[6,2],[2,1]],'freely',[[40,1]],'correct',[[45,2],[49,1],[65,1]],'below',[[90,1],[91,1],[20,1],[55,2],[2,1],[27,1]],'account',[[52,1],[46,1]],'codeproject',[[0,1]],'key”',[[11,1],[92,1]],'actually',[[76,1],[2,1],[37,1]],'step',[[6,2]],'resizing',[[46,1],[37,1]],'svga',[[41,1]],'sherwood',[[52,1],[91,2]],'thank',[[0,3]],'screenshot',[[11,1]],'filled',[[77,2]],'often',[[76,2],[0,1]],'fixsmackloop',[[73,1]],'plus',[[26,1]],'aero',[[53,7],[50,3]],'owner',[[0,1]],'export',[[9,1],[1,1],[25,1],[2,1],[0,1]],'formula',[[63,1]],'glut32',[[72,2]],'prefer',[[9,1]],'analyze',[[45,1],[69,1],[1,1]],'lose',[[44,1],[29,1]],'uprising',[[46,1],[37,1]],'notify',[[29,1]],'hidecdromempty',[[80,1]],'return',[[52,1],[55,2],[71,1],[76,2],[44,1]],'conveniently',[[76,1]],'bypassgoglibs',[[79,1]],'accelerate',[[11,1]],'slow',[[45,2],[64,1],[11,1],[0,1]],'supporters',[[24,1],[0,1]],'whole',[[37,1],[45,1],[59,1],[71,1],[30,3],[39,1]],'bit',[[77,4],[76,3],[57,2],[39,1]],'too',[[46,1]],'recent',[[17,1],[55,1],[76,1],[50,1],[0,2],[72,1],[57,1],[86,1]],'audio',[[76,1]],'sets',[[63,1],[49,1],[88,1],[76,1],[85,1],[52,1],[37,1]],'mechanism',[[30,1],[44,1]],'killed',[[73,1],[46,2]],'generate',[[52,1]],'opcodes',[[76,3],[65,1]],'ran',[[0,1]],'call',[[73,1],[53,1],[71,2],[34,1],[72,1],[74,1],[33,3],[79,1]],'alpha',[[52,2]],'mcisendstring',[[74,2]],'ime',[[76,2]],'mintexy',[[87,1]],'usually',[[65,1],[5,1],[76,3],[71,2],[50,1],[0,1],[11,1],[39,1]],'grabbing',[[40,1]],'afford',[[76,1]],'unchanged',[[11,1]],'leftmost',[[20,1]],'approximation',[[52,1]],'cumulative',[[52,1]],'pump',[[46,1]],'maxtexx',[[87,1]],'yet',[[76,1],[0,1]],'stand',[[11,1]],'networking',[[11,1]],'resolutions',[[41,3]],'usual',[[0,1]],'provide',[[52,1],[1,1]],'logic',[[32,1],[31,1],[0,1]],'into',[[58,1],[51,1],[1,1],[46,1],[55,1],[0,5],[52,1],[92,1],[37,1]],'avoid',[[73,1],[55,1],[67,1],[45,1],[52,1],[35,1],[37,1],[63,1],[59,1],[49,1],[76,1],[34,1],[79,1]],'great',[[0,1]],'fixpixelzoom',[[72,1]],'collect',[[1,1]],'ratios',[[30,1],[64,1]],'referring',[[30,1]],'locks',[[52,1]],'refreshed',[[73,1],[52,1],[20,1]],'handled',[[50,1]],'those',[[57,1],[58,1]],'offscreenplain',[[50,1]],'logging',[[88,1],[92,1],[19,2],[11,2],[67,1]],'runtime',[[68,1],[1,1]],'calculates',[[30,1]],'terminates',[[57,1],[29,1]],'varying',[[55,1]],'windows',[[46,4],[53,2],[30,2],[0,2],[44,1],[45,1],[52,1],[74,2],[92,1],[37,8],[59,1],[9,1],[23,1],[29,1],[71,1],[76,6],[78,2],[80,1],[72,1],[85,1],[32,1],[33,1],[18,1],[57,3]],'patches',[[76,1],[79,1]],'using',[[65,1],[1,1],[46,1],[55,2],[30,1],[44,1],[0,3],[76,1],[74,1],[68,1],[58,2]],'either',[[76,1],[19,2],[2,1],[0,1]],'unacquire',[[44,3]],'disablefogging',[[61,1]],'fail',[[25,1],[52,1],[46,1]],'although',[[46,1],[0,1]],'successfully',[[76,1],[37,1]],'noimagehlp',[[76,1]],'artwork',[[0,1]],'win98',[[80,1]],'localized',[[93,1]],'multimedia',[[74,3],[65,1]],'selector',[[85,1],[30,1]],'correspond',[[55,1]],'timestretch',[[65,1]],'user',[[33,1],[40,3]],'copy',[[0,2],[80,2],[69,1],[60,1]],'how',[[29,1],[55,1],[50,1],[0,2]],'icon',[[26,3],[31,1],[2,5],[30,2],[81,1],[82,1],[32,1],[3,1],[33,1]],'die',[[33,1],[2,1]],'switched',[[38,1]],'external',[[3,1],[40,2],[93,1]],'condition',[[45,1],[52,1],[76,3]],'criteria',[[58,1]],'certain',[[33,1],[79,2],[0,1]],'pack',[[85,4]],'0x70',[[88,1]],'locking',[[11,1],[92,1]],'relative',[[68,2],[44,2]],'cooperative',[[55,2],[19,1],[44,1]],'texturehighlight',[[58,1]],'skewed',[[55,1]],'setcursorpos',[[45,1]],'configurable',[[63,1]],'smearing',[[52,1]],'blockpriorityclass',[[76,1]],'inject',[[32,1]],'exiting',[[3,1]],'pax',[[52,1]],'unresponsive',[[0,1]],'picker',[[30,1]],'bar',[[30,1],[37,1]],'maintaining',[[0,1]],'name',[[34,1],[72,1],[19,1],[79,1],[28,4]],'fullscr',[[11,1]],'black',[[52,1],[55,3],[30,1],[50,1]],'commands',[[26,1],[3,1],[40,4],[2,2],[27,1]],'suppresschild',[[34,1]],'warnings',[[47,1]],'d3d9',[[49,1],[57,2],[24,1]],'match',[[58,1],[1,1]],'developer',[[24,2],[1,1]],'based',[[63,1],[49,1]],'basically',[[55,1]],'endless',[[76,2]],'modders',[[58,1]],'stretch',[[51,1],[55,1],[74,1],[20,1],[40,1],[86,1],[65,5]],'gho',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,2],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,1],[9,1],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[93,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'clipper',[[71,1],[52,2]],'path',[[9,3],[1,3],[23,1],[25,1],[2,4],[28,3],[31,5]],'identical',[[81,1]],'theory',[[46,1]],'weren',[[55,1]],'unlock',[[90,1],[52,1],[88,1],[55,1],[11,1],[37,1]],'until',[[93,1],[2,1],[26,1]],'middle',[[45,2]],'showhints',[[29,1]],'potentially',[[46,1]],'encouragement',[[24,1]],'adds',[[68,2]],'lowering',[[15,1]],'here',[[86,1],[89,1],[79,1],[84,1],[28,1]],'frames',[[73,2],[61,2],[57,2]],'suppressed',[[46,1]],'advantages',[[33,1]],'reached',[[33,1]],'outdebugstring',[[68,1]],'args',[[72,1]],'current',[[19,1],[38,1],[0,1],[45,1],[52,1],[17,1],[21,1],[49,1],[2,1],[24,1],[85,1],[3,1],[11,2]],'refresh',[[63,1],[88,2],[92,1],[11,1],[37,2]],'michael',[[24,1]],'internet',[[0,1]],'compatibility',[[55,1],[53,1],[0,2],[13,3],[78,1],[49,1],[29,1],[76,2],[60,1],[75,1],[32,1],[79,2]],'afterward',[[37,1]],'delay',[[45,2],[63,9]],'wildly',[[63,1]],'corners',[[65,1]],'string',[[85,1],[74,1],[68,1]],'yfactor',[[72,1]],'must',[[81,1],[93,1],[46,1]],'turned',[[46,1],[44,1]],'disks',[[80,1]],'decided',[[0,1]],'suspended',[[32,1]],'closer',[[50,1]],'terminated',[[86,1],[26,1],[46,1]],'border',[[45,2],[59,1],[46,1],[55,1],[40,1],[30,1]],'tight',[[73,1]],'choosing',[[1,1]],'emulation',[[55,2],[71,1],[38,1],[50,2],[52,3],[91,1],[11,1]],'processes',[[34,2],[82,1],[46,2]],'retrieved',[[81,1]],'notable',[[55,3],[76,1]],'flickering',[[71,1]],'affecting',[[25,1],[39,1]],'the',[[50,25],[0,47],[61,6],[77,10],[27,4],[15,4],[29,13],[47,7],[80,8],[2,26],[24,14],[82,4],[91,7],[32,22],[57,12],[79,4],[46,16],[38,5],[28,11],[44,22],[81,11],[12,3],[13,4],[20,10],[68,9],[64,9],[5,10],[37,28],[63,20],[21,2],[22,1],[41,14],[69,7],[43,2],[83,3],[86,12],[90,8],[92,19],[33,30],[11,39],[73,8],[88,9],[1,30],[19,15],[67,2],[74,8],[16,2],[84,1],[39,10],[59,8],[9,8],[14,3],[23,3],[49,15],[51,12],[60,3],[4,4],[71,21],[10,1],[40,7],[18,1],[7,3],[65,27],[55,72],[53,6],[30,54],[31,6],[45,37],[52,41],[93,12],[17,2],[78,7],[26,11],[25,19],[76,36],[6,8],[34,10],[72,10],[85,17],[3,10],[58,7]],'speech',[[82,1]],'off',[[1,1],[55,1],[19,1],[92,5],[3,1],[11,3]],'perform',[[57,1],[69,1],[74,1]],'better',[[51,1],[55,1],[50,1],[13,1],[52,2],[33,1],[11,1],[79,1]],'surround',[[30,1]],'straight',[[55,1]],'result',[[76,1],[74,1]],'bear',[[0,1]],'twice',[[51,1]],'fixbindtexture',[[72,1]],'modern',[[55,1],[76,2],[0,1],[61,1],[52,1],[37,1]],'green',[[2,1]],'entries',[[25,1],[2,1],[0,1],[77,2],[57,1],[39,3]],'allowed',[[55,1],[40,1]],'receives',[[45,2],[71,1]],'minimal',[[45,1],[55,2]],'located',[[0,1],[93,1],[55,1],[33,1],[5,1]],'handy',[[4,1]],'generic',[[29,1]],'adjustment',[[20,1]],'banner',[[29,1]],'mysterious',[[0,1]],'significantly',[[55,1]],'crashes',[[13,1],[46,1],[76,1],[0,1]],'execution',[[31,3],[32,2]],'hooknorun',[[33,1]],'progressive',[[52,1]],'required',[[55,1],[1,1]],'previous',[[61,1],[2,2],[68,1]],'full',[[55,1],[51,1],[74,1]],'everything',[[1,1],[0,2]],'specifications',[[52,1]],'dump',[[87,4],[55,1],[58,2]],'level',[[29,1],[55,2],[19,1],[44,2]],'shareddc',[[71,2]],'xfactor',[[72,1]],'routing',[[79,1]],'cubes',[[81,1]],'drawback',[[32,3]],'turning',[[11,1]],'rendered',[[57,1]],'vfw',[[74,1]],'english',[[85,4]],'guarantee',[[76,1]],'dll',[[49,5],[76,3],[24,3],[0,1],[34,1],[72,2],[85,3],[93,1],[57,1],[33,1],[65,2]],'making',[[44,2],[34,1],[46,1],[38,1],[50,1],[39,1]],'scaled',[[72,1],[52,2],[51,1],[71,1],[50,1]],'movie',[[74,3]],'taking',[[11,1]],'social',[[0,1]],'listen',[[46,1]],'exception',[[76,3],[65,1]],'opcode',[[76,1],[65,1]],'opengl32',[[72,1]],'detected',[[73,1],[13,1],[41,1],[55,1],[76,1]],'conversions',[[50,1]],'smack',[[73,4]],'seem',[[76,1]],'outimporttable',[[69,1]],'width',[[87,2],[55,1],[19,1],[30,6],[41,2],[10,2],[86,3]],'note',[[63,1],[55,1],[41,1],[30,1],[50,1],[81,1],[3,1],[69,1]],'release',[[45,1],[78,1],[52,1],[30,1],[0,3]],'simplify',[[28,1]],'dungeon',[[45,1]],'blitted',[[55,1],[51,1]],'horizontal',[[55,1],[86,1],[52,1]],'cover',[[74,1]],'function',[[45,1],[72,1],[12,1],[88,1],[33,1],[11,2]],'affinity',[[76,3]],'reserve',[[76,1]],'backbufattach',[[55,1]],'appear',[[52,1],[1,1],[55,1],[80,1],[64,1],[90,1]],'active',[[73,1],[3,1],[25,1],[44,1]],'temporary',[[50,1]],'behind',[[0,1]],'contents',[[46,1]],'handle',[[29,1],[46,1],[71,1],[2,2],[0,1],[76,3],[80,1],[33,1],[11,1],[37,1]],'designed',[[46,2],[29,1]],'size',[[55,1],[50,1],[30,4],[74,1],[86,1],[37,1],[63,1],[59,1],[22,1],[29,1],[51,2],[40,2],[57,1]],'allow',[[3,1],[55,1],[0,3]],'“dave',[[55,1]],'useful',[[53,1],[13,1],[52,1],[68,1],[92,3],[69,1],[37,1],[39,1],[5,1],[9,1],[15,1],[2,2],[11,2]],'16bpp',[[55,4],[38,1]],'given',[[93,1],[41,2],[2,1],[27,1]],'surface',[[73,2],[55,12],[19,1],[50,14],[61,1],[52,9],[92,1],[37,1],[59,2],[51,4],[71,2],[91,1],[57,2],[11,1]],'noticeable',[[55,1],[39,1]],'vista',[[53,1]],'packs',[[85,1]],'improve',[[55,2],[76,1],[60,1],[0,2]],'project',[[24,1],[0,4]],'oddly',[[52,1]],'golf',[[37,1]],'1mhz',[[65,1]],'bpp',[[38,4]],'produces',[[63,1],[71,1],[11,1]],'tracehooks',[[69,1]],'tricky',[[46,1],[0,1]],'ubik',[[76,1]],'perfect',[[11,1]],'programming',[[0,1]],'usb',[[1,1]],'free',[[76,1],[40,1]],'manual',[[83,1]],'along',[[76,1],[30,1],[69,1]],'rightmost',[[20,1]],'who',[[24,10]],'human',[[44,1]],'executable',[[1,1],[23,1],[29,1],[2,1],[28,1],[0,1],[33,1]],'classes',[[74,1]],'positive',[[74,1],[0,1]],'weird',[[11,1]],'realistic',[[63,1]],'keeper',[[45,1]],'specified',[[64,1]],'returns',[[76,1],[74,1]],'provides',[[18,1]],'new',[[37,1],[1,2],[25,1],[30,1],[0,1],[44,1],[34,1],[67,2],[86,1],[5,1]],'existed',[[0,1]],'shortcuts',[[0,1]],'installing',[[1,1]],'altering',[[39,1]],'little',[[29,1],[50,1],[0,2]],'attention',[[0,1]],'dragging',[[37,1],[20,1]],'adjacent',[[41,2],[51,1]],'choice',[[41,2],[33,1],[76,1]],'listbox',[[65,1]],'showtimestretch',[[65,1]],'determine',[[71,1]],'directed',[[49,1]],'cost',[[25,1],[55,1]],'providing',[[30,1]],'bother',[[0,1]],'textureformat',[[52,1]],'gray',[[2,1],[31,1]],'very',[[39,1],[15,1],[29,1],[55,3],[71,1],[76,2],[0,1],[80,1],[52,1],[3,1],[37,1]],'quality',[[55,1]],'join',[[0,1]],'clipping”',[[92,1]],'modules',[[31,1]],'limitscreenres',[[41,1]],'logged',[[69,1]],'physically',[[76,1]],'0x8ffffff',[[76,1]],'fixes',[[73,1],[76,2],[24,1],[44,1],[45,1],[90,2],[74,1],[91,1],[57,3]],'image',[[52,1],[91,1],[57,1],[11,1],[90,1]],'low',[[17,1]],'giving',[[37,1]],'ticks',[[65,1]],'outdebug',[[69,1]],'kills',[[25,1],[15,1],[46,1]],'inserts',[[5,1]],'though',[[49,1],[46,1],[52,1],[33,1],[71,1],[76,1]],'hidemultimonitor',[[37,1]],'older',[[85,1],[46,1],[41,1],[55,1],[57,1]],'learned',[[0,1]],'playback',[[73,1]],'bitmap',[[55,1],[58,1]],'functional',[[76,1]],'killing',[[2,1]],'long',[[46,3],[68,1],[0,1]],'longer',[[17,1],[9,1],[41,1],[55,1],[76,1],[0,1],[85,2]],'person',[[0,1]],'enabling',[[44,2]],'places',[[45,1],[55,1]],'duplicates',[[25,1]],'hooksmackw32',[[73,1]],'divide',[[76,1]],'refreshing',[[21,1],[37,1]],'applied',[[34,1],[23,1],[55,1],[69,1]],'cleared',[[85,1]],'setting',[[78,1],[49,1],[1,1],[76,2],[38,5],[2,2],[44,1],[0,1],[85,1],[52,1],[39,1]],'texture',[[87,9],[55,5],[61,1],[52,2],[72,2],[10,3],[58,6]],'hookopengl',[[72,1]],'improved',[[0,1]],'occupies',[[30,2]],'multiplication',[[92,1]],'foreground',[[46,1]],'configured',[[1,2],[25,1],[0,1]],'displaying',[[46,1]],'moves',[[6,4]],'scan',[[55,2]],'people',[[0,1]],'second',[[63,2],[21,1],[20,1],[19,2],[64,1],[0,3]],'discouraged',[[71,1]],'list',[[1,2],[23,1],[25,4],[6,2],[2,2],[0,2],[34,1],[80,1],[3,1],[57,1],[5,3]],'selectively',[[64,1]],'alphachannel',[[52,1]],'and',[[50,9],[0,33],[61,1],[77,1],[35,1],[15,1],[29,3],[80,3],[2,4],[24,5],[32,2],[57,3],[79,3],[46,10],[44,5],[12,3],[20,4],[68,1],[86,2],[64,2],[37,12],[63,3],[69,2],[22,1],[89,1],[41,3],[92,5],[33,5],[11,11],[73,3],[88,1],[1,7],[19,2],[67,1],[74,4],[84,1],[39,3],[59,2],[9,4],[49,5],[71,5],[10,2],[40,4],[65,6],[55,14],[53,2],[30,13],[45,10],[52,5],[93,1],[26,1],[25,3],[76,11],[34,2],[72,1],[85,8],[3,3],[58,3]],'individual',[[33,2]],'still',[[17,1],[65,1],[1,1],[29,1],[0,3],[3,1],[11,3],[37,1]],'powerful',[[76,1],[0,1]],'meaningless',[[46,1]],'racer',[[55,2],[57,1],[90,2]],'delicate',[[65,1]],'record',[[81,1],[82,1]],'before',[[1,1],[46,1],[38,1],[55,1],[0,1],[76,1],[81,1],[37,3]],'256',[[39,1],[2,1],[21,1]],'ignore',[[63,1],[52,1],[55,2],[37,1]],'lock',[[39,3],[88,1],[55,2],[90,1],[52,3],[92,2],[11,1],[37,1]],'refreshes',[[52,1]],'fps',[[63,12],[88,1],[92,1],[19,1],[11,2]],'various',[[18,1]],'mouse',[[46,3],[30,2],[44,6],[45,17],[85,1],[52,2],[69,3]],'forth',[[45,1],[46,1],[29,1]],'intercepting',[[32,1]],'modifymouse',[[45,1]],'virtualjoystick',[[45,1]],'starts',[[34,1],[93,3],[3,1],[76,1],[30,1]],'cutscenes',[[46,1]],'which',[[73,2],[55,4],[30,1],[0,1],[45,1],[50,1],[52,1],[39,1],[78,1],[29,1],[76,1],[32,1],[65,1]],'stores',[[0,1]],'war',[[55,1]],'policy',[[33,1]],'dedicate',[[0,1]],'start',[[76,1],[71,1],[31,2],[0,2],[4,2],[93,1],[86,1],[39,1]],'center',[[30,2],[44,1]],'lines',[[55,6],[11,1],[92,1]],'title',[[63,2],[30,1],[37,1]],'gaming',[[30,1],[0,1]],'differences',[[2,1]],'mci',[[74,4]],'controls',[[80,1]],'setzbufferbitdepths',[[55,1]],'require',[[45,1],[30,1],[1,1]],'diablo',[[76,2]],'activemovie',[[74,1]],'nofillrect',[[71,1]],'entirely',[[30,1],[92,1]],'syncpalette',[[71,1]],'exports',[[25,1],[57,1]],'switch',[[53,1],[52,1],[29,2]],'trouble',[[1,1],[0,1]],'work',[[1,1],[30,1],[0,2],[44,2],[52,2],[37,1],[17,1],[59,1],[76,1],[2,2],[85,1],[33,1],[7,1],[11,2]],'centering',[[45,1]],'deactivates',[[13,1]],'wait',[[46,1]],'gog',[[79,8]],'keepcursorwithin',[[45,1]],'sfb7',[[24,1],[0,2]],'references',[[24,1],[0,1]],'therefore',[[34,1]],'hooked',[[65,1],[1,1],[55,2],[19,1],[0,2],[28,2],[81,1],[16,2],[37,2],[9,1],[14,3],[76,1],[2,1],[82,1],[11,3],[58,3]],'avoiding',[[45,1],[52,1],[47,1],[80,1]],'you',[[1,11],[50,1],[0,25],[84,1],[9,2],[29,10],[49,2],[51,1],[2,2],[60,1],[80,3],[82,3],[10,1],[40,1],[7,1],[57,1],[65,1],[55,6],[38,1],[30,4],[28,3],[31,2],[45,2],[12,1],[20,2],[52,1],[81,3],[64,1],[5,1],[17,1],[63,1],[26,3],[83,1],[25,3],[86,2],[89,1],[92,2],[93,3],[34,1],[72,1],[85,1],[3,1],[11,6],[58,1]],'happening',[[55,1],[0,1]],'left',[[45,1],[55,1],[11,1],[0,3]],'immediately',[[92,1],[29,1],[47,1],[11,1],[5,1]],'pathname',[[28,2]],'moto',[[55,1]],'memory',[[76,5],[55,10],[50,1],[53,1],[52,3],[33,1]],'used',[[46,1],[19,1],[31,1],[30,4],[0,1],[44,1],[45,1],[52,3],[81,2],[86,1],[64,1],[9,2],[51,1],[76,2],[33,1],[58,1]],'restores',[[4,1],[13,1],[14,1]],'roms',[[80,1]],'coming',[[1,1]],'user32',[[37,1],[71,2],[65,1]],'reliable',[[25,1]],'directdrawsurface',[[55,1],[52,1]],'segment',[[76,1]],'its',[[1,2],[46,1],[53,1],[0,5],[45,1],[64,1],[37,3],[83,1],[9,1],[22,1],[29,2],[71,1],[2,2],[76,2],[4,1],[34,2],[85,1],[3,2],[33,2],[40,1],[65,1]],'victims',[[0,1]],'programmed',[[47,1]],'enables',[[45,1],[72,1],[9,1],[93,1],[47,1],[35,1]],'imports',[[3,1]],'sid',[[37,1]],'flushes',[[46,1]],'taskbar',[[14,1],[46,1],[30,1],[13,2],[16,3],[11,1],[37,2]],'buffer',[[55,1],[57,2],[50,3]],'sophisticated',[[33,1],[0,2]],'present',[[76,1]],'ratio',[[65,2],[55,1],[76,1],[30,7],[64,5]],'pixel',[[17,1],[22,1],[51,1],[52,4],[50,1]],'hookenabled',[[31,1]],'cursor',[[88,1],[19,2],[43,4],[45,10],[52,2],[91,1],[92,1],[69,3]],'key_wow64_32key',[[77,2]],'unpack',[[1,1]],'documentation',[[24,1]],'sporadic',[[52,1]],'react',[[92,1],[11,1],[46,2]],'introduced',[[55,1],[52,1]],'sort',[[5,2]],'negative',[[76,1]],'why',[[65,1],[29,1],[25,1],[0,4]],'suppressdxerrors',[[52,1]],'disablemaxwindowedmode',[[76,1]],'sometimes',[[1,1],[25,1],[13,1],[79,2],[11,1],[65,1]],'physical',[[80,2]],'problems',[[9,1],[46,1],[1,1],[71,1],[89,1],[85,1],[65,1]],'style',[[37,5]],'layer',[[55,1],[71,1]],'didn',[[92,1],[46,1],[80,1],[11,1]],'crazy',[[15,1]],'“slow',[[69,1]],'happens',[[71,1]],'hooking',[[49,3],[29,1],[71,1],[31,1],[0,2],[28,1],[72,1],[32,1],[35,1],[69,1]],'discussion',[[1,1]],'bring',[[37,1]],'hack',[[87,4],[76,2],[58,2]],'advantage',[[50,1],[0,1]],'prompt',[[3,1]],'context',[[71,3],[0,1]],'number',[[63,1],[67,1],[76,1],[33,1],[30,1],[28,1]],'rom',[[74,1]],'close',[[29,4],[14,1]],'nick',[[0,1]],'make',[[37,2],[65,1],[55,1],[0,1],[52,1],[33,1],[64,1],[58,1]],'bmx”',[[55,1]],'known',[[1,1],[44,1],[74,1],[92,1],[57,1],[11,1],[39,1]],'demonstrations',[[0,1]],'adjusting',[[45,1],[65,1]],'temporarily',[[11,1]],'portable',[[1,1]],'but',[[1,2],[50,8],[0,5],[61,2],[39,1],[59,1],[9,1],[29,2],[49,1],[51,1],[2,2],[71,1],[4,1],[32,1],[40,1],[57,1],[65,2],[55,6],[38,3],[30,1],[28,1],[31,1],[45,1],[52,3],[81,1],[92,1],[86,2],[64,1],[37,4],[17,1],[63,2],[26,1],[83,1],[25,1],[41,1],[76,3],[33,4],[11,2]],'benefit',[[73,1]],'may',[[73,1],[50,1],[0,3],[61,1],[74,3],[59,1],[9,2],[29,3],[49,1],[80,1],[2,1],[60,1],[32,2],[57,3],[46,2],[55,8],[31,1],[44,1],[64,1],[37,2],[17,1],[25,1],[76,2],[72,1],[33,1]],'interfering',[[76,1]],'clearing',[[71,1]],'teachers',[[0,1]],'relied',[[76,1]],'proper',[[57,1],[25,1],[55,2],[2,1],[0,2]],'debug',[[9,2],[0,1],[85,6],[68,2],[93,2],[69,1]],'fixclipperarea',[[71,1]],'bigger',[[63,1]],'addresses',[[33,1]],'research',[[0,1]],'20msec',[[63,1]],'both',[[63,1],[55,1],[33,1],[24,1]],'any',[[1,1],[46,4],[55,1],[0,6],[81,2],[13,1],[52,1],[92,1],[93,2],[37,2],[27,1],[26,1],[41,1],[47,1],[43,1],[80,1],[82,1],[34,2],[72,1],[85,1],[3,1],[11,1],[58,1]],'typing',[[88,1]],'synchronized',[[76,1]],'anti',[[0,1]],'ensuring',[[46,1]],'systemmemory',[[55,2]],'slowing',[[69,1]],'default',[[50,1],[39,1],[9,1],[29,1],[49,1],[51,2],[2,1],[24,1],[4,1],[71,1],[32,1],[55,1],[30,2],[31,1],[52,5],[20,1],[93,1],[37,2],[26,1],[76,2],[41,1],[72,1],[34,2],[85,5],[33,3],[58,1]],'declare',[[53,1]],'store',[[86,1]],'normal',[[51,1],[1,1],[92,1],[11,3],[2,1]],'keepaspectratio',[[30,3]],'decently',[[37,1]],'evolution',[[0,2]],'slows',[[11,1],[51,1]],'plain',[[55,1]],'gettickcount',[[68,1]],'clip',[[11,1]],'creates',[[55,1],[33,1],[37,1]],'overlap',[[63,1]],'about',[[22,1],[1,1],[29,1],[19,1],[24,1],[0,1],[46,1],[92,1],[11,1],[37,1]],'artifacts',[[55,1],[61,1]],'gdinone',[[71,1]],'high',[[64,2]],'manually',[[83,1],[9,1],[93,1],[55,1]],'whose',[[57,1],[24,1],[0,1]],'value',[[87,6],[55,5],[19,1],[77,2],[52,1],[74,1],[64,1],[63,2],[41,1],[76,3],[2,3],[33,1],[65,3]],'can',[[1,8],[50,1],[0,2],[84,1],[9,3],[29,2],[47,1],[49,1],[2,3],[60,1],[71,2],[80,1],[40,1],[57,1],[65,3],[55,7],[30,2],[28,2],[31,1],[44,3],[13,1],[20,1],[52,1],[68,1],[64,2],[37,2],[63,1],[69,2],[26,1],[81,2],[25,1],[76,3],[92,5],[93,1],[34,1],[85,3],[11,5],[58,1]],'koch',[[24,1]],'calculating',[[58,1]],'timers',[[65,4]],'interesting',[[50,1]],'breaks',[[79,1]],'programs',[[46,4],[55,6],[31,1],[0,3],[44,1],[45,3],[61,2],[93,1],[37,3],[5,1],[9,1],[76,2],[71,1],[2,1],[85,2],[32,1],[33,1],[57,1]],'operations',[[73,1],[46,1],[53,2],[50,2],[44,1],[77,2],[74,1],[68,1],[92,1],[69,6],[37,1],[63,2],[29,1],[76,2],[40,3],[11,1]],'widechar',[[33,2]],'explorer',[[5,1]],'deletes',[[3,1],[25,1],[7,1],[5,1]],'important',[[63,1],[81,1],[83,1]],'takes',[[50,1],[0,1]],'disables',[[45,1],[61,1],[85,1],[41,1],[71,1],[76,1]],'uniquely',[[58,1]],'pieces',[[24,1]],'monitor',[[0,2],[46,1],[41,1],[55,1],[30,6],[37,2]],'unconnected',[[33,1]],'controlled',[[45,4],[92,1]],'checkadmin',[[85,2]],'receiving',[[45,1]],'move',[[46,1],[55,2],[0,1],[92,2],[86,1],[5,2],[59,2],[26,2],[25,2],[6,1],[3,2],[40,4],[11,3]],'none',[[58,1],[67,1],[49,2],[93,1],[50,2],[0,1]],'extensions',[[57,1]],'fontbypass',[[76,1]],'hard',[[1,1],[76,1],[33,1],[80,1]],'supposed',[[45,1],[37,1]],'classic',[[41,1],[0,1]],'showfps',[[63,1]],'plocktoggle',[[88,1],[92,1]],'shooters',[[0,1]],'meier',[[37,1]],'typical',[[41,1]],'lockcolordepth',[[52,1]],'browser',[[24,1]],'upon',[[0,1]],'chat',[[0,1]],'cease',[[76,1]],'xyz',[[85,1]],'runs',[[9,1],[25,1],[2,1],[28,1],[52,1],[93,1],[33,1],[11,1]],'exits',[[3,1],[93,1],[0,1]],'multiple',[[72,1],[85,1],[25,1],[76,1],[80,1],[37,1]],'this',[[50,4],[0,13],[61,4],[29,5],[47,2],[80,4],[2,2],[24,1],[82,2],[91,1],[32,6],[57,10],[79,5],[46,10],[38,1],[28,1],[44,7],[81,2],[12,1],[13,2],[20,1],[68,2],[64,4],[5,1],[37,11],[63,3],[21,1],[69,3],[41,1],[86,1],[90,2],[92,6],[33,12],[11,9],[73,2],[1,4],[19,1],[74,2],[39,3],[59,1],[9,5],[49,2],[51,2],[71,4],[60,1],[10,1],[7,3],[65,9],[55,23],[30,4],[31,3],[45,10],[52,18],[93,1],[17,1],[78,1],[25,5],[76,16],[34,6],[72,3],[85,2],[3,1],[58,2]],'operated',[[0,1]],'elevate',[[29,1]],'more',[[1,1],[55,1],[30,1],[0,4],[31,1],[44,1],[52,1],[64,2],[69,1],[63,1],[23,1],[25,1],[76,2],[2,1],[32,1],[57,1],[65,1]],'polling',[[45,2]],'peekmessage',[[46,1]],'noflipemulation',[[52,1]],'essential',[[74,1],[29,1]],'determined',[[65,1]],'impact',[[76,1],[57,1]],'ago',[[0,1]],'accelerated',[[65,1],[55,1],[11,1],[50,1]],'factor',[[92,1],[20,1]],'associate',[[7,1]],'focused',[[30,1]],'information',[[37,1],[69,1],[22,1],[23,1],[29,1],[19,2],[24,1],[83,1],[92,1],[11,1],[18,1]],'ignored',[[55,1],[71,1],[30,1]],'forces',[[29,1],[55,6],[53,1],[43,2],[44,2],[60,2],[52,1],[92,1],[57,1],[11,1],[37,3]],'glories',[[0,1]],'directx10',[[49,2]],'lot',[[0,1]],'use',[[65,1],[1,1],[55,4],[19,1],[0,1],[44,1],[61,1],[52,1],[93,1],[64,1],[37,1],[69,1],[49,1],[76,3],[82,1],[34,2],[72,2],[85,2],[33,2],[79,2],[58,1]],'cdromdrivetype',[[80,1]],'involving',[[52,1]],'contributed',[[24,1]],'acquire',[[44,1],[29,1]],'ddrawex',[[49,1]],'swapeffect',[[60,1]],'represent',[[88,1]],'intended',[[11,1]],'affects',[[0,1],[45,1],[41,1],[39,1]],'ram',[[76,1]],'against',[[50,1]],'refuse',[[15,1]],'createprocess',[[34,2]],'contains',[[55,1],[1,1]],'auto',[[73,1],[9,1],[52,2]],'what',[[49,1],[29,1],[55,2],[71,1],[0,3]],'have',[[73,1],[1,1],[55,3],[30,2],[0,4],[44,1],[45,1],[52,1],[9,1],[15,1],[71,1],[2,1],[80,1],[32,1],[33,1],[11,1]],'concurrent',[[69,1]],'position',[[86,4],[59,1],[88,1],[30,8],[44,1],[45,5],[92,1],[20,1],[40,2],[11,2],[37,1]],'hookdi',[[44,1]],'years',[[0,1]],'crash',[[3,1],[55,1],[76,1],[44,1]],'real',[[76,1],[50,2]],'paths',[[9,2]],'graphic',[[52,1],[55,2],[33,1],[71,1]],'ensures',[[73,1],[52,1]],'created',[[34,3],[52,1],[32,1],[55,2],[67,1],[37,1]],'other',[[65,1],[46,1],[30,2],[28,1],[0,3],[44,2],[13,1],[50,1],[52,2],[92,1],[37,2],[63,3],[29,2],[76,6],[71,3],[24,1],[33,1],[11,1],[57,2]],'efficient',[[55,1]],'128',[[57,1]],'element',[[76,1]],'simulator',[[45,1]],'functionality',[[0,1]],'ramp',[[39,2]],'quickly',[[92,1],[11,1],[69,1]],'olly',[[24,1]],'suppressing',[[53,1]],'clean',[[61,1],[76,1],[57,2],[90,1]],'fixmoviecolor',[[74,1]],'setwindowshook',[[32,2]],'gone',[[15,1]],'returned',[[52,1],[41,1],[55,2]],'append',[[67,1]],'hashed',[[58,1]],'discontinued',[[0,2]],'trail',[[91,1],[0,1]],'put',[[0,1]],'hijack',[[0,1]],'inactive',[[44,1],[0,1]],'defaults',[[28,1],[1,1]],'panel',[[5,2],[39,1],[65,1],[78,1],[19,1],[27,3]],'request',[[55,2]],'invoke',[[76,1]],'alternatively',[[1,1]],'they',[[65,1],[1,1],[55,2],[30,1],[0,1],[44,2],[77,2],[74,1],[68,1],[81,1],[92,2],[39,3],[37,2],[76,1],[2,1],[33,3],[11,2],[58,1]],'map',[[79,1],[11,1],[85,1]],'permissions',[[85,1],[9,1],[29,1]],'then',[[64,1],[9,1],[1,1],[25,1],[53,1],[50,1],[12,1],[92,1],[11,1],[37,2]],'language',[[85,8],[84,1]],'requested',[[55,2],[52,1]],'badly',[[11,1]],'ignoring',[[44,1]],'mention',[[28,1]],'replacement',[[58,1]],'toggle',[[92,3],[88,3],[11,7]],'ways',[[65,1],[0,2]],'power',[[55,1],[57,2],[76,1],[0,1]],'mainly',[[39,1],[9,1],[0,1]],'taken',[[32,1]],'ddraw',[[52,1],[49,1],[51,1],[55,3],[71,2],[90,1]],'platforms',[[17,1],[61,1],[77,2],[76,1],[0,1]],'identify',[[58,1]],'devoted',[[74,1]],'hid',[[44,2]],'unpleasant',[[45,1]],'rate',[[55,1],[63,1]],'windowing',[[11,1],[49,1]],'example',[[63,1],[55,3],[30,1],[0,1],[28,1],[52,1],[57,1],[64,1]],'because',[[15,1],[30,1],[2,1],[0,1],[50,1],[52,1],[61,1],[33,1],[37,1]],'additional',[[57,1],[1,1],[55,1],[19,1],[31,1],[35,1]],'rgb565',[[55,2]],'timetoggle',[[88,1],[92,1]],'translate',[[0,1]],'pitch',[[55,4],[50,1],[90,1]],'normally',[[45,1],[0,2]],'behave',[[76,1]],'reset',[[57,2],[60,1]],'repeated',[[46,1]],'would',[[25,1],[55,1],[50,1],[76,2]],'corresponding',[[63,1],[49,1],[25,1],[55,1],[45,1],[81,1],[52,1],[85,3],[33,2],[39,1]],'group',[[44,2]],'data',[[25,1],[52,2]],'reposition',[[55,1]],'improving',[[55,1]],'appended',[[63,1]],'hopefully',[[0,1]],'target',[[61,2]],'association',[[47,1]],'privileged',[[76,3]],'unlimited',[[41,1]],'smackw32',[[73,2]],'abnormally',[[2,1]],'mmporpg',[[0,1]],'blitfrombackbuffer',[[52,1]],'borders',[[39,1],[59,1],[37,2]],'compensates',[[45,1]],'warhammer',[[55,1]],'tables',[[0,1]],'original',[[25,1],[55,1],[50,1],[24,1],[52,1],[33,6],[40,1]],'texturehack',[[58,1]],'four',[[30,2]],'hybridmode',[[50,1]],'contexts',[[57,1],[71,1]],'explicitly',[[76,1],[49,1],[52,1]],'contain',[[2,1],[29,1]],'developed',[[46,1],[55,1],[24,1],[0,1]],'activation',[[32,1],[28,1]],'applies',[[52,1]],'cpuslowdown',[[64,3]],'parent',[[28,1],[34,2],[37,3]],'idle',[[4,1],[26,1],[93,1],[19,1],[2,1]],'tycoon',[[46,1]],'grayscale',[[55,1]],'import',[[9,1],[1,2],[3,1],[69,2],[0,1]],'highlight',[[58,2]],'remap',[[61,1],[71,2],[74,1]],'aspect',[[55,1],[30,7],[0,1]],'custom',[[0,2],[72,2],[85,1],[79,2],[58,1]],'switching',[[72,1],[76,2],[65,1]],'flexible',[[55,1]],'counters',[[63,1]],'played',[[74,1]],'typically',[[45,1],[73,1],[41,1],[37,1]],'returning',[[76,1]],'hex',[[88,1]],'enter',[[31,1],[28,1]],'large',[[69,1]],'maxtexy',[[87,1]],'cleartarget',[[61,1]],'named',[[67,1],[0,1]],'sufficient',[[1,1]],'objects',[[55,2]],'diagonal',[[57,1]],'processing',[[87,4],[46,1],[47,2],[45,1],[52,1],[10,1]],'assign',[[11,1],[12,1]],'count',[[68,1]],'applications',[[63,1],[29,1],[55,1],[33,1],[76,1],[0,3]],'bundles',[[2,1]],'hookdi8',[[44,1]],'impress',[[0,1]],'minhook',[[24,1]],'see',[[88,1],[1,2],[19,2],[0,2],[9,2],[23,1],[29,1],[49,1],[91,1],[32,1],[10,1],[57,2],[18,1],[65,1],[46,1],[55,1],[30,1],[31,1],[90,2],[13,4],[20,1],[52,2],[92,1],[93,1],[5,3],[25,2],[76,1],[34,1],[3,1],[11,7],[58,1]],'ready',[[4,1],[26,2],[19,1],[2,2]],'refreshonresize',[[37,1]],'blit',[[73,2],[52,6],[51,1],[53,1],[50,1]],'involved',[[49,1],[0,2]],'success',[[76,1],[71,1]],'reduces',[[64,1]],'posy',[[86,1]],'directx1',[[29,1]],'fails',[[33,1],[52,1],[71,1]],'connected',[[45,1]],'ctrl',[[12,1]],'allows',[[50,1],[28,1],[81,1],[12,1],[20,1],[64,1],[25,2],[80,1],[82,1],[72,1],[85,1],[10,1],[40,1],[11,3],[65,1]],'milliseconds',[[63,1]],'despite',[[76,1],[0,1]],'global',[[8,1],[5,2]],'invasive',[[0,1]],'clears',[[43,1]],'problem',[[1,1],[41,1],[57,3],[50,1],[76,3]],'resize',[[92,2],[55,1],[40,2],[11,2],[37,2]],'loading',[[85,1]],'out',[[58,1]],'emulators',[[55,1]],'directdraw',[[73,1],[55,9],[19,1],[50,1],[0,2],[53,1],[61,1],[52,6],[69,2],[39,1],[51,1],[29,1],[76,2],[71,4],[91,1]],'vulnerable',[[46,1]],'tsuda',[[24,1]],'interlaced',[[55,2]],'altered',[[50,2],[65,1],[33,1],[40,1],[0,1]],'toggles',[[11,7],[92,3]],'many',[[69,1],[1,3],[57,1],[24,1],[0,3]],'injected',[[0,1]],'happen',[[45,1],[2,1]],'alter',[[0,2],[20,1],[93,1],[65,1]],'expansions',[[73,1],[35,1]],'lockedsurface',[[50,1]],'resuming',[[64,1]],'obfuscated',[[33,3]],'directx9',[[49,3],[29,1]],'act',[[38,1]],'direct3d8',[[57,1],[50,1]],'entire',[[30,2],[63,1],[11,1],[39,1]],'indicated',[[32,1]],'desire',[[63,1]],'transitioned',[[0,1]],'uses',[[0,1],[52,1],[93,1],[33,1],[30,1],[24,1]],'def',[[30,1]],'routines',[[33,2]],'narzou',[[24,1]],'take',[[81,1],[52,1],[46,1],[50,1],[37,1]],'cases',[[1,1],[31,1],[0,2],[30,1],[28,1],[45,3],[50,1],[52,2],[37,1],[59,1],[49,1],[76,1],[71,1],[60,1],[33,5]],'seen',[[19,1],[69,1]],'primary',[[73,1],[51,2],[55,5],[19,1],[50,12],[30,1],[45,1],[71,2],[52,5],[37,2]],'produce',[[65,1],[93,1],[55,1],[2,1],[64,1]],'general',[[0,1],[25,1],[76,1],[37,1]],'hookdlls',[[33,1]],'installation',[[0,1]],'zbuffer',[[55,1],[57,2],[90,1]],'randomly',[[63,1],[58,1]],'corresponds',[[49,1],[11,1],[20,1]],'bitmaps',[[58,1]],'embedded',[[85,1],[74,1]],'email',[[0,1]],'inside',[[40,1],[52,1]],'consider',[[92,1],[11,1],[69,1]],'resembles',[[32,1]],'values',[[9,1],[88,1],[41,1],[71,1],[55,2],[30,3],[81,3],[77,2],[39,1]],'last',[[9,2],[15,1],[49,1],[76,2],[30,1],[80,1]],'multi',[[30,1],[37,1]],'polls',[[45,1]],'discrepancy',[[55,1]],'subtopic',[[18,1]],'usable',[[67,1]],'systems',[[76,1],[52,1],[0,1]],'heavily',[[90,1]],'robin',[[52,1],[91,2]],'processmessage',[[73,1]],'priority',[[15,1],[76,2],[64,1]],'alters',[[55,1],[0,1]],'starting',[[1,1],[41,1],[38,1],[37,1]],'respectful',[[50,1]],'red',[[2,1]],'nowinposchanges',[[46,1]],'reason',[[1,1],[25,1],[29,1],[76,1],[0,1]],'whatever',[[41,1]],'doom',[[33,1]],'minimize',[[12,1],[14,1]],'dumped',[[58,1]],'tog',[[11,1]],'setdisplaymode',[[52,1]],'try',[[59,1],[1,2],[29,1],[50,1],[0,1],[85,1],[52,1],[92,1],[11,1],[37,1]],'particularly',[[55,1],[50,1]],'launcher',[[28,1]],'easily',[[65,1],[46,1],[55,1],[0,1]],'palettized',[[55,1],[76,1]],'referred',[[30,1]],'borrowed',[[30,1]],'strength',[[0,1]],'support',[[55,1],[80,1],[0,3]],'activateapp',[[37,2]],'seconds',[[46,2]],'neutralize',[[76,1]],'select',[[30,2]],'possibly',[[76,1],[37,1]],'handlealtf4',[[47,1]],'coordinates',[[46,3],[19,1],[30,8],[71,2],[45,5],[74,2],[92,1],[86,1]],'renderers',[[71,1]],'forcing',[[52,1],[74,1]],'loops',[[76,1]],'restoring',[[2,1],[9,1]],'term',[[0,1]],'tab',[[81,1],[85,1],[76,2],[82,1]],'dinput',[[44,1]],'potential',[[9,1]],'commander',[[55,1]],'resolve',[[89,1]],'visible',[[72,1],[26,1],[85,1],[11,1],[37,1]],'accurate',[[63,1],[52,1]],'entering',[[31,1]],'speeds',[[11,1]],'funkyfr3sh',[[24,1]],'glbindtexture',[[72,1]],'good',[[0,1]],'iconized',[[2,1],[93,2]],'hidehwcursor',[[43,1]],'outside',[[45,4],[30,1],[0,1]],'lets',[[17,1],[55,1]],'scaling',[[51,1]],'attribute',[[52,1]],'boundaries',[[58,1]],'sizy',[[86,1]],'program',[[73,1],[88,1],[1,10],[19,1],[0,5],[27,1],[59,1],[9,2],[14,3],[15,1],[29,3],[2,6],[24,1],[4,1],[47,2],[71,4],[32,6],[82,1],[57,1],[65,3],[46,3],[55,5],[53,1],[30,2],[28,4],[31,3],[44,6],[45,3],[81,1],[92,3],[86,1],[64,3],[5,2],[37,4],[63,3],[26,4],[69,2],[25,7],[76,10],[78,1],[93,2],[34,3],[85,1],[3,1],[33,6],[11,6]],'table',[[69,2]],'quarter',[[63,1]],'threaded',[[0,1]],'these',[[65,1],[88,1],[1,1],[46,2],[55,1],[30,1],[0,5],[31,1],[50,1],[12,1],[52,1],[61,1],[81,3],[39,3],[9,2],[49,1],[76,1],[71,2],[2,1],[34,1],[79,1],[58,1]],'enablehotkeys',[[47,1]],'nopaletteupdate',[[52,1]],'ignores',[[31,1]],'finds',[[74,1],[29,1],[2,1],[58,1]],'descriptive',[[28,1]],'look',[[80,1],[29,1]],'combined',[[76,1]],'old',[[69,1],[55,3],[76,5],[80,1],[0,5],[45,1],[61,1],[44,1],[92,1],[11,1],[65,2]],'interfere',[[44,1]],'executables',[[33,2],[69,1]],'some',[[1,2],[50,1],[0,6],[61,1],[39,1],[59,1],[9,1],[29,1],[47,1],[49,1],[60,1],[80,3],[82,1],[32,4],[57,3],[79,1],[65,1],[46,4],[55,10],[38,1],[31,2],[28,2],[44,2],[45,7],[52,4],[92,2],[69,2],[37,6],[17,1],[83,1],[22,1],[41,1],[76,6],[34,1],[72,1],[33,3],[11,1]],'cliptoggle',[[88,1],[92,1]],'colored',[[0,1]],'normalizeperfcount',[[65,1]],'sites',[[0,1]],'bilspelet',[[52,1]],'noddexclusivemode',[[55,1]],'hook',[[73,1],[1,1],[19,1],[31,2],[44,2],[45,1],[93,1],[35,3],[37,1],[69,1],[26,1],[29,1],[49,3],[2,2],[4,3],[34,6],[72,3],[32,2],[3,2],[33,6],[79,2]],'blt',[[52,1]],'parameter',[[31,1],[1,1]],'clumsy',[[0,2]],'built',[[1,2],[85,1],[0,1]],'comes',[[83,1],[1,1],[57,1],[2,1]],'colors',[[21,1],[51,1],[55,1],[50,1],[39,4]],'unique',[[33,1]],'opengl',[[61,1],[49,1],[72,11],[50,1],[0,1]],'ends',[[9,1]],'complex',[[32,1],[1,1]],'exactly',[[29,1]],'emulates',[[45,1],[55,1],[44,1]],'forceclipper',[[52,1]],'16bit',[[57,1]],'erase',[[67,1]],'modify',[[5,1],[49,1],[25,3],[27,1]],'exe',[[34,1],[1,1],[68,1],[0,1]],'iii',[[33,1]],'imposed',[[76,1]],'override',[[81,1],[77,1],[80,1]],'maximumres',[[41,1]],'toggling',[[11,1],[92,1]],'fine',[[65,1],[20,1]],'she',[[24,1]],'flipemulation',[[52,1]],'normalizes',[[65,1]],'fill',[[55,1],[11,1],[30,2]],'transformation',[[50,1]],'version',[[78,2],[49,3],[1,1],[55,5],[19,3],[24,1],[28,1],[76,1],[52,1],[93,1],[33,1]],'d3d',[[57,1],[59,4]],'consistent',[[25,1]],'decrement',[[55,1]],'suppressrelease',[[52,1],[37,1]],'expressed',[[63,1]],'noperfcounter',[[76,1]],'except',[[80,1],[30,1]],'control',[[0,1],[92,1],[11,1],[65,3]],'technique',[[49,2],[32,2],[33,3],[65,1]],'missing',[[77,2],[9,1],[85,1]],'surfaces',[[52,5],[55,4],[53,1],[50,1]],'method',[[61,2],[52,3],[32,1],[55,2],[33,2]],'disablemaxwinmode',[[76,1]],'rights',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,1],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,1],[9,2],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[93,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'exit',[[92,1],[3,1],[47,1],[11,1],[39,1]],'saveload',[[29,1]],'causes',[[78,1],[46,1],[55,1],[76,2],[45,1],[85,1],[93,1],[79,1]],'calculations',[[46,1]],'characteristic',[[50,1]],'game',[[73,1],[1,3],[50,2],[0,12],[39,2],[9,1],[29,2],[47,1],[49,1],[80,1],[91,1],[46,1],[55,5],[38,2],[44,3],[45,4],[90,1],[13,2],[52,9],[92,4],[64,1],[37,5],[76,2],[3,3],[33,5],[11,7],[58,1]],'upperleft',[[30,1]],'assume',[[65,1]],'initial',[[65,2],[41,2],[38,1],[30,6],[2,1],[33,1],[86,3],[5,1]],'direct3d',[[59,1],[71,1],[0,1],[90,2],[61,4],[56,1],[69,2],[57,1]],'tons',[[11,1],[92,1]],'once',[[21,1],[1,1],[26,1],[19,1],[0,1],[44,1],[20,1],[3,1],[33,1]],'recoverscreenmode',[[37,1]],'malfunctions',[[46,1]],'copes',[[55,1]],'flip',[[91,1],[52,5],[60,1]],'clipping',[[45,4],[52,3],[88,1],[92,1],[71,1],[11,1]],'filenames',[[58,2]],'storing',[[47,1]],'holds',[[83,1]],'made',[[53,1],[71,1],[33,2],[50,1],[0,1]],'uncommon',[[69,1],[46,1]],'restart',[[29,1]],'plan',[[58,1]],'flipex',[[60,1]],'stretches',[[74,1],[65,1]],'changes',[[71,1],[50,1],[30,1],[0,3],[34,1],[52,1],[81,1],[39,1]],'outcursortrace',[[69,1]],'pretending',[[0,1]],'inspect',[[20,1]],'refcount',[[55,2]],'colordepth',[[19,1]],'minimized',[[14,1]],'copyright',[[87,1],[50,1],[0,1],[61,1],[77,1],[56,1],[35,1],[27,1],[15,1],[29,1],[47,1],[80,1],[2,1],[24,1],[82,1],[48,1],[32,1],[91,1],[57,1],[79,1],[46,1],[38,1],[28,1],[44,1],[81,1],[12,1],[13,1],[20,1],[36,1],[64,1],[5,1],[37,1],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,1],[83,1],[86,1],[89,1],[90,1],[92,1],[33,1],[11,1],[73,1],[88,1],[1,1],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,1],[9,1],[14,1],[23,1],[49,1],[51,1],[54,1],[4,1],[60,1],[66,1],[71,1],[10,1],[40,1],[18,1],[7,1],[65,1],[55,1],[53,1],[30,1],[31,1],[45,1],[62,1],[42,1],[52,1],[93,1],[8,1],[17,1],[78,1],[26,1],[25,1],[70,1],[6,1],[76,1],[34,1],[72,1],[75,1],[3,1],[85,1],[58,1]],'nonresponsive',[[73,1]],'cornes',[[63,1]],'effect',[[63,1],[49,1],[47,1],[55,1],[30,1],[60,2],[76,2],[61,1],[52,1],[72,1],[81,1]],'interpolates',[[55,1]],'fullscreen',[[46,2],[55,2],[19,1],[30,6],[0,6],[44,2],[45,1],[50,1],[52,1],[86,1],[69,1],[39,2],[37,4],[29,2],[76,1],[71,3],[57,1],[11,3]],'blackwhite',[[55,1]],'life',[[33,1]],'10%',[[65,1]],'fixparentwin',[[37,1]],'web',[[24,1]],'down”',[[69,1]],'255',[[39,1]],'completely',[[32,1]],'informational',[[18,1]],'through',[[9,1],[71,2],[31,1],[50,1],[45,1],[12,1],[74,1],[40,1],[11,1]],'kageyu',[[24,1]],'locksyscolors',[[39,1]],'suppressclipping',[[52,1]],'influences',[[50,1]],'fixpitch',[[55,1]],'suppress',[[55,1],[71,2],[76,2],[44,1],[34,1],[52,3],[57,2],[37,1]],'scale',[[71,2],[51,1]],'optimizations',[[50,1]],'fixglobalunlock',[[76,1]],'track',[[55,1],[49,1]],'legacy',[[76,2],[0,1]],'lost',[[44,1],[46,1],[0,1]],'are',[[73,1],[88,1],[1,2],[50,6],[0,7],[77,4],[74,3],[39,1],[9,1],[49,3],[47,1],[57,4],[40,2],[65,3],[46,2],[55,3],[53,1],[30,7],[44,2],[45,5],[12,1],[20,1],[52,1],[86,1],[64,1],[69,2],[17,1],[83,1],[76,4],[85,3],[33,2],[11,1],[58,2]],'releasing',[[30,1]],'others',[[45,1]],'getsystemtime',[[65,1]],'fillrect',[[71,3]],'greatly',[[45,1]],'parallel',[[0,3]],'picks',[[76,1]],'notes',[[82,3]],'printscreen',[[44,1]],'leaving',[[4,1],[55,1],[11,1]],'filename',[[72,1],[93,2],[67,1],[28,1]],'proxy',[[24,2]],'colorfix',[[76,1]],'holding',[[12,1]],'centered',[[30,3]],'aeroboost',[[53,1]],'load',[[93,1],[85,3],[29,1]],'resources',[[45,2],[85,2],[76,2],[0,1]],'skip',[[63,2],[34,1],[46,2],[44,1]],'gdimode',[[50,1]],'results',[[55,2]],'hookchildwin',[[33,1]],'forcewinresize',[[37,1]],'directdraw8',[[57,1]],'experiencing',[[65,1]],'outdxwintrace',[[69,1]],'hogging',[[45,1]],'local',[[2,1]],'enough',[[52,1],[92,1],[33,3],[11,1]],'limits',[[10,1],[65,1]],'surfacebuffer',[[50,1]],'flow',[[0,2],[20,1],[65,3]],'gdi',[[51,2],[71,12],[50,3],[45,2],[52,1],[11,2]],'prevents',[[39,1],[55,1],[37,3]],'skips',[[63,1],[74,1]],'incredibly',[[0,1]],'detect',[[45,1],[78,1],[49,1],[32,1]],'queue',[[52,2],[46,7]],'replaced',[[55,1],[58,1]],'shims',[[18,1],[23,3]],'zbufferclean',[[57,1]],'emulatebuffer',[[50,2]],'extend',[[34,2],[0,1]],'run',[[1,5],[55,1],[30,1],[0,9],[28,2],[31,1],[13,1],[69,1],[39,2],[29,4],[25,1],[41,1],[2,1],[76,2],[85,1],[32,1],[3,1],[33,7],[65,1]],'interface',[[1,2],[55,1],[19,1],[31,1],[0,1],[44,1],[50,1],[9,1],[15,1],[29,1],[2,4],[32,3],[33,1]],'hood',[[52,1],[91,2]],'pure',[[71,1]],'cinematics',[[47,1]],'build',[[85,1]],'three',[[33,1],[44,1]],'random',[[34,1]],'quiet',[[93,1]],'over',[[30,2],[0,1]],'aqrit',[[24,1]],'aware',[[71,1],[11,1]],'relevant',[[13,1]],'distributed',[[79,1]],'mirra',[[55,1]],'fact',[[52,1],[0,1]],'definition',[[1,1]],'unnotify',[[76,1],[29,1]],'simulating',[[76,2],[65,1]],'accepts',[[93,1]],'interactions',[[76,1],[71,1]],'attachable',[[55,2]],'depending',[[49,1],[19,1],[30,1],[57,1]],'non',[[55,1],[33,1],[44,2]],'patching',[[33,3],[24,1]],'minimizes',[[9,1],[14,1]],'playability',[[45,1]],'diablotweak',[[76,1]],'clone',[[25,1]],'habit',[[45,1]],'description',[[1,1]],'immediate',[[81,1]],'patient',[[0,1]],'anywhere',[[0,1]],'compressed',[[55,1],[1,1]],'advancing',[[11,1]],'grow',[[69,1]],'duplicate',[[25,1]],'sleepwalker',[[37,1]],'resources_xyz',[[85,1]],'viewport',[[61,1]],'environment',[[0,4],[71,1],[53,1],[50,1],[28,1]],'sharedkeyboard',[[44,1]],'“force',[[92,1]],'somewhere',[[0,1]],'solutions',[[1,1]],'much',[[55,1],[0,1]],'erasing',[[13,1]],'selecting',[[25,1],[30,1]],'false',[[85,3]],'tells',[[63,1],[9,1],[29,1],[33,2],[38,1]],'performance',[[65,3],[55,2],[76,4],[60,1],[0,1]],'properties',[[78,1]],'cdrom',[[80,7]],'hurt',[[29,1]],'initially',[[93,1]],'please',[[0,1]],'embeds',[[65,1]],'poor',[[55,1]],'hacker',[[33,1]],'critical',[[52,1]],'resources_',[[85,1],[93,1]],'been',[[30,1],[0,1]],'producing',[[63,1],[57,2]],'mode',[[50,9],[61,2],[39,1],[9,2],[29,2],[49,2],[51,1],[60,1],[71,3],[80,1],[32,4],[57,2],[55,10],[38,3],[30,3],[44,1],[45,1],[53,5],[13,3],[52,2],[93,1],[86,1],[69,1],[37,3],[76,1],[85,3],[11,11]],'injectsuspended',[[32,1]],'gui',[[83,1],[85,1],[9,1],[86,2]],'per',[[17,1],[63,2],[21,1],[20,1],[19,2]],'welcome',[[24,1]],'pronounced',[[55,1]],'uncompressed',[[55,3]],'null',[[55,1]],'after',[[5,1],[32,1],[3,1],[80,1],[2,2],[0,2]],'were',[[0,1],[61,2],[76,2],[37,1]],'clicking',[[26,2],[1,1],[25,2],[2,1],[0,1],[20,1]],'hidetaskbar',[[37,1]],'win7',[[76,1],[46,1]],'ansi',[[33,2]],'shortage',[[52,1]],'should',[[58,1],[65,1],[49,2],[46,3],[55,2],[76,3],[0,1],[44,2],[45,1],[92,1],[11,1],[37,2]],'white',[[61,1],[1,1]],'updating',[[37,1],[52,1],[2,1],[39,1]],'brings',[[50,1],[52,1]],'command',[[1,1],[19,1],[28,1],[13,1],[20,1],[74,1],[92,2],[93,3],[21,1],[26,2],[25,3],[85,1],[11,2]],'overlay',[[63,2],[55,5],[60,1],[65,1]],'terminateonclose',[[29,1]],'initializes',[[37,1]],'detour',[[33,1]],'improves',[[45,1]],'vast',[[33,1]],'generally',[[34,1],[49,1],[46,1],[55,1]],'continue',[[1,1],[76,1],[0,1]],'launching',[[28,1]],'windowize',[[30,1],[29,1]],'patch',[[33,1]],'usage',[[55,1],[64,3],[58,1]],'multitasking',[[76,1]],'define',[[25,1],[5,1]],'regwin32',[[81,1]],'discard',[[60,1]],'extra',[[55,1],[50,1],[0,1]],'getmessage',[[69,1],[46,1]],'find',[[89,1],[49,1],[0,1]],'actions',[[47,1],[32,1]],'occur',[[68,1]],'turn',[[1,1],[0,1]],'search',[[77,2],[85,1],[33,1],[31,1]],'later',[[0,2]],'limit',[[63,2],[41,1],[55,1],[76,1]],'minimalcaps',[[55,1]],'limited',[[63,2],[33,1],[76,1]],'“adopt”',[[0,1]],'show',[[63,2],[26,2],[1,2],[29,3],[46,1],[43,1],[88,1],[61,2],[16,1],[3,2],[68,1],[65,1]],'odd',[[55,2],[32,1]],'stretchtimers',[[65,1]],'mapping',[[88,1]],'principles',[[0,2]],'bad',[[45,1],[76,1],[32,1]],'core',[[76,6]],'pick',[[30,1]],'graphics',[[58,1],[61,1],[49,2],[55,1],[37,1]],'winmm',[[74,1],[65,1]],'depends',[[55,1]],'independently',[[32,1]],'likely',[[3,1],[76,1],[85,1]],'corner',[[63,1],[65,1],[11,2],[30,1]],'cossacks',[[52,1]],'rgb555',[[55,1]],'exclusive',[[55,1],[19,1],[35,1]],'whether',[[57,1],[25,1],[19,1],[2,1],[0,1]],'direct3d10',[[49,1]],'vertical',[[86,1],[52,1]],'complicated',[[71,1],[80,1]],'forceswapeffect',[[60,1]],'anyone',[[85,1],[0,1]],'able',[[55,1],[2,1],[11,1]],'capability',[[52,2],[55,5],[57,1],[0,1]],'computer',[[11,1],[1,1]],'performs',[[45,1],[29,1],[55,1],[69,1]],'hybrid',[[71,1],[50,1]],'versa',[[80,1]],'all',[[87,1],[50,2],[0,8],[61,2],[77,1],[56,1],[35,1],[27,1],[15,1],[29,2],[47,2],[80,2],[2,3],[24,1],[82,1],[48,1],[32,2],[91,1],[57,1],[79,1],[46,5],[38,1],[28,1],[44,3],[81,1],[12,1],[13,2],[20,1],[36,1],[64,2],[5,1],[37,2],[63,1],[21,1],[22,1],[41,1],[68,1],[43,1],[69,4],[83,2],[86,1],[89,1],[90,1],[92,1],[33,6],[11,3],[73,2],[88,1],[1,2],[19,1],[67,1],[74,1],[16,1],[84,1],[39,1],[59,2],[9,1],[14,1],[23,1],[49,2],[51,1],[54,1],[4,1],[60,1],[66,1],[71,2],[10,1],[40,1],[18,1],[7,1],[65,1],[55,4],[53,2],[30,4],[31,1],[45,1],[62,1],[42,1],[52,1],[93,3],[8,1],[17,1],[78,1],[26,1],[25,2],[70,1],[6,1],[76,2],[34,1],[72,1],[75,1],[3,4],[85,2],[58,4]],'displays',[[21,1],[23,1],[22,1],[24,1]],'delete',[[9,1],[25,1],[7,1],[5,1]],'meaning',[[37,1],[1,1]],'solaris',[[37,1]],'having',[[92,1],[1,1],[80,1],[11,2],[0,1]],'trigger',[[47,1]],'tweaks',[[59,1],[55,1],[76,1],[80,1],[90,2],[57,1]],'privileges',[[29,1]],'maximize',[[37,1]],'styles',[[76,1]],'bubble',[[82,1]],'near',[[55,1]],'visibility',[[43,2]],'constraint',[[46,1]],'depths',[[17,1],[57,1]],'flash',[[1,1]],'insist',[[37,1]],'nativeres',[[41,1]],'minimum',[[15,1],[87,2],[10,3],[86,2],[64,1]],'technical',[[11,1],[92,1]],'camera',[[11,1]],'them',[[46,1],[50,1],[44,1],[0,1],[45,1],[93,1],[39,1],[37,1],[21,1],[49,2],[76,1],[89,1],[2,1],[79,1],[58,1]],'produced',[[24,1]],'succeed',[[49,1]],'apis',[[0,1],[72,1],[69,1],[65,2]],'instruction',[[65,1]],'apply',[[33,1],[79,1],[58,1]],'metrics',[[76,3]],'disable',[[61,2],[9,1],[29,1],[76,6],[39,1]],'create',[[58,1],[34,1],[52,1],[25,1],[19,1],[0,1]],'efforts',[[0,1]],'hints',[[29,1],[24,1],[1,2]],'cleartexturefourcc',[[55,1]],'purposes',[[76,1],[33,1],[69,1]],'universal',[[33,1]],'darker',[[39,1]],'factors',[[20,1]],'hides',[[55,1],[16,1]],'change',[[39,1],[37,2],[49,1],[65,2],[55,1],[38,1],[76,1],[13,1],[5,1]],'directly',[[28,1],[76,1],[33,3],[65,1]],'suppressoverlay',[[55,1]],'mostly',[[52,1]],'via',[[45,1],[2,1],[1,2]],'failure',[[44,1]],'operating',[[4,1],[13,1],[26,1],[46,1],[0,1]],'recover',[[13,1],[37,1]],'repeatedly',[[37,1]],'sending',[[1,1]],'status',[[45,1],[19,3],[2,1],[18,1]],'administrator',[[85,1],[9,1],[29,2]],'attempts',[[76,1],[0,1]],'dlls',[[93,1],[33,3],[31,1],[79,3]],'iat',[[33,5]],'recurse',[[33,1]],'successful',[[44,1]],'enumadaptermodes',[[57,1]],'switches',[[85,1],[11,1],[52,1]],'complete',[[83,1]],'notextures',[[61,1]],'localization',[[85,1]],'flags',[[9,1],[1,1],[55,3],[71,1],[30,1],[44,2],[13,1],[33,1],[64,1],[58,1]],'operates',[[64,1]],'remains',[[11,1]],'optimizes',[[53,1],[29,1]],'western',[[39,1]],'getcaps',[[55,1]],'gdiemulatedc',[[71,1]],'does',[[65,1],[59,1],[1,1],[46,1],[38,1],[0,4],[34,2],[52,2],[32,1],[58,1]],'tricks',[[83,1],[0,2]],'interferences',[[52,1]],'resource',[[85,1],[52,1],[93,1]],'best',[[55,1],[0,2]],'ddscl_exclusive',[[55,3]],'coordinated',[[72,1]],'get',[[63,1],[73,1],[26,1],[1,1],[46,4],[76,1],[45,1],[52,1],[92,1],[57,1],[11,1]],'freelibrary',[[76,2]],'enabled',[[11,1],[52,1],[92,1],[71,1],[31,1],[2,2]],'gear',[[76,1]],'shaped',[[45,1]],'handler',[[76,1]],'video',[[55,7],[38,2],[0,1],[45,1],[13,1],[52,2],[36,1],[74,1],[41,1],[71,1],[2,1],[32,1],[57,2],[11,1]],'outddrawtrace',[[69,1]],'decelerated',[[65,1]],'0x4000000',[[76,1]],'hidedesktop',[[30,1]],'opened',[[0,1]],'reasonable',[[52,1]],'share',[[71,1],[0,1]],'interfaces',[[50,2]],'cannot',[[33,1],[2,1]],'distracting',[[30,1]],'locked',[[40,1],[11,1],[50,1]],'presence',[[44,1]],'checking',[[45,1],[32,1],[29,1],[33,2],[46,1]],'ryan',[[24,1]],'sourceforge',[[1,1],[0,2]],'stretched',[[40,1],[11,1],[65,1]],'slider',[[65,2],[20,5],[11,2],[18,1]],'solid',[[58,1]],'considered',[[30,1]],'searches',[[65,1]],'remaining',[[30,1],[37,1]],'schemes',[[80,1]],'widths',[[10,1]],'message',[[29,2],[46,7],[47,2],[2,1],[45,3],[52,2],[68,2],[93,1],[37,5]],'types',[[44,1]],'dwzbufferbitdepths',[[55,2]],'prompts',[[25,1]],'display',[[27,1],[63,1],[22,1],[52,2],[20,1],[92,1],[11,1],[37,3]],'peekallmessages',[[46,2]]];window.bSearchDataLoaded=true; \ No newline at end of file diff --git a/build/help/toc.html b/build/help/toc.html index 3478fc8..0449eb5 100644 --- a/build/help/toc.html +++ b/build/help/toc.html @@ -456,6 +456,12 @@ target="FrameMain"> Color management +
  • + + Window size & position +
  • WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN , 0)) + OutTraceE("WaitForVerticalBlank ERROR: res=%x\n", res2); + } + bVSyncDone = FALSE; + } + + if(dxw.Windowize) lpdestrect = &destrect; + // blit only when source and dest surface are different. Should make ScreenRefresh faster. if (lpdds != lpddssrc) { dxw.ShowOverlay(lpddssrc); - if (IsDebug) BlitTrace("PRIM-NOEMU", lpsrcrect, &destrect, __LINE__); - res=(*pPrimaryBlt)(dxversion, pBlt, lpdds, &destrect, lpddssrc, lpsrcrect); + if (IsDebug) BlitTrace("PRIM-NOEMU", lpsrcrect, lpdestrect, __LINE__); + res=(*pPrimaryBlt)(dxversion, pBlt, lpdds, lpdestrect, lpddssrc, lpsrcrect, lpddbltfx); + //res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } if(res){ - BlitError(res, lpsrcrect, &destrect, __LINE__); + BlitError(res, lpsrcrect, lpdestrect, __LINE__); if(IsDebug) { DescribeSurface(lpdds, 0, "[DST]" , __LINE__); if (lpddssrc) DescribeSurface(lpddssrc, 0, "[SRC]" , __LINE__); // lpddssrc could be NULL!!! @@ -229,9 +240,9 @@ static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR if(res==DDERR_SURFACEBUSY){ (*pUnlockMethod(dxversion))(lpdds, NULL); if(lpddssrc) (*pUnlockMethod(dxversion))(lpdds, NULL); - if (IsDebug) BlitTrace("BUSY", lpsrcrect, &destrect, __LINE__); - res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); - if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); + if (IsDebug) BlitTrace("BUSY", lpsrcrect, lpdestrect, __LINE__); + res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); + if (res) BlitError(res, lpsrcrect, lpdestrect, __LINE__); } // Try to handle DDBLT_KEYSRC on primary surface if((res==DDERR_INVALIDPARAMS) && (dwflags & DDBLT_KEYSRC)){ @@ -239,22 +250,22 @@ static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR DDSURFACEDESC2 ddsd; LPDIRECTDRAWSURFACE2 lpddsTmp; extern CreateSurface2_Type pCreateSurfaceMethod(int); - if (IsDebug) BlitTrace("KEYSRC", lpsrcrect, &destrect, __LINE__); + if (IsDebug) BlitTrace("KEYSRC", lpsrcrect, lpdestrect, __LINE__); memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = (dxversion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); (*pGetSurfaceDescMethod())((LPDIRECTDRAWSURFACE2)lpddssrc, &ddsd); res=(*pCreateSurfaceMethod(dxversion))(lpPrimaryDD, &ddsd, (LPDIRECTDRAWSURFACE *)&lpddsTmp, NULL); if(res) OutTraceE("CreateSurface: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); // copy background - res= (*pBlt)((LPDIRECTDRAWSURFACE)lpddsTmp, lpsrcrect, lpdds, &destrect, DDBLT_WAIT, NULL); + res= (*pBlt)((LPDIRECTDRAWSURFACE)lpddsTmp, lpsrcrect, lpdds, lpdestrect, DDBLT_WAIT, NULL); if(res) OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); // overlay texture res= (*pBlt)((LPDIRECTDRAWSURFACE)lpddsTmp, lpsrcrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); if(res) OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); // copy back to destination - res= (*pBlt)(lpdds, &destrect, (LPDIRECTDRAWSURFACE)lpddsTmp, lpsrcrect, DDBLT_WAIT, lpddbltfx); + res= (*pBlt)(lpdds, lpdestrect, (LPDIRECTDRAWSURFACE)lpddsTmp, lpsrcrect, DDBLT_WAIT, lpddbltfx); if(res) OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); - if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); + if (res) BlitError(res, lpsrcrect, lpdestrect, __LINE__); (*pReleaseSMethod(dxversion))((LPDIRECTDRAWSURFACE)lpddsTmp); } if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; @@ -271,8 +282,15 @@ static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR if(dxw.dwFlags5 & GDIMODE){ extern void BlitToWindow(HWND, LPDIRECTDRAWSURFACE); - //if (lpdds != lpddssrc) + if((dxw.dwFlags1 & SAVELOAD) || (dxw.dwFlags8 & FORCEVSYNC)){ + HRESULT res2; + if(!bVSyncDone){ + if(res2=lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN , 0)) + OutTraceE("WaitForVerticalBlank ERROR: res=%x\n", res2); + } + bVSyncDone = FALSE; BlitToWindow(dxw.GethWnd(), lpddssrc); + } return DD_OK; } @@ -363,8 +381,18 @@ static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR emurect.right <<= 1; emurect.bottom <<= 1; } + + if((dxw.dwFlags1 & SAVELOAD) || (dxw.dwFlags8 & FORCEVSYNC)) { + HRESULT res2; + if(!bVSyncDone){ + if(res2=lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN , 0)) + OutTraceE("WaitForVerticalBlank ERROR: res=%x\n", res2); + } + bVSyncDone = FALSE; + } + if (IsDebug) BlitTrace("BACK2PRIM", &emurect, &destrect, __LINE__); - res=(*pPrimaryBlt)(dxversion, pBlt, lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect); + res=(*pPrimaryBlt)(dxversion, pBlt, lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, NULL); if (res) BlitError(res, &emurect, &destrect, __LINE__); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; @@ -428,6 +456,15 @@ HRESULT WINAPI sBlt(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDRAWSURFACE OutTrace(sLog); } + if(dxw.dwFlags8 & FORCEWAIT){ + dwflags |= DDBLT_WAIT; + dwflags &= ~(DDBLT_ASYNC|DDBLT_DONOTWAIT); + } + if(dxw.dwFlags8 & FORCENOWAIT){ + dwflags &= ~DDBLT_WAIT; + dwflags |= (DDBLT_ASYNC|DDBLT_DONOTWAIT); + } + if(ToPrim) res = sBltToPrimary(dxversion, pBlt, api, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx, isFlipping); else diff --git a/dll/ddcreates.cpp b/dll/ddcreates.cpp new file mode 100644 index 0000000..f620e56 --- /dev/null +++ b/dll/ddcreates.cpp @@ -0,0 +1,1046 @@ +#define _CRT_SECURE_NO_WARNINGS +#define INITGUID +//#define FULLHEXDUMP + +#include +#include +#include "dxwnd.h" +#include "dxhook.h" +#include "ddrawi.h" +#include "dxwcore.hpp" +#include "stdio.h" +#include "hddraw.h" +#include "dxhelper.h" +#include "syslibs.h" + +#define MAXBACKBUFFERS 4 + +extern void SetPixFmt(LPDDSURFACEDESC2); +extern void GetPixFmt(LPDDSURFACEDESC2); +extern CHAR *LogSurfaceAttributes(LPDDSURFACEDESC, char *, int); +extern void DumpPixFmt(LPDDSURFACEDESC2); +extern void DescribeSurface(LPDIRECTDRAWSURFACE, int, char *, int); +extern void HookDDSurface(LPDIRECTDRAWSURFACE *, int, BOOL); +extern void RegisterPixelFormat(int, LPDIRECTDRAWSURFACE); +extern void SetVSyncDelays(int, LPDIRECTDRAW); +extern char *DumpPixelFormat(LPDDSURFACEDESC2); +extern void FixSurfaceCaps(LPDDSURFACEDESC2, int); +extern SetPalette_Type pSetPaletteMethod(int); +extern ReleaseS_Type pReleaseSMethod(int); +extern CreatePalette_Type pCreatePaletteMethod(int); +extern GetGDISurface_Type pGetGDISurfaceMethod(int); + +extern int iBakBufferVersion; +extern LPDIRECTDRAWSURFACE lpDDSEmu_Prim; +extern LPDIRECTDRAWSURFACE lpDDSEmu_Back; +extern LPDIRECTDRAWSURFACE lpDDZBuffer; +extern DDSURFACEDESC2 DDSD_Prim; +extern LPDIRECTDRAWPALETTE lpDDP; +extern LPDIRECTDRAWCLIPPER lpddC; +extern LPDIRECTDRAW lpPrimaryDD; +extern int iDDPExtraRefCounter; +extern DWORD dwBackBufferCaps; +extern BOOL bFlippedDC; +extern PALETTEENTRY DefaultSystemPalette[]; +extern GetGDISurface_Type pGetGDISurface1, pGetGDISurface2, pGetGDISurface3, pGetGDISurface4, pGetGDISurface7; +extern GetAttachedSurface_Type pGetAttachedSurface1, pGetAttachedSurface2, pGetAttachedSurface3, pGetAttachedSurface4, pGetAttachedSurface7; +extern CreateSurface1_Type pCreateSurface1, pCreateSurface2, pCreateSurface3, pCreateSurface4, pCreateSurface7; +extern ReleaseS_Type pReleaseS1, pReleaseS2, pReleaseS3, pReleaseS4, pReleaseS7; +extern GetPixelFormat_Type pGetPixelFormat1, pGetPixelFormat2, pGetPixelFormat3, pGetPixelFormat4, pGetPixelFormat7; + +void InitDSScreenParameters(int dxversion, LPDIRECTDRAWSURFACE lpdds) +{ + HRESULT res; + DDPIXELFORMAT p; + DDSURFACEDESC2 ddsd; + GetPixelFormat_Type pGetPixelFormat; + switch(dxversion){ + case 1: pGetPixelFormat=pGetPixelFormat1; break; + case 2: pGetPixelFormat=pGetPixelFormat2; break; + case 3: pGetPixelFormat=pGetPixelFormat3; break; + case 4: pGetPixelFormat=pGetPixelFormat4; break; + case 7: pGetPixelFormat=pGetPixelFormat7; break; + } + //OutTrace("dxversion=%d pGetPixelFormat=%x\n", dxversion, pGetPixelFormat); + p.dwSize=sizeof(DDPIXELFORMAT); + if(res=(*pGetPixelFormat)(lpdds, &p)){ + OutTraceE("GetPixelFormat: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return; + } + + ddsd.ddpfPixelFormat = p; + OutTraceDW("InitDSScreenParameters: version=%d Actual %s\n", dxversion, DumpPixelFormat(&ddsd)); + dxw.ActualPixelFormat = p; + SetBltTransformations(dxversion); + return; +} + +static void ClearSurfaceDesc(void *ddsd, int dxversion) +{ + int size; + size = (dxversion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); + memset(ddsd, 0, size); // Clean all + ((LPDDSURFACEDESC)ddsd)->dwSize = size; +} + +static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, int dxversion) +{ + HRESULT res; + DDSURFACEDESC2 ddsd; + + OutTraceDW("DEBUG: BuildRealSurfaces: lpdd=%x pCreateSurface=%x version=%d\n", lpdd, pCreateSurface, dxversion); + if(lpDDSEmu_Prim==NULL){ + ClearSurfaceDesc((void *)&ddsd, dxversion); + ddsd.dwFlags = DDSD_CAPS; + // try DDSCAPS_SYSTEMMEMORY first, then suppress it if not supported + // no, DDSCAPS_SYSTEMMEMORY cause screen flickering while moving the window (and other troubles?) + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); + if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){ + OutTraceDW("CreateSurface: ASSERT DDSEmu_Prim already exists\n"); + if(dxw.Windowize){ + // in Windowize mode, the desktop properties are untouched, then the current primary surface can be recycled + res=(*pGetGDISurfaceMethod(dxversion))(lpdd, &lpDDSEmu_Prim); + } + else { + // in non-Windowized mode, the primary surface must be released and rebuilt with the proper properties + res=(*pGetGDISurfaceMethod(dxversion))(lpdd, &lpDDSEmu_Prim); + if (lpDDSEmu_Prim) while((*pReleaseSMethod(dxversion))(lpDDSEmu_Prim)); + res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); + } + } + if(res){ + OutTraceE("CreateSurface: ERROR on DDSEmu_Prim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return; + } + OutTraceDW("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); + if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); + InitDSScreenParameters(dxversion, lpDDSEmu_Prim); + dxwss.PopSurface(lpDDSEmu_Prim); + + if (dxw.dwFlags3 & FORCECLIPPER){ + OutTraceDW("CreateSurface: FORCE SetClipper on primary hwnd=%x lpdds=%x\n", dxw.GethWnd(), lpDDSEmu_Prim); + res=lpdd->CreateClipper(0, &lpddC, NULL); + if (res) OutTraceE("CreateSurface: CreateClipper ERROR res=%x(%s)\n", res, ExplainDDError(res)); + res=lpddC->SetHWnd(0, dxw.GethWnd()); + if (res) OutTraceE("CreateSurface: SetHWnd ERROR res=%x(%s)\n", res, ExplainDDError(res)); + res=lpDDSEmu_Prim->SetClipper(lpddC); + if (res) OutTraceE("CreateSurface: SetClipper ERROR res=%x(%s)\n", res, ExplainDDError(res)); + } + // can't hook lpDDSEmu_Prim as generic, since the Flip method is unimplemented for a PRIMARY surface! + // better avoid it or hook just useful methods. + //if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Prim, dxw.dwDDVersion); + } + + if(lpDDSEmu_Back==NULL){ + ClearSurfaceDesc((void *)&ddsd, dxversion); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.ddsCaps.dwCaps = dwBackBufferCaps; + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + if(dxw.dwFlags4 & BILINEAR2XFILTER){ + // double backbuffer size + ddsd.dwWidth = dxw.GetScreenWidth() << 1; + ddsd.dwHeight = dxw.GetScreenHeight() << 1; + } + + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); + if(res) { + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); + } + if(res){ + OutTraceE("CreateSurface: CreateSurface ERROR on DDSEmuBack : res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return; + } + OutTraceDW("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); + if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); + dxwss.PopSurface(lpDDSEmu_Back); + //if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); + } +} + +void RestoreDDrawSurfaces() +{ + // if it's a ddraw game .... + if(lpPrimaryDD){ + OutTraceDW("RestoreDDrawSurfaces: rebuilding surfaces for dd session %x\n", lpPrimaryDD); + ReleaseS_Type pReleaseS; + CreateSurface_Type pCreateSurface; + switch(iBakBufferVersion){ + case 1: pCreateSurface=(CreateSurface_Type)pCreateSurface1; pReleaseS=pReleaseS1; break; + case 2: pCreateSurface=(CreateSurface_Type)pCreateSurface2; pReleaseS=pReleaseS2; break; + case 3: pCreateSurface=(CreateSurface_Type)pCreateSurface3; pReleaseS=pReleaseS3; break; + case 4: pCreateSurface=(CreateSurface_Type)pCreateSurface4; pReleaseS=pReleaseS4; break; + case 7: pCreateSurface=(CreateSurface_Type)pCreateSurface7; pReleaseS=pReleaseS7; break; + } + if(lpDDSEmu_Back) while((*pReleaseS)(lpDDSEmu_Back)); lpDDSEmu_Back=0; + if(lpDDSEmu_Prim) while((*pReleaseS)(lpDDSEmu_Prim)); lpDDSEmu_Prim=0; + BuildRealSurfaces(lpPrimaryDD, pCreateSurface, iBakBufferVersion); + } +} + +static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildPrimaryEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + // emulated primary surface + memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); + + // handle the surface attributes before the ddsd.dwFlags gets updated: + // if a surface desc is NOT specified, build one + if(!(ddsd.dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); + // then save it + dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; + + 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); + // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces + ddsd.ddsCaps.dwCaps |= (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags6 & NOSYSMEMPRIMARY) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + + // create Primary surface + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res){ + OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + iBakBufferVersion=dxversion; // v2.03.01 + + OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); + HookDDSurface(lplpdds, dxversion, TRUE); + // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... + + // build a default System palette and apply it to primary surface + if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && + (dxw.dwFlags6 & SYNCPALETTE)){ + if(lpDDP == NULL){ + res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); + if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); + } + // this must be done after hooking - who knows why? + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); + if(res) { + OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); + } + else iDDPExtraRefCounter++; + } + + // set a global capability value for surfaces that have to blit to primary + // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces + // DDSCAPS_SYSTEMMEMORY makes operations faster, but it is not always good... + dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + // this is important to avoid that certain D3D operations will abort - see "Forsaken" problem + if(dxw.dwFlags6 & NOSYSMEMBACKBUF) dwBackBufferCaps = DDSCAPS_OFFSCREENPLAIN; + + if(dxw.dwFlags6 & SHAREDDC) bFlippedDC = TRUE; + + if(dxw.dwFlags5 & GDIMODE) return DD_OK; + + BuildRealSurfaces(lpdd, pCreateSurface, dxversion); + return DD_OK; +} + +static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildPrimaryFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + // emulated primary surface + memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); + + // handle the surface attributes before the ddsd.dwFlags gets updated: + // if a surface desc is NOT specified, build one + if(!(ddsd.dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); + // then save it + dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; + + OutTraceDW("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); + + // dwFlags + ddsd.dwFlags &= ~(DDSD_REFRESHRATE); + ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_BACKBUFFERCOUNT); + + // dwBackBufferCount: set to at least 1 + if(!(lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) || (lpddsd->dwBackBufferCount == 0)) ddsd.dwBackBufferCount = 1; + + // dwCaps + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM|DDSCAPS_FRONTBUFFER); + ddsd.ddsCaps.dwCaps |= (DDSCAPS_COMPLEX|DDSCAPS_FLIP|DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags6 & NOSYSMEMPRIMARY) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + + // dwWidth & dwHeight + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + + // create Primary surface + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res){ + OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + iBakBufferVersion=dxversion; // v2.03.01 + + OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); + HookDDSurface(lplpdds, dxversion, TRUE); + // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... + + // build a default System palette and apply it to primary surface + if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && + (dxw.dwFlags6 & SYNCPALETTE)){ + if(lpDDP == NULL){ + res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); + if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); + } + // this must be done after hooking - who knows why? + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); + if(res) { + OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); + } + else iDDPExtraRefCounter++; + } + + // set a global capability value for surfaces that have to blit to primary + dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + // this is important to avoid that certain D3D operations will abort - see "Forsaken" problem + if(dxw.dwFlags6 & NOSYSMEMBACKBUF) dwBackBufferCaps = DDSCAPS_OFFSCREENPLAIN; + + if(dxw.dwFlags6 & SHAREDDC) bFlippedDC = TRUE; + + if(dxw.dwFlags5 & GDIMODE) return DD_OK; + + BuildRealSurfaces(lpdd, pCreateSurface, dxversion); + return DD_OK; +} + +static HRESULT BuildPrimaryFullscreen(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildPrimaryFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + // genuine primary surface + memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); + + // create Primary surface + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res){ + if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ + LPDIRECTDRAWSURFACE lpPrim; + GetGDISurface_Type pGetGDISurface; + switch(dxversion){ + default: + case 1: pGetGDISurface = pGetGDISurface1; break; + case 2: pGetGDISurface = pGetGDISurface2; break; + case 3: pGetGDISurface = pGetGDISurface3; break; + case 4: pGetGDISurface = pGetGDISurface4; break; + case 7: pGetGDISurface = pGetGDISurface7; break; + } + OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); + (*pGetGDISurface)(lpPrimaryDD, &lpPrim); + while ((*pReleaseSMethod(dxversion))(lpPrim)); + res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + } + /* fall through */ + if(res){ + OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + } + + OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); + + iBakBufferVersion=dxversion; + HookDDSurface(lplpdds, dxversion, TRUE); + if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); + + return DD_OK; +} + +static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildPrimaryDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + // genuine primary surface + memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); + // v2.03.98 - when going to fullscreen mode and no emulation do not alter the capability masks, or in other words ... + // if doing emulation or in window mode, fix the capability masks (De Morgan docet) + ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT); + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_FLIP|DDSCAPS_COMPLEX); + // v2.02.93: don't move primary / backbuf surfaces on systemmemory when 3DDEVICE is requested + // this impact also on capabilities for temporary surfaces for AERO optimized handling + if ((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + + // create Primary surface + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res){ + if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ + LPDIRECTDRAWSURFACE lpPrim; + GetGDISurface_Type pGetGDISurface; + switch(dxversion){ + default: + case 1: pGetGDISurface = pGetGDISurface1; break; + case 2: pGetGDISurface = pGetGDISurface2; break; + case 3: pGetGDISurface = pGetGDISurface3; break; + case 4: pGetGDISurface = pGetGDISurface4; break; + case 7: pGetGDISurface = pGetGDISurface7; break; + } + OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); + (*pGetGDISurface)(lpPrimaryDD, &lpPrim); + while ((*pReleaseSMethod(dxversion))(lpPrim)); + res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + } + /* fall through */ + if(res){ + OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + } + + OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); + + if(dxw.dwFlags1 & EMULATEBUFFER){ + lpDDSEmu_Prim = *lplpdds; + dxwss.PopSurface(lpDDSEmu_Prim); + + ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; + // warning: can't create zero sized backbuffer surface !!!! + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + ddsd.ddsCaps.dwCaps = 0; + if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res){ + OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); + return res; + } + OutTraceDW("CreateSurface: created FIX DDSPrim=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim(2)", __LINE__); + } + + iBakBufferVersion=dxversion; // v2.03.37 + HookDDSurface(lplpdds, dxversion, TRUE); + if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); + + return DD_OK; +} + +static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildBackBufferEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + // create BackBuffer surface + memcpy(&ddsd, lpddsd, lpddsd->dwSize); + ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); + ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_BACKBUFFER|DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + + // v2.03.75: if a surface desc is NOT specified, build one. This will allow ZBUF attach. + if(!(lpddsd->dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); + + // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces + ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); + if(ddsd.ddsCaps.dwCaps & DDSCAPS_3DDEVICE) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; // necessary: Martian Gotic crashes otherwise + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags6 & NOSYSMEMBACKBUF) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + GetPixFmt(&ddsd); + + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res) { + OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + + OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); + HookDDSurface(lplpdds, dxversion, FALSE); // added !!! + iBakBufferVersion=dxversion; // v2.02.31 + + if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && + (dxw.dwFlags6 & SYNCPALETTE)){ + if(lpDDP == NULL){ + res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); + if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); + } + // this must be done after hooking - who knows why? + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); + if(res) { + OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); + } + else iDDPExtraRefCounter++; + } + + // V2.1.85/V2.2.34: tricky !!!! + // When a real backbuffer is created, it has a reference to its frontbuffer. + // some games (Monopoly 3D) may depend on this setting - i.e. they could close + // the exceeding references - so this is better be replicated adding an initial + // reference to the zero count. But you don't have to do this if the backbuffer + // is created independently by the primary surface. + (*lplpdds)->AddRef(); // should it be repeated BBCount times???? + + return DD_OK; +} + +static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + //MessageBox(NULL, "BuildBackBufferFlippable", "DxWnd", MB_OK); + + // create BackBuffer surface + memcpy(&ddsd, lpddsd, lpddsd->dwSize); + + ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); + ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); + + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FRONTBUFFER|DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); + + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + GetPixFmt(&ddsd); + + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res) { + OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + + OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); + HookDDSurface(lplpdds, dxversion, FALSE); // added !!! + iBakBufferVersion=dxversion; // v2.02.31 + + if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && + (dxw.dwFlags6 & SYNCPALETTE)){ + if(lpDDP == NULL){ + res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); + if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); + } + // this must be done after hooking - who knows why? + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); + if(res) { + OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); + } + else iDDPExtraRefCounter++; + } + + return DD_OK; +} + +static HRESULT AttachBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + HRESULT res; + LPDIRECTDRAWSURFACE lpDDSPrim; + OutTraceDW("DEBUG: AttachBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + + // retrieve the attached backbuffer surface and hook it + + if(lpddsd->dwBackBufferCount == 0) return DD_OK; // nothing to retrieve + + GetAttachedSurface_Type pGetAttachedSurface; + DDSCAPS2 caps; + switch(dxversion){ + case 1: pGetAttachedSurface = pGetAttachedSurface1; break; + case 2: pGetAttachedSurface = pGetAttachedSurface2; break; + case 3: pGetAttachedSurface = pGetAttachedSurface3; break; + case 4: pGetAttachedSurface = pGetAttachedSurface4; break; + case 7: pGetAttachedSurface = pGetAttachedSurface7; break; + } + memset(&caps, 0, sizeof(caps)); + caps.dwCaps = DDSCAPS_BACKBUFFER; + lpDDSPrim = dxwss.GetPrimarySurface(); + res = (*pGetAttachedSurface)(lpDDSPrim, (LPDDSCAPS)&caps, lplpdds); + if(res){ + OutTraceE("CreateSurface: GetAttachedSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + OutTraceDW("CreateSurface: retrieved BACK DDSBack=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); + HookDDSurface(lplpdds, dxversion, FALSE); // added !!! + iBakBufferVersion=dxversion; // v2.02.31 + + return DD_OK; +} + +static HRESULT BuildBackBufferFullscreen(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + OutTraceDW("DEBUG: BuildBackBufferFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + return DD_OK; +} + +static HRESULT AttachBackBufferFullscreen(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + OutTraceDW("DEBUG: AttachBackBufferFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + return DD_OK; +} + +static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildBackBufferDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + // create BackBuffer surface + // ClearSurfaceDesc((void *)&ddsd, dxversion); + memcpy(&ddsd, lpddsd, lpddsd->dwSize); + if(dxw.IsEmulated || dxw.Windowize){ + ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT); + ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH); + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX); + // v2.02.93: don't move primary / backbuf surfaces on systemmemory when 3DDEVICE is requested + if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) { + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + } + else { + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + } + } + if(dxw.dwFlags6 & NOSYSMEMBACKBUF) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + + if (dxw.dwFlags2 & BACKBUFATTACH) { + LPDIRECTDRAWSURFACE lpPrim; + DDSURFACEDESC2 prim; + GetGDISurface_Type pGetGDISurface; + switch(dxversion){ + default: + case 1: pGetGDISurface = pGetGDISurface1; break; + case 2: pGetGDISurface = pGetGDISurface2; break; + case 3: pGetGDISurface = pGetGDISurface3; break; + case 4: pGetGDISurface = pGetGDISurface4; break; + case 7: pGetGDISurface = pGetGDISurface7; break; + } + (*pGetGDISurface)(lpPrimaryDD, &lpPrim); + memset(&prim, 0, sizeof(DDSURFACEDESC2)); + prim.dwSize = (dxversion >= 4) ? sizeof(DDSURFACEDESC2) : sizeof(DDSURFACEDESC); + res=lpPrim->GetSurfaceDesc((DDSURFACEDESC *)&prim); + (*pReleaseSMethod(dxversion))(lpPrim); + ddsd.dwWidth = prim.dwWidth; + ddsd.dwHeight = prim.dwHeight; + OutTraceDW("BMX FIX: res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight); + } + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res) { + if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){ + OutTraceDW("CreateSurface: CreateSurface DDERR_OUTOFVIDEOMEMORY ERROR at %d, retry in SYSTEMMEMORY\n", __LINE__); + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + } + if(res){ + OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + } + + OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); + HookDDSurface(lplpdds, dxversion, FALSE); // added !!! + iBakBufferVersion=dxversion; // v2.02.31 + + return DD_OK; +} + +static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildGenericEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... + FixSurfaceCaps(&ddsd, dxversion); + // It looks that DDSCAPS_SYSTEMMEMORY surfaces can perfectly be DDSCAPS_3DDEVICE as well. + // For "Risk II" it is necessary that both the primary surface and the offscreen surfaces are generated + // with the same type, so that assuming an identical lPitch and memcopy-ing from one buffer to the + // other is a legitimate operation. + + if(dxw.dwFlags6 & POWER2WIDTH){ // v2.03.28: POWER2WIDTH to fix "Midtown Madness" in surface emulation mode + if(((ddsd.dwFlags & (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) && + (ddsd.ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) + ){ + DWORD dwWidth; + dwWidth = ((ddsd.dwWidth + 3) >> 2) << 2; + if(dwWidth != ddsd.dwWidth) OutTraceDW("CreateSurface: fixed surface width %d->%d\n", ddsd.dwWidth, dwWidth); + ddsd.dwWidth = dwWidth; + } + } + + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); + if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res!=DD_OK)){ + OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); + } + if (res) { + OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", + *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__)); + + // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. + // fixes "Virtua Fighter PC" palette bug + if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); + if(res) + OutTraceE("SetPalette: ERROR on lpdds=%x(Emu_Generic) res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); + else { + OutTraceDW("CreateSurface: applied lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); + iDDPExtraRefCounter++; + } + } + + // diagnostic hooks .... + HookDDSurface(lplpdds, dxversion, FALSE); + + return DD_OK; +} + +static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildGenericFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... + FixSurfaceCaps(&ddsd, dxversion); + + if(dxw.dwFlags6 & POWER2WIDTH){ // v2.03.28: POWER2WIDTH to fix "Midtown Madness" in surface emulation mode + if(((ddsd.dwFlags & (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) && + (ddsd.ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) + ){ + DWORD dwWidth; + dwWidth = ((ddsd.dwWidth + 3) >> 2) << 2; + if(dwWidth != ddsd.dwWidth) OutTraceDW("CreateSurface: fixed surface width %d->%d\n", ddsd.dwWidth, dwWidth); + ddsd.dwWidth = dwWidth; + } + } + + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); + if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res!=DD_OK)){ + OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); + } + if (res) { + OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", + *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__)); + + // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. + // fixes "Virtua Fighter PC" palette bug + if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); + if(res) + OutTraceE("SetPalette: ERROR on lpdds=%x(Emu_Generic) res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); + else { + OutTraceDW("CreateSurface: applied lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); + iDDPExtraRefCounter++; + } + } + + // diagnostic hooks .... + HookDDSurface(lplpdds, dxversion, FALSE); + + return DD_OK; +} + +static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + HRESULT res; + + OutTraceDW("DEBUG: BuildGenericDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); + + res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); + if(res){ + // v2.02.60: Ref. game Incoming GOG release, post by Marek, error DDERR_UNSUPPORTED while trying to create ZBUFFER surface + if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && ((res==DDERR_OUTOFVIDEOMEMORY)||(res==DDERR_UNSUPPORTED))){ + 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); + } + if(res){ + OutTraceE("CreateSurface: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + } + + OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", + *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); + + // hooks .... + HookDDSurface(lplpdds, dxversion, FALSE); + + return DD_OK; +} + +HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface, LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, + LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + HRESULT res; + DDSURFACEDESC2 ddsd; + LPDIRECTDRAWSURFACE lpDDSPrim; + LPDIRECTDRAWSURFACE lpDDSBack = NULL; + DWORD CurFlags; + int TargetSize; + typedef HRESULT (*BuildSurface_Type)(LPDIRECTDRAW, CreateSurface_Type, LPDDSURFACEDESC2, int, LPDIRECTDRAWSURFACE *, void *); + static BuildSurface_Type BuildPrimary = 0; + static BuildSurface_Type BuildBackBuffer = 0; + static BuildSurface_Type AttachBackBuffer = 0; + static BuildSurface_Type BuildGeneric = 0; + static enum { + PRIMARY_FULLSCREEN = 0, + PRIMARY_DIRECT, + PRIMARY_FLIPPABLE, + PRIMARY_EMULATED + } SurfaceMode; + + OutTraceDDRAW("CreateSurface(%d): lpdd=%x %s\n", + dxversion, lpdd, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__)); + + // v2.03.95.fx1 - deleted: some texture handling REQUIRES a proper FourCC codec. + // maybe it could be suppressed by a dedicated config. flag and on primary surfaces only? + //lpddsd->ddpfPixelFormat.dwFourCC = 0; + + // if not initialized yet .... + if(BuildPrimary == 0){ + char *sLabel; + SurfaceMode = PRIMARY_FULLSCREEN; + if(dxw.IsEmulated || dxw.Windowize){ + SurfaceMode = (dxw.dwFlags1 & EMULATESURFACE) ? + ((dxw.dwFlags6 & FLIPEMULATION) ? + PRIMARY_EMULATED : + PRIMARY_FLIPPABLE) : + PRIMARY_DIRECT; + } + + switch(SurfaceMode) { + case PRIMARY_FULLSCREEN: + BuildPrimary = BuildPrimaryFullscreen; + BuildBackBuffer = BuildBackBufferFullscreen; + AttachBackBuffer = AttachBackBufferFullscreen; + BuildGeneric = BuildGenericDir; + sLabel="FULLSCR"; + break; + case PRIMARY_DIRECT: + BuildPrimary = BuildPrimaryDir; + BuildBackBuffer = BuildBackBufferDir; + AttachBackBuffer = BuildBackBufferDir; + BuildGeneric = BuildGenericDir; + sLabel="DIRECT"; + break; + case PRIMARY_FLIPPABLE: + BuildPrimary = BuildPrimaryFlippable; + BuildBackBuffer = BuildBackBufferFlippable; + AttachBackBuffer = AttachBackBufferFlippable; + BuildGeneric = BuildGenericFlippable; + sLabel="FLIPPABLE"; + break; + case PRIMARY_EMULATED: + BuildPrimary = BuildPrimaryEmu; + BuildBackBuffer = BuildBackBufferEmu; + AttachBackBuffer = BuildBackBufferEmu; + BuildGeneric = BuildGenericEmu; + sLabel="EMULATED"; + break; + } + OutTraceDW("CreateSurface: MODE INITIALIZED mode=%d(%s)\n", SurfaceMode, sLabel); + } + + // check for lpddsd->dwSize value + TargetSize=(dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); + if(lpddsd->dwSize != TargetSize){ + char sMsg[81]; + sprintf_s(sMsg,80, "CreateSurface: ASSERT bad dwSize=%d dxversion=%d\n", + lpddsd->dwSize, dxversion); + 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)){ + OutTraceDW("CreateSurface: fixing illegal dwFlags value: %x -> %x\n", + lpddsd->dwFlags, (lpddsd->dwFlags | DDSD_CAPS)); + lpddsd->dwFlags |= DDSD_CAPS; + } + + memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy + + // v2.02.38: this is odd: in "Star Force Deluxe" there is no PRIMARY surface, but a surface with + // 0 flags and 0 capabilities serves for this purpose. Is it a side-effect of old ddraw releases? + if((dxversion == 1) && ((ddsd.dwFlags & ~DDSD_BACKBUFFERCOUNT) == 0)){ // Star Force Deluxe + ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + //if(dxw.VirtualPixelFormat.dwRGBBitCount == 8) ddsd.ddsCaps.dwCaps |= DDSCAPS_PALETTE; + } + + // creation of the primary surface.... + if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){ + dxwss.ClearSurfaceList(); // v2.03.83: "Daytona USA" would saturate the list otherwise + SetVSyncDelays(dxversion, lpdd); + GetHookInfo()->Height=(short)dxw.GetScreenHeight(); + GetHookInfo()->Width=(short)dxw.GetScreenWidth(); + GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount; + GetHookInfo()->DXVersion=dxversion; + lpPrimaryDD = lpdd; // v2.1.87 + memcpy(&DDSD_Prim, lpddsd, sizeof(DDSD_Prim)); // v2.02.37 + + // beware of the different behaviour between older and newer directdraw releases... + if(dxversion >= 4){ + if (lpDDSEmu_Back) while(lpDDSEmu_Back->Release()); + if (lpDDSEmu_Prim) while(lpDDSEmu_Prim->Release()); + if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { // Praetorians !!!! + lpDDSBack = dxwss.GetBackBufferSurface(); + if (lpDDSBack) { + if(dxw.dwFlags6 & FLIPEMULATION) while(lpDDSBack->Release()); + dxwss.PopSurface(lpDDSBack); + lpDDSBack = NULL; + } + } + } + lpDDSEmu_Back=NULL; + lpDDSEmu_Prim=NULL; + + int BBCount=0; // or 1 ?? + if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) BBCount=ddsd.dwBackBufferCount; + if ((BBCount > 0) && (iBakBufferVersion < 4)){ + lpDDSBack=NULL; + OutTraceDW("CreateSurface: backbuffer cleared - BackBufferCount=%d\n", BBCount); + } + + if (BBCount > MAXBACKBUFFERS){ + char sMsg[81]; + sprintf_s(sMsg, 80, "CreateSurface: BackBufferCount=%d\n", BBCount); + OutTraceDW(sMsg); + if (IsAssertEnabled) MessageBox(0, sMsg, "CreateSurface", MB_OK | MB_ICONEXCLAMATION); + // recover ... + BBCount = MAXBACKBUFFERS; + } + + // build emulated primary surface, real primary and backbuffer surfaces + CurFlags=ddsd.dwFlags; + res=BuildPrimary(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); + if(res) return res; + lpDDSPrim = *lplpdds; + dxwss.PushPrimarySurface(lpDDSPrim, dxversion); + RegisterPixelFormat(dxversion, lpDDSPrim); + + if (BBCount){ + // build emulated backbuffer surface + res=AttachBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); + if(res) return res; + dxwss.PushBackBufferSurface(lpDDSBack, dxversion); + } + + if(IsTraceDDRAW){ + char sInfo[256+1]; + sprintf(sInfo, "CreateSurface: created DDSPrim=%x DDSBack=%x", lpDDSPrim, lpDDSBack); + if(dxw.IsEmulated) sprintf(sInfo, "%s DDSEmu_Prim=%x", sInfo, lpDDSEmu_Prim); + if(dxw.dwFlags1 & EMULATESURFACE) sprintf(sInfo, "%s DDSEmu_Back=%x", sInfo, lpDDSEmu_Back); + strcat(sInfo, "\n"); + OutTrace(sInfo); + } + + // rebuild the clipper area + if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); + + // v2.2.64: added extra ref needed to preserve ddraw session for later use. Is it a ddraw1 legacy? + // seems to fix problems in "Warhammer 40K Rites Of War" that uses a ddraw session after reaching 0 refcount. + // v2.2.84: avoid the extra referenced in non windowed mode since it causes the window shift reported by gsky916 + // for Wind Fantasy SP. + // v2.3.59: same extra reference is needed by "Wahammer Chaos Gate" that uses ddraw interface release 2 + // v2.3.72: fixed previous fix: condition is <=2, not >=2 ! + // Be aware that it may perhaps become <=3, if we get the same problem elsewhere + // v2.3.96: deleted the if(Windowized) condition: AddRef is needed also in fullscreen mode. + if(dxw.dwDDVersion<=2) lpdd->AddRef(); + + return DD_OK; + } + + // 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) { + OutTraceDW("CreateSurface: returning current DDSBack=%x\n", lpDDSBack); + *lplpdds = lpDDSBack; + return DD_OK; + } + + res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); + if(res == DD_OK) { + dxwss.PushBackBufferSurface(*lplpdds, dxversion); + dxwcdb.PushCaps(*lplpdds, lpddsd->ddsCaps.dwCaps); + } + return res; + } + + // if nothing else, it's a generic/zbuffer surface + + res=BuildGeneric(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, pu); + if(!res) { + dxwss.PopSurface(*lplpdds); + if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { + // v2.03.82: save ZBUFFER capabilities for later fix in D3D CreateDevice + if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) dxwcdb.PushCaps(*lplpdds, lpddsd->ddsCaps.dwCaps); + OutTraceDW("CreateSurface: lpDDZBuffer=%x save ZBUFFER caps=%x(%s)\n", *lplpdds, lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); + } + } + + return res; +} \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 44ccbe5..0e02daf 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -14,6 +14,7 @@ #include "syslibs.h" #define EMULATEZBUFFERATTACH FALSE +#define HANDLEFLIPPABLE #ifdef CHECKMETHODPOINTERS static void NullMethodPointer(char *s) @@ -35,6 +36,7 @@ ColorConversion_Type pColorConversion = NULL; HDC hFlippedDC = NULL; BOOL bFlippedDC = FALSE; DWORD dwBackBufferCaps = 0; +BOOL bVSyncDone; // DirectDraw API HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *); @@ -134,6 +136,11 @@ HRESULT WINAPI extGetCaps2D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); HRESULT WINAPI extGetCaps3D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); HRESULT WINAPI extGetCaps4D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); HRESULT WINAPI extGetCaps7D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +HRESULT WINAPI extGetScanLine1(LPDIRECTDRAW, LPDWORD); +HRESULT WINAPI extGetScanLine2(LPDIRECTDRAW, LPDWORD); +HRESULT WINAPI extGetScanLine3(LPDIRECTDRAW, LPDWORD); +HRESULT WINAPI extGetScanLine4(LPDIRECTDRAW, LPDWORD); +HRESULT WINAPI extGetScanLine7(LPDIRECTDRAW, LPDWORD); // DirectDrawSurface HRESULT WINAPI extQueryInterfaceS1(void *, REFIID, LPVOID *); @@ -264,7 +271,7 @@ HRESULT WINAPI extAddOverlayDirtyRect3(LPDIRECTDRAWSURFACE, LPRECT); HRESULT WINAPI extAddOverlayDirtyRect4(LPDIRECTDRAWSURFACE, LPRECT); HRESULT WINAPI extAddOverlayDirtyRect7(LPDIRECTDRAWSURFACE, LPRECT); -HRESULT WINAPI extCreateSurface(int, CreateSurface_Type, LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); +extern HRESULT WINAPI extCreateSurface(int, CreateSurface_Type, LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extSetSurfaceDesc3(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); HRESULT WINAPI extSetSurfaceDesc4(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); HRESULT WINAPI extSetSurfaceDesc7(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); @@ -333,6 +340,7 @@ RestoreAllSurfaces_Type pRestoreAllSurfaces; TestCooperativeLevel_Type pTestCooperativeLevel4, pTestCooperativeLevel7; GetDeviceIdentifier_Type pGetDeviceIdentifier; RestoreDisplayMode_Type pRestoreDisplayMode1, pRestoreDisplayMode2, pRestoreDisplayMode3, pRestoreDisplayMode4, pRestoreDisplayMode7; +GetScanLine_Type pGetScanLine1, pGetScanLine2, pGetScanLine3, pGetScanLine4, pGetScanLine7; /* DirectDrawSurface hook pointers */ QueryInterface_Type pQueryInterfaceS1, pQueryInterfaceS2, pQueryInterfaceS3, pQueryInterfaceS4, pQueryInterfaceS7; @@ -405,8 +413,6 @@ GammaRamp_Type pDDSetGammaRamp; // ddraw global variables, constants & so on -#define MAXBACKBUFFERS 4 - extern PALETTEENTRY DefaultSystemPalette[256]; LPDIRECTDRAWSURFACE lpDDSEmu_Prim=NULL; LPDIRECTDRAWSURFACE lpDDSEmu_Back=NULL; @@ -426,8 +432,8 @@ DWORD *Palette16BPP = NULL; void *EmuScreenBuffer = NULL; // to implement pitch bug fix DWORD rPitch = 0; LPVOID rSurface = NULL; -static void SetPixFmt(LPDDSURFACEDESC2); -static void GetPixFmt(LPDDSURFACEDESC2); +void SetPixFmt(LPDDSURFACEDESC2); +void GetPixFmt(LPDDSURFACEDESC2); static HookEntryEx_Type ddHooks[]={ {HOOK_HOT_CANDIDATE, 0x08, "DirectDrawCreate", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreate, (FARPROC)extDirectDrawCreate}, @@ -487,6 +493,32 @@ void SetVSyncDelays(int dxversion, LPDIRECTDRAW lpdd) dxw.SetVSyncDelays(ddsdRefreshRate.dwRefreshRate); } +static DWORD GetBltWaitFlags(DWORD dwBltFlags) +{ + if(dxw.dwFlags8 & FORCEWAIT) { + dwBltFlags |= DDBLT_WAIT; + dwBltFlags &= ~DDBLT_DONOTWAIT; + } + if(dxw.dwFlags8 & FORCENOWAIT){ + dwBltFlags |= DDBLT_DONOTWAIT; + dwBltFlags &= ~DDBLT_WAIT; + } + return dwBltFlags; +} + +static DWORD GetFlipWaitFlags(DWORD dwFlipFlags) +{ + if(dxw.dwFlags8 & FORCEWAIT) { + dwFlipFlags |= DDFLIP_WAIT; + dwFlipFlags &= ~DDFLIP_DONOTWAIT; + } + if(dxw.dwFlags8 & FORCENOWAIT){ + dwFlipFlags |= DDFLIP_DONOTWAIT; + dwFlipFlags &= ~DDFLIP_WAIT; + } + return dwFlipFlags; +} + static void Stopper(char *s, int line) { char sMsg[81]; @@ -501,12 +533,12 @@ static void Stopper(char *s, int line) #define STOPPER(s) #endif -static char *DumpPixelFormat(LPDDSURFACEDESC2 lpddsd) +char *DumpPixelFormat(LPDDSURFACEDESC2 lpddsd) { return ExplainPixelFormat(&(lpddsd->ddpfPixelFormat)); } -static CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) +CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) { static char sInfo[1024]; sprintf(sInfo, "SurfaceDesc: %s Flags=%x(%s)", @@ -544,7 +576,7 @@ static CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) return sInfo; } -static void DumpPixFmt(LPDDSURFACEDESC2 lpdds) +void DumpPixFmt(LPDDSURFACEDESC2 lpdds) { OutTrace("PixelFormat: lpdds=%x %s\n", DumpPixelFormat(lpdds)); } @@ -639,33 +671,6 @@ void InitDDScreenParameters(int dxversion, LPDIRECTDRAW lpdd) return; } -void InitDSScreenParameters(int dxversion, LPDIRECTDRAWSURFACE lpdds) -{ - HRESULT res; - DDPIXELFORMAT p; - DDSURFACEDESC2 ddsd; - GetPixelFormat_Type pGetPixelFormat; - switch(dxversion){ - case 1: pGetPixelFormat=pGetPixelFormat1; break; - case 2: pGetPixelFormat=pGetPixelFormat2; break; - case 3: pGetPixelFormat=pGetPixelFormat3; break; - case 4: pGetPixelFormat=pGetPixelFormat4; break; - case 7: pGetPixelFormat=pGetPixelFormat7; break; - } - //OutTrace("dxversion=%d pGetPixelFormat=%x\n", dxversion, pGetPixelFormat); - p.dwSize=sizeof(DDPIXELFORMAT); - if(res=(*pGetPixelFormat)(lpdds, &p)){ - OutTraceE("GetPixelFormat: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return; - } - - ddsd.ddpfPixelFormat = p; - OutTraceDW("InitDSScreenParameters: version=%d Actual %s\n", dxversion, DumpPixelFormat(&ddsd)); - dxw.ActualPixelFormat = p; - SetBltTransformations(dxversion); - return; -} - void InitScreenParameters(int dxversion) { extern void FixPixelFormat(int , DDPIXELFORMAT *); @@ -1085,7 +1090,7 @@ void RegisterPixelFormat(int dxversion, LPDIRECTDRAWSURFACE lpdds) // SetPixFmt: builds a pixel format descriptor when no one is specified, starting from the color depth, the current // desktop pixel format (when the color depth is the same) or the config flags -static void SetPixFmt(LPDDSURFACEDESC2 lpdd) +void SetPixFmt(LPDDSURFACEDESC2 lpdd) { OutTraceDW("SetPixFmt: BPP=%d Use565=%d NoAlpha=%d\n", dxw.VirtualPixelFormat.dwRGBBitCount, @@ -1116,7 +1121,7 @@ static void SetPixFmt(LPDDSURFACEDESC2 lpdd) // retrieves the stored pixel format -static void GetPixFmt(LPDDSURFACEDESC2 lpdd) +void GetPixFmt(LPDDSURFACEDESC2 lpdd) { lpdd->ddpfPixelFormat = dxw.VirtualPixelFormat; OutTraceDW("GetPixFmt: %s\n", DumpPixelFormat(lpdd)); @@ -1160,6 +1165,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps1D, (void **)&pGetCaps1D, "GetCaps(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode1, (void **)&pGetDisplayMode1, "GetDisplayMode(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface1, (void **)&pGetGDISurface1, "GetGDISurface(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 64), extGetScanLine1, (void **)&pGetScanLine1, "GetScanLine(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize1, (void **)&pInitialize1, "Initialize(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 76), extRestoreDisplayMode1, (void **)&pRestoreDisplayMode1, "RestoreDisplayMode(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel1, (void **)&pSetCooperativeLevel1, "SetCooperativeLevel(D1)"); @@ -1177,6 +1183,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps2D, (void **)&pGetCaps2D, "GetCaps(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode2, (void **)&pGetDisplayMode2, "GetDisplayMode(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface2, (void **)&pGetGDISurface2, "GetGDISurface(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 64), extGetScanLine2, (void **)&pGetScanLine2, "GetScanLine(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize2, (void **)&pInitialize2, "Initialize(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 76), extRestoreDisplayMode2, (void **)&pRestoreDisplayMode2, "RestoreDisplayMode(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel2, (void **)&pSetCooperativeLevel2, "SetCooperativeLevel(D2)"); @@ -1196,6 +1203,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps3D, (void **)&pGetCaps3D, "GetCaps(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode3, (void **)&pGetDisplayMode3, "GetDisplayMode(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface3, (void **)&pGetGDISurface3, "GetGDISurface(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 64), extGetScanLine3, (void **)&pGetScanLine3, "GetScanLine(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize3, (void **)&pInitialize3, "Initialize(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 76), extRestoreDisplayMode3, (void **)&pRestoreDisplayMode3, "RestoreDisplayMode(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel3, (void **)&pSetCooperativeLevel3, "SetCooperativeLevel(D3)"); @@ -1215,6 +1223,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps4D, (void **)&pGetCaps4D, "GetCaps(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode4, (void **)&pGetDisplayMode4, "GetDisplayMode(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface4, (void **)&pGetGDISurface4, "GetGDISurface(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 64), extGetScanLine4, (void **)&pGetScanLine4, "GetScanLine(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize4, (void **)&pInitialize4, "Initialize(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 76), extRestoreDisplayMode4, (void **)&pRestoreDisplayMode4, "RestoreDisplayMode(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel4, (void **)&pSetCooperativeLevel4, "SetCooperativeLevel(D4)"); @@ -1236,6 +1245,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps7D, (void **)&pGetCaps7D, "GetCaps(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode7, (void **)&pGetDisplayMode7, "GetDisplayMode(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface7, (void **)&pGetGDISurface7, "GetGDISurface(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 64), extGetScanLine7, (void **)&pGetScanLine7, "GetScanLine(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize7, (void **)&pInitialize7, "Initialize(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 76), extRestoreDisplayMode7, (void **)&pRestoreDisplayMode7, "RestoreDisplayMode(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel7, (void **)&pSetCooperativeLevel7, "SetCooperativeLevel(D7)"); @@ -1267,9 +1277,9 @@ static void HookDDPalette(LPDIRECTDRAWPALETTE FAR* lplpDDPalette) SetHook((void *)(**(DWORD **)lplpDDPalette + 24), extSetEntries, (void **)&pSetEntries, "SetEntries(P)"); } -static void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPrim) +void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPrim) { - BOOL bEmu = (dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)); + BOOL bEmu = dxw.IsEmulated; if(iBakBufferVersion==0) iBakBufferVersion=dxversion; // v2.03.60 OutTraceDW("Hooking surface dds=%x dxversion=%d prim=%x thread_id=%x\n", @@ -1378,7 +1388,7 @@ static void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPr SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface7, (void **)&pAddAttachedSurface7, "AddAttachedSurface(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRect7, (void **)&pAddOverlayDirtyRect7, "AddOverlayDirtyRect(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast7, (void **)&pBltFast7, "BltFast(S7)"); - SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt7, (void **)&pBlt7, "Blt(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt7, (void **)&pBlt7, "Blt(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface7, (void **)&pDeleteAttachedSurface7, "DeleteAttachedSurface(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces7, (void **)&pEnumAttachedSurfaces7, "EnumAttachedSurfaces(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 40), extEnumOverlayZOrders7, (void **)&pEnumOverlayZOrders7, "EnumOverlayZOrders(S7)"); @@ -1841,7 +1851,7 @@ HRESULT WINAPI extInitialize7(LPDIRECTDRAW lpdd, GUID FAR *lpguid) static HRESULT WINAPI extRestoreDisplayMode(int dxversion, RestoreDisplayMode_Type pRestoreDisplayMode, LPDIRECTDRAW lpdd) { OutTraceDW("RestoreDisplayMode(%d): lpdd=%x\n", dxversion, lpdd); - if((dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER))){ + if(dxw.IsEmulated){ OutTraceDW("RestoreDisplayMode: BYPASS\n"); return DD_OK; } @@ -1859,6 +1869,31 @@ HRESULT WINAPI extRestoreDisplayMode4(LPDIRECTDRAW lpdd) HRESULT WINAPI extRestoreDisplayMode7(LPDIRECTDRAW lpdd) { return extRestoreDisplayMode(7, pRestoreDisplayMode7, lpdd); } +HRESULT WINAPI extGetScanLine(int dxversion, GetScanLine_Type pGetScanLine, LPDIRECTDRAW lpdd, LPDWORD lpdwScanLine) +{ + HRESULT res; + res = pGetScanLine(lpdd, lpdwScanLine); + OutTraceB("GetScanLine(%d): lpdd=%x res=%x line=%d\n", dxversion, lpdd, res, *lpdwScanLine); + + if(!res && dxw.Windowize && dxw.dwRealScreenHeight){ + *lpdwScanLine = (*lpdwScanLine * dxw.GetScreenHeight()) / dxw.dwRealScreenHeight; + OutTraceB("GetScanLine(%d): FIXED line=%d\n", *lpdwScanLine); + } + + return res; +} + +HRESULT WINAPI extGetScanLine1(LPDIRECTDRAW lpdd, LPDWORD lpdwScanLine) +{ return extGetScanLine(1, pGetScanLine1, lpdd, lpdwScanLine); } +HRESULT WINAPI extGetScanLine2(LPDIRECTDRAW lpdd, LPDWORD lpdwScanLine) +{ return extGetScanLine(2, pGetScanLine2, lpdd, lpdwScanLine); } +HRESULT WINAPI extGetScanLine3(LPDIRECTDRAW lpdd, LPDWORD lpdwScanLine) +{ return extGetScanLine(3, pGetScanLine3, lpdd, lpdwScanLine); } +HRESULT WINAPI extGetScanLine4(LPDIRECTDRAW lpdd, LPDWORD lpdwScanLine) +{ return extGetScanLine(4, pGetScanLine4, lpdd, lpdwScanLine); } +HRESULT WINAPI extGetScanLine7(LPDIRECTDRAW lpdd, LPDWORD lpdwScanLine) +{ return extGetScanLine(7, pGetScanLine7, lpdd, lpdwScanLine); } + static HRESULT WINAPI extQueryInterfaceD(int dxversion, QueryInterface_Type pQueryInterfaceD, void *lpdd, REFIID riid, LPVOID *obp) { HRESULT res; @@ -2270,6 +2305,8 @@ HRESULT WINAPI extGetDisplayMode(int dxversion, GetDisplayMode_Type pGetDisplayM if(!lpddsd->ddpfPixelFormat.dwFlags) SetPixFmt((LPDDSURFACEDESC2)lpddsd); } + dxw.dwRealScreenWidth = lpddsd->dwWidth; + dxw.dwRealScreenHeight = lpddsd->dwHeight; if(dxw.Windowize){ lpddsd->dwWidth = dxw.GetScreenWidth(); lpddsd->dwHeight = dxw.GetScreenHeight(); @@ -2424,7 +2461,7 @@ HRESULT WINAPI extSetCooperativeLevel4(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwfla HRESULT WINAPI extSetCooperativeLevel7(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) { return extSetCooperativeLevel(7, pSetCooperativeLevel7, lpdd, hwnd, dwflags); } -static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) +void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) { // rules of thumb: // 1) textures should be left untouched (switching to SYSTEMMEMORY when forcing HEL may even fail!) @@ -2503,893 +2540,6 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) return; } -static void ClearSurfaceDesc(void *ddsd, int dxversion) -{ - int size; - size = (dxversion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); - memset(ddsd, 0, size); // Clean all - ((LPDDSURFACEDESC)ddsd)->dwSize = size; -} - -static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, int dxversion) -{ - HRESULT res; - DDSURFACEDESC2 ddsd; - - OutTraceDW("DEBUG: BuildRealSurfaces: lpdd=%x pCreateSurface=%x version=%d\n", lpdd, pCreateSurface, dxversion); - if(lpDDSEmu_Prim==NULL){ - ClearSurfaceDesc((void *)&ddsd, dxversion); - ddsd.dwFlags = DDSD_CAPS; - // try DDSCAPS_SYSTEMMEMORY first, then suppress it if not supported - // no, DDSCAPS_SYSTEMMEMORY cause screen flickering while moving the window (and other troubles?) - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); - if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){ - OutTraceDW("CreateSurface: ASSERT DDSEmu_Prim already exists\n"); - if(dxw.Windowize){ - // in Windowize mode, the desktop properties are untouched, then the current primary surface can be recycled - res=(*pGetGDISurfaceMethod(dxversion))(lpdd, &lpDDSEmu_Prim); - } - else { - // in non-Windowized mode, the primary surface must be released and rebuilt with the proper properties - res=(*pGetGDISurfaceMethod(dxversion))(lpdd, &lpDDSEmu_Prim); - if (lpDDSEmu_Prim) while((*pReleaseSMethod(dxversion))(lpDDSEmu_Prim)); - res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); - } - } - if(res){ - OutTraceE("CreateSurface: ERROR on DDSEmu_Prim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return; - } - OutTraceDW("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); - if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); - InitDSScreenParameters(dxversion, lpDDSEmu_Prim); - dxwss.PopSurface(lpDDSEmu_Prim); - - if (dxw.dwFlags3 & FORCECLIPPER){ - OutTraceDW("CreateSurface: FORCE SetClipper on primary hwnd=%x lpdds=%x\n", dxw.GethWnd(), lpDDSEmu_Prim); - res=lpdd->CreateClipper(0, &lpddC, NULL); - if (res) OutTraceE("CreateSurface: CreateClipper ERROR res=%x(%s)\n", res, ExplainDDError(res)); - res=lpddC->SetHWnd(0, dxw.GethWnd()); - if (res) OutTraceE("CreateSurface: SetHWnd ERROR res=%x(%s)\n", res, ExplainDDError(res)); - res=lpDDSEmu_Prim->SetClipper(lpddC); - if (res) OutTraceE("CreateSurface: SetClipper ERROR res=%x(%s)\n", res, ExplainDDError(res)); - } - // can't hook lpDDSEmu_Prim as generic, since the Flip method is unimplemented for a PRIMARY surface! - // better avoid it or hook just useful methods. - //if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Prim, dxw.dwDDVersion); - } - - if(lpDDSEmu_Back==NULL){ - ClearSurfaceDesc((void *)&ddsd, dxversion); - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = dwBackBufferCaps; - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - if(dxw.dwFlags4 & BILINEAR2XFILTER){ - // double backbuffer size - ddsd.dwWidth = dxw.GetScreenWidth() << 1; - ddsd.dwHeight = dxw.GetScreenHeight() << 1; - } - - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); - if(res) { - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); - } - if(res){ - OutTraceE("CreateSurface: CreateSurface ERROR on DDSEmuBack : res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return; - } - OutTraceDW("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); - if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); - dxwss.PopSurface(lpDDSEmu_Back); - //if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); - } -} - -void RestoreDDrawSurfaces() -{ - // if it's a ddraw game .... - if(lpPrimaryDD){ - OutTraceDW("RestoreDDrawSurfaces: rebuilding surfaces for dd session %x\n", lpPrimaryDD); - ReleaseS_Type pReleaseS; - CreateSurface_Type pCreateSurface; - switch(iBakBufferVersion){ - case 1: pCreateSurface=(CreateSurface_Type)pCreateSurface1; pReleaseS=pReleaseS1; break; - case 2: pCreateSurface=(CreateSurface_Type)pCreateSurface2; pReleaseS=pReleaseS2; break; - case 3: pCreateSurface=(CreateSurface_Type)pCreateSurface3; pReleaseS=pReleaseS3; break; - case 4: pCreateSurface=(CreateSurface_Type)pCreateSurface4; pReleaseS=pReleaseS4; break; - case 7: pCreateSurface=(CreateSurface_Type)pCreateSurface7; pReleaseS=pReleaseS7; break; - } - if(lpDDSEmu_Back) while((*pReleaseS)(lpDDSEmu_Back)); lpDDSEmu_Back=0; - if(lpDDSEmu_Prim) while((*pReleaseS)(lpDDSEmu_Prim)); lpDDSEmu_Prim=0; - BuildRealSurfaces(lpPrimaryDD, pCreateSurface, iBakBufferVersion); - } -} - -static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - OutTraceDW("DEBUG: BuildPrimaryEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - // emulated primary surface - memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); - - // handle the surface attributes before the ddsd.dwFlags gets updated: - // if a surface desc is NOT specified, build one - if(!(ddsd.dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); - // then save it - dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; - - 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); - // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - ddsd.ddsCaps.dwCaps |= (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... - if(dxw.dwFlags6 & NOSYSMEMPRIMARY) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - - // create Primary surface - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - iBakBufferVersion=dxversion; // v2.03.01 - - OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); - HookDDSurface(lplpdds, dxversion, TRUE); - // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... - - // build a default System palette and apply it to primary surface - if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && - (dxw.dwFlags6 & SYNCPALETTE)){ - if(lpDDP == NULL){ - res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); - if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); - } - // this must be done after hooking - who knows why? - res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); - if(res) { - OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); - } - else iDDPExtraRefCounter++; - } - - // set a global capability value for surfaces that have to blit to primary - // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - // DDSCAPS_SYSTEMMEMORY makes operations faster, but it is not always good... - dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... - // this is important to avoid that certain D3D operations will abort - see "Forsaken" problem - if(dxw.dwFlags6 & NOSYSMEMBACKBUF) dwBackBufferCaps = DDSCAPS_OFFSCREENPLAIN; - - if(dxw.dwFlags6 & SHAREDDC) bFlippedDC = TRUE; - - if(dxw.dwFlags5 & GDIMODE) return DD_OK; - - BuildRealSurfaces(lpdd, pCreateSurface, dxversion); - return DD_OK; -} - -static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - OutTraceDW("DEBUG: BuildPrimaryFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - // emulated primary surface - memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); - - // handle the surface attributes before the ddsd.dwFlags gets updated: - // if a surface desc is NOT specified, build one - if(!(ddsd.dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); - // then save it - dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; - - OutTraceDW("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); - - // dwFlags - ddsd.dwFlags &= ~(DDSD_REFRESHRATE); - ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_BACKBUFFERCOUNT); - - // dwBackBufferCount: set to at least 1 - if(!(lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) || (lpddsd->dwBackBufferCount == 0)) ddsd.dwBackBufferCount = 1; - - // dwCaps - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM|DDSCAPS_FRONTBUFFER); - ddsd.ddsCaps.dwCaps |= (DDSCAPS_COMPLEX|DDSCAPS_FLIP|DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... - if(dxw.dwFlags6 & NOSYSMEMPRIMARY) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - - // dwWidth & dwHeight - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - - // create Primary surface - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - iBakBufferVersion=dxversion; // v2.03.01 - - OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); - HookDDSurface(lplpdds, dxversion, TRUE); - // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... - - // build a default System palette and apply it to primary surface - if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && - (dxw.dwFlags6 & SYNCPALETTE)){ - if(lpDDP == NULL){ - res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); - if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); - } - // this must be done after hooking - who knows why? - res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); - if(res) { - OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); - } - else iDDPExtraRefCounter++; - } - - // set a global capability value for surfaces that have to blit to primary - dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... - // this is important to avoid that certain D3D operations will abort - see "Forsaken" problem - if(dxw.dwFlags6 & NOSYSMEMBACKBUF) dwBackBufferCaps = DDSCAPS_OFFSCREENPLAIN; - - if(dxw.dwFlags6 & SHAREDDC) bFlippedDC = TRUE; - - if(dxw.dwFlags5 & GDIMODE) return DD_OK; - - BuildRealSurfaces(lpdd, pCreateSurface, dxversion); - return DD_OK; -} - -static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - OutTraceDW("DEBUG: BuildPrimaryDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - // genuine primary surface - memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); - ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT); - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_FLIP|DDSCAPS_COMPLEX); - // v2.02.93: don't move primary / backbuf surfaces on systemmemory when 3DDEVICE is requested - // this impact also on capabilities for temporary surfaces for AERO optimized handling - if ((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - - // create Primary surface - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res){ - if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ - LPDIRECTDRAWSURFACE lpPrim; - GetGDISurface_Type pGetGDISurface; - switch(dxversion){ - default: - case 1: pGetGDISurface = pGetGDISurface1; break; - case 2: pGetGDISurface = pGetGDISurface2; break; - case 3: pGetGDISurface = pGetGDISurface3; break; - case 4: pGetGDISurface = pGetGDISurface4; break; - case 7: pGetGDISurface = pGetGDISurface7; break; - } - OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); - (*pGetGDISurface)(lpPrimaryDD, &lpPrim); - while ((*pReleaseSMethod(dxversion))(lpPrim)); - res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - } - /* fall through */ - if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - } - - OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); - - if(dxw.dwFlags1 & EMULATEBUFFER){ - lpDDSEmu_Prim = *lplpdds; - dxwss.PopSurface(lpDDSEmu_Prim); - - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; - // warning: can't create zero sized backbuffer surface !!!! - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - ddsd.ddsCaps.dwCaps = 0; - if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - return res; - } - OutTraceDW("CreateSurface: created FIX DDSPrim=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim(2)", __LINE__); - } - - iBakBufferVersion=dxversion; // v2.03.37 - HookDDSurface(lplpdds, dxversion, TRUE); - if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); - - return DD_OK; -} - -static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - OutTraceDW("DEBUG: BuildBackBufferEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - // create BackBuffer surface - memcpy(&ddsd, lpddsd, lpddsd->dwSize); - ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); - ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_BACKBUFFER|DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - - // v2.03.75: if a surface desc is NOT specified, build one. This will allow ZBUF attach. - if(!(lpddsd->dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); - - // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - if(ddsd.ddsCaps.dwCaps & DDSCAPS_3DDEVICE) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; // necessary: Martian Gotic crashes otherwise - // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... - if(dxw.dwFlags6 & NOSYSMEMBACKBUF) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - GetPixFmt(&ddsd); - - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res) { - OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - - OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurface(lplpdds, dxversion, FALSE); // added !!! - iBakBufferVersion=dxversion; // v2.02.31 - - if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && - (dxw.dwFlags6 & SYNCPALETTE)){ - if(lpDDP == NULL){ - res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); - if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); - } - // this must be done after hooking - who knows why? - res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); - if(res) { - OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); - } - else iDDPExtraRefCounter++; - } - - // V2.1.85/V2.2.34: tricky !!!! - // When a real backbuffer is created, it has a reference to its frontbuffer. - // some games (Monopoly 3D) may depend on this setting - i.e. they could close - // the exceeding references - so this is better be replicated adding an initial - // reference to the zero count. But you don't have to do this if the backbuffer - // is created independently by the primary surface. - (*lplpdds)->AddRef(); // should it be repeated BBCount times???? - - return DD_OK; -} - -static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - OutTraceDW("DEBUG: BuildBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - //MessageBox(NULL, "BuildBackBufferFlippable", "DxWnd", MB_OK); - - // create BackBuffer surface - memcpy(&ddsd, lpddsd, lpddsd->dwSize); - - ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); - ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); - - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FRONTBUFFER|DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - GetPixFmt(&ddsd); - - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res) { - OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - - OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurface(lplpdds, dxversion, FALSE); // added !!! - iBakBufferVersion=dxversion; // v2.02.31 - - if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && - (dxw.dwFlags6 & SYNCPALETTE)){ - if(lpDDP == NULL){ - res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); - if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); - } - // this must be done after hooking - who knows why? - res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); - if(res) { - OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); - } - else iDDPExtraRefCounter++; - } - - return DD_OK; -} - -static HRESULT AttachBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - HRESULT res; - LPDIRECTDRAWSURFACE lpDDSPrim; - OutTraceDW("DEBUG: AttachBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - - // retrieve the attached backbuffer surface and hook it - - if(lpddsd->dwBackBufferCount == 0) return DD_OK; // nothing to retrieve - - GetAttachedSurface_Type pGetAttachedSurface; - DDSCAPS2 caps; - switch(dxversion){ - case 1: pGetAttachedSurface = pGetAttachedSurface1; break; - case 2: pGetAttachedSurface = pGetAttachedSurface2; break; - case 3: pGetAttachedSurface = pGetAttachedSurface3; break; - case 4: pGetAttachedSurface = pGetAttachedSurface4; break; - case 7: pGetAttachedSurface = pGetAttachedSurface7; break; - } - memset(&caps, 0, sizeof(caps)); - caps.dwCaps = DDSCAPS_BACKBUFFER; - lpDDSPrim = dxwss.GetPrimarySurface(); - res = (*pGetAttachedSurface)(lpDDSPrim, (LPDDSCAPS)&caps, lplpdds); - if(res){ - OutTraceE("CreateSurface: GetAttachedSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - OutTraceDW("CreateSurface: retrieved BACK DDSBack=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurface(lplpdds, dxversion, FALSE); // added !!! - iBakBufferVersion=dxversion; // v2.02.31 - - return DD_OK; -} - -static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - OutTraceDW("DEBUG: BuildBackBufferDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - // create BackBuffer surface - // ClearSurfaceDesc((void *)&ddsd, dxversion); - memcpy(&ddsd, lpddsd, lpddsd->dwSize); - ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT); - ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH); - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX); - // v2.02.93: don't move primary / backbuf surfaces on systemmemory when 3DDEVICE is requested - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) { - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - } - else { - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - } - if(dxw.dwFlags6 & NOSYSMEMBACKBUF) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - - if (dxw.dwFlags2 & BACKBUFATTACH) { - LPDIRECTDRAWSURFACE lpPrim; - DDSURFACEDESC2 prim; - GetGDISurface_Type pGetGDISurface; - switch(dxversion){ - default: - case 1: pGetGDISurface = pGetGDISurface1; break; - case 2: pGetGDISurface = pGetGDISurface2; break; - case 3: pGetGDISurface = pGetGDISurface3; break; - case 4: pGetGDISurface = pGetGDISurface4; break; - case 7: pGetGDISurface = pGetGDISurface7; break; - } - (*pGetGDISurface)(lpPrimaryDD, &lpPrim); - memset(&prim, 0, sizeof(DDSURFACEDESC2)); - prim.dwSize = (dxversion >= 4) ? sizeof(DDSURFACEDESC2) : sizeof(DDSURFACEDESC); - res=lpPrim->GetSurfaceDesc((DDSURFACEDESC *)&prim); - (*pReleaseSMethod(dxversion))(lpPrim); - ddsd.dwWidth = prim.dwWidth; - ddsd.dwHeight = prim.dwHeight; - OutTraceDW("BMX FIX: res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight); - } - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res) { - if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){ - OutTraceDW("CreateSurface: CreateSurface DDERR_OUTOFVIDEOMEMORY ERROR at %d, retry in SYSTEMMEMORY\n", __LINE__); - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - } - if(res){ - OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - } - - OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurface(lplpdds, dxversion, FALSE); // added !!! - iBakBufferVersion=dxversion; // v2.02.31 - - return DD_OK; -} - -static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - OutTraceDW("DEBUG: BuildGenericEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... - FixSurfaceCaps(&ddsd, dxversion); - // It looks that DDSCAPS_SYSTEMMEMORY surfaces can perfectly be DDSCAPS_3DDEVICE as well. - // For "Risk II" it is necessary that both the primary surface and the offscreen surfaces are generated - // with the same type, so that assuming an identical lPitch and memcopy-ing from one buffer to the - // other is a legitimate operation. - - if(dxw.dwFlags6 & POWER2WIDTH){ // v2.03.28: POWER2WIDTH to fix "Midtown Madness" in surface emulation mode - if(((ddsd.dwFlags & (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) && - (ddsd.ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) - ){ - DWORD dwWidth; - dwWidth = ((ddsd.dwWidth + 3) >> 2) << 2; - if(dwWidth != ddsd.dwWidth) OutTraceDW("CreateSurface: fixed surface width %d->%d\n", ddsd.dwWidth, dwWidth); - ddsd.dwWidth = dwWidth; - } - } - - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); - if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res!=DD_OK)){ - OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); - } - if (res) { - OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", - *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__)); - - // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. - // fixes "Virtua Fighter PC" palette bug - if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ - res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); - if(res) - OutTraceE("SetPalette: ERROR on lpdds=%x(Emu_Generic) res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); - else { - OutTraceDW("CreateSurface: applied lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); - iDDPExtraRefCounter++; - } - } - - // diagnostic hooks .... - HookDDSurface(lplpdds, dxversion, FALSE); - - return DD_OK; -} - -static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - OutTraceDW("DEBUG: BuildGenericFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... - FixSurfaceCaps(&ddsd, dxversion); - - if(dxw.dwFlags6 & POWER2WIDTH){ // v2.03.28: POWER2WIDTH to fix "Midtown Madness" in surface emulation mode - if(((ddsd.dwFlags & (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) && - (ddsd.ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) - ){ - DWORD dwWidth; - dwWidth = ((ddsd.dwWidth + 3) >> 2) << 2; - if(dwWidth != ddsd.dwWidth) OutTraceDW("CreateSurface: fixed surface width %d->%d\n", ddsd.dwWidth, dwWidth); - ddsd.dwWidth = dwWidth; - } - } - - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); - if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res!=DD_OK)){ - OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); - } - if (res) { - OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", - *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__)); - - // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. - // fixes "Virtua Fighter PC" palette bug - if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ - res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); - if(res) - OutTraceE("SetPalette: ERROR on lpdds=%x(Emu_Generic) res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); - else { - OutTraceDW("CreateSurface: applied lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); - iDDPExtraRefCounter++; - } - } - - // diagnostic hooks .... - HookDDSurface(lplpdds, dxversion, FALSE); - - return DD_OK; -} - -static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - HRESULT res; - - OutTraceDW("DEBUG: BuildGenericDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); - - res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); - if(res){ - // v2.02.60: Ref. game Incoming GOG release, post by Marek, error DDERR_UNSUPPORTED while trying to create ZBUFFER surface - if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && ((res==DDERR_OUTOFVIDEOMEMORY)||(res==DDERR_UNSUPPORTED))){ - 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); - } - if(res){ - OutTraceE("CreateSurface: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - } - - OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", - *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); - - // hooks .... - HookDDSurface(lplpdds, dxversion, FALSE); - - - return DD_OK; -} - -static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface, LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, - LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - HRESULT res; - DDSURFACEDESC2 ddsd; - LPDIRECTDRAWSURFACE lpDDSPrim; - LPDIRECTDRAWSURFACE lpDDSBack = NULL; - DWORD CurFlags; - int TargetSize; - typedef HRESULT (*BuildSurface_Type)(LPDIRECTDRAW, CreateSurface_Type, LPDDSURFACEDESC2, int, LPDIRECTDRAWSURFACE *, void *); - BuildSurface_Type BuildPrimary; - BuildSurface_Type BuildBackBuffer; - BuildSurface_Type AttachBackBuffer; - BuildSurface_Type BuildGeneric; - enum { - PRIMARY_DIRECT = 0, - PRIMARY_FLIPPABLE, - PRIMARY_EMULATED - } SurfaceMode; - - OutTraceDDRAW("CreateSurface: Version=%d lpdd=%x %s\n", - dxversion, lpdd, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__)); - - // v2.03.95.fx1 - deleted: some texture handling REQUIRES a proper FourCC codec. - // maybe it could be suppressed by a dedicated config. flag and on primary surfaces only? - //lpddsd->ddpfPixelFormat.dwFourCC = 0; - - SurfaceMode = (dxw.dwFlags1 & EMULATESURFACE) ? ((dxw.dwFlags6 & FLIPEMULATION) ? PRIMARY_EMULATED : PRIMARY_FLIPPABLE) : PRIMARY_DIRECT; - - switch(SurfaceMode) { - case PRIMARY_DIRECT: - BuildPrimary = BuildPrimaryDir; - BuildBackBuffer = BuildBackBufferDir; - AttachBackBuffer = BuildBackBufferDir; - BuildGeneric = BuildGenericDir; - break; - case PRIMARY_FLIPPABLE: - BuildPrimary = BuildPrimaryFlippable; - BuildBackBuffer = BuildBackBufferFlippable; - AttachBackBuffer = AttachBackBufferFlippable; - BuildGeneric = BuildGenericFlippable; - //BuildGeneric = BuildGenericEmu; - break; - case PRIMARY_EMULATED: - BuildPrimary = BuildPrimaryEmu; - BuildBackBuffer = BuildBackBufferEmu; - AttachBackBuffer = BuildBackBufferEmu; - BuildGeneric = BuildGenericEmu; - break; - } - - // check for lpddsd->dwSize value - TargetSize=(dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); - if(lpddsd->dwSize != TargetSize){ - char sMsg[81]; - sprintf_s(sMsg,80, "CreateSurface: ASSERT bad dwSize=%d dxversion=%d\n", - lpddsd->dwSize, dxversion); - 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)){ - OutTraceDW("CreateSurface: fixing illegal dwFlags value: %x -> %x\n", - lpddsd->dwFlags, (lpddsd->dwFlags | DDSD_CAPS)); - lpddsd->dwFlags |= DDSD_CAPS; - } - - memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy - - // v2.02.38: this is odd: in "Star Force Deluxe" there is no PRIMARY surface, but a surface with - // 0 flags and 0 capabilities serves for this purpose. Is it a side-effect of old ddraw releases? - if((dxversion == 1) && ((ddsd.dwFlags & ~DDSD_BACKBUFFERCOUNT) == 0)){ // Star Force Deluxe - ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - //if(dxw.VirtualPixelFormat.dwRGBBitCount == 8) ddsd.ddsCaps.dwCaps |= DDSCAPS_PALETTE; - } - - // creation of the primary surface.... - if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){ - dxwss.ClearSurfaceList(); // v2.03.83: "Daytona USA" would saturate the list otherwise - SetVSyncDelays(dxversion, lpdd); - GetHookInfo()->Height=(short)dxw.GetScreenHeight(); - GetHookInfo()->Width=(short)dxw.GetScreenWidth(); - GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount; - GetHookInfo()->DXVersion=dxversion; - lpPrimaryDD = lpdd; // v2.1.87 - memcpy(&DDSD_Prim, lpddsd, sizeof(DDSD_Prim)); // v2.02.37 - - // beware of the different behaviour between older and newer directdraw releases... - if(dxversion >= 4){ - if (lpDDSEmu_Back) while(lpDDSEmu_Back->Release()); - if (lpDDSEmu_Prim) while(lpDDSEmu_Prim->Release()); - if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { // Praetorians !!!! - lpDDSBack = dxwss.GetBackBufferSurface(); - if (lpDDSBack) { - if(dxw.dwFlags6 & FLIPEMULATION) while(lpDDSBack->Release()); - dxwss.PopSurface(lpDDSBack); - lpDDSBack = NULL; - } - } - } - lpDDSEmu_Back=NULL; - lpDDSEmu_Prim=NULL; - - int BBCount=0; // or 1 ?? - if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) BBCount=ddsd.dwBackBufferCount; - if ((BBCount > 0) && (iBakBufferVersion < 4)){ - lpDDSBack=NULL; - OutTraceDW("CreateSurface: backbuffer cleared - BackBufferCount=%d\n", BBCount); - } - - if (BBCount > MAXBACKBUFFERS){ - char sMsg[81]; - sprintf_s(sMsg, 80, "CreateSurface: BackBufferCount=%d\n", BBCount); - OutTraceDW(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "CreateSurface", MB_OK | MB_ICONEXCLAMATION); - // recover ... - BBCount = MAXBACKBUFFERS; - } - - // build emulated primary surface, real primary and backbuffer surfaces - CurFlags=ddsd.dwFlags; - res=BuildPrimary(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); - if(res) return res; - lpDDSPrim = *lplpdds; - dxwss.PushPrimarySurface(lpDDSPrim, dxversion); - RegisterPixelFormat(dxversion, lpDDSPrim); - - if (BBCount){ - // build emulated backbuffer surface - res=AttachBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); - if(res) return res; - dxwss.PushBackBufferSurface(lpDDSBack, dxversion); - } - - if(IsTraceDDRAW){ - char sInfo[256+1]; - sprintf(sInfo, "CreateSurface: created DDSPrim=%x DDSBack=%x", lpDDSPrim, lpDDSBack); - if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)) sprintf(sInfo, "%s DDSEmu_Prim=%x", sInfo, lpDDSEmu_Prim); - if(dxw.dwFlags1 & EMULATESURFACE) sprintf(sInfo, "%s DDSEmu_Back=%x", sInfo, lpDDSEmu_Back); - strcat(sInfo, "\n"); - OutTrace(sInfo); - } - - // rebuild the clipper area - if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); - - // v2.2.64: added extra ref needed to preserve ddraw session for later use. Is it a ddraw1 legacy? - // seems to fix problems in "Warhammer 40K Rites Of War" that uses a ddraw session after reaching 0 refcount. - // v2.2.84: avoid the extra referenced in non windowed mode since it causes the window shift reported by gsky916 - // for Wind Fantasy SP. - // v2.3.59: same extra reference is needed by "Wahammer Chaos Gate" that uses ddraw interface release 2 - // v2.3.72: fixed previous fix: condition is <=2, not >=2 ! - // Be aware that it may perhaps become <=3, if we get the same problem elsewhere - // v2.3.96: deleted the if(Windowized) condition: AddRef is needed also in fullscreen mode. - if(dxw.dwDDVersion<=2) lpdd->AddRef(); - - return DD_OK; - } - - // 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) { - OutTraceDW("CreateSurface: returning current DDSBack=%x\n", lpDDSBack); - *lplpdds = lpDDSBack; - return DD_OK; - } - - res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); - if(res == DD_OK) { - dxwss.PushBackBufferSurface(*lplpdds, dxversion); - dxwcdb.PushCaps(*lplpdds, lpddsd->ddsCaps.dwCaps); - } - return res; - } - - // if nothing else, it's a generic/zbuffer surface - - res=BuildGeneric(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, pu); - if(!res) { - dxwss.PopSurface(*lplpdds); - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { - // v2.03.82: save ZBUFFER capabilities for later fix in D3D CreateDevice - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) dxwcdb.PushCaps(*lplpdds, lpddsd->ddsCaps.dwCaps); - OutTraceDW("CreateSurface: lpDDZBuffer=%x save ZBUFFER caps=%x(%s)\n", *lplpdds, lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); - } - } - - return res; -} - - HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { return extCreateSurface(1, (CreateSurface_Type)pCreateSurface1, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) @@ -3541,12 +2691,23 @@ void BlitTrace(char *label, LPRECT lps, LPRECT lpd, int line) return; } -HRESULT WINAPI PrimaryBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, LPDDBLTFX lpddbltfx) { - return (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect, DDBLT_WAIT, 0); + HRESULT res; + res = (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect, GetBltWaitFlags(DDBLT_WAIT), lpddbltfx); + if(res == DDERR_SURFACELOST) { + if(lpdds->IsLost()) { + OutTraceDW("RECOVERY of lost surface lpdds=%x\n", lpdds); + lpdds->Restore(); + if(res) { + OutTraceE("PrimaryBlt: Restore ERROR lpdds=%x err=%x(%s) at %d\n", lpdds, res, ExplainDDError(res), __LINE__); + } + } + } + return res; } -HRESULT WINAPI PrimaryFastBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryFastBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, LPDDBLTFX lpddbltfx) { HRESULT res; RECT client; @@ -3555,12 +2716,12 @@ HRESULT WINAPI PrimaryFastBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE iXOffset = (client.right - dxw.GetScreenWidth()) >> 1; iYOffset = (client.bottom - dxw.GetScreenHeight()) >> 1; if(dxw.dwFlags3 & FORCECLIPPER){ - RECT destrect; - destrect.left = iXOffset + lpdestrect->left; - destrect.right = iXOffset + lpdestrect->right; - destrect.top = iYOffset + lpdestrect->top; - destrect.bottom = iYOffset + lpdestrect->bottom; - res = (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, DDBLT_WAIT, 0); + RECT destrect; + destrect.left = iXOffset + lpdestrect->left; + destrect.right = iXOffset + lpdestrect->right; + destrect.top = iYOffset + lpdestrect->top; + destrect.bottom = iYOffset + lpdestrect->bottom; + res = (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, GetBltWaitFlags(DDBLT_WAIT), 0); } else { BltFast_Type pBltFast; @@ -3571,12 +2732,21 @@ HRESULT WINAPI PrimaryFastBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE case 4: pBltFast=pBltFast4; break; case 7: pBltFast=pBltFast7; break; } - res= (*pBltFast)(lpdds, iXOffset + lpdestrect->left, iYOffset + lpdestrect->top, lpddssrc, lpsrcrect, DDBLTFAST_WAIT); + res= (*pBltFast)(lpdds, iXOffset + lpdestrect->left, iYOffset + lpdestrect->top, lpddssrc, lpsrcrect, GetFlipWaitFlags(DDFLIP_WAIT)); + } + if(res == DDERR_SURFACELOST) { + if(lpdds->IsLost()) { + OutTraceDW("RECOVERY of lost surface lpdds=%x\n", lpdds); + res = lpdds->Restore(); + if(res) { + OutTraceE("PrimaryBlt: Restore ERROR lpdds=%x err=%x(%s) at %d\n", lpdds, res, ExplainDDError(res), __LINE__); + } + } } return res; } -HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, LPDDBLTFX lpddbltfx) { HRESULT res; DDSURFACEDESC2 ddsd; @@ -3636,10 +2806,10 @@ HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFA else { while(TRUE) { if(bUseFastBlt){ - res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); + res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, GetFlipWaitFlags(DDBLTFAST_WAIT)); } else{ - res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); + res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, GetBltWaitFlags(DDBLT_WAIT), 0); } if(res == DDERR_INVALIDRECT){ OutTraceDW("PrimaryStretchBlt: adding clipper ddversion=%x at %d\n", iDirectDrawVersion, __LINE__); @@ -3668,17 +2838,20 @@ HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFA res=(*pSetClipper)(lpdds, lpddC); if(res) OutTraceE("SetClipper ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); OutTraceDW("PrimaryStretchBlt: added clipper lpddc=%x at %d\n", lpddC, __LINE__); - res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); + + res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, GetBltWaitFlags(DDBLT_WAIT), 0); } - if(res) OutTraceE("PrimaryStretchBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res) OutTraceE("PrimaryStretchBlt: %s ERROR %x(%s) at %d\n", bUseFastBlt?"BltFast":"Blt", res, ExplainDDError(res), __LINE__); if(res == DDERR_SURFACELOST){ if(lpdds->IsLost()) { + OutTraceDW("RECOVERY of lost surface lpdds=%x\n", lpdds); res = lpdds->Restore(); if(res) { OutTraceE("PrimaryStretchBlt: Restore ERROR lpdds=%x err=%x(%s) at %d\n", lpdds, res, ExplainDDError(res), __LINE__); } } if(lpddsTmp->IsLost()) { + OutTraceDW("RECOVERY of lost surface lpdds=%x\n", lpddsTmp); res = lpddsTmp->Restore(); if(res) { OutTraceE("PrimaryStretchBlt: Restore ERROR lpdds=%x err=%x(%s) at %d\n", lpddsTmp, res, ExplainDDError(res), __LINE__); @@ -3721,7 +2894,7 @@ void *LoadFilter(char *apiname) return (*pGetProcAddress)(filterlib, apiname); } -HRESULT WINAPI PrimaryBilinearBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryBilinearBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, LPDDBLTFX lpddbltfx) { HRESULT res; typedef void (WINAPI *Resize_HQ_Type)( unsigned char*, RECT *, int, unsigned char*, RECT *, int); @@ -3856,7 +3029,7 @@ HRESULT WINAPI PrimaryBilinearBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURF return res; } -HRESULT WINAPI PrimaryNoBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryNoBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, LPDDBLTFX lpddbltfx) { return DD_OK; } @@ -3937,10 +3110,14 @@ HRESULT WINAPI extFlip(int dxversion, Flip_Type pFlip, LPDIRECTDRAWSURFACE lpdds DDSURFACEDESC2 ddsd; LPDIRECTDRAWSURFACE lpddsTmp; LPDIRECTDRAWSURFACE lpDDSBack; + DWORD dwBltFlags; + BOOL bEmulatedFlip; + bEmulatedFlip = dxw.Windowize || dxw.IsEmulated; IsPrim=dxwss.IsAPrimarySurface(lpdds); - OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s) version=%d\n", - lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags), dxversion); + OutTraceDDRAW("Flip(%d): %s lpdds=%x%s, src=%x, flags=%x(%s) version=%d\n", + dxversion, bEmulatedFlip?"EMULATED":"GENUINE", + lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); Blt_Type pBlt; switch (dxversion){ @@ -3982,13 +3159,35 @@ HRESULT WINAPI extFlip(int dxversion, Flip_Type pFlip, LPDIRECTDRAWSURFACE lpdds return res; } +#ifdef HANDLEFLIPPABLE + if(!bEmulatedFlip){ + dwBltFlags = GetFlipWaitFlags(dwflags); + res=(*pFlip)(lpdds, lpddssrc, dwBltFlags); + if(res) OutTraceE("Flip: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } +#endif + // emulation to primary surface Flip - you can't flip to window surfaces, // so you have to replace it with Blt operations. - - if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0); + // v2.03.98: moved closer to actual video operations to avoid the risk of losing the end of vertical blank period + // while doing calculations + //if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0); lpDDSBack = dxwss.GetBackBufferSurface(); + // from ddraw.h: + // On IDirectDrawSurface7 and higher interfaces, the default is DDFLIP_WAIT. If you wish + // to override the default and use time when the accelerator is busy (as denoted by + // the DDERR_WASSTILLDRAWING return code) then use DDFLIP_DONOTWAIT. + + if(dxversion >= 7) + dwBltFlags = (dwflags & DDFLIP_DONOTWAIT) ? DDBLT_DONOTWAIT : DDBLT_WAIT; + else + dwBltFlags = (dwflags & DDFLIP_WAIT) ? DDBLT_WAIT : 0; + + dwBltFlags = GetBltWaitFlags(dwBltFlags); + if(dxw.dwFlags4 & NOFLIPEMULATION){ HRESULT res2; // create a temporary working surface @@ -4034,7 +3233,7 @@ HRESULT WINAPI extFlip(int dxversion, Flip_Type pFlip, LPDIRECTDRAWSURFACE lpdds if(lpddssrc){ //res=lpdds->Blt(0, lpddssrc, 0, DDBLT_WAIT, 0); - res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpddssrc, NULL, DDBLT_WAIT, 0, TRUE); + res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpddssrc, NULL, dwBltFlags, 0, TRUE); } else{ if(!lpDDSBack){ @@ -4046,10 +3245,10 @@ HRESULT WINAPI extFlip(int dxversion, Flip_Type pFlip, LPDIRECTDRAWSURFACE lpdds NullArea.left=NullArea.top=0; NullArea.bottom=dxw.GetScreenHeight(); NullArea.right=dxw.GetScreenWidth(); - res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpDDSBack, &NullArea, DDBLT_WAIT, 0, TRUE); + res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpDDSBack, &NullArea, dwBltFlags, 0, TRUE); } else - res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpDDSBack, NULL, DDBLT_WAIT, 0, TRUE); + res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpDDSBack, NULL, dwBltFlags, 0, TRUE); lpddssrc = lpDDSBack; } @@ -4214,10 +3413,21 @@ HRESULT WINAPI extBltFast7(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDI HRESULT WINAPI extWaitForVerticalBlank(WaitForVerticalBlank_Type pWaitForVerticalBlank, LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) { + // set a global to avoid double calls + bVSyncDone = TRUE; + + if(dxw.dwFlags8 & FORCENOVSYNC) return DD_OK; + if(dxw.dwFlags1 & SAVELOAD){ dxw.VSyncWait(); - return 0; + return DD_OK; } + + if(dxw.dwFlags8 & VSYNCSCANLINE){ + dxw.VSyncWaitLine(((DWORD)dxw.ScanLine * 100) / dxw.GetScreenHeight()); + return DD_OK; + } + return (*pWaitForVerticalBlank)(lpdd, dwflags, hevent); } @@ -4407,7 +3617,7 @@ static HRESULT WINAPI extSetClipper(SetClipper_Type pSetClipper, LPDIRECTDRAWSUR // Needed also to avoid "New Yourk Racer" intro movie clipping. if(dxw.dwFlags1 & SUPPRESSCLIPPING) return 0; - if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ + if(dxw.IsEmulated){ if (dxw.dwFlags3 & FORCECLIPPER){ // v2.03.48: FORCECLIPPER ensures that a valid clipper is issued on the real primary surface // and on the main game window. Then, you won't be able to BltFast any longer.... @@ -5571,6 +4781,8 @@ static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDI IsZBuf=(caps->dwCaps & DDSCAPS_ZBUFFER); if(IsZBuf) sLabel="(ZBUFFER)"; + if(!(dxw.IsEmulated || dxw.Windowize)) return res; + if (IsPrim) { IsFixed=TRUE; caps->dwCaps |= DDSD_Prim.ddsCaps.dwCaps; @@ -5657,6 +4869,8 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS OutTraceDDRAW("GetSurfaceDesc(%d): lpdds=%x%s %s\n", dxversion, lpdds, sLabel, LogSurfaceAttributes(lpddsd, "GetSurfaceDesc", __LINE__)); + if(!(dxw.IsEmulated || dxw.Windowize)) return res; + if (IsPrim) { IsFixed=TRUE; if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 168596c..d9a679b 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -136,12 +136,12 @@ static char *Flag7Names[32]={ "SSUPPRESSDIERRORS", "HOOKNORUN", "FIXBINDTEXTURE", "ENUM16BITMODES", "SHAREDKEYBOARD", "HOOKNOUPDATE", "HOOKGLUT32", "INITIALRES", "MAXIMUMRES", "LOCKCOLORDEPTH", "FIXSMACKLOOP", "FIXFREELIBRARY", - "ANCHORED", "", "", "", + "ANCHORED", "CLEARTEXTUREFOURCC", "NODDEXCLUSIVEMODE", "COPYNOSHIMS", }; static char *Flag8Names[32]={ - "", "", "", "", - "", "", "", "", + "FORCEWAIT", "FORCENOWAIT", "FORCEVSYNC", "FORCENOVSYNC", + "VSYNCSCANLINES", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -1398,9 +1398,9 @@ void HookInit(TARGETMAP *target, HWND hwnd) OSVERSIONINFO osinfo; strcpy(sInfo, ""); if(hwnd) sprintf(sInfo, " hWnd=%x ParentWnd=%x desktop=%x", hwnd, dxw.hParentWnd, GetDesktopWindow()); - OutTrace("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d) monitor=%d%s\n", + OutTrace("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d) init-max=(%d,%d) monitor=%d%s\n", target->path, target->module, dxversions[dxw.dwTargetDDVersion], - target->posx, target->posy, target->sizx, target->sizy, target->monitorid, sInfo); + target->posx, target->posy, target->sizx, target->sizy, target->resw, target->resh, target->monitorid, sInfo); osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if(GetVersionEx(&osinfo)){ OutTrace("OS=(%d.%d) build=%d platform=%d service pack=%s\n", @@ -1411,6 +1411,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) if (dxw.dwFlags7 & LIMITDDRAW) OutTrace("HookInit: max supported IDidrectDrawInterface=%d\n", dxw.MaxDdrawInterface); if (dxw.dwFlags7 & CPUSLOWDOWN) OutTrace("HookInit: CPU slowdown ratio 1:%d\n", dxw.SlowRatio); if (dxw.dwFlags7 & CPUMAXUSAGE) OutTrace("HookInit: CPU maxusage ratio 1:%d\n", dxw.SlowRatio); + if (dxw.dwFlags8 & VSYNCSCANLINE) OutTrace("HookInit: VSync Scanline=%d\n", dxw.ScanLine); } if (hwnd && IsDebug){ diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 4af2211..ba33cf4 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -94,6 +94,7 @@ void dxwCore::InitTarget(TARGETMAP *target) dwFlags8 = target->flags8; dwTFlags = target->tflags; Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE; + IsEmulated = (dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)) ? TRUE : FALSE; IsVisible = TRUE; if(dwFlags3 & FULLSCREENONLY) FullScreen=TRUE; gsModules = target->module; @@ -143,6 +144,7 @@ void dxwCore::InitTarget(TARGETMAP *target) dwScreenHeight = 600; SlowRatio = target->SlowRatio; + ScanLine = target->ScanLine; GDIEmulationMode = GDIMODE_NONE; // default if (dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED; @@ -693,6 +695,27 @@ void dxwCore::VSyncWait() if(step >= iRefreshDelayCount) step=0; } +void dxwCore::VSyncWaitLine(DWORD ScanLine) +{ + extern LPDIRECTDRAW lpPrimaryDD; + static DWORD iLastScanLine = 0; + DWORD iCurrentScanLine; + if (!lpPrimaryDD) return; + while(1){ + HRESULT res; + if(res=lpPrimaryDD->GetScanLine(&iCurrentScanLine)) { + OutTraceE("VSyncWaitLine: GetScanLine ERROR res=%x\n", res); + iLastScanLine = 0; + break; // error + } + if((iLastScanLine <= ScanLine) && (iCurrentScanLine > ScanLine)) { + OutTraceB("VSyncWaitLine: line=%d last=%d\n", iCurrentScanLine, iLastScanLine); + break; + } + iLastScanLine = iCurrentScanLine; + (*pSleep)(1); + } +} static float fMul[17]={2.14F, 1.95F, 1.77F, 1.61F, 1.46F, 1.33F, 1.21F, 1.10F, 1.00F, 0.91F, 0.83F, 0.75F, 0.68F, 0.62F, 0.56F, 0.51F, 0.46F}; @@ -1194,12 +1217,12 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_EXSTYLE); } - if ((dxw.dwFlags1 & PREVENTMAXIMIZE) && (hwnd==hWnd)){ // disable maximize settings + if ((dxw.dwFlags5 & UNLOCKZORDER) && (hwnd==hWnd)){ // disable maximize settings if (lpSS->styleNew & WS_EX_TOPMOST){ OutTraceDW("%s: prevent EXSTYLE topmost style\n", ApiName); lpSS->styleNew &= ~WS_EX_TOPMOST; } - } + } break; default: break; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 9b41a0f..93cf00c 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -140,6 +140,7 @@ public: // methods void MapKeysInit(); void SetVSyncDelays(UINT); void VSyncWait(); + void VSyncWaitLine(DWORD); void DumpDesktopStatus(); void ToggleFreezedTime(); void GetMonitorWorkarea(LPRECT, BOOL); @@ -150,6 +151,7 @@ public: // simple data variables int MonitorId; BOOL Windowize; BOOL IsVisible; + BOOL IsEmulated; DDPIXELFORMAT ActualPixelFormat; DDPIXELFORMAT VirtualPixelFormat; DWORD dwDDVersion; @@ -191,6 +193,7 @@ public: // simple data variables short Coordinates; short MaxScreenRes; short SlowRatio; + short ScanLine; HDC RealHDC; HDC VirtualHDC; int GDIEmulationMode; @@ -198,6 +201,8 @@ public: // simple data variables RECT VirtualDesktop; BOOL bHintActive; BOOL bAutoScale; + DWORD dwRealScreenWidth; + DWORD dwRealScreenHeight; // Implementation protected: diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 4fbbfb8..c921ccc 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.97.fx2" +#define VERSION "2.03.98" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 764fc2f..bafda67 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj index da32afb..2b33143 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -257,6 +257,10 @@ RelativePath=".\ddblit.cpp" > + + diff --git a/dll/dxwnd.vs2008.vcproj.gho-PC.gho.user b/dll/dxwnd.vs2008.vcproj.gho-PC.gho.user deleted file mode 100644 index 38b5a45..0000000 --- a/dll/dxwnd.vs2008.vcproj.gho-PC.gho.user +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index 0575cf5..398644d 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -2101,6 +2101,12 @@ HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceT pCaps->MaxPixelShader30InstructionSlots); } } + + if(dxw.dwFlags7 & SUPPRESSOVERLAY){ + if(pCaps->Caps & D3DCAPS_OVERLAY) OutTraceDW("GetDeviceCaps(%d): SUPPRESS OVERLAY CAP\n"); + pCaps->Caps &= ~D3DCAPS_OVERLAY; + } + return res; } diff --git a/dll/hddraw.h b/dll/hddraw.h index 6a2ccb2..d7d76dc 100644 --- a/dll/hddraw.h +++ b/dll/hddraw.h @@ -51,6 +51,7 @@ typedef HRESULT (WINAPI *GetSurfaceFromDC_Type)(LPDIRECTDRAW, HDC, LPDIRECTDRAWS typedef HRESULT (WINAPI *RestoreAllSurfaces_Type)(LPDIRECTDRAW); typedef HRESULT (WINAPI *TestCooperativeLevel_Type)(LPDIRECTDRAW); typedef HRESULT (WINAPI *GetDeviceIdentifier_Type)(LPDIRECTDRAW, LPDDDEVICEIDENTIFIER, DWORD); +typedef HRESULT (WINAPI *GetScanLine_Type)(LPDIRECTDRAW, LPDWORD); // STDMETHOD(StartModeTest)(THIS_ LPSIZE, DWORD, DWORD ) PURE; // STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE; @@ -125,15 +126,15 @@ extern void HookTexture(LPVOID *, int); extern int Set_dwSize_From_Surface(); extern void SetBltTransformations(int); -extern HRESULT WINAPI PrimaryBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -extern HRESULT WINAPI PrimaryNoBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -extern HRESULT WINAPI PrimaryStretchBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -extern HRESULT WINAPI PrimaryFastBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -extern HRESULT WINAPI PrimaryBilinearBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +extern HRESULT WINAPI PrimaryBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, LPDDBLTFX); +extern HRESULT WINAPI PrimaryNoBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, LPDDBLTFX); +extern HRESULT WINAPI PrimaryStretchBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, LPDDBLTFX); +extern HRESULT WINAPI PrimaryFastBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, LPDDBLTFX); +extern HRESULT WINAPI PrimaryBilinearBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, LPDDBLTFX); typedef HRESULT (WINAPI *EmuBlt_Type)(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPVOID); typedef HRESULT (WINAPI *RevBlt_Type)(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -typedef HRESULT (WINAPI *PrimaryBlt_Type)(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +typedef HRESULT (WINAPI *PrimaryBlt_Type)(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, LPDDBLTFX); extern EmuBlt_Type pEmuBlt; extern RevBlt_Type pRevBlt; diff --git a/dll/imagehlp.cpp b/dll/imagehlp.cpp index e0cedd1..7d62798 100644 --- a/dll/imagehlp.cpp +++ b/dll/imagehlp.cpp @@ -9,14 +9,40 @@ typedef PIMAGE_DEBUG_INFORMATION (WINAPI *MapDebugInformation_Type)(HANDLE, PCSTR, PCSTR, ULONG); typedef BOOL (WINAPI *UnmapDebugInformation_Type)(PIMAGE_DEBUG_INFORMATION); +typedef BOOL (WINAPI *SymInitialize_Type)(HANDLE, PCTSTR, BOOL); +typedef BOOL (WINAPI *SymCleanup_Type)(HANDLE); +typedef BOOL (WINAPI *StackWalk_Type)(DWORD, HANDLE, HANDLE, LPSTACKFRAME, LPVOID, PREAD_PROCESS_MEMORY_ROUTINE, PFUNCTION_TABLE_ACCESS_ROUTINE, PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE); +typedef LPVOID (WINAPI *SymFunctionTableAccess_Type)(HANDLE, DWORD); +typedef LPVOID (WINAPI *SymGetModuleBase_Type)(HANDLE, DWORD); +typedef BOOL (WINAPI *SymGetSymFromAddr_Type)(HANDLE, DWORD, LPDWORD, PIMAGEHLP_SYMBOL); + PIMAGE_DEBUG_INFORMATION WINAPI extMapDebugInformation(HANDLE, PCSTR, PCSTR, ULONG); BOOL WINAPI extUnmapDebugInformation(PIMAGE_DEBUG_INFORMATION); +BOOL WINAPI extSymInitialize(HANDLE, PCTSTR, BOOL); +BOOL WINAPI extSymCleanup(HANDLE); +BOOL WINAPI extStackWalk(DWORD, HANDLE, HANDLE, LPSTACKFRAME, LPVOID, PREAD_PROCESS_MEMORY_ROUTINE, PFUNCTION_TABLE_ACCESS_ROUTINE, PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE); +LPVOID WINAPI extSymFunctionTableAccess(HANDLE, DWORD); +LPVOID WINAPI extSymGetModuleBase(HANDLE, DWORD); +BOOL WINAPI extSymGetSymFromAddr(HANDLE, DWORD, LPDWORD, PIMAGEHLP_SYMBOL); + MapDebugInformation_Type pMapDebugInformation = NULL; UnmapDebugInformation_Type pUnmapDebugInformation = NULL; +SymInitialize_Type pSymInitialize; +SymCleanup_Type pSymCleanup; +StackWalk_Type pStackWalk; +SymFunctionTableAccess_Type pSymFunctionTableAccess; +SymGetModuleBase_Type pSymGetModuleBase; +SymGetSymFromAddr_Type pSymGetSymFromAddr; static HookEntryEx_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0, "MapDebugInformation", (FARPROC)NULL, (FARPROC *)&pMapDebugInformation, (FARPROC)extMapDebugInformation}, {HOOK_IAT_CANDIDATE, 0, "UnmapDebugInformation", (FARPROC)NULL, (FARPROC *)&pUnmapDebugInformation, (FARPROC)extUnmapDebugInformation}, + {HOOK_IAT_CANDIDATE, 0, "SymInitialize", (FARPROC)NULL, (FARPROC *)&pSymInitialize, (FARPROC)extSymInitialize}, + {HOOK_IAT_CANDIDATE, 0, "SymCleanup", (FARPROC)NULL, (FARPROC *)&pSymCleanup, (FARPROC)extSymCleanup}, + {HOOK_IAT_CANDIDATE, 0, "StackWalk", (FARPROC)NULL, (FARPROC *)&pStackWalk, (FARPROC)extStackWalk}, + {HOOK_IAT_CANDIDATE, 0, "SymFunctionTableAccess", (FARPROC)NULL, (FARPROC *)&pSymFunctionTableAccess, (FARPROC)extSymFunctionTableAccess}, + {HOOK_IAT_CANDIDATE, 0, "SymGetModuleBase", (FARPROC)NULL, (FARPROC *)&pSymGetModuleBase, (FARPROC)extSymGetModuleBase}, + {HOOK_IAT_CANDIDATE, 0, "SymGetSymFromAddr", (FARPROC)NULL, (FARPROC *)&pSymGetSymFromAddr, (FARPROC)extSymGetSymFromAddr}, {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -60,3 +86,44 @@ BOOL WINAPI extUnmapDebugInformation(PIMAGE_DEBUG_INFORMATION DebugInfo) return TRUE; } +BOOL WINAPI extSymInitialize(HANDLE hProcess, PCTSTR UserSearchPath, BOOL fInvadeProcess) +{ + OutTrace("SymInitialize: hprocess=%x usrsearchpath=\"%s\" invadeproc=%x\n", hProcess, UserSearchPath, fInvadeProcess); + return TRUE; +} + +BOOL WINAPI extSymCleanup(HANDLE hProcess) +{ + OutTrace("SymCleanup: hprocess=%x\n", hProcess); + return TRUE; +} + +BOOL WINAPI extStackWalk(DWORD MachineType, HANDLE hProcess, HANDLE hThread, LPSTACKFRAME StackFrame, LPVOID ContextRecord, + PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine, PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine, + PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine, PTRANSLATE_ADDRESS_ROUTINE TranslateAddress) +{ + OutTrace("SymCleanup: hprocess=%x\n", hProcess); + // too complex, pretend we have an error + return FALSE; +} + +LPVOID WINAPI extSymFunctionTableAccess(HANDLE hProcess, DWORD AddrBase) +{ + OutTrace("SymFunctionTableAccess: hprocess=%x addrbase=%x\n", hProcess, AddrBase); + // too dangerous, pretend we have an error + return NULL; +} + +LPVOID WINAPI extSymGetModuleBase(HANDLE hProcess, DWORD AddrBase) +{ + OutTrace("SymGetModuleBase: hprocess=%x addrbase=%x\n", hProcess, AddrBase); + // too dangerous, pretend we have an error + return NULL; +} + +BOOL WINAPI extSymGetSymFromAddr(HANDLE hProcess, DWORD Address, LPDWORD Displacement, PIMAGEHLP_SYMBOL Symbol) +{ + OutTrace("SymGetSymFromAddr: hprocess=%x address=%x\n", hProcess, Address); + // too dangerous, pretend we have an error + return NULL; +} diff --git a/dll/user32.cpp b/dll/user32.cpp index 0e38d73..31b505a 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -238,7 +238,6 @@ static HookEntryEx_Type Hooks[]={ //{HOOK_IAT_CANDIDATE, 0, "IsZoomed", (FARPROC)NULL, (FARPROC *)&pIsZoomed, (FARPROC)extIsZoomed}, //{HOOK_HOT_CANDIDATE, 0, "IsIconic", (FARPROC)IsIconic, (FARPROC *)&pIsIconic, (FARPROC)extIsIconic}, {HOOK_HOT_CANDIDATE, 0, "ScrollDC", (FARPROC)NULL, (FARPROC *)&pScrollDC, (FARPROC)extScrollDC}, - //{HOOK_IAT_CANDIDATE, 0, "mouse_event", (FARPROC)NULL, (FARPROC *)&pmouse_event, (FARPROC)extmouse_event}, // both added to fix the Galapagos menu bar, but with no success !!!! {HOOK_HOT_CANDIDATE, 0, "ShowScrollBar", (FARPROC)ShowScrollBar, (FARPROC *)&pShowScrollBar, (FARPROC)extShowScrollBar}, @@ -874,8 +873,10 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon } // v2.02.32: disable topmost for main window only if(dxw.IsDesktop(hwnd) && (nIndex==GWL_EXSTYLE)){ - OutTraceDW("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong); - dwNewLong = dwNewLong & ~(WS_EX_TOPMOST); + if(dxw.dwFlags5 & UNLOCKZORDER) { + OutTraceDW("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong); + dwNewLong = dwNewLong & ~(WS_EX_TOPMOST); + } } } @@ -891,12 +892,11 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon // v2.03.94.fx2: removed dxw.IsFullScreen() check here ... WinProc routine must be verified in all conditions // fixes "Nascar Racing 3" that was setting the WinProc while still in non fullscreen mode! - if (((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)) && - dxw.Windowize && // v2.03.95 - replaced dxw.IsFullScreen() check - // dxw.IsFullScreen() && // v2.02.51 - see A10 Cuba.... - !(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug flag + if ((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)) { WNDPROC lres; WNDPROC OldProc; + DWORD WinStyle; + BOOL bHooked = FALSE; // fix .... extern LRESULT CALLBACK dw_Hider_Message_Handler(HWND, UINT, WPARAM, LPARAM); @@ -913,18 +913,47 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon // end of GPL fix OldProc = (WNDPROC)(*pGetWindowLong)(hwnd, nIndex); - // v2.02.70 fix - if((OldProc==extWindowProc) || - (OldProc==extChildWindowProc)|| - (OldProc==extDialogWindowProc)) - OldProc=dxwws.GetProc(hwnd); - dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); - res=(LONG)OldProc; - SetLastError(0); - lres=(WNDPROC)(*pSetWindowLong)(hwnd, nIndex, (LONG)extWindowProc); + WinStyle = (*pGetWindowLong)(hwnd, GWL_STYLE); + + // hook extWindowProc to main win .... + if(dxw.IsDesktop(hwnd) && !(dxw.dwFlags6 & NOWINDOWHOOKS)){ + if(OldProc==extWindowProc) OldProc=dxwws.GetProc(hwnd); + dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); + res=(LONG)OldProc; + SetLastError(0); + lres=(WNDPROC)(*pSetWindowLong)(hwnd, nIndex, (LONG)extWindowProc); + OutTraceDW("SetWindowLong: DESKTOP hooked %x->%x\n", dwNewLong, extWindowProc); + bHooked = TRUE; + } + + // hook extChildWindowProc to child win .... + if((WinStyle & WS_CHILD) && (dxw.dwFlags1 & HOOKCHILDWIN) && !(dxw.dwFlags6 & NOWINDOWHOOKS)){ + if(OldProc==extChildWindowProc) OldProc=dxwws.GetProc(hwnd); + dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); + res=(LONG)OldProc; + SetLastError(0); + lres=(WNDPROC)(*pSetWindowLong)(hwnd, nIndex, (LONG)extChildWindowProc); + OutTraceDW("SetWindowLong: CHILD hooked %x->%x\n", dwNewLong, extChildWindowProc); + bHooked = TRUE; + } + + // hook extDlgWindowProc to dialog win .... + if((WinStyle & DWL_DLGPROC) && (dxw.dwFlags1 & HOOKCHILDWIN) && !(dxw.dwFlags6 & NOWINDOWHOOKS)){ + if(OldProc==extDialogWindowProc) OldProc=dxwws.GetProc(hwnd); + dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); + res=(LONG)OldProc; + SetLastError(0); + lres=(WNDPROC)(*pSetWindowLong)(hwnd, nIndex, (LONG)extDialogWindowProc); + OutTraceDW("SetWindowLong: DIALOG hooked %x->%x\n", dwNewLong, extDialogWindowProc); + bHooked = TRUE; + } + + // hook dwNewLong if not done otherwise + if(!bHooked) res=(*pSetWindowLong)(hwnd, nIndex, dwNewLong); if(!lres && GetLastError())OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } - else { + else{ + // through here for any message different from GWL_WNDPROC or DWL_DLGPROC res=(*pSetWindowLong)(hwnd, nIndex, dwNewLong); } @@ -1125,13 +1154,19 @@ BOOL WINAPI extGetCursorPos(LPPOINT lppoint) res=1; } - prev=*lppoint; - *lppoint=dxw.ScreenToClient(*lppoint); - *lppoint=dxw.FixCursorPos(*lppoint); - + if(dxw.dwFlags1 & MODIFYMOUSE){ + dxw.UpdateDesktopCoordinates(); + prev=*lppoint; + *lppoint=dxw.ScreenToClient(*lppoint); + //OutTraceC("GetCursorPos: REMAPPED pos=(%d,%d)->(%d,%d)\n", prev.x, prev.y, lppoint->x, lppoint->y); + *lppoint=dxw.FixCursorPos(*lppoint); + OutTraceC("GetCursorPos: FIXED pos=(%d,%d)->(%d,%d)\n", prev.x, prev.y, lppoint->x, lppoint->y); + } + else { + OutTraceC("GetCursorPos: pos=(%d,%d)\n", lppoint->x, lppoint->y); + } GetHookInfo()->CursorX=(short)lppoint->x; GetHookInfo()->CursorY=(short)lppoint->y; - OutTraceC("GetCursorPos: FIXED pos=(%d,%d)->(%d,%d)\n", prev.x, prev.y, lppoint->x, lppoint->y); if((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()) while((*pShowCursor)(0) >= 0); if(dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0); @@ -1164,6 +1199,7 @@ BOOL WINAPI extSetCursorPos(int x, int y) if(dxw.dwFlags1 & MODIFYMOUSE){ // v2.03.41 POINT cur; + dxw.UpdateDesktopCoordinates(); cur.x = x; cur.y = y; dxw.MapWindow(&cur); @@ -1673,6 +1709,8 @@ static HWND WINAPI CreateWindowCommon( dxw.SetFullScreen(TRUE); } + if(dxw.dwFlags5 & UNLOCKZORDER) dwExStyle &= ~WS_EX_TOPMOST ; + if(!dxw.IsFullScreen()){ // v2.1.63: needed for "Monster Truck Madness" if(WideChar) hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); @@ -2498,9 +2536,10 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT lpTemplate->style, lpTemplate->dwExtendedStyle, lpTemplate->cdit, lpTemplate->x, lpTemplate->y, lpTemplate->cx, lpTemplate->cy, hWndParent, lpDialogFunc, lParamInit); if(dxw.IsFullScreen() && hWndParent==NULL) hWndParent=dxw.GethWnd(); - dxw.SetFullScreen(FALSE); + // v2.03.98: commented out the temporary return to windowed mode to make Red Alert 2 dialog work again! + //dxw.SetFullScreen(FALSE); RetHWND=(*pCreateDialogIndirectParam)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); - dxw.SetFullScreen(FullScreen); + //dxw.SetFullScreen(FullScreen); // v2.02.73: redirect lpDialogFunc only when it is nor NULL if( lpDialogFunc && @@ -2522,9 +2561,9 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW OutTraceDW("CreateDialogParam: hInstance=%x lpTemplateName=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", hInstance, sTemplateName(lpTemplateName), hWndParent, lpDialogFunc, lParamInit); if(hWndParent==NULL) hWndParent=dxw.GethWnd(); - dxw.SetFullScreen(FALSE); + //dxw.SetFullScreen(FALSE); RetHWND=(*pCreateDialogParam)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, lParamInit); - dxw.SetFullScreen(FullScreen); + //dxw.SetFullScreen(FullScreen); // v2.02.73: redirect lpDialogFunc only when it is nor NULL: fix for "LEGO Stunt Rally" if( lpDialogFunc && @@ -3922,9 +3961,17 @@ VOID WINAPI extmouse_event(DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULON return; } - if(dxw.Windowize){ - dxw.MapClient((int *)&dx, (int *)&dy); + if((dwFlags & MOUSEEVENTF_ABSOLUTE) && dxw.Windowize && (dxw.dwFlags1 & MODIFYMOUSE)){ + // ???? untested ...... + //dxw.MapClient((int *)&dx, (int *)&dy); + POINT cursor; + cursor.x = dx; + cursor.y = dy; + cursor = dxw.FixCursorPos(cursor); + dx = cursor.x; + dy = cursor.y; } + return (*pmouse_event)(dwFlags, dx, dy, dwData, dwExtraInfo); } diff --git a/dll/winmm.cpp b/dll/winmm.cpp index ec9499c..cf3a281 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -495,8 +495,14 @@ static void ShowJoystick(LONG, LONG, DWORD); MMRESULT WINAPI extjoyGetDevCapsA(DWORD uJoyID, LPJOYCAPS pjc, UINT cbjc) { OutTraceDW("joyGetDevCaps: joyid=%d size=%d\n", uJoyID, cbjc); - if((uJoyID != -1) && (uJoyID != 0)) return MMSYSERR_NODRIVER; - if(cbjc != sizeof(JOYCAPS)) return MMSYSERR_INVALPARAM; + if((uJoyID != -1) && (uJoyID != 0)) { + OutTraceDW("joyGetDevCaps: ERROR joyid=%d ret=MMSYSERR_NODRIVER\n", uJoyID, cbjc); + return MMSYSERR_NODRIVER; + } + if(cbjc != sizeof(JOYCAPS)) { + OutTraceDW("joyGetDevCaps: ERROR joyid=%d size=%d ret=MMSYSERR_INVALPARAM\n", uJoyID, cbjc); + return MMSYSERR_INVALPARAM; + } uJoyID = 0; // always first (unique) one ... // set Joystick capability structure diff --git a/dll/winproc.cpp b/dll/winproc.cpp index 3574fab..7a76d33 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -245,7 +245,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp if(IsTraceW) ExplainMsg("WindowProc", hwnd, message, wparam, lparam); - if(dxw.dwFlags3 & FILTERMESSAGES){ + if(dxw.dwFlags3 & (FILTERMESSAGES|DEFAULTMESSAGES)){ switch(message){ case WM_NCMOUSEMOVE: case WM_NCLBUTTONDOWN: @@ -257,8 +257,16 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case WM_NCMBUTTONDOWN: case WM_NCMBUTTONUP: case WM_NCMBUTTONDBLCLK: - OutTraceDW("WindowProc[%x]: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam); - return 0; + case WM_MOVE: + case WM_MOVING: + if(dxw.dwFlags3 & FILTERMESSAGES){ + OutTraceDW("WindowProc[%x]: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam); + return 0; + } + else { + OutTraceDW("WindowProc[%x]: DEFAULT WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam); + return (*pDefWindowProcA)(hwnd, message, wparam, lparam); + } } } diff --git a/host/MainFrm.cpp b/host/MainFrm.cpp index 08f41f8..fe0173a 100644 --- a/host/MainFrm.cpp +++ b/host/MainFrm.cpp @@ -178,9 +178,9 @@ void CMainFrame::OnClose() } if(gWarnOnExit){ - if(MessageBoxLang(DXW_STRING_EXIT_OK, DXW_STRING_WARNING, MB_OKCANCEL)==IDOK) - CFrameWnd::OnClose(); - } + if(MessageBoxLang(DXW_STRING_EXIT_OK, DXW_STRING_WARNING, MB_OKCANCEL)==IDOK) + CFrameWnd::OnClose(); +} else CFrameWnd::OnClose(); } diff --git a/host/TabDirectX.cpp b/host/TabDirectX.cpp index bb1bbb2..6daa8ca 100644 --- a/host/TabDirectX.cpp +++ b/host/TabDirectX.cpp @@ -29,8 +29,6 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) DDX_Radio(pDX, IDC_AUTO, cTarget->m_DXVersion); DDX_Radio(pDX, IDC_NOEMULATESURFACE, cTarget->m_DxEmulationMode); DDX_Radio(pDX, IDC_DDRAWFILTER, cTarget->m_DxFilterMode); - DDX_Check(pDX, IDC_SUPPRESSCLIPPING, cTarget->m_SuppressClipping); - DDX_Check(pDX, IDC_FORCECLIPPER, cTarget->m_ForceClipper); DDX_Check(pDX, IDC_BLITFROMBACKBUFFER, cTarget->m_BlitFromBackBuffer); DDX_Check(pDX, IDC_AUTOREFRESH, cTarget->m_AutoRefresh); DDX_Check(pDX, IDC_INDEPENDENTREFRESH, cTarget->m_IndependentRefresh); diff --git a/host/TabDirectX2.cpp b/host/TabDirectX2.cpp index bc9f3fa..2e38076 100644 --- a/host/TabDirectX2.cpp +++ b/host/TabDirectX2.cpp @@ -46,6 +46,23 @@ void CTabDirectX2::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_BACKBUFATTACH, cTarget->m_BackBufAttach); DDX_Check(pDX, IDC_CLEARTEXTUREFOURCC, cTarget->m_ClearTextureFourCC); DDX_Check(pDX, IDC_NODDEXCLUSIVEMODE, cTarget->m_NoDDExclusiveMode); + + // Vsync + //DDX_Check(pDX, IDC_SAVELOAD, cTarget->m_SaveLoad); + //DDX_Check(pDX, IDC_FORCEVSYNC, cTarget->m_ForceVSync); + //DDX_Check(pDX, IDC_FORCENOVSYNC, cTarget->m_ForceNoVSync); + //DDX_Check(pDX, IDC_FORCEWAIT, cTarget->m_ForceWait); + //DDX_Check(pDX, IDC_FORCENOWAIT, cTarget->m_ForceNoWait); + DDX_Radio(pDX, IDC_VSYNCDEFAULT, cTarget->m_VSyncMode); + DDX_Radio(pDX, IDC_WAITDEFAULT, cTarget->m_WaitMode); + DDX_Radio(pDX, IDC_VSYNCHW, cTarget->m_VSyncImpl); + DDX_Text(pDX, IDC_SCANLINE, cTarget->m_ScanLine); + + // Clipper + //DDX_Check(pDX, IDC_SUPPRESSCLIPPING, cTarget->m_SuppressClipping); + //DDX_Check(pDX, IDC_FORCECLIPPER, cTarget->m_ForceClipper); + DDX_Radio(pDX, IDC_CLIPPERNONE, cTarget->m_ClipperMode); + } BEGIN_MESSAGE_MAP(CTabDirectX2, CDialog) diff --git a/host/TabHook.cpp b/host/TabHook.cpp index d150c20..1fd8d2b 100644 --- a/host/TabHook.cpp +++ b/host/TabHook.cpp @@ -35,6 +35,7 @@ void CTabHook::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_HOOKDLLS, cTarget->m_HookDLLs); DDX_Check(pDX, IDC_ANSIWIDE, cTarget->m_AnsiWide); DDX_Check(pDX, IDC_HOOKNORUN, cTarget->m_HookNoRun); + DDX_Check(pDX, IDC_COPYNOSHIMS, cTarget->m_CopyNoShims); DDX_Check(pDX, IDC_HOOKNOUPDATE, cTarget->m_HookNoUpdate); DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin); diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp index bbdfd86..0997b11 100644 --- a/host/TabProgram.cpp +++ b/host/TabProgram.cpp @@ -106,7 +106,6 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_TERMINATEONCLOSE, cTarget->m_TerminateOnClose); DDX_Check(pDX, IDC_FULLSCREENONLY, cTarget->m_FullScreenOnly); DDX_Check(pDX, IDC_SHOWHINTS, cTarget->m_ShowHints); - DDX_Check(pDX, IDC_SAVELOAD, cTarget->m_SaveLoad); DDX_Check(pDX, IDC_KEEPASPECTRATIO, cTarget->m_KeepAspectRatio); DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner); DDX_Check(pDX, IDC_HIDEDESKTOP, cTarget->m_HideDesktop); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 30f68fb..c949468 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -117,6 +117,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_HookDLLs = TRUE; // default true !! m_AnsiWide = FALSE; m_HookNoRun = FALSE; + m_CopyNoShims = FALSE; m_HookNoUpdate = FALSE; m_TerminateOnClose = FALSE; m_ConfirmOnClose = FALSE; @@ -135,13 +136,13 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_NoBanner = FALSE; m_FilePath = _T(""); m_Module = _T(""); - m_SaveLoad = FALSE; + //m_SaveLoad = FALSE; m_SlowDown = FALSE; m_BlitFromBackBuffer = FALSE; m_NoFlipEmulation = FALSE; m_LockColorDepth = FALSE; - m_SuppressClipping = FALSE; - m_ForceClipper = FALSE; + //m_SuppressClipping = FALSE; + //m_ForceClipper = FALSE; m_DisableGammaRamp = FALSE; m_AutoRefresh = FALSE; m_IndependentRefresh = FALSE; @@ -194,6 +195,13 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_BackBufAttach = FALSE; m_ClearTextureFourCC = FALSE; m_NoDDExclusiveMode = FALSE; + //m_ForceVSync = FALSE; + //m_ForceNoVSync = FALSE; + //m_ForceWait = FALSE; + //m_ForceNoWait = FALSE; + m_VSyncMode = 0; + m_VSyncImpl = 0; + m_WaitMode = 0; m_HandleAltF4 = FALSE; m_LimitFPS = FALSE; m_SkipFPS = FALSE; @@ -240,6 +248,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_AssertDialog = FALSE; m_InitialRes = FALSE; m_MaximumRes = FALSE; + m_ClipperMode = 0; m_PosX = 50; m_PosY = 50; m_SizX = 800; @@ -250,7 +259,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_InitTS = 8; m_SwapEffect = 0; m_InjectionMode = 0; - m_WinMovementType = 0; + m_WinMovementType = 1; // "Floating" position mode, better than "Free"! + m_ScanLine = 0; //}}AFX_DATA_INIT } @@ -413,4 +423,4 @@ void CTargetDlg::OnBnClickedKill() else{ MessageBoxLang(DXW_STRING_NOKILLTASK, DXW_STRING_INFO, MB_ICONEXCLAMATION); } -} \ No newline at end of file +} diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 4778540..66784fa 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -71,6 +71,7 @@ public: BOOL m_HookDLLs; BOOL m_AnsiWide; BOOL m_HookNoRun; + BOOL m_CopyNoShims; BOOL m_HookNoUpdate; BOOL m_TerminateOnClose; BOOL m_ConfirmOnClose; @@ -97,13 +98,13 @@ public: CString m_OpenGLLib; CString m_Notes; CString m_Registry; - BOOL m_SaveLoad; + //BOOL m_SaveLoad; BOOL m_SlowDown; BOOL m_BlitFromBackBuffer; BOOL m_NoFlipEmulation; BOOL m_LockColorDepth; - BOOL m_SuppressClipping; - BOOL m_ForceClipper; + //BOOL m_SuppressClipping; + //BOOL m_ForceClipper; BOOL m_DisableGammaRamp; BOOL m_AutoRefresh; BOOL m_IndependentRefresh; @@ -155,6 +156,10 @@ public: BOOL m_BackBufAttach; BOOL m_ClearTextureFourCC; BOOL m_NoDDExclusiveMode; + //BOOL m_ForceVSync; + //BOOL m_ForceNoVSync; + //BOOL m_ForceWait; + //BOOL m_ForceNoWait; BOOL m_HandleAltF4; BOOL m_HandleExceptions; BOOL m_SkipFPS; @@ -258,6 +263,9 @@ public: BOOL m_LimitScreenRes; BOOL m_InitialRes; BOOL m_MaximumRes; + int m_VSyncMode; + int m_VSyncImpl; + int m_WaitMode; int m_PosX; int m_PosY; int m_SizX; @@ -270,6 +278,8 @@ public: int m_MaxScreenRes; int m_ResTypes; int m_SwapEffect; + int m_ClipperMode; + int m_ScanLine; //}}AFX_DATA diff --git a/host/dxTabCtrl.cpp b/host/dxTabCtrl.cpp index 13cd335..d34a24b 100644 --- a/host/dxTabCtrl.cpp +++ b/host/dxTabCtrl.cpp @@ -45,7 +45,6 @@ static char THIS_FILE[] = __FILE__; #endif extern BOOL gbDebug; -extern BOOL gWarnOnExit; ///////////////////////////////////////////////////////////////////////////// // CDXTabCtrl diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index e332724..3604fb6 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.h b/host/dxwndhost.h index c11715b..ed23689 100644 --- a/host/dxwndhost.h +++ b/host/dxwndhost.h @@ -38,6 +38,7 @@ typedef struct PRIVATEMAP typedef struct { TARGETMAP *TM; PRIVATEMAP *PM; + char *ExePath; } ThreadInfo_Type; ThreadInfo_Type; diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index b8d2006..4482799 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index f678d56..5e993d3 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhost.vs2008.vcproj.gho-PC.gho.user b/host/dxwndhost.vs2008.vcproj.gho-PC.gho.user deleted file mode 100644 index d99ab4b..0000000 --- a/host/dxwndhost.vs2008.vcproj.gho-PC.gho.user +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 7f4f456..dd74b5a 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -207,6 +207,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_HookDLLs) t->flags3 |= HOOKDLLS; if(dlg->m_AnsiWide) t->flags5 |= ANSIWIDE; if(dlg->m_HookNoRun) t->flags7 |= HOOKNORUN; + if(dlg->m_CopyNoShims) t->flags7 |= COPYNOSHIMS; if(dlg->m_HookNoUpdate) t->flags7 |= HOOKNOUPDATE; if(dlg->m_TerminateOnClose) t->flags6 |= TERMINATEONCLOSE; if(dlg->m_ConfirmOnClose) t->flags6 |= CONFIRMONCLOSE; @@ -309,6 +310,29 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) case 3: t->flags |= LOCKWINPOS; t->flags7 |= ANCHORED; break; } + switch(dlg->m_VSyncMode){ + case 0: break; + case 1: t->flags8 |= FORCEVSYNC; break; + case 2: t->flags8 |= FORCENOVSYNC; break; + } + + switch(dlg->m_VSyncImpl){ + case 0: break; + case 1: t->flags8 |= VSYNCSCANLINE; break; + case 2: t->flags |= SAVELOAD; break; + } + switch(dlg->m_WaitMode){ + case 0: break; + case 1: t->flags8 |= FORCEWAIT; break; + case 2: t->flags8 |= FORCENOWAIT; break; + } + + switch(dlg->m_ClipperMode){ + case 0: break; + case 1: t->flags3 |= FORCECLIPPER; break; + case 2: t->flags |= SUPPRESSCLIPPING; break; + } + if(dlg->m_HookDI) t->flags |= HOOKDI; if(dlg->m_HookDI8) t->flags |= HOOKDI8; if(dlg->m_EmulateRelMouse) t->flags6 |= EMULATERELMOUSE; @@ -389,13 +413,13 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_LimitScreenRes) t->flags4 |= LIMITSCREENRES; if(dlg->m_SingleProcAffinity) t->flags3 |= SINGLEPROCAFFINITY; if(dlg->m_UseLastCore) t->flags5 |= USELASTCORE; - if(dlg->m_SaveLoad) t->flags |= SAVELOAD; + //if(dlg->m_SaveLoad) t->flags |= SAVELOAD; if(dlg->m_SlowDown) t->flags |= SLOWDOWN; if(dlg->m_BlitFromBackBuffer) t->flags |= BLITFROMBACKBUFFER; if(dlg->m_NoFlipEmulation) t->flags4 |= NOFLIPEMULATION; if(dlg->m_LockColorDepth) t->flags7 |= LOCKCOLORDEPTH; - if(dlg->m_SuppressClipping) t->flags |= SUPPRESSCLIPPING; - if(dlg->m_ForceClipper) t->flags3 |= FORCECLIPPER; + //if(dlg->m_SuppressClipping) t->flags |= SUPPRESSCLIPPING; + //if(dlg->m_ForceClipper) t->flags3 |= FORCECLIPPER; if(dlg->m_DisableGammaRamp) t->flags2 |= DISABLEGAMMARAMP; if(dlg->m_AutoRefresh) t->flags |= AUTOREFRESH; if(dlg->m_IndependentRefresh) t->flags2 |= INDEPENDENTREFRESH; @@ -492,10 +516,15 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_ReplacePrivOps) t->flags5 |= REPLACEPRIVOPS; if(dlg->m_InitialRes) t->flags7 |= INITIALRES; if(dlg->m_MaximumRes) t->flags7 |= MAXIMUMRES; + //if(dlg->m_ForceVSync) t->flags8 |= FORCEVSYNC; + //if(dlg->m_ForceNoVSync) t->flags8 |= FORCENOVSYNC; + //if(dlg->m_ForceWait) t->flags8 |= FORCEWAIT; + //if(dlg->m_ForceNoWait) t->flags8 |= FORCENOWAIT; t->posx = dlg->m_PosX; t->posy = dlg->m_PosY; t->sizx = dlg->m_SizX; t->sizy = dlg->m_SizY; + t->ScanLine = dlg->m_ScanLine; t->MaxFPS = dlg->m_MaxFPS; t->InitTS = dlg->m_InitTS-8; t->FakeVersionId = dlg->m_FakeVersionId; @@ -524,6 +553,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_HookDLLs = t->flags3 & HOOKDLLS ? 1 : 0; dlg->m_AnsiWide = t->flags5 & ANSIWIDE ? 1 : 0; dlg->m_HookNoRun = t->flags7 & HOOKNORUN ? 1 : 0; + dlg->m_CopyNoShims = t->flags7 & COPYNOSHIMS ? 1 : 0; dlg->m_HookNoUpdate = t->flags7 & HOOKNOUPDATE ? 1 : 0; dlg->m_TerminateOnClose = t->flags6 & TERMINATEONCLOSE ? 1 : 0; dlg->m_ConfirmOnClose = t->flags6 & CONFIRMONCLOSE ? 1 : 0; @@ -601,6 +631,22 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) if(t->flags2 & LOCKEDSIZE) dlg->m_WinMovementType = 2; if(t->flags7 & ANCHORED) dlg->m_WinMovementType = 3; + dlg->m_VSyncMode = 0; + if(t->flags8 & FORCEVSYNC) dlg->m_VSyncMode = 1; + if(t->flags8 & FORCENOVSYNC) dlg->m_VSyncMode = 2; + + dlg->m_VSyncImpl = 0; + if(t->flags8 & VSYNCSCANLINE) dlg->m_VSyncImpl = 1; + if(t->flags & SAVELOAD) dlg->m_VSyncImpl = 2; + + dlg->m_WaitMode = 0; + if(t->flags8 & FORCEWAIT) dlg->m_WaitMode = 1; + if(t->flags8 & FORCENOWAIT) dlg->m_WaitMode = 2; + + dlg->m_ClipperMode = 0; + if (t->flags3 & FORCECLIPPER) dlg->m_ClipperMode = 1; + if (t->flags & SUPPRESSCLIPPING) dlg->m_ClipperMode = 2; + dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0; dlg->m_HookDI8 = t->flags & HOOKDI8 ? 1 : 0; dlg->m_EmulateRelMouse = t->flags6 & EMULATERELMOUSE ? 1 : 0; @@ -680,13 +726,13 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ClearTarget = t->flags5 & CLEARTARGET ? 1 : 0; dlg->m_FixPitch = t->flags6 & FIXPITCH ? 1 : 0; dlg->m_Power2Width = t->flags6 & POWER2WIDTH ? 1 : 0; - dlg->m_SaveLoad = t->flags & SAVELOAD ? 1 : 0; + //dlg->m_SaveLoad = t->flags & SAVELOAD ? 1 : 0; dlg->m_SlowDown = t->flags & SLOWDOWN ? 1 : 0; dlg->m_BlitFromBackBuffer = t->flags & BLITFROMBACKBUFFER ? 1 : 0; dlg->m_NoFlipEmulation = t->flags4 & NOFLIPEMULATION ? 1 : 0; dlg->m_LockColorDepth = t->flags7 & LOCKCOLORDEPTH ? 1 : 0; - dlg->m_SuppressClipping = t->flags & SUPPRESSCLIPPING ? 1 : 0; - dlg->m_ForceClipper = t->flags3 & FORCECLIPPER ? 1 : 0; +// dlg->m_SuppressClipping = t->flags & SUPPRESSCLIPPING ? 1 : 0; +// dlg->m_ForceClipper = t->flags3 & FORCECLIPPER ? 1 : 0; dlg->m_DisableGammaRamp = t->flags2 & DISABLEGAMMARAMP ? 1 : 0; dlg->m_AutoRefresh = t->flags & AUTOREFRESH ? 1 : 0; dlg->m_IndependentRefresh = t->flags2 & INDEPENDENTREFRESH ? 1 : 0; @@ -781,10 +827,15 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ReplacePrivOps = t->flags5 & REPLACEPRIVOPS ? 1 : 0; dlg->m_InitialRes = t->flags7 & INITIALRES ? 1 : 0; dlg->m_MaximumRes = t->flags7 & MAXIMUMRES ? 1 : 0; + //dlg->m_ForceVSync = t->flags8 & FORCEVSYNC ? 1 : 0; + //dlg->m_ForceNoVSync = t->flags8 & FORCENOVSYNC ? 1 : 0; + //dlg->m_ForceWait = t->flags8 & FORCEWAIT ? 1 : 0; + //dlg->m_ForceNoWait = t->flags8 & FORCENOWAIT ? 1 : 0; dlg->m_PosX = t->posx; dlg->m_PosY = t->posy; dlg->m_SizX = t->sizx; dlg->m_SizY = t->sizy; + dlg->m_ScanLine = t->ScanLine; dlg->m_MaxFPS = t->MaxFPS; dlg->m_InitTS = t->InitTS+8; dlg->m_FakeVersionId = t->FakeVersionId; @@ -866,14 +917,6 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, sprintf_s(val, sizeof(val), "%i", TargetMap->flags8); WritePrivateProfileString("target", key, val, InitPath); // ------- - sprintf_s(key, sizeof(key), "flagl%i", i); - sprintf_s(val, sizeof(val), "%i", TargetMap->flags7); - WritePrivateProfileString("target", key, val, InitPath); - // ------- - sprintf_s(key, sizeof(key), "flagm%i", i); - sprintf_s(val, sizeof(val), "%i", TargetMap->flags8); - WritePrivateProfileString("target", key, val, InitPath); - // ------- sprintf_s(key, sizeof(key), "tflag%i", i); sprintf_s(val, sizeof(val), "%i", TargetMap->tflags); WritePrivateProfileString("target", key, val, InitPath); @@ -926,6 +969,10 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, sprintf_s(val, sizeof(val), "%i", TargetMap->SlowRatio); WritePrivateProfileString("target", key, val, InitPath); // ------- + sprintf_s(key, sizeof(key), "scanline%i", i); + sprintf_s(val, sizeof(val), "%i", TargetMap->ScanLine); + WritePrivateProfileString("target", key, val, InitPath); + // ------- sprintf_s(key, sizeof(key), "initresw%i", i); sprintf_s(val, sizeof(val), "%i", TargetMap->resw); WritePrivateProfileString("target", key, val, InitPath); @@ -1122,6 +1169,9 @@ static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, c sprintf_s(key, sizeof(key), "slowratio%i", i); TargetMap->SlowRatio = GetPrivateProfileInt("target", key, 1, InitPath); // ------- + sprintf_s(key, sizeof(key), "scanline%i", i); + TargetMap->ScanLine = GetPrivateProfileInt("target", key, 1, InitPath); + // ------- sprintf_s(key, sizeof(key), "initresw%i", i); TargetMap->resw = GetPrivateProfileInt("target", key, 0, InitPath); // ------- @@ -1940,6 +1990,10 @@ void CDxwndhostView::OnProcessKill() lpProcName=FilePath; while (lpNext=strchr(lpProcName,'\\')) lpProcName=lpNext+1; + if(TargetMaps[i].flags7 & COPYNOSHIMS){ + strcat(lpProcName, ".noshim"); + } + if(!KillProcByName(lpProcName, FALSE)){ wchar_t *wcstring = new wchar_t[48+1]; mbstowcs_s(NULL, wcstring, 48, PrivateMaps[i].title, _TRUNCATE); @@ -2666,7 +2720,7 @@ DWORD WINAPI StartDebug(void *p) ThInfo = (ThreadInfo_Type *)p; ZeroMemory(&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); - sRunTargetPath = (strlen(ThInfo->PM->launchpath)>0) ? ThInfo->PM->launchpath : ThInfo->TM->path; + sRunTargetPath = ThInfo->ExePath; strcpy_s(path, sizeof(path), sRunTargetPath); PathRemoveFileSpec(path); if(!CreateProcess(NULL, @@ -3061,6 +3115,77 @@ static void CheckSafeDiscVersion(char *path) fclose(exe); } +#define FILECOPYBUFSIZE 1024 + +static void MakeHiddenFile(char *sTargetPath) +{ + HANDLE hFile = INVALID_HANDLE_VALUE; + HANDLE hTempFile = INVALID_HANDLE_VALUE; + BOOL fSuccess = FALSE; + DWORD dwRetVal = 0; + UINT uRetVal = 0; + DWORD dwBytesRead = 0; + DWORD dwBytesWritten = 0; + char chBuffer[FILECOPYBUFSIZE]; + + hFile = CreateFile(sTargetPath, // file name + GENERIC_READ, // open for reading + 0, // do not share + NULL, // default security + OPEN_EXISTING, // existing file only + FILE_ATTRIBUTE_NORMAL, // normal file + NULL); // no template + if (hFile == INVALID_HANDLE_VALUE) { + //PrintError(TEXT("First CreateFile failed")); + return; + } + + strcat(sTargetPath, ".noshim"); + + // Deletes last copy of the file, just in case it was updated (patched?) + // DeleteFile(sTargetPath); + + // Creates the new file to write to for the upper-case version. + hTempFile = CreateFile((LPTSTR) sTargetPath, // file name + GENERIC_WRITE, // open for write + 0, // do not share + NULL, // default security + CREATE_ALWAYS, // overwrite existing + //FILE_ATTRIBUTE_HIDDEN, // hidden file + FILE_ATTRIBUTE_NORMAL, // normal file + NULL); // no template + if (hTempFile == INVALID_HANDLE_VALUE) { + char msg[120]; + sprintf(msg, "Creation of hidden copy of target file with no SHIMs failed\nError=%d", GetLastError()); + MessageBox(0, msg, "Warning", 0); + //PrintError(TEXT("Second CreateFile failed")); + if (!CloseHandle(hFile)){ + sprintf(msg, "CloseHandle failed\nError=%d", GetLastError()); + MessageBox(0, msg, "Error", 0); + } + return; + } + // Reads BUFSIZE blocks to the buffer and copy to the temporary + // file. + do { + if (ReadFile(hFile, chBuffer, FILECOPYBUFSIZE, &dwBytesRead, NULL)) { + fSuccess = WriteFile(hTempFile, chBuffer, dwBytesRead, &dwBytesWritten, NULL); + if (!fSuccess) { + //PrintError(TEXT("WriteFile failed")); + break; + } + } + else { + //PrintError(TEXT("ReadFile failed")); + break; + } + // Continues until the whole file is processed. + } while (dwBytesRead == FILECOPYBUFSIZE); + + CloseHandle(hFile); + CloseHandle(hTempFile); +} + void CDxwndhostView::OnRun() { CListCtrl& listctrl = GetListCtrl(); @@ -3068,7 +3193,8 @@ void CDxwndhostView::OnRun() int i; STARTUPINFO sinfo; PROCESS_INFORMATION pinfo; - char path[MAX_PATH]; + char folderpath[MAX_PATH+20]; // max + space for ".noshim" + char exepath[MAX_PATH+20]; // max + space for ".noshim" TARGETMAP RestrictedMaps[2]; char *sRunTargetPath; @@ -3088,10 +3214,16 @@ void CDxwndhostView::OnRun() memcpy(&RestrictedMaps[0], &TargetMaps[i], sizeof(TARGETMAP)); memset(&RestrictedMaps[1], 0, sizeof(TARGETMAP)); if(!(PrivateMaps[i].startfolder[0])){ - strcpy_s(path, sizeof(path), sRunTargetPath); - PathRemoveFileSpec(path); + strcpy_s(folderpath, sizeof(folderpath), sRunTargetPath); + strcpy_s(exepath, sizeof(exepath), sRunTargetPath); + PathRemoveFileSpec(folderpath); }else{ - strcpy_s(path, sizeof(path), PrivateMaps[i].startfolder); + strcpy_s(folderpath, sizeof(folderpath), PrivateMaps[i].startfolder); + strcpy_s(exepath, sizeof(exepath), sRunTargetPath); + } + if(TargetMaps[i].flags7 & COPYNOSHIMS){ + MakeHiddenFile(exepath); + strncpy(RestrictedMaps[0].path, exepath, MAX_PATH); } SetTarget(RestrictedMaps); OutTrace("OnRun idx=%d prog=\"%s\"\n", i, TargetMaps[i].path); @@ -3137,24 +3269,31 @@ void CDxwndhostView::OnRun() ThreadInfo_Type ThreadInfo; ThreadInfo.TM=&TargetMaps[i]; ThreadInfo.PM=&PrivateMaps[i]; + ThreadInfo.ExePath=exepath; CloseHandle(CreateThread( NULL, 0, StartDebug, &ThreadInfo, 0, NULL)); } else if(TargetMaps[i].flags7 & INJECTSUSPENDED){ OutTrace("injectsuspended mode\n"); - InjectSuspended(sRunTargetPath, path); + InjectSuspended(exepath, folderpath); } else{ OutTrace("setwindowshook mode\n"); CreateProcess(NULL, - sRunTargetPath, - 0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, path, &sinfo, &pinfo); + exepath, + 0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, folderpath, &sinfo, &pinfo); CloseHandle(pinfo.hProcess); // no longer needed, avoid handle leakage CloseHandle(pinfo.hThread); // no longer needed, avoid handle leakage } + // wait & recover CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecoverTargetMaps, (LPVOID)TargetMaps, 0, NULL); if(gAutoHideMode) this->OnGoToTrayIcon(); + + // not working: the file is opened, can't be deleted + //if(TargetMaps[i].flags7 & COPYNOSHIMS){ + // DeleteFile(exepath); + //} } void SwitchToColorDepth(int bpp) diff --git a/host/host.aps b/host/host.aps index 81ba404..6a498d0 100644 Binary files a/host/host.aps and b/host/host.aps differ diff --git a/host/resource b/host/resource index fec2a6d..9f5dff1 100644 Binary files a/host/resource and b/host/resource differ diff --git a/proxy/d3d8.suo b/proxy/d3d8.suo new file mode 100644 index 0000000..ef44227 Binary files /dev/null and b/proxy/d3d8.suo differ diff --git a/proxy/d3d9.suo b/proxy/d3d9.suo new file mode 100644 index 0000000..56c8d13 Binary files /dev/null and b/proxy/d3d9.suo differ diff --git a/proxy/ddraw.suo b/proxy/ddraw.suo new file mode 100644 index 0000000..4d655f3 Binary files /dev/null and b/proxy/ddraw.suo differ