From 8050fe4ddbb8b1e321c8ce036e135cb2b4e18a1b Mon Sep 17 00:00:00 2001 From: gho tik Date: Sat, 3 Jan 2015 11:40:25 -0500 Subject: [PATCH] v2_03_12_src Former-commit-id: 98030671cbaf07264e09d169f6ac315d17e1678e --- Include/dxwnd.h | 4 +- build/ICCVID.DLL | Bin 0 -> 92160 bytes build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/exports/A10 Cuba.dxw | 7 +- build/exports/Actua Ice Hockey.dxw | 29 ++++++ build/exports/Adrenix 3D.dxw | 29 ++++++ build/exports/Daemonstar.dxw | 29 ++++++ build/exports/Diablo.dxw | 6 +- build/exports/Divide, the.dxw | 29 ++++++ build/exports/Esoteria.dxw | 29 ++++++ build/exports/Gruntz.dxw | 7 +- build/exports/H.E.D.Z..dxw | 29 ++++++ build/exports/Powerslide.dxw | 29 ++++++ build/exports/StarCraft.dxw | 9 +- build/exports/Tenka.dxw | 29 ++++++ build/exports/Virtua Cop.dxw | 29 ++++++ build/exports/Warcraft 2 Battlenet Ed.dxw | 5 +- build/exports/Worms 2.dxw | 29 ++++++ build/exports/dxwnd.ini | 5 + build/readme-relnotes.txt | 13 ++- build/redist/dplay.dll | 3 + build/registry/dxwnd.the Divide.REG | 20 ++++ build/registry/dxwnd.the Industry Giant.reg | 9 ++ dll/advapi.cpp | 87 ++++++++-------- dll/ddproxy.cpp | 33 ++++++- dll/ddraw.cpp | 97 ++++++++++++++++-- dll/dinput.cpp | 104 ++++++++++++++------ dll/dxhook.cpp | 2 + dll/dxwcore.cpp | 38 +++++++ dll/dxwcore.hpp | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 93696 -> 97280 bytes dll/dxwnd.vs2008.vcproj | 4 + dll/gdi32.cpp | 70 +++++++++++-- dll/hexdump.cpp | 22 +++++ dll/user32.cpp | 26 +++-- host/TabProgram.cpp | 20 +++- host/dxwndhost.aps | Bin 154964 -> 128484 bytes host/dxwndhost.vs2008.suo | Bin 197632 -> 197632 bytes host/dxwndhostView.cpp | 44 +++++++-- 41 files changed, 819 insertions(+), 117 deletions(-) create mode 100644 build/ICCVID.DLL create mode 100644 build/exports/Actua Ice Hockey.dxw create mode 100644 build/exports/Adrenix 3D.dxw create mode 100644 build/exports/Daemonstar.dxw create mode 100644 build/exports/Divide, the.dxw create mode 100644 build/exports/Esoteria.dxw create mode 100644 build/exports/H.E.D.Z..dxw create mode 100644 build/exports/Powerslide.dxw create mode 100644 build/exports/Tenka.dxw create mode 100644 build/exports/Virtua Cop.dxw create mode 100644 build/exports/Worms 2.dxw create mode 100644 build/exports/dxwnd.ini create mode 100644 build/redist/dplay.dll create mode 100644 build/registry/dxwnd.the Divide.REG create mode 100644 build/registry/dxwnd.the Industry Giant.reg create mode 100644 dll/hexdump.cpp diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 41d14ba..414bde9 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -37,7 +37,7 @@ #define LOCKEDSURFACE 0x01000000 // emulates the buffer of the primary surface when locked and written directly #define FIXPARENTWIN 0x02000000 // fixes parent window size & position #define SWITCHVIDEOMEMORY 0x04000000 // when VIDEO memory is over, switches to SYSTEM memory -#define CLIENTREMAPPING 0x08000000 // hooks CLientToRect, RectToClient, GetClientRect, GetWinRect +#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) @@ -264,6 +264,8 @@ void OutTrace(const char *, ...); void OutTraceHex(BYTE *, int); void *HookAPI(HMODULE, char *, void *, const char *, void *); void AdjustWindowFrame(HWND, DWORD, DWORD); +char *hexdump(unsigned char *, int); + LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK extChildWindowProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK extDialogWindowProc(HWND, UINT, WPARAM, LPARAM); diff --git a/build/ICCVID.DLL b/build/ICCVID.DLL new file mode 100644 index 0000000000000000000000000000000000000000..ae34f204816ba3ef83a94bec83c6a67b208f56e7 GIT binary patch literal 92160 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
VLsN#295y^PEhTkC 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 D@$M7t literal 0 HcmV?d00001 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 7fa61f2..3f7c827 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d53bda86269a959549e061c5b2c23e70b492dcb1b1e2b944063b193b49179d87 -size 567296 +oid sha256:5005c1da2c65a47e47378d41ed67cb908a2fd475ced015bddebe715c7f1d71d7 +size 570368 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index fcfb1b7..9b429dc 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:be381f4fba85d8c7dcb13682c470713728dd133b38e6d4d1ed65fc6ceb74e771 -size 536064 +oid sha256:2e73542e5cc2b9a1fa1d6429230b756694eb361b63fe55b812cb1c31c118e938 +size 538112 diff --git a/build/exports/A10 Cuba.dxw b/build/exports/A10 Cuba.dxw index 1446a8f..9052c32 100644 --- a/build/exports/A10 Cuba.dxw +++ b/build/exports/A10 Cuba.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=671096866 flagg0=1207959568 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,8 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +notes0= +flagj0=128 +winver0=0 +maxres0=0 diff --git a/build/exports/Actua Ice Hockey.dxw b/build/exports/Actua Ice Hockey.dxw new file mode 100644 index 0000000..844d301 --- /dev/null +++ b/build/exports/Actua Ice Hockey.dxw @@ -0,0 +1,29 @@ +[target] +title0=Actua Ice Hockey +path0=D:\Games\ahockey\HOCKEY.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=671088674 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Adrenix 3D.dxw b/build/exports/Adrenix 3D.dxw new file mode 100644 index 0000000..e84b1e1 --- /dev/null +++ b/build/exports/Adrenix 3D.dxw @@ -0,0 +1,29 @@ +[target] +title0=Adrenix 3D +path0=D:\Games\Adrenix\AdrenixD.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134234150 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Daemonstar.dxw b/build/exports/Daemonstar.dxw new file mode 100644 index 0000000..572a09d --- /dev/null +++ b/build/exports/Daemonstar.dxw @@ -0,0 +1,29 @@ +[target] +title0=Daemonstar +path0=D:\Games\dmnstar\DS.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Diablo.dxw b/build/exports/Diablo.dxw index 0878981..9fb8c95 100644 --- a/build/exports/Diablo.dxw +++ b/build/exports/Diablo.dxw @@ -18,10 +18,12 @@ maxx0=0 maxy0=0 posx0=50 posy0=50 -sizx0=640 -sizy0=480 +sizx0=800 +sizy0=600 maxfps0=0 initts0=0 launchpath0= winver0=0 maxres0=0 +notes0= +flagj0=129 diff --git a/build/exports/Divide, the.dxw b/build/exports/Divide, the.dxw new file mode 100644 index 0000000..4845201 --- /dev/null +++ b/build/exports/Divide, the.dxw @@ -0,0 +1,29 @@ +[target] +title0=Divide, the +path0=D:\Games\divide\DIVIDE.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1212153856 +flagh0=1044 +flagi0=1212153860 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Esoteria.dxw b/build/exports/Esoteria.dxw new file mode 100644 index 0000000..42f2119 --- /dev/null +++ b/build/exports/Esoteria.dxw @@ -0,0 +1,29 @@ +[target] +title0=Esoteria +path0=D:\Games\esoter3\ESOTERIA.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Gruntz.dxw b/build/exports/Gruntz.dxw index 2148a0f..1c4872b 100644 --- a/build/exports/Gruntz.dxw +++ b/build/exports/Gruntz.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134234656 +flag0=134234146 flagg0=1207959552 flagh0=67108884 -flagi0=131076 +flagi0=4325380 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=128 diff --git a/build/exports/H.E.D.Z..dxw b/build/exports/H.E.D.Z..dxw new file mode 100644 index 0000000..f0c91a8 --- /dev/null +++ b/build/exports/H.E.D.Z..dxw @@ -0,0 +1,29 @@ +[target] +title0=H.E.D.Z. +path0=D:\Games\HEDZ\HEDZ.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=681574434 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=134221952 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Powerslide.dxw b/build/exports/Powerslide.dxw new file mode 100644 index 0000000..9e4c618 --- /dev/null +++ b/build/exports/Powerslide.dxw @@ -0,0 +1,29 @@ +[target] +title0=Powerslide +path0=D:\Games\Powerslide\powerslide.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=512 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/StarCraft.dxw b/build/exports/StarCraft.dxw index ec3c771..558110d 100644 --- a/build/exports/StarCraft.dxw +++ b/build/exports/StarCraft.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=0 coord0=0 flag0=134217762 -flagg0=136314880 +flagg0=1207959552 flagh0=20 -flagi0=0 +flagi0=4194304 tflag0=64 initx0=0 inity0=0 @@ -22,3 +22,8 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +notes0= +flagj0=128 +winver0=0 +maxres0=0 diff --git a/build/exports/Tenka.dxw b/build/exports/Tenka.dxw new file mode 100644 index 0000000..4bc32c9 --- /dev/null +++ b/build/exports/Tenka.dxw @@ -0,0 +1,29 @@ +[target] +title0=Tenka +path0=D:\Games\tenka\tenka.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +tflag0=512 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Virtua Cop.dxw b/build/exports/Virtua Cop.dxw new file mode 100644 index 0000000..2ad7338 --- /dev/null +++ b/build/exports/Virtua Cop.dxw @@ -0,0 +1,29 @@ +[target] +title0=Virtua Cop +path0=D:\Games\Virtua Cop\VCOP.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134234150 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Warcraft 2 Battlenet Ed.dxw b/build/exports/Warcraft 2 Battlenet Ed.dxw index 127c947..f5c383e 100644 --- a/build/exports/Warcraft 2 Battlenet Ed.dxw +++ b/build/exports/Warcraft 2 Battlenet Ed.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=134218400 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=0 +launchpath0= +notes0= +flagj0=128 diff --git a/build/exports/Worms 2.dxw b/build/exports/Worms 2.dxw new file mode 100644 index 0000000..4852b52 --- /dev/null +++ b/build/exports/Worms 2.dxw @@ -0,0 +1,29 @@ +[target] +title0=Worms 2 +path0=D:\Games\worms2\worms2.exe +launchpath0= +module0= +opengllib0= +notes0=Working pretty well on TWILIGHT game rip.\nUntested on CD version.\nIt shows problems with the background: \nin emulated mode the colors are limited, in GDI mode it's all black.\n +ver0=0 +coord0=0 +flag0=134234146 +flagg0=1207959552 +flagh0=20 +flagi0=138412038 +flagj0=5248 +tflag0=536870912 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini new file mode 100644 index 0000000..385ef5b --- /dev/null +++ b/build/exports/dxwnd.ini @@ -0,0 +1,5 @@ +[window] +posx=1292 +posy=131 +sizx=320 +sizy=787 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index c440d13..3a25de5 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -740,4 +740,15 @@ fix: GDI mode bug, crashing when blitting from NULL surface (to do a color fill v2.03.11 fix: added DDSCAPS_FLIP capability to emulated backbuffer surface. Fixes "Injection" missing flips fix: added high order bit set to kernel32.dll GetVersion() wrapper in case of Win95/98 emulation. Fixes "Warhead" frontend program -fix: coordinates returned by user32.dll GetClipCursor() must be scaled accordingly with virtual desktop size. Fixes "SubCulture" mouse control problems \ No newline at end of file +fix: coordinates returned by user32.dll GetClipCursor() must be scaled accordingly with virtual desktop size. Fixes "SubCulture" mouse control problems + +v2.03.12 +fix: several issues in fake registry hooks +add: continue char '\' in fake registry configuration for hex values +add: GetClipList ddraw hooker: fixes "Full Pipe" blitting coordinates +fix: proper handling of palette reserved entries +fix: dinput GetDeviceData +add: implemented "Release mouse outside window" functionality in dinput calls +fix: now "Release mouse outside window" leaves the mouse close to where it left the window +fix: in GUI, keeps memory of last used paths +fix: several log messages \ No newline at end of file diff --git a/build/redist/dplay.dll b/build/redist/dplay.dll new file mode 100644 index 0000000..42e2b0c --- /dev/null +++ b/build/redist/dplay.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8194ca60e6eda8f5c3fe67990bb38f7d3e68e9beba9d6adf5c68fab9478b94f5 +size 57344 diff --git a/build/registry/dxwnd.the Divide.REG b/build/registry/dxwnd.the Divide.REG new file mode 100644 index 0000000..42406af --- /dev/null +++ b/build/registry/dxwnd.the Divide.REG @@ -0,0 +1,20 @@ +[HKEY_LOCAL_MACHINE\SOFTWARE] +[HKEY_LOCAL_MACHINE\SOFTWARE\Viacom New Media] +[HKEY_LOCAL_MACHINE\SOFTWARE\Viacom New Media\The Divide] +[HKEY_LOCAL_MACHINE\SOFTWARE\Viacom New Media\The Divide\1.0] +"Display Name"="\"The Divide\"" +"InstallDir"="." +"InstallSrc"="." +"CDROM"=".:" +"ProgramDir"="." +"LevelsDir"=".\\Levels\\" +"MoviesDir"=".\\Movies\\" +"SoundsDir"=".\\pc\\" + + +[HKEY_CURRENT_USER\SOFTWARE\Viacom New Media\The Divide\Config] +"Game Settings"=hex:20,03,00,00,58,02,00,00,20,03,00,00,58,02,00,00\ +00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00\ +00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,00,00\ +00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 + diff --git a/build/registry/dxwnd.the Industry Giant.reg b/build/registry/dxwnd.the Industry Giant.reg new file mode 100644 index 0000000..718f49f --- /dev/null +++ b/build/registry/dxwnd.the Industry Giant.reg @@ -0,0 +1,9 @@ +[HKEY_LOCAL_MACHINE\SOFTWARE] + +; the Industry Giant + + +[HKEY_LOCAL_MACHINE\SOFTWARE\JoWooD] +[HKEY_LOCAL_MACHINE\SOFTWARE\JoWooD\The IndustryGiant] +"InstallPath"="." + diff --git a/dll/advapi.cpp b/dll/advapi.cpp index 729f179..c8e3b0e 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -197,12 +197,13 @@ LONG WINAPI extRegQueryValueEx( } // try emulated registry + res = ERROR_FILE_NOT_FOUND; FILE *regf; char RegBuf[MAX_PATH+1]; char *pData; HKEY hCurKey=HKEY_FAKE+1; regf=OpenFakeRegistry(); - if(regf==NULL) return ERROR_FILE_NOT_FOUND; + if(regf==NULL) return res; if(!lpValueName)lpValueName=""; fgets(RegBuf, 256, regf); while (!feof(regf)){ @@ -211,70 +212,79 @@ LONG WINAPI extRegQueryValueEx( } else { if(hCurKey==hKey){ - - //OutTrace("loop: \"%s\"\n", RegBuf); if((RegBuf[0]=='"') && !_strnicmp(lpValueName, &RegBuf[1], strlen(lpValueName)) && (RegBuf[strlen(lpValueName)+1]=='"') && (RegBuf[strlen(lpValueName)+2]=='=')) { + LPBYTE lpb; res=ERROR_FILE_NOT_FOUND; pData=&RegBuf[strlen(lpValueName)+3]; + lpb = lpData; if(*pData=='"'){ // string value + if(lpType) *lpType=REG_SZ; if(lpData){ - LPBYTE lpb; - lpb = lpData; *lpcbData=0; pData++; while(*pData && (*pData != '"')){ if(*pData=='\\') pData++; *lpb++=*pData++; - *lpcbData++; + if(lpcbData) *lpcbData++; } *lpb = 0; // string terminator } - if(lpType) *lpType=REG_SZ; - // - OutTraceR("RegQueryValueEx: Data=\"%s\" type=REG_SZ\n", lpData); + OutTraceR("RegQueryValueEx: type=REG_SZ Data=\"%s\"\n", lpData ? (char *)lpData : "(NULL)"); res=ERROR_SUCCESS; + break; } if(!strncmp(pData,"dword:",strlen("dword:"))){ //dword value DWORD val; + if(lpType) *lpType=REG_DWORD; pData+=strlen("dword:"); sscanf(pData, "%x", &val); if(lpData) memcpy(lpData, &val, sizeof(DWORD)); - if(lpType) *lpType=REG_DWORD; - *lpcbData=sizeof(DWORD); - OutTraceR("RegQueryValueEx: Data=0x%x type=REG_DWORD\n", val); + if(lpcbData) *lpcbData=sizeof(DWORD); + OutTraceR("RegQueryValueEx: type=REG_DWORD Data=0x%x\n", val); res=ERROR_SUCCESS; + break; } - if(!strncmp(pData,"hex:",strlen("hex:"))){ //dword value - pData+=strlen("hex:"); - pData[strlen(pData)-1]=0; // eliminates \n + if(!strncmp(pData,"hex:",strlen("hex:"))){ //hex value + BYTE *p; if(lpType) *lpType=REG_BINARY; - OutTraceDW("RegQueryValueEx: Data="); - if(lpData){ - *lpcbData=0; - while(strlen(pData)>1){ - sscanf(pData, "%x,", (char *)lpData); - OutTraceDW("%02.2x,", *(unsigned char *)lpData); - pData+=3; - lpData++; - (*lpcbData)++; + p = (BYTE *)pData; + p+=strlen("hex:"); + if(lpcbData) *lpcbData=0; + while(TRUE){ + p[strlen((char *)p)-1]=0; // eliminates \n + if(lpData){ + while(strlen((char *)p)>1){ + sscanf((char *)p, "%x,", (char *)lpb); + p+=3; + lpb++; + if(lpcbData) (*lpcbData)++; + } + if(p[strlen((char *)p)-1]=='\\'){ + fgets(RegBuf, 256, regf); + pData = RegBuf; + p = (BYTE *)pData; + } + else break; } } - OutTraceR(" type=REG_BINARY cbData=%d\n", *lpcbData); + OutTraceR("RegQueryValueEx: type=REG_BINARY cbData=%d Data=%s\n", + lpcbData ? *lpcbData : 0, + lpData ? "(NULL)" : hexdump(lpData, *lpcbData)); res=ERROR_SUCCESS; + break; } - fclose(regf); - return res; } } } fgets(RegBuf, 256, regf); } fclose(regf); - return ERROR_FILE_NOT_FOUND; + OutTraceR("RegQueryValueEx: res=%x\n", res); + return res; } LONG WINAPI extRegCloseKey(HKEY hKey) @@ -287,18 +297,13 @@ LONG WINAPI extRegCloseKey(HKEY hKey) LONG WINAPI extRegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE *lpData, DWORD cbData) { if (IsTraceR){ - OutTrace("RegSetValueEx: hKey=%x ValueName=\"%s\" Type=%x(%s) cbData=%d ", hKey, lpValueName, dwType, ExplainRegType(dwType), cbData); + char sInfo[1024]; + sprintf(sInfo, "RegSetValueEx: hKey=%x ValueName=\"%s\" Type=%x(%s) cbData=%d", hKey, lpValueName, dwType, ExplainRegType(dwType), cbData); switch(dwType){ - case REG_DWORD: OutTrace("Data=%x\n", *(DWORD *)lpData); break; - case REG_NONE: OutTrace("Data=\"%s\"\n", lpData); break; - case REG_BINARY: { - DWORD i; - OutTrace("Data=%02.2X,", *lpData); - for(i=1; ileft, lpRect->top, lpRect->right, lpRect->bottom); - else OutTraceP("rect=(NULL) "); + if(IsTraceP){ + char sInfo[81]; + if (lpRect) sprintf(sInfo, "rect=(%d,%d)-(%d,%d) ", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + else sprintf(sInfo, "rect=(NULL) "); + OutTrace("GetClipList(C): PROXED lpddClip=%x %s\n", lpddClip, sInfo); + } res=(*pGetClipList)(lpddClip, lpRect, lpRgnData, lpw); - if(res) OutTraceP("GeGetClipListtHWnd(C): ERROR err=%x(%s)\n", res, ExplainDDError(res)); - else OutTraceP("GetClipList(C): w=%x\n", *lpw); + if(IsTraceP){ + //char *sInfo[1024]; + if(res) OutTrace("GetClipList(C): ERROR err=%x(%s)\n", res, ExplainDDError(res)); + else{ + if(lpRgnData){ + OutTrace("GetClipList(C): w=%x rgndataheader{size=%d type=%x count=%d RgnSize=%d bound=(%d,%d)-(%d,%d)}\n", + *lpw, lpRgnData->rdh.dwSize, lpRgnData->rdh.iType, lpRgnData->rdh.nCount, lpRgnData->rdh.nRgnSize, + lpRgnData->rdh.rcBound.left, lpRgnData->rdh.rcBound.top, lpRgnData->rdh.rcBound.right, lpRgnData->rdh.rcBound.bottom); + if(IsDebug){ + RECT *rgns; + rgns = (RECT *)lpRgnData->Buffer; + for(DWORD i=0; irdh.nCount; i++){ + OutTrace("GetClipList(C): rect[%d]=(%d,%d)-(%d,%d)\n", + i, rgns[i].left, rgns[i].top, rgns[i].right, rgns[i].bottom); + } + } + } + else{ + OutTrace("GetClipList(C): w=%x\n", *lpw); + } + } + } return res; } diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index bf5309b..db04307 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -104,6 +104,7 @@ HRESULT WINAPI extSetSurfaceDesc(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); // DirectDrawClipper HRESULT WINAPI extReleaseC(LPDIRECTDRAWCLIPPER); +HRESULT WINAPI extGetClipList(LPDIRECTDRAWCLIPPER, LPRECT, LPRGNDATA, LPDWORD); // DirectDrawPalette HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE); @@ -495,14 +496,41 @@ void DescribeSurface(LPDIRECTDRAWSURFACE lpdds, int dxversion, char *label, int BOOL isPaletteUpdated; -void mySetPalette(int dwstart, int dwcount, LPPALETTEENTRY lpentries) +void mySetPalette(int dwstart, int dwcount, LPPALETTEENTRY lpentries, BOOL Has256ColorsPalette) { int i; extern DXWNDSTATUS *pStatus; + // copy the palette entries on the current system palette for(int idx=0; idxPalette[dwstart+idx]= lpentries[idx]; + // if has reserved palette entries, recover them + if(!Has256ColorsPalette){ + int nStatCols, nPalEntries; + PALETTEENTRY SysPalEntry[256]; + LPPALETTEENTRY lpEntry; + extern GetSystemPaletteEntries_Type pGDIGetSystemPaletteEntries; + extern GetDeviceCaps_Type pGDIGetDeviceCaps; + + // The number of static colours should be 20, but inquire it anyway + nStatCols = (*pGDIGetDeviceCaps)(GetDC(0), NUMRESERVED); + + // fix the first nStatCols/2 and the last nStatCols/2 entries + nPalEntries=(*pGDIGetSystemPaletteEntries)(GetDC(0), 0, 256, SysPalEntry); + + for (i = 0; i < 256; i++){ + // skip intermediate un-reserved palette entries + if(i==(nStatCols / 2)) i=256 - (nStatCols / 2); + lpEntry = &lpentries[i]; + if(lpEntry->peFlags==0){ + lpEntry->peRed = SysPalEntry[i].peRed; + lpEntry->peGreen = SysPalEntry[i].peGreen; + lpEntry->peBlue = SysPalEntry[i].peBlue; + } + } + } + for(i = 0; i < dwcount; i ++){ PALETTEENTRY PalColor; PalColor = lpentries[i]; @@ -1087,6 +1115,8 @@ static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper) // IDirectDrawClipper::Release SetHook((void *)(**(DWORD **)lplpDDClipper + 8), extReleaseC, (void **)&pReleaseC, "Release(C)"); + // IDirectDrawClipper::GetClipList + SetHook((void *)(**(DWORD **)lplpDDClipper + 12), extGetClipList, (void **)&pGetClipList, "GetClipList(C)"); if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; // Just proxed ... @@ -1095,8 +1125,6 @@ static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper) SetHook((void *)(**(DWORD **)lplpDDClipper), extQueryInterfaceCProxy, (void **)&pQueryInterfaceC, "QueryInterface(C)"); // IDirectDrawClipper::AddRef SetHook((void *)(**(DWORD **)lplpDDClipper + 4), extAddRefCProxy, (void **)&pAddRefC, "AddRef(C)"); - // IDirectDrawClipper::GetClipList - SetHook((void *)(**(DWORD **)lplpDDClipper + 12), extGetClipListProxy, (void **)&pGetClipList, "GetClipList(C)"); // IDirectDrawClipper::GetHWnd SetHook((void *)(**(DWORD **)lplpDDClipper + 16), extGetHWndProxy, (void **)&pGetHWnd, "GetHWnd(C)"); // IDirectDrawClipper::Initialize @@ -3385,6 +3413,8 @@ HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE #define DDPCAPS_INITIALIZE_LEGACY 0x00000008l +BOOL Has256ColorsPalette = FALSE; + HRESULT WINAPI extCreatePalette(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) { @@ -3394,6 +3424,7 @@ HRESULT WINAPI extCreatePalette(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY if(IsDebug && (dwflags & DDPCAPS_8BIT)) dxw.DumpPalette(256, lpddpa); //if (dwflags & ~(DDPCAPS_PRIMARYSURFACE|DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE_LEGACY)) STOPPER("Palette flags"); + if(dwflags & DDPCAPS_ALLOW256) Has256ColorsPalette = TRUE; if(dxw.dwFlags1 & EMULATESURFACE) dwflags &= ~DDPCAPS_PRIMARYSURFACE; res = (*pCreatePalette)(lpdd, dwflags, lpddpa, lplpddp, pu); @@ -3454,7 +3485,7 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd lpentries = (LPPALETTEENTRY)PaletteEntries; res2=lpddp->GetEntries(0, 0, 256, lpentries); if(res2) OutTraceE("SetPalette: GetEntries ERROR res=%x(%s)\n", res2, ExplainDDError(res2)); - mySetPalette(0, 256, lpentries); // v2.02.76: necessary for "Requiem Avenging Angel" in SURFACEEMULATION mode + mySetPalette(0, 256, lpentries, Has256ColorsPalette); // v2.02.76: necessary for "Requiem Avenging Angel" in SURFACEEMULATION mode } // Apply palette to backbuffer surface. This is necessary on some games: "Duckman private dick", "Total Soccer 2000", ... if (lpDDSBack){ @@ -3490,7 +3521,8 @@ HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dws OutTraceDW("SetEntries: ASSERT start+count > 256\n"); } - mySetPalette(dwstart, dwcount, lpentries); + if(dwflags & DDPCAPS_ALLOW256) Has256ColorsPalette=TRUE; + mySetPalette(dwstart, dwcount, lpentries, Has256ColorsPalette); // GHO: needed for fixed rect and variable palette animations, // e.g. dungeon keeper loading screen, Warcraft II splash, ... @@ -4024,7 +4056,7 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD EmuDesc.ddpfPixelFormat.dwRGBBitCount=SupportedDepths[DepthIdx]; EmuDesc.lPitch=SupportedRes[ResIdx].w * SupportedDepths[DepthIdx] / 8; FixPixelFormat(EmuDesc.ddpfPixelFormat.dwRGBBitCount, &(EmuDesc.ddpfPixelFormat)); - EnumModesCallbackDumper((LPDDSURFACEDESC)&EmuDesc, lpContext); + if(IsDebug) EnumModesCallbackDumper((LPDDSURFACEDESC)&EmuDesc, lpContext); res=(*cb)((LPDDSURFACEDESC)&EmuDesc, lpContext); if(res==DDENUMRET_CANCEL) break; } @@ -4464,6 +4496,59 @@ HRESULT WINAPI extReleaseC(LPDIRECTDRAWCLIPPER lpddClip) return ref; } +HRESULT WINAPI extGetClipList(LPDIRECTDRAWCLIPPER lpddClip, LPRECT lpRect, LPRGNDATA lpRgnData, LPDWORD lpw) +{ + HRESULT res; + + // returned clip region (both RgnData and single RECT array) should be relocated in window mode + // an easy way to do that, though not accurate, is to consider the clip region as the whole virtual screen + // a better way is to use the dxw.UnmapWindow(RECT *) method + // this makes "Full Pipe" working without clipping problems. + + if(IsTraceDDRAW){ + char sInfo[81]; + if (lpRect) sprintf(sInfo, "rect=(%d,%d)-(%d,%d) ", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + else sprintf(sInfo, "rect=(NULL) "); + OutTrace("GetClipList(C): lpddClip=%x %s\n", lpddClip, sInfo); + } + res=(*pGetClipList)(lpddClip, lpRect, lpRgnData, lpw); + if(IsTraceDDRAW){ + if(res) OutTrace("GetClipList(C): ERROR err=%x(%s)\n", res, ExplainDDError(res)); + else{ + if(lpRgnData){ + OutTrace("GetClipList(C): w=%x rgndataheader{size=%d type=%x count=%d RgnSize=%d bound=(%d,%d)-(%d,%d)}\n", + *lpw, lpRgnData->rdh.dwSize, lpRgnData->rdh.iType, lpRgnData->rdh.nCount, lpRgnData->rdh.nRgnSize, + lpRgnData->rdh.rcBound.left, lpRgnData->rdh.rcBound.top, lpRgnData->rdh.rcBound.right, lpRgnData->rdh.rcBound.bottom); + if(dxw.Windowize && (dxw.dwFlags1 & CLIENTREMAPPING)){ + dxw.UnmapWindow(&lpRgnData->rdh.rcBound); + //lpRgnData->rdh.rcBound = dxw.GetScreenRect(); + OutTraceDW("GetClipList(C): w=%x rgndataheader{size=%d type=%x count=%d RgnSize=%d REMAPPED bound=(%d,%d)-(%d,%d)}\n", + *lpw, lpRgnData->rdh.dwSize, lpRgnData->rdh.iType, lpRgnData->rdh.nCount, lpRgnData->rdh.nRgnSize, + lpRgnData->rdh.rcBound.left, lpRgnData->rdh.rcBound.top, lpRgnData->rdh.rcBound.right, lpRgnData->rdh.rcBound.bottom); + } + if(IsDebug){ + RECT *rgns; + rgns = (RECT *)lpRgnData->Buffer; + for(DWORD i=0; irdh.nCount; i++){ + OutTrace("GetClipList(C): rect[%d]=(%d,%d)-(%d,%d)\n", + i, rgns[i].left, rgns[i].top, rgns[i].right, rgns[i].bottom); + if(dxw.Windowize && (dxw.dwFlags1 & CLIENTREMAPPING)){ + dxw.UnmapWindow(&rgns[i]); + //rgns[i] = dxw.GetScreenRect(); + OutTrace("GetClipList(C): REMAPPED rect[%d]=(%d,%d)-(%d,%d)\n", + i, rgns[i].left, rgns[i].top, rgns[i].right, rgns[i].bottom); + } + } + } + } + else{ + OutTrace("GetClipList(C): w=%x\n", *lpw); + } + } + } + return res; +} + HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) { HRESULT res; diff --git a/dll/dinput.cpp b/dll/dinput.cpp index e0518aa..81cbfa9 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -235,6 +235,25 @@ HRESULT WINAPI extDICreateDeviceEx(LPDIRECTINPUT lpdi, REFGUID rguid, return 0; } +/* from MSDN: +cbObjectData + Size of the DIDEVICEOBJECTDATA structure, in bytes. +rgdod + Array of DIDEVICEOBJECTDATA structures to receive the buffered data. + The number of elements in this array must be equal to the value of the pdwInOut parameter. + If this parameter is NULL, the buffered data is not stored anywhere, but all other side effects take place. +pdwInOut + On entry, the number of elements in the array pointed to by the rgdod parameter. + On exit, the number of elements actually obtained. +dwFlags + Flags that control the manner in which data is obtained. + This value can be 0 or the following flag. + + DIGDD_PEEK + Do not remove the items from the buffer. A subsequent IDirectInputDevice8::GetDeviceData call will read the same data. + Normally, data is removed from the buffer after it is read. +*/ + HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPVOID rgdod, LPDWORD pdwinout, DWORD dwflags) { HRESULT res; @@ -242,39 +261,56 @@ HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPVOID unsigned int i; POINT p; - OutTraceDW("GetDeviceData(I): cbdata=%i\n", cbdata); + OutTraceDW("GetDeviceData(I): did=%x cbdata=%i rgdod=%x, inout=%d flags=%x\n", + lpdid, cbdata, rgdod, *pdwinout, dwflags); res = (*pGetDeviceData)(lpdid, cbdata, rgdod, pdwinout, dwflags); - if(res) return res; + if(res) { + OutTraceE("GetDeviceData(I) ERROR: err=%x(%s)\n", res, ExplainDDError(res)); + return res; + } + + if(!dxw.bActive) { + *pdwinout = 0; + return DI_OK; + } + + if(dxw.dwFlags4 & RELEASEMOUSE){ + POINT curr; + RECT client; + extern GetCursorPos_Type pGetCursorPos; + extern GetClientRect_Type pGetClientRect; + extern ScreenToClient_Type pScreenToClient; + (*pGetCursorPos)(&curr); + (*pScreenToClient)(dxw.GethWnd(), &curr); + (*pGetClientRect)(dxw.GethWnd(), &client); + if ((curr.x < client.left) || (curr.y < client.top) || (curr.x > client.right) || (curr.y > client.bottom)){ + *pdwinout = 0; + return DI_OK; + } + } - if(!dxw.bActive) *pdwinout = 0; - GetMousePosition((int *)&p.x, (int *)&p.y); if(cbdata == 20 || cbdata == 24 || cbdata == 16){ tmp = (BYTE *)rgdod; - for(i = 0; i < *pdwinout; i ++){ - if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_X){ - ((LPDIDEVICEOBJECTDATA)tmp)->dwData = p.x; - if(!dxw.bDInputAbs){ - if(p.x < iCurMinX) p.x = iCurMinX; - if(p.x > iCurMaxX) p.x = iCurMaxX; - ((LPDIDEVICEOBJECTDATA)tmp)->dwData = p.x - iCursorXBuf; - iCursorXBuf = p.x; - } + if(dxw.bDInputAbs){ + GetMousePosition((int *)&p.x, (int *)&p.y); + for(i = 0; i < *pdwinout; i ++){ + if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_X)((LPDIDEVICEOBJECTDATA)tmp)->dwData = p.x; + if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_Y)((LPDIDEVICEOBJECTDATA)tmp)->dwData = p.y; + tmp += cbdata; + } + OutTraceB("GetDeviceData(I): ABS mousedata=(%d,%d)\n", p.x, p.y); + } + else{ + for(i = 0; i < *pdwinout; i ++){ + if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_X) OutTraceB("GetDeviceData(I): REL mousedata X=%d\n", ((LPDIDEVICEOBJECTDATA)tmp)->dwData); + if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_Y) OutTraceB("GetDeviceData(I): REL mousedata Y=%d\n", ((LPDIDEVICEOBJECTDATA)tmp)->dwData); + tmp += cbdata; } - if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_Y){ - ((LPDIDEVICEOBJECTDATA)tmp)->dwData = p.y; - if(!dxw.bDInputAbs){ - if(p.y < iCurMinY) p.y = iCurMinY; - if(p.y > iCurMaxY) p.y = iCurMaxY; - ((LPDIDEVICEOBJECTDATA)tmp)->dwData = p.y - iCursorYBuf; - iCursorYBuf = p.y; - } - } - tmp += cbdata; } - OutTraceDW("DEBUG: directinput mousedata=(%d,%d)\n", p.x, p.y); } - return 0; + + return DI_OK; } HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMOUSESTATE lpvdata) @@ -314,7 +350,7 @@ HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMO } if(cbdata == 256 && !dxw.bActive) ZeroMemory(lpvdata, 256); - return 0; + return DI_OK; } //static char *dftype(LPCDIDATAFORMAT lpdf) @@ -356,11 +392,21 @@ static char *didftype(DWORD c) else eb[0]=0; return(eb); } +static char *ExplainDataFormatFlags(DWORD f) +{ + char *s; + s="unknown"; + switch(f){ + case DIDF_ABSAXIS: s="DIDF_ABSAXIS"; + case DIDF_RELAXIS: s="DIDF_RELAXIS"; + } + return s; +} HRESULT WINAPI extSetDataFormat(LPDIRECTINPUTDEVICE lpdid, LPCDIDATAFORMAT lpdf) { - OutTraceDW("SetDataFormat(I): did=%x lpdf=%x size=%d objsize=%d flags=0x%x datasize=%d numobjects=%d\n", - lpdid, lpdf, lpdf->dwSize, lpdf->dwObjSize, lpdf->dwFlags, lpdf->dwDataSize, lpdf->dwNumObjs); + OutTraceDW("SetDataFormat(I): did=%x lpdf=%x size=%d objsize=%d flags=0x%x(%s) datasize=%d numobjects=%d\n", + lpdid, lpdf, lpdf->dwSize, lpdf->dwObjSize, lpdf->dwFlags, ExplainDataFormatFlags(lpdf->dwFlags), lpdf->dwDataSize, lpdf->dwNumObjs); if(IsDebug){ DIOBJECTDATAFORMAT *df; df = lpdf->rgodf; @@ -396,7 +442,7 @@ HRESULT WINAPI extDISetCooperativeLevel(LPDIRECTINPUTDEVICE lpdid, HWND hwnd, DW void GetMousePosition(int *x, int *y) { POINT p; - //GetCursorPos(&p); + extern BOOL WINAPI extGetCursorPos(LPPOINT); extGetCursorPos(&p); *x = p.x; diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 1a1f4ca..463096e 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -951,8 +951,10 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp } break; case WM_ACTIVATE: + // turn DirectInput bActive flag on & off ..... dxw.bActive = (LOWORD(wparam) == WA_ACTIVE || LOWORD(wparam) == WA_CLICKACTIVE) ? 1 : 0; case WM_NCACTIVATE: + // turn DirectInput bActive flag on & off ..... if(message == WM_NCACTIVATE) dxw.bActive = wparam; (*pSetWindowPos)(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); if(dxw.dwFlags1 & UNNOTIFY){ diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index f938518..c6474e8 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -420,6 +420,8 @@ POINT dxwCore::FixCursorPos(POINT prev) POINT curr; RECT rect; extern LPRECT lpClipRegion; + static BOOL IsWithin = TRUE; + static POINT LastPos; curr=prev; @@ -449,6 +451,7 @@ POINT dxwCore::FixCursorPos(POINT prev) } if(dxw.dwFlags4 & RELEASEMOUSE){ +#if 0 if ((curr.x < 0) || (curr.y < 0) || (curr.x > w) || @@ -456,6 +459,28 @@ POINT dxwCore::FixCursorPos(POINT prev) curr.x = w / 2; curr.y = h / 2; } +#else + if ((curr.x < 0) || (curr.y < 0) || (curr.x > w) || (curr.y > h)){ + if(IsWithin){ + int RestX, RestY; + RestX = w ? ((CLIP_TOLERANCE * w) / dxw.GetScreenWidth()) + 2 : CLIP_TOLERANCE + 2; + RestY = h ? ((CLIP_TOLERANCE * h) / dxw.GetScreenHeight()) + 2 : CLIP_TOLERANCE + 2; + if (curr.x < 0) curr.x = RestX; + if (curr.y < 0) curr.y = RestY; + if (curr.x > w) curr.x = w - RestX; + if (curr.y > h) curr.y = h - RestY; + LastPos = curr; + IsWithin = FALSE; + } + else{ + curr = LastPos; + } + } + else{ + IsWithin = TRUE; + LastPos = curr; + } +#endif } else { if (curr.x < 0) curr.x = 0; @@ -833,6 +858,19 @@ void dxwCore::MapWindow(LPPOINT lppoint) lppoint->y = upleft.y + (((lppoint->y * client.bottom) + (dwScreenHeight >> 1)) / dwScreenHeight); } +void dxwCore::UnmapWindow(LPRECT rect) +{ + RECT client; + POINT upleft = {0,0}; + if(!(*pGetClientRect)(hWnd, &client)) return; + (*pClientToScreen)(hWnd, &upleft); + if((client.right == 0) || (client.bottom == 0)) return; + rect->left= ((rect->left - upleft.x) * (int)dwScreenWidth) / client.right; + rect->top= ((rect->top - upleft.y) * (int)dwScreenHeight) / client.bottom; + rect->right= ((rect->right - upleft.x) * (int)dwScreenWidth) / client.right; + rect->bottom= ((rect->bottom - upleft.y) * (int)dwScreenHeight) / client.bottom; +} + POINT dxwCore::ClientOffset(HWND hwnd) { RECT desktop; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index a0f9c93..6a36e70 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -63,6 +63,7 @@ public: // methods void MapWindow(LPPOINT); void MapWindow(LPRECT); void MapWindow(int *, int *, int *, int *); + void UnmapWindow(LPRECT); void FixWorkarea(LPRECT); RECT GetScreenRect(void); RECT GetUnmappedScreenRect(); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 2f4d241..9930e02 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.11" +#define VERSION "2.03.12" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 46899f7edb7ea9a41c76bec77617e006610a82f3..dee11846da985bd257cb2e26562459dbe4f033d4 100644 GIT binary patch literal 97280 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 U@P_#PPR0zt|Lv-j%>FO-Ps&pBV*mgE literal 93696 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
_#PUJa@kQf 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 + + diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 2a175a8..0ea3fd9 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -37,6 +37,20 @@ BOOL WINAPI extExtTextOutA(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, cons ExtTextOutW_Type pExtTextOutW = NULL; ExtTextOutA_Type pExtTextOutA = NULL; +/* +typedef COLORREF (WINAPI *SetBkColor_Type)(HDC, COLORREF); +typedef COLORREF (WINAPI *SetTextColor_Type)(HDC hdc, COLORREF crColor); +typedef int (WINAPI *SetBkMode_Type)(HDC, int); + +SetBkColor_Type pSetBkColor = NULL; +SetTextColor_Type pSetTextColor = NULL; +SetBkMode_Type pSetBkMode = NULL; + +COLORREF WINAPI extSetBkColor(HDC, COLORREF); +COLORREF WINAPI extSetTextColor(HDC hdc, COLORREF crColor); +int WINAPI extSetBkMode(HDC, int); +*/ + static HookEntry_Type Hooks[]={ {HOOK_IAT_CANDIDATE, "GetDeviceCaps", (FARPROC)GetDeviceCaps, (FARPROC *)&pGDIGetDeviceCaps, (FARPROC)extGetDeviceCaps}, @@ -155,6 +169,15 @@ static HookEntry_Type FontHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; +/* +static HookEntry_Type LockWHooks[]={ + {HOOK_HOT_CANDIDATE, "SetBkColor", (FARPROC)SetBkColor, (FARPROC *)&pSetBkColor, (FARPROC)extSetBkColor}, + {HOOK_HOT_CANDIDATE, "SetBkMode", (FARPROC)SetBkMode, (FARPROC *)&pSetBkMode, (FARPROC)extSetBkMode}, + {HOOK_HOT_CANDIDATE, "SetTextColor", (FARPROC)SetTextColor, (FARPROC *)&pSetTextColor, (FARPROC)extSetTextColor}, + {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator +}; +*/ + extern HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *); extern HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *, LPDIRECTDRAW FAR *, REFIID, IUnknown FAR *); @@ -168,6 +191,7 @@ void HookGDI32Init() HookLibInit(EmulateHooks); HookLibInit(TextHooks); HookLibInit(GammaHooks); + //HookLibInit(LockWHooks); } void HookGDI32(HMODULE module) @@ -182,6 +206,7 @@ void HookGDI32(HMODULE module) if (dxw.dwFlags2 & DISABLEGAMMARAMP) HookLibrary(module, GammaHooks, libname); // v2.02.33 - for "Stratego" compatibility option if(dxw.dwFlags3 & FONTBYPASS) HookLibrary(module, FontHooks, libname); + //if(1) HookLibrary(module, LockWHooks, libname); } FARPROC Remap_GDI32_ProcAddress(LPCSTR proc, HMODULE hModule) @@ -198,6 +223,7 @@ FARPROC Remap_GDI32_ProcAddress(LPCSTR proc, HMODULE hModule) if (dxw.dwFlags2 & DISABLEGAMMARAMP) if(addr=RemapLibrary(proc, hModule, GammaHooks)) return addr; // v2.02.33 - for "Stratego" compatibility option if (dxw.dwFlags3 & FONTBYPASS) if(addr=RemapLibrary(proc, hModule, FontHooks)) return addr; + //if (1) if(addr=RemapLibrary(proc, hModule, LockWHooks)) return addr; return NULL; } @@ -338,7 +364,7 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) case RASTERCAPS: if(dxw.dwFlags2 & INIT8BPP) { res |= RC_PALETTE; // v2.02.12 - OutTraceDW("GetDeviceCaps: fix(2) RASTERCAPS setting RC_PALETTE cap=%x\n",res); + OutTraceDW("GetDeviceCaps: fix(2) RASTERCAPS setting RC_PALETTE cap=%x\n", res); } break; case BITSPIXEL: @@ -346,7 +372,7 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix if(dxw.dwFlags2 & INIT8BPP) res = 8; if(dxw.dwFlags2 & INIT16BPP) res = 16; - OutTraceDW("GetDeviceCaps: fix(2) BITSPIXEL/COLORRES cap=%d\n",res); + OutTraceDW("GetDeviceCaps: fix(2) BITSPIXEL/COLORRES cap=%d\n", res); } break; //case NUMCOLORS: // numcolors windows bug fix.... @@ -369,15 +395,15 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) if(dxw.VirtualPixelFormat.dwRGBBitCount!=0) res = dxw.VirtualPixelFormat.dwRGBBitCount; if(dxw.dwFlags2 & INIT8BPP) res = 8; if(dxw.dwFlags2 & INIT16BPP) res = 16; - if(PrevRes != res) OutTraceDW("GetDeviceCaps: fix(3) BITSPIXEL/COLORRES cap=%d\n",res); + if(PrevRes != res) OutTraceDW("GetDeviceCaps: fix(3) BITSPIXEL/COLORRES cap=%d\n", res); break; case SIZEPALETTE: res = 256; - OutTraceDW("GetDeviceCaps: fix(3) SIZEPALETTE cap=%x\n",res); + OutTraceDW("GetDeviceCaps: fix(3) SIZEPALETTE cap=%x\n", res); break; case NUMRESERVED: res = 0; - OutTraceDW("GetDeviceCaps: fix(3) NUMRESERVED cap=%x\n",res); + OutTraceDW("GetDeviceCaps: fix(3) NUMRESERVED cap=%x\n", res); break; } } @@ -493,14 +519,14 @@ BOOL WINAPI extAnimatePalette(HPALETTE hpal, UINT iStartIndex, UINT cEntries, co UINT WINAPI extRealizePalette(HDC hdc) { UINT ret; - extern void mySetPalette(int, int, LPPALETTEENTRY); + extern void mySetPalette(int, int, LPPALETTEENTRY, BOOL); OutTraceDW("GDI.RealizePalette: hdc=%x\n", hdc); if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ PALETTEENTRY PalEntries[256]; UINT nEntries; nEntries=GetPaletteEntries(hDesktopPalette, 0, 256, PalEntries); - mySetPalette(0, nEntries, PalEntries); + mySetPalette(0, nEntries, PalEntries, TRUE); // ?? if(IsDebug) dxw.DumpPalette(nEntries, PalEntries); ret=DD_OK; } @@ -1868,6 +1894,36 @@ BOOL WINAPI extExtTextOutW(HDC hdc, int X, int Y, UINT fuOptions, const RECT *lp } #if 0 +COLORREF WINAPI extSetBkColor(HDC hdc, COLORREF crColor) +{ + OutTrace("SetBkColor: hdc=%x color=%x\n", hdc, crColor); + if(dxw.Windowize && dxw.IsRealDesktop(WindowFromDC(hdc))) { + OutTrace("Remap desktop hdc=%x->%x\n", hdc, GetDC(dxw.GethWnd())); + hdc=GetDC(dxw.GethWnd()); + } + return (*pSetBkColor)(hdc, crColor); +} + +int WINAPI extSetBkMode(HDC hdc, int iBkMode) +{ + OutTrace("SetBkMode: hdc=%x bkmode=%x\n", hdc, iBkMode); + if(dxw.Windowize && dxw.IsRealDesktop(WindowFromDC(hdc))) { + OutTrace("Remap desktop hdc=%x->%x\n", hdc, GetDC(dxw.GethWnd())); + hdc=GetDC(dxw.GethWnd()); + } + return (*pSetBkMode)(hdc, iBkMode); +} + +COLORREF WINAPI extSetTextColor(HDC hdc, COLORREF crColor) +{ + OutTrace("SetTextColor: hdc=%x color=%x\n", hdc, crColor); + if(dxw.Windowize && dxw.IsRealDesktop(WindowFromDC(hdc))) { + OutTrace("Remap desktop hdc=%x->%x\n", hdc, GetDC(dxw.GethWnd())); + hdc=GetDC(dxw.GethWnd()); + } + return (*pSetTextColor)(hdc, crColor); +} + // unhooked, since quite surprisingly all rectangles showed properly scaled already in RollerCoaster Tycoon !! DWORD WINAPI extGetRegionData(HRGN hRgn, DWORD dwCount, LPRGNDATA lpRgnData) { diff --git a/dll/hexdump.cpp b/dll/hexdump.cpp new file mode 100644 index 0000000..79037d5 --- /dev/null +++ b/dll/hexdump.cpp @@ -0,0 +1,22 @@ +#define _CRT_SECURE_NO_WARNINGS +#include "stdio.h" +#include "string.h" + +#define MAX_HEXDUMP 512 + +char *hexdump(unsigned char *Buffer, int len) +{ + static char sHexBuffer[3*MAX_HEXDUMP+12]; + char *s; + int iMaxI; + s=sHexBuffer; + iMaxI = len; + if(iMaxI > MAX_HEXDUMP) iMaxI = MAX_HEXDUMP; + for (int i=0; i iMaxI) strcpy(s, ",..."); + return sHexBuffer; +} \ No newline at end of file diff --git a/dll/user32.cpp b/dll/user32.cpp index f1721e1..98742b7 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -58,7 +58,7 @@ static HookEntry_Type Hooks[]={ {HOOK_HOT_CANDIDATE, "SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA}, {HOOK_HOT_CANDIDATE, "SystemParametersInfoW", (FARPROC)SystemParametersInfoW, (FARPROC *)&pSystemParametersInfoW, (FARPROC)extSystemParametersInfoW}, //{HOOK_HOT_CANDIDATE, "GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow}, - //{HOOK_HOT_CANDIDATE, "GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, + //{HOOK_HOT_CANDIDATE, "GetForegroundWindow", (FARPROC)GetForegroundWindow, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, //{HOOK_IAT_CANDIDATE, "GetWindowTextA", (FARPROC)GetWindowTextA, (FARPROC *)&pGetWindowTextA, (FARPROC)extGetWindowTextA}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -1054,6 +1054,7 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT UINT pi; int ret; // a rarely used API, but responsible for a painful headache: needs hooking for "Commandos 2", "Alien Nations". + // used also in "Full Pipe" activemovie OutTraceDW("MapWindowPoints: hWndFrom=%x%s hWndTo=%x%s cPoints=%d FullScreen=%x\n", hWndFrom, dxw.IsDesktop(hWndFrom)?"(DESKTOP)":"", @@ -1070,9 +1071,14 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT if(dxw.IsRealDesktop(hWndFrom)) hWndFrom=dxw.GethWnd(); } - // should scale the retcode ??? + // should scale the retcode and every point ??? ret=(*pMapWindowPoints)(hWndFrom, hWndTo, lpPoints, cPoints); + if(IsDebug){ + OutTrace("Mapped points: "); + for(pi=0; pi>16, ret&0x0000FFFF); return ret; } @@ -2574,18 +2580,22 @@ HWND WINAPI extGetActiveWindow(void) { HWND ret; ret=(*pGetActiveWindow)(); - OutTraceDW("GetActiveWindow: ret=%x->%x\n", ret, dxw.GethWnd()); - //STOPPER("GetActiveWindow"); - return dxw.GethWnd(); + if(dxw.Windowize && dxw.IsFullScreen()) { + OutTraceDW("GetActiveWindow: ret=%x->%x\n", ret, dxw.GethWnd()); + return dxw.GethWnd(); + } + return ret; } HWND WINAPI extGetForegroundWindow(void) { HWND ret; ret=(*pGetForegroundWindow)(); - OutTraceDW("GetForegroundWindow: ret=%x->%x\n", ret, dxw.GethWnd()); - //STOPPER("GetForegroundWindow"); - return dxw.GethWnd(); + if(dxw.Windowize && dxw.IsFullScreen()) { + OutTraceDW("GetForegroundWindow: ret=%x->%x\n", ret, dxw.GethWnd()); + return dxw.GethWnd(); + } + return ret; } BOOL WINAPI extIsWindowVisible(HWND hwnd) diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp index dad2886..17e1de6 100644 --- a/host/TabProgram.cpp +++ b/host/TabProgram.cpp @@ -63,26 +63,42 @@ END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTabProgram message handlers +extern void GetFolderFromPath(char *); + void CTabProgram::OnOpen() { // TODO: Please add your control notification handler code here char path[MAX_PATH]; + extern char *gInitFilePath; CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); cTarget->m_File.GetWindowText(path, MAX_PATH); + GetPrivateProfileString("window", "exepath", ".", path, MAX_PATH, gInitFilePath); CFileDialog dlg( TRUE, "*.*", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Program (*.exe)|*.exe|All Files (*.*)|*.*||", this); - if( dlg.DoModal() == IDOK) cTarget->m_File.SetWindowText(dlg.GetPathName()); + if( dlg.DoModal() == IDOK) { + cTarget->m_File.SetWindowText(dlg.GetPathName()); + strcpy(path, dlg.GetPathName()); + GetFolderFromPath(path); + WritePrivateProfileString("window", "exepath", path, gInitFilePath); + } } void CTabProgram::OnOpenLaunch() { // TODO: Please add your control notification handler code here char path[MAX_PATH]; + extern char *gInitFilePath; CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); cTarget->m_File.GetWindowText(path, MAX_PATH); + GetPrivateProfileString("window", "exepath", NULL, path, MAX_PATH, gInitFilePath); CFileDialog dlg( TRUE, "*.*", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Program (*.exe)|*.exe|All Files (*.*)|*.*||", this); - if( dlg.DoModal() == IDOK) cTarget->m_Launch.SetWindowText(dlg.GetPathName()); + if( dlg.DoModal() == IDOK) { + cTarget->m_Launch.SetWindowText(dlg.GetPathName()); + strcpy(path, dlg.GetPathName()); + GetFolderFromPath(path); + WritePrivateProfileString("window", "exepath", path, gInitFilePath); + } } BOOL CTabProgram::OnInitDialog() diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 1321bf443cdcdced4824e18fc6b6a8ab818d43e6..d8532fe73cf7e7db0c5e1a76d98b5c4cd04d622a 100644 GIT binary patch delta 1624 zcmY+CZBSHY6vv-)ciD9bnT=K$mgTL{T#Ot7#D<;_>X`ts`xCBxx zHsHArK4L)q3b?bVeVPoVdY0T)=wHoJv=}ll>Vjq1ZKAI=4yeK#4oJkQ<)Fuq1K!6% z7nrc92rO7x0z2>x6PR(Z1ir^vi?(*g2~${8K*BpNaC7c07Yt&#iGun{p&Jv5$-1L} zz8qy_?JUza^WD(H7rN?(nhFpDnLRL`PWAT-@Q<15Z&zTR>o4O<{drocKmDoH+XiV- zpGZ;a4|b(~`-tRAJ?6K8bm8dR&C-}o&e&;9l7#Y!sUNdmey=+V^5v24ocR9??{xS6 zzkN$Khm#^jJ1Zr*C~T8MyUn!3Kl|9z7D+)l`phRPUE4LT(#72~Dh;%bs1)AgR_X4Z z%_=#cy{1rP)pPsQz{tlhxIvwoU;Ivz|9a^GrIkuS&VDr`;(0koH9%A3#J&&IMK~JS z-nKzg&PLAeFVmE-afZ@6xO@{edQp<05UZpMk{3oF%@p>WX@IaY=>v zQcel3R<`Aupmz83OSBMls%ith;l&?F{;cysm7<+?l{R;2vtXAt8(yMVmv+XMgX#mz zfh8JL=}|T7;X|6|l_l!eD025uDBcz}39*u1yj#=?2h~_i`5)v7vmUFerCh^h8iWNl zc%%%;ufuk(0X@FUH57+~TrCE?!L>F1_ySmsZ&Hxw9)W4wrF31CppZbSOT;-nSPj!U zAr2&C;&O8CjTa(d6?l@J39AGSG4$jJyvdNYUf?`~e*>k}5X^3+G=|C|fsG7PE`c2k zf0R?s;$$1;Fa)Y8hd{D>@KQM)*GJEC-9u5eH2l04*FFwgjCP9<7rg?5G}J}?0#7qI zUlTaY5DEyKtd&xYWD`9>^3_vwEsR{Bf$8Q|PZ?5nz3D1wxO?ZWcf(bf`Rt&7PPT;~gxmd`X zqoW)6LL{_MGpViQ#^`KKX{IKoDRwj9utDANQj^J-;k1?6fI)4ij+$RnR3$4P@U*6Q zsPWa)W7$e5sezx5V6s74r|To|ZIaS(ZKIT|yQOpw8AB9qaRPQUlKC>hNd}t>aEPIo z;3k8<3~-(y&kdO7C8(+ZEM!<#NjGrNb$+Cmc$k_Fo*sUJvKZ`Dbd^$)JL#ygCn=Ao x{%w@UFj_--O$4Dv%4;Iuk!B&zdEwapbmJKPBRyXLepoGK>)a!NUsp@%{{q-y3n~Br delta 19209 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 J=Xa**{{iyI+VcPa diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index b6c1e003ae6ce0ff4d2c5c7c42b9a5b04342eb39..1261f5cb814a6adcda9d79618330257f693306e4 100644 GIT binary patch delta 8018 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 C6dh{- delta 8558 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 diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 09c3231..b8706c8 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -81,6 +81,11 @@ static char *Unescape(char *s) return tmp; } +void GetFolderFromPath(char *path) +{ + for(char *c=&path[strlen(path)-1]; (c>path) && (*c!='\\'); c--) *c=0; +} + ///////////////////////////////////////////////////////////////////////////// // CDxwndhostView @@ -869,6 +874,8 @@ void CDxwndhostView::OnDraw(CDC* pDC) ASSERT_VALID(pDoc); } +char *gInitFilePath; + void CDxwndhostView::OnInitialUpdate() { CListView::OnInitialUpdate(); @@ -905,6 +912,7 @@ void CDxwndhostView::OnInitialUpdate() GetCurrentDirectory(MAX_PATH, InitPath); strcat_s(InitPath, sizeof(InitPath), "\\"); strcat_s(InitPath, sizeof(InitPath), m_ConfigFileName); + gInitFilePath = InitPath; listctrl.InsertColumn(0, &listcol); for(i = 0; i < MAXTARGETS; i ++){ @@ -958,7 +966,7 @@ void CDxwndhostView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) *pResult = 0; } -static char ImportExportPath[4096] = {0}; +//static char ImportExportPath[4096] = {0}; void CDxwndhostView::OnExport() { @@ -969,12 +977,19 @@ void CDxwndhostView::OnExport() if(!listctrl.GetSelectedCount()) return; pos = listctrl.GetFirstSelectedItemPosition(); i = listctrl.GetNextSelectedItem(pos); - //path[0]=0; - strcpy_s(path, MAX_PATH, TitleMaps[i].title); + GetPrivateProfileString("window", "exportpath", ".\\", path, MAX_PATH, InitPath); + //strcat_s(path, MAX_PATH, "\\"); + strcat_s(path, MAX_PATH, TitleMaps[i].title); CFileDialog dlg( FALSE, "*.dxw", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "dxwnd task config (*.dxw)|*.dxw|All Files (*.*)|*.*||", this); - if( dlg.DoModal() == IDOK) - SaveConfigItem(&TargetMaps[i], &TitleMaps[i], 0, dlg.GetPathName().GetBuffer()); + if( dlg.DoModal() == IDOK) { + strcpy(path, dlg.GetPathName().GetBuffer()); + //MessageBox(path, "PathName", MB_OK); + SaveConfigItem(&TargetMaps[i], &TitleMaps[i], 0, path); + GetFolderFromPath(path); + //MessageBox(path, "FolderPath", MB_OK); + WritePrivateProfileString("window", "exportpath", path, InitPath); + } } void CDxwndhostView::OnImport() @@ -982,6 +997,7 @@ void CDxwndhostView::OnImport() LV_ITEM listitem; int i; char path[MAX_PATH]; + char ImportExportPath[4096] = {0}; for (i=0; strlen(TargetMaps[i].path) && iInitDevMode); } + //GetPrivateProfileString("window", "exportpath", ".", path, MAX_PATH, InitPath); + //strcat_s(path, MAX_PATH, "\\"); + //strcat_s(path, MAX_PATH, TitleMaps[i].title); + //CFileDialog dlg( FALSE, "*.dxw", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, + // "dxwnd task config (*.dxw)|*.dxw|All Files (*.*)|*.*||", this); + //if( dlg.DoModal() == IDOK) { + // SaveConfigItem(&TargetMaps[i], &TitleMaps[i], 0, dlg.GetPathName().GetBuffer()); + // WritePrivateProfileString("window", "exportpath", dlg.GetFolderPath(), InitPath); + //} + + void CDxwndhostView::OnAdd() {