diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 32d12bf..54565fd 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -144,6 +144,7 @@ #define HOTPATCHALWAYS 0x10000000 // Force hot patching to every call #define NOD3DRESET 0x20000000 // Disables D3D8/9 D3DDevice::Reset method #define OVERRIDEREGISTRY 0x40000000 // same as EMULATEREGISTRY, but fake keys takeprecedence +#define HIDECDROMEMPTY 0x80000000 // hide empty CDROM drivers // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/Resources_CN.dll b/build/Resources_CN.dll new file mode 100644 index 0000000..87dc011 --- /dev/null +++ b/build/Resources_CN.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b29905bf73aea4baf7a3ca50fc224d6e6f33478efcd19c06230439d48499ed54 +size 125952 diff --git a/build/dxwnd.cn.bat b/build/dxwnd.cn.bat new file mode 100644 index 0000000..ff63282 --- /dev/null +++ b/build/dxwnd.cn.bat @@ -0,0 +1,2 @@ +echo off +start "" "dxwnd.exe" "/lang=cn" \ No newline at end of file diff --git a/build/dxwnd.cn.lnk b/build/dxwnd.cn.lnk new file mode 100644 index 0000000..32ee7b1 Binary files /dev/null and b/build/dxwnd.cn.lnk differ diff --git a/build/dxwnd.dll b/build/dxwnd.dll index c15b3e3..577bd21 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0552e42ae11b81672959e1b316db09614269737d6e12393f0bd473b140ce6d50 -size 487424 +oid sha256:512069ae0535b5c459f092824da7d559e7950574c161c31657fdcbc739a29f93 +size 489472 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 8fd0f19..b575366 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d25ed7d43c0672c5ce69054896578802218de233bbc82f22b392c3406e56915f -size 540160 +oid sha256:c06874fa4dbb6cee68cbee26cbb5510526ed30c895494280e8d365a0fdb7ce56 +size 547328 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 2f9754f..bbea89f 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -3,3 +3,35 @@ timetoggle=0x72 altf4=0x73 timeslow=0x74 timefast=0x75 +[window] +posx=709 +posy=406 +sizx=320 +sizy=200 +[target] +title0=Conflict Zone +path0=D:\Games\Conflict Zone\Conflict zone.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217760 +flagg0=1207959552 +flagh0=20 +flagi0=4194308 +tflag0=64 +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/Actua Soccer 3.dxw b/build/exports/Actua Soccer 3.dxw index ba11b10..d912d17 100644 --- a/build/exports/Actua Soccer 3.dxw +++ b/build/exports/Actua Soccer 3.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=939524146 +flag0=671088674 flagg0=1207959552 -flagh0=16 -flagi0=138412036 +flagh0=20 +flagi0=4 tflag0=0 initx0=0 inity0=0 @@ -22,6 +22,3 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -launchpath0= -winver0=0 -maxres0=0 diff --git a/build/exports/Battle Realms.dxw b/build/exports/Battle Realms.dxw deleted file mode 100644 index 2ab1589..0000000 --- a/build/exports/Battle Realms.dxw +++ /dev/null @@ -1,27 +0,0 @@ -[target] -title0=Battle Realms -path0=D:\Games\Battle Realms\Battle_Realms_F.exe -launchpath0= -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=150994976 -flagg0=1207959552 -flagh0=20 -flagi0=138412036 -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/Darkened Skye.dxw b/build/exports/Darkened Skye.dxw index ac9f547..8aa2c65 100644 --- a/build/exports/Darkened Skye.dxw +++ b/build/exports/Darkened Skye.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=679493664 flagg0=1207959552 flagh0=65556 -flagi0=69206020 +flagi0=4 tflag0=0 initx0=0 inity0=0 @@ -24,4 +24,3 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 -launchpath0= diff --git a/build/exports/Diablo.dxw b/build/exports/Diablo.dxw index 0878981..63c7691 100644 --- a/build/exports/Diablo.dxw +++ b/build/exports/Diablo.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=1 coord0=0 flag0=138428450 -flagg0=1242562576 +flagg0=1108344848 flagh0=20 -flagi0=4194304 +flagi0=0 tflag0=0 initx0=0 inity0=0 @@ -22,6 +22,3 @@ sizx0=640 sizy0=480 maxfps0=0 initts0=0 -launchpath0= -winver0=0 -maxres0=0 diff --git a/build/exports/Dungeon Keeper II.dxw b/build/exports/Dungeon Keeper II.dxw index 8f1b938..3b5d517 100644 --- a/build/exports/Dungeon Keeper II.dxw +++ b/build/exports/Dungeon Keeper II.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=0 coord0=0 flag0=16418 -flagg0=708837376 +flagg0=574619648 flagh0=20 -flagi0=4194304 +flagi0=0 tflag0=263 initx0=0 inity0=0 @@ -22,6 +22,3 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -launchpath0= -winver0=0 -maxres0=0 diff --git a/build/exports/Hollywood Monsters.dxw b/build/exports/Hollywood Monsters.dxw index 0b4df23..797fac0 100644 --- a/build/exports/Hollywood Monsters.dxw +++ b/build/exports/Hollywood Monsters.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=134217762 flagg0=1209008384 flagh0=20 -flagi0=4194308 +flagi0=4 tflag0=64 initx0=0 inity0=0 @@ -24,4 +24,3 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 -launchpath0= diff --git a/build/exports/International Football 2000.dxw b/build/exports/International Football 2000.dxw index 38f1700..e3b9a31 100644 --- a/build/exports/International Football 2000.dxw +++ b/build/exports/International Football 2000.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=150994976 flagg0=1207959552 flagh0=20 -flagi0=4194308 +flagi0=4 tflag0=259 initx0=0 inity0=0 @@ -22,6 +22,3 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -launchpath0=D:\Games\International Football 2000\MSIF2000.EXE -winver0=0 -maxres0=0 diff --git a/build/exports/Kohan II Kings of War.dxw b/build/exports/Kohan II Kings of War.dxw index 5fbec8c..ce7caaa 100644 --- a/build/exports/Kohan II Kings of War.dxw +++ b/build/exports/Kohan II Kings of War.dxw @@ -8,8 +8,8 @@ coord0=0 flag0=134217762 flagg0=1207959552 flagh0=20 -flagi0=4194308 -tflag0=0 +flagi0=1028 +tflag0=6163 initx0=0 inity0=0 minx0=0 @@ -22,6 +22,3 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -launchpath0= -winver0=0 -maxres0=0 diff --git a/build/exports/Magic & Mayhem.dxw b/build/exports/Magic & Mayhem.dxw index e07a544..8e8066e 100644 --- a/build/exports/Magic & Mayhem.dxw +++ b/build/exports/Magic & Mayhem.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=0 coord0=0 flag0=138428450 -flagg0=201326592 -flagh0=20 -flagi0=4194304 +flagg0=1275068416 +flagh0=8388628 +flagi0=0 tflag0=259 initx0=0 inity0=0 @@ -22,6 +22,3 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -launchpath0= -winver0=0 -maxres0=0 diff --git a/build/exports/O.R.B. Offword Rescue Base.dxw b/build/exports/O.R.B. Offword Rescue Base.dxw index 62d09dd..245e8c7 100644 --- a/build/exports/O.R.B. Offword Rescue Base.dxw +++ b/build/exports/O.R.B. Offword Rescue Base.dxw @@ -4,11 +4,11 @@ path0=D:\Games\O.R.B\orb.exe module0= opengllib0= ver0=0 -coord0=0 +coord0=2 flag0=134234144 -flagg0=1207959552 +flagg0=1207959568 flagh0=20 -flagi0=4194308 +flagi0=4 tflag0=6163 initx0=0 inity0=0 @@ -24,4 +24,3 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 -launchpath0= diff --git a/build/exports/Railroad Tycoon II.dxw b/build/exports/Railroad Tycoon II.dxw index 6269c50..c3cb149 100644 --- a/build/exports/Railroad Tycoon II.dxw +++ b/build/exports/Railroad Tycoon II.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134219810 -flagg0=135266304 +flag0=2082 +flagg0=143654912 flagh0=16 -flagi0=4194304 +flagi0=0 tflag0=0 initx0=0 inity0=0 @@ -22,6 +22,3 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -launchpath0= -winver0=0 -maxres0=0 diff --git a/build/exports/Rollcage 2 (D3D).dxw b/build/exports/Rollcage 2 (D3D).dxw index 040fa26..62cb48f 100644 --- a/build/exports/Rollcage 2 (D3D).dxw +++ b/build/exports/Rollcage 2 (D3D).dxw @@ -10,7 +10,7 @@ flag0=134217760 flagg0=134217728 flagh0=20 flagi0=138412036 -tflag0=0 +tflag0=6147 initx0=0 inity0=0 minx0=0 diff --git a/build/exports/Total Annihilation Kingdoms.dxw b/build/exports/Total Annihilation Kingdoms.dxw index 05427b2..bf596e7 100644 --- a/build/exports/Total Annihilation Kingdoms.dxw +++ b/build/exports/Total Annihilation Kingdoms.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=671105058 -flagg0=1207959568 +flag0=134234146 +flagg0=1073741840 flagh0=16 -flagi0=4194304 +flagi0=0 tflag0=0 initx0=0 inity0=0 @@ -22,6 +22,3 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -launchpath0= -winver0=0 -maxres0=0 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index 52a2141..c739d0d 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1393 -posy=159 -sizx=455 -sizy=708 +posx=1289 +posy=149 +sizx=465 +sizy=382 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index c475179..cdd9b97 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -524,4 +524,11 @@ ole32, user32 API hot patched handling of DWL_DLGPROC message v2.02.79 -fix: recovered capability to "pin" ddraw and d3d calls \ No newline at end of file +fix: recovered capability to "pin" ddraw and d3d calls + +v2.02.80 +Preliminary multilanguage release, english and chinese, many thanks to gsky916 support +fixed Sleep bug for small delays and accelerated timeshift: fixes "Wind Fantasy SP" reported bug +added log for DirectInput::SetCooperativeLevel flags +fixed flip emulation mode when backbuffer is lost: fixes cursor problems in "HellCopter" +fixed Pitch setting in DirectDraw::EnumDisplayModes when in SVGA emulation mode. Let "Outlive" use this setting \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 4180c8e..abca7d7 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -3351,20 +3351,35 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0); if(dxw.dwFlags4 & NOFLIPEMULATION){ + HRESULT res2; // create a temporary working surface memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = SurfaceDescrSize(lpdds); - (*pGetSurfaceDescMethod(lpdds))((LPDIRECTDRAWSURFACE2)lpDDSBack, &ddsd); - ddsd.dwFlags &= ~DDSD_PITCH; - res=(*pCreateSurfaceMethod(lpdds))(lpPrimaryDD, &ddsd, &lpddsTmp, NULL); - if(res) OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + // v2.02.80: the BackBuffer may not exist? see "HellCopter" + if(lpDDSBack){ + (*pGetSurfaceDescMethod(lpdds))((LPDIRECTDRAWSURFACE2)lpDDSBack, &ddsd); + ddsd.dwFlags &= ~DDSD_PITCH; + } + else{ + ddsd.dwFlags = (DDSD_HEIGHT | DDSD_WIDTH | DDSD_CAPS); + ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN); + ddsd.dwHeight = dxw.GetScreenHeight(); + ddsd.dwWidth = dxw.GetScreenWidth(); + } + res2=(*pCreateSurfaceMethod(lpdds))(lpPrimaryDD, &ddsd, &lpddsTmp, NULL); + if(res2) { + OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__); + OutTrace("Size=%d lpPrimaryDD=%x lpDDSBack=%x\n", ddsd.dwSize, lpPrimaryDD, lpDDSBack); + LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[FlipBuf]", __LINE__); + //dxw.dwFlags4 &= ~NOFLIPEMULATION; + } //OutTrace("DEBUG: copied surface size=(%dx%d)\n", ddsd.dwWidth, ddsd.dwHeight); // copy front buffer if(dxw.dwFlags1 & EMULATESURFACE){ // in emulated mode, the primary surface is virtual and you can pick it all // needed for "Gruntz" - res= (*pBlt)(lpddsTmp, NULL, lpdds, NULL, DDBLT_WAIT, NULL); - if(res) BlitError(res, NULL, NULL, __LINE__); + res2= (*pBlt)(lpddsTmp, NULL, lpdds, NULL, DDBLT_WAIT, NULL); + if(res2) BlitError(res2, NULL, NULL, __LINE__); } else { // in no-emulated mode, the primary surface is the whole screen, so you have to pick... @@ -3374,8 +3389,8 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, clip=dxw.GetScreenRect(); else clip=dxw.GetUnmappedScreenRect(); - res= (*pBlt)(lpddsTmp, NULL, lpdds, &clip, DDBLT_WAIT, NULL); - if(res) BlitError(res, &clip, NULL, __LINE__); + res2= (*pBlt)(lpddsTmp, NULL, lpdds, &clip, DDBLT_WAIT, NULL); + if(res2) BlitError(res2, &clip, NULL, __LINE__); } } @@ -3404,9 +3419,10 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, } if(dxw.dwFlags4 & NOFLIPEMULATION){ + HRESULT res2; // restore flipped backbuffer and delete temporary surface - res= (*pBlt)(lpddssrc, NULL, lpddsTmp, NULL, DDBLT_WAIT, NULL); - if(res) OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); + res2= (*pBlt)(lpddssrc, NULL, lpddsTmp, NULL, DDBLT_WAIT, NULL); + if(res2) OutTraceE("Blt: ERROR %x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__); (*pReleaseS)(lpddsTmp); } @@ -4114,6 +4130,7 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD EmuDesc.ddpfPixelFormat.dwFlags=DDPF_RGB; for (DepthIdx=0; SupportedDepths[DepthIdx]; DepthIdx++) { EmuDesc.ddpfPixelFormat.dwRGBBitCount=SupportedDepths[DepthIdx]; + EmuDesc.lPitch=SupportedRes[ResIdx].w * SupportedDepths[DepthIdx] / 8; FixPixelFormat(EmuDesc.ddpfPixelFormat.dwRGBBitCount, &(EmuDesc.ddpfPixelFormat)); res=(*cb)((LPDDSURFACEDESC)&EmuDesc, lpContext); OutTraceDW("EnumDisplayModes(D): proposed depth[%d]=%d size[%d]=(%d,%d) res=%x\n", diff --git a/dll/dinput.cpp b/dll/dinput.cpp index b2d70db..9c6971f 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -286,7 +286,9 @@ HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMO res = (*pGetDeviceState)(lpdid, cbdata, lpvdata); if(res) return res; - if(cbdata == sizeof(DIMOUSESTATE) || cbdata == sizeof(DIMOUSESTATE2)){ + if( cbdata == sizeof(DIMOUSESTATE) || cbdata == sizeof(DIMOUSESTATE2) + // || cbdata == sizeof(DIJOYSTATE) || cbdata == sizeof(DIJOYSTATE2) + ){ GetMousePosition((int *)&p.x, (int *)&p.y); lpvdata->lX = p.x; lpvdata->lY = p.y; @@ -304,16 +306,65 @@ HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMO lpvdata->lZ = 0; *(DWORD *)lpvdata->rgbButtons = 0; } - OutTraceDW("DEBUG: directinput mousestate=(%d,%d)\n", p.x, p.y); + OutTraceB("GetDeviceState(I): DEBUG mousestate=(%d,%d)\n", p.x, p.y); } if(cbdata == 256 && !dxw.bActive) ZeroMemory(lpvdata, 256); return 0; } - + +//static char *dftype(LPCDIDATAFORMAT lpdf) +//{ +// if(lpdf == &c_dfDIMouse) return "mouse"; +// if(lpdf == &c_dfDIKeyboard) return "keyboard"; +// if(lpdf == &c_dfDIMouse2) return "mouse2"; +// if(lpdf == &c_dfDIJoystick) return "joy"; +// if(lpdf == &c_dfDIJoystick2) return "joy2"; +// return "custom"; +//} + +static char *didftype(DWORD c) +{ + static char eb[256]; + unsigned int l; + strcpy(eb,"DIDFT_"); + switch (c & 0x00000003){ + case DIDFT_RELAXIS: strcat(eb, "RELAXIS+"); break; + case DIDFT_ABSAXIS: strcat(eb, "ABSAXIS+"); break; + case DIDFT_AXIS: strcat(eb, "AXIS+"); break; + } + switch (c & 0x0000000C){ + case DIDFT_PSHBUTTON: strcat(eb, "PSHBUTTON+"); break; + case DIDFT_TGLBUTTON: strcat(eb, "TGLBUTTON+"); break; + case DIDFT_BUTTON: strcat(eb, "BUTTON+"); break; + } + if (c & DIDFT_POV) strcat(eb, "POV+"); + if (c & DIDFT_COLLECTION) strcat(eb, "COLLECTION+"); + if (c & DIDFT_NODATA) strcat(eb, "NODATA+"); + if (c & DIDFT_FFACTUATOR) strcat(eb, "FFACTUATOR+"); + if (c & DIDFT_FFEFFECTTRIGGER) strcat(eb, "FFEFFECTTRIGGER+"); + if (c & DIDFT_VENDORDEFINED) strcat(eb, "VENDORDEFINED+"); + if (c & DIDFT_OUTPUT) strcat(eb, "OUTPUT+"); + if (c & DIDFT_ALIAS) strcat(eb, "ALIAS+"); + if (c & DIDFT_OPTIONAL) strcat(eb, "OPTIONAL+"); + l=strlen(eb); + if (l>strlen("DIDFT_")) eb[l-1]=0; // delete last '+' if any + else eb[0]=0; + return(eb); +} + HRESULT WINAPI extSetDataFormat(LPDIRECTINPUTDEVICE lpdid, LPCDIDATAFORMAT lpdf) { - OutTraceDW("SetDataFormat(I): did=%x flags=0x%x\n", lpdid, lpdf->dwFlags); + 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); + if(IsDebug){ + DIOBJECTDATAFORMAT *df; + df = lpdf->rgodf; + for(DWORD i=0; idwNumObjs; i++){ + OutTrace("SetDataFormat(I): DataFormat[%d] ofs=%x flags=%x type=%x(%s)\n", + i, df[i].dwOfs, df[i].dwFlags, df[i].dwType, didftype(df[i].dwType)); + } + } if(lpdf->dwFlags & DIDF_ABSAXIS) dxw.bDInputAbs = 1; if(lpdf->dwFlags & DIDF_RELAXIS) dxw.bDInputAbs = 0; @@ -322,7 +373,8 @@ HRESULT WINAPI extSetDataFormat(LPDIRECTINPUTDEVICE lpdid, LPCDIDATAFORMAT lpdf) HRESULT WINAPI extDISetCooperativeLevel(LPDIRECTINPUTDEVICE lpdid, HWND hwnd, DWORD dwflags) { - OutTraceDW("SetCooperativeLevel(I): did=%x hwnd=%x flags=%x\n", lpdid, hwnd, dwflags); + OutTraceDW("SetCooperativeLevel(I): did=%x hwnd=%x flags=%x(%s)\n", + lpdid, hwnd, dwflags, ExplainDICooperativeFlags(dwflags)); if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); dwflags = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; @@ -371,6 +423,7 @@ HRESULT WINAPI extDeviceProxy(LPCDIDEVICEINSTANCE dev, LPVOID arg) dev->dwSize, p, dev->guidInstance.Data1, dev->guidInstance.Data2, dev->guidInstance.Data3, dev->guidInstance.Data4, dev->dwDevType, dev->tszInstanceName, dev->tszProductName); +#if 0 if(0){ DIDEVICEINSTANCEW fixdev; fixdev.dwSize=sizeof(DIDEVICEINSTANCEW); @@ -383,13 +436,9 @@ HRESULT WINAPI extDeviceProxy(LPCDIDEVICEINSTANCE dev, LPVOID arg) OutTraceDW("EnumDevices: CALLBACK ret=%x\n", res); return res; } +#endif - __try{ - res = ((((CallbackArg *)arg)->cb))(dev, ((CallbackArg *)arg)->arg); - } - __except(EXCEPTION_EXECUTE_HANDLER){ - res=TRUE; - } + res = (*(((CallbackArg *)arg)->cb))(dev, ((CallbackArg *)arg)->arg); OutTraceDW("EnumDevices: CALLBACK ret=%x\n", res); return res; } @@ -401,7 +450,7 @@ HRESULT WINAPI extDIEnumDevices(void *lpdi, DWORD dwDevType, LPDIENUMDEVICESCALL OutTraceDW("EnumDevices(I): di=%x DevType=%x CallBack=%x Ref=%x Flags=%x\n", lpdi, dwDevType, lpCallback, pvRef, dwFlags); Arg.cb= lpCallback; Arg.arg=pvRef; - res=(*pDIEnumDevices)( lpdi, dwDevType, (LPDIENUMDEVICESCALLBACK)extDeviceProxy, pvRef, dwFlags); + res=(*pDIEnumDevices)( lpdi, dwDevType, (LPDIENUMDEVICESCALLBACK)extDeviceProxy, &Arg, dwFlags); // V2.02.80 fix //res=(*pDIEnumDevices)( lpdi, dwDevType, lpCallback, pvRef, dwFlags); OutTraceDW("EnumDevices(I): res=%x\n", res); return res; diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index 34ac2fc..68567cc 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "dxwnd.h" @@ -1716,3 +1717,18 @@ char *ExplainChangeDisplaySettingsFlags(DWORD c) return(eb); } +char *ExplainDICooperativeFlags(DWORD c) +{ + static char eb[128]; + unsigned int l; + strcpy(eb,"DISCL_"); + if(c & DISCL_EXCLUSIVE) strcat(eb, "EXCLUSIVE+"); + if(c & DISCL_NONEXCLUSIVE) strcat(eb, "NONEXCLUSIVE+"); + if(c & DISCL_FOREGROUND) strcat(eb, "FOREGROUND+"); + if(c & DISCL_BACKGROUND) strcat(eb, "BACKGROUND+"); + if(c & DISCL_NOWINKEY) strcat(eb, "NOWINKEY+"); + l=strlen(eb); + if (l>strlen("DISCL_")) eb[l-1]=0; // delete last '+' if any + else strcpy(eb,"NULL"); + return(eb); +} \ No newline at end of file diff --git a/dll/dxhelper.h b/dll/dxhelper.h index e9098e1..b54aca4 100644 --- a/dll/dxhelper.h +++ b/dll/dxhelper.h @@ -50,3 +50,4 @@ extern char *ExplainD3DRenderState(DWORD); extern char *ExplainRenderstateValue(DWORD); extern char *ExplainWfPFlags(DWORD); extern char *ExplainChangeDisplaySettingsFlags(DWORD); +extern char *ExplainDICooperativeFlags(DWORD); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 0797684..782e0ab 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -1143,7 +1143,7 @@ void dxwCore::ShowFPS(HDC xdc) static int x, y; static DWORD color; - if((*pGetTickCount)()-dwTimer > 4000){ + if((*pGetTickCount)()-dwTimer > 6000){ RECT rect; dwTimer = (*pGetTickCount)(); corner = dwTimer % 4; diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index c0206be..dd2e7ad 100644 Binary files a/dll/dxwnd.aps and b/dll/dxwnd.aps differ diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 38b7dad..ae0e13e 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.79" +#define VERSION "2.02.80" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 2d53de3..2923f2d 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index cbd43b3..a3c7041 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -5,6 +5,7 @@ #include "dxhelper.h" #include "hddraw.h" #include "ddproxy.h" +#include "stdio.h" //#undef IsTraceDW //#define IsTraceDW TRUE @@ -17,6 +18,7 @@ static HookEntry_Type Hooks[]={ {HOOK_IAT_CANDIDATE, "LoadLibraryW", (FARPROC)LoadLibraryW, (FARPROC *)&pLoadLibraryW, (FARPROC)extLoadLibraryW}, {HOOK_IAT_CANDIDATE, "LoadLibraryExW", (FARPROC)LoadLibraryExW, (FARPROC *)&pLoadLibraryExW, (FARPROC)extLoadLibraryExW}, {HOOK_IAT_CANDIDATE, "GetDriveTypeA", (FARPROC)NULL, (FARPROC *)&pGetDriveType, (FARPROC)extGetDriveType}, + {HOOK_IAT_CANDIDATE, "GetLogicalDrives", (FARPROC)NULL, (FARPROC *)&pGetLogicalDrives, (FARPROC)extGetLogicalDrives}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -29,8 +31,8 @@ static HookEntry_Type FixIOHooks[]={ }; static HookEntry_Type LimitHooks[]={ - {HOOK_IAT_CANDIDATE, "GetDiskFreeSpaceA", (FARPROC)GetDiskFreeSpaceA, (FARPROC *)&pGetDiskFreeSpaceA, (FARPROC)extGetDiskFreeSpaceA}, - {HOOK_IAT_CANDIDATE, "GlobalMemoryStatus", (FARPROC)GlobalMemoryStatus, (FARPROC *)&pGlobalMemoryStatus, (FARPROC)extGlobalMemoryStatus}, + {HOOK_HOT_CANDIDATE, "GetDiskFreeSpaceA", (FARPROC)GetDiskFreeSpaceA, (FARPROC *)&pGetDiskFreeSpaceA, (FARPROC)extGetDiskFreeSpaceA}, + {HOOK_HOT_CANDIDATE, "GlobalMemoryStatus", (FARPROC)GlobalMemoryStatus, (FARPROC *)&pGlobalMemoryStatus, (FARPROC)extGlobalMemoryStatus}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -316,12 +318,9 @@ VOID WINAPI extSleep(DWORD dwMilliseconds) { DWORD dwNewDelay; dwNewDelay=dwMilliseconds; - if (dwMilliseconds!=INFINITE && dwMilliseconds!=0){ + if ((dwMilliseconds!=INFINITE) && (dwMilliseconds!=0)){ dwNewDelay = dxw.StretchTime(dwMilliseconds); - if (dwNewDelay==0){ // oh oh! troubles... - if (dxw.TimeShift > 0) dwNewDelay=1; // minimum allowed... - else dwNewDelay = INFINITE-1; // maximum allowed !!! - } + if (dwNewDelay==0) dwNewDelay=1; // minimum allowed... } if (IsDebug) OutTrace("Sleep: msec=%d->%d timeshift=%d\n", dwMilliseconds, dwNewDelay, dxw.TimeShift); (*pSleep)(dwNewDelay); @@ -331,12 +330,9 @@ DWORD WINAPI extSleepEx(DWORD dwMilliseconds, BOOL bAlertable) { DWORD dwNewDelay; dwNewDelay=dwMilliseconds; - if (dwMilliseconds!=INFINITE && dwMilliseconds!=0){ + if ((dwMilliseconds!=INFINITE) && (dwMilliseconds!=0)){ dwNewDelay = dxw.StretchTime(dwMilliseconds); - if (dwNewDelay==0){ // oh oh! troubles... - if (dxw.TimeShift > 0) dwNewDelay=1; // minimum allowed... - else dwNewDelay = INFINITE-1; // maximum allowed !!! - } + if (dwNewDelay==0) dwNewDelay=1; // minimum allowed... } if (IsDebug) OutTrace("SleepEx: msec=%d->%d alertable=%x, timeshift=%d\n", dwMilliseconds, dwNewDelay, bAlertable, dxw.TimeShift); return (*pSleepEx)(dwNewDelay, bAlertable); @@ -611,9 +607,37 @@ UINT WINAPI extGetDriveType(LPCTSTR lpRootPathName) { OutTraceDW("GetDriveType: path=\"%s\"\n", lpRootPathName); if (dxw.dwFlags3 & CDROMDRIVETYPE) return DRIVE_CDROM; + if (dxw.dwFlags4 & HIDECDROMEMPTY){ + BOOL Vol; + Vol = GetVolumeInformation(lpRootPathName, NULL, NULL, NULL, 0, 0, 0, 0); + OutTrace("Vol=%x\n", Vol); + if(!Vol) return DRIVE_UNKNOWN; + } return (*pGetDriveType)(lpRootPathName); } +DWORD WINAPI extGetLogicalDrives(void) +{ + DWORD DevMask; + OutTraceDW("GetLogicalDrives:\n"); + DevMask = (*pGetLogicalDrives)(); + if (dxw.dwFlags4 & HIDECDROMEMPTY){ + for(int i=0; i<32; i++){ + DWORD DevBit; + BOOL Vol; + DevBit = 0x1 << i; + if(DevMask & DevBit){ + char RootPathName[10]; + sprintf(RootPathName, "%c:\\", 'A'+i); + Vol = GetVolumeInformation(RootPathName, NULL, NULL, NULL, 0, 0, 0, 0); + OutTrace("Vol=%s status=%x\n", RootPathName, Vol); + if(!Vol) DevMask &= ~DevBit; + } + } + } + return DevMask; +} + BOOL WINAPI extReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { BOOL ret; diff --git a/dll/syslibs.h b/dll/syslibs.h index 6850b30..d3e1bd3 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -99,6 +99,7 @@ typedef DWORD (WINAPI *GetObjectType_Type)(HGDIOBJ); // Kernel32.dll: typedef BOOL (WINAPI *GetDiskFreeSpaceA_Type)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); typedef UINT (WINAPI *GetDriveType_Type)(LPCSTR); +typedef DWORD (WINAPI *GetLogicalDrives_Type)(void); typedef void (WINAPI *GetLocalTime_Type)(LPSYSTEMTIME); typedef FARPROC (WINAPI *GetProcAddress_Type)(HMODULE, LPCSTR); typedef void (WINAPI *GetSystemTime_Type)(LPSYSTEMTIME); @@ -308,6 +309,7 @@ DXWEXTERN GetObjectType_Type pGetObjectType DXWINITIALIZED; // Kernel32.dll: DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED; DXWEXTERN GetDriveType_Type pGetDriveType DXWINITIALIZED; +DXWEXTERN GetLogicalDrives_Type pGetLogicalDrives DXWINITIALIZED; DXWEXTERN GetLocalTime_Type pGetLocalTime DXWINITIALIZED; DXWEXTERN GetProcAddress_Type pGetProcAddress DXWINITIALIZED; DXWEXTERN GetSystemTime_Type pGetSystemTime DXWINITIALIZED; @@ -508,6 +510,7 @@ extern DWORD WINAPI extGetObjectType(HGDIOBJ); // Kernel32.dll: extern BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); extern UINT WINAPI extGetDriveType(LPCSTR); +extern DWORD WINAPI extGetLogicalDrives(void); extern void WINAPI extGetLocalTime(LPSYSTEMTIME); extern FARPROC WINAPI extGetProcAddress(HMODULE, LPCSTR); extern void WINAPI extGetSystemTime(LPSYSTEMTIME); diff --git a/host/CppUACSelfElevation.cpp b/host/CppUACSelfElevation.cpp index 9dad8dc..32ed595 100644 --- a/host/CppUACSelfElevation.cpp +++ b/host/CppUACSelfElevation.cpp @@ -492,221 +492,3 @@ void ReportError(LPCWSTR pszFunction, DWORD dwError = GetLastError()) } } -#if 0 -// -// FUNCTION: OnInitDialog(HWND, HWND, LPARAM) -// -// PURPOSE: Process the WM_INITDIALOG message. Check and display the -// "run as administrator" status, the elevation information, and the -// integrity level of the current process. -// -BOOL OnInitDialog(HWND hWnd, HWND hwndFocus, LPARAM lParam) -{ - // Get and display whether the primary access token of the process - // belongs to user account that is a member of the local Administrators - // group even if it currently is not elevated (IsUserInAdminGroup). - HWND hInAdminGroupLabel = GetDlgItem(hWnd, IDC_STATIC_INADMINGROUP); - try - { - BOOL const fInAdminGroup = IsUserInAdminGroup(); - SetWindowText(hInAdminGroupLabel, fInAdminGroup ? L"True" : L"False"); - } - catch (DWORD dwError) - { - SetWindowText(hInAdminGroupLabel, L"N/A"); - ReportError(L"IsUserInAdminGroup", dwError); - } - - // Get and display whether the process is run as administrator or not - // (IsRunAsAdmin). - HWND hIsRunAsAdminLabel = GetDlgItem(hWnd, IDC_STATIC_ISRUNASADMIN); - try - { - BOOL const fIsRunAsAdmin = IsRunAsAdmin(); - SetWindowText(hIsRunAsAdminLabel, fIsRunAsAdmin ? L"True" : L"False"); - } - catch (DWORD dwError) - { - SetWindowText(hIsRunAsAdminLabel, L"N/A"); - ReportError(L"IsRunAsAdmin", dwError); - } - - // Get and display the process elevation information (IsProcessElevated) - // and integrity level (GetProcessIntegrityLevel). The information is not - // available on operating systems prior to Windows Vista. - - HWND hIsElevatedLabel = GetDlgItem(hWnd, IDC_STATIC_ISELEVATED); - HWND hILLabel = GetDlgItem(hWnd, IDC_STATIC_IL); - - OSVERSIONINFO osver = { sizeof(osver) }; - if (GetVersionEx(&osver) && osver.dwMajorVersion >= 6) - { - // Running Windows Vista or later (major version >= 6). - - try - { - // Get and display the process elevation information. - BOOL const fIsElevated = IsProcessElevated(); - SetWindowText(hIsElevatedLabel, fIsElevated ? L"True" : L"False"); - - // Update the Self-elevate button to show the UAC shield icon on - // the UI if the process is not elevated. The - // Button_SetElevationRequiredState macro (declared in Commctrl.h) - // is used to show or hide the shield icon in a button. You can - // also get the shield directly as an icon by calling - // SHGetStockIconInfo with SIID_SHIELD as the parameter. - HWND hElevateBtn = GetDlgItem(hWnd, IDC_BUTTON_ELEVATE); - Button_SetElevationRequiredState(hElevateBtn, !fIsElevated); - } - catch (DWORD dwError) - { - SetWindowText(hIsElevatedLabel, L"N/A"); - ReportError(L"IsProcessElevated", dwError); - } - - try - { - // Get and display the process integrity level. - DWORD const dwIntegrityLevel = GetProcessIntegrityLevel(); - switch (dwIntegrityLevel) - { - case SECURITY_MANDATORY_UNTRUSTED_RID: SetWindowText(hILLabel, L"Untrusted"); break; - case SECURITY_MANDATORY_LOW_RID: SetWindowText(hILLabel, L"Low"); break; - case SECURITY_MANDATORY_MEDIUM_RID: SetWindowText(hILLabel, L"Medium"); break; - case SECURITY_MANDATORY_HIGH_RID: SetWindowText(hILLabel, L"High"); break; - case SECURITY_MANDATORY_SYSTEM_RID: SetWindowText(hILLabel, L"System"); break; - default: SetWindowText(hILLabel, L"Unknown"); break; - } - } - catch (DWORD dwError) - { - SetWindowText(hILLabel, L"N/A"); - ReportError(L"GetProcessIntegrityLevel", dwError); - } - } - else - { - SetWindowText(hIsElevatedLabel, L"N/A"); - SetWindowText(hILLabel, L"N/A"); - } - - return TRUE; -} - - -// -// FUNCTION: OnCommand(HWND, int, HWND, UINT) -// -// PURPOSE: Process the WM_COMMAND message -// -void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) -{ - switch (id) - { - case IDC_BUTTON_ELEVATE: - { - // Check the current process's "run as administrator" status. - BOOL fIsRunAsAdmin; - try - { - fIsRunAsAdmin = IsRunAsAdmin(); - } - catch (DWORD dwError) - { - ReportError(L"IsRunAsAdmin", dwError); - break; - } - - // Elevate the process if it is not run as administrator. - if (!fIsRunAsAdmin) - { - wchar_t szPath[MAX_PATH]; - if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath))) - { - // Launch itself as administrator. - SHELLEXECUTEINFO sei = { sizeof(sei) }; - sei.lpVerb = L"runas"; - sei.lpFile = szPath; - sei.hwnd = hWnd; - sei.nShow = SW_NORMAL; - - if (!ShellExecuteEx(&sei)) - { - DWORD dwError = GetLastError(); - if (dwError == ERROR_CANCELLED) - { - // The user refused the elevation. - // Do nothing ... - } - } - else - { - EndDialog(hWnd, TRUE); // Quit itself - } - } - } - else - { - MessageBox(hWnd, L"The process is running as administrator", L"UAC", MB_OK); - } - } - break; - - case IDOK: - case IDCANCEL: - EndDialog(hWnd, 0); - break; - } -} - - -// -// FUNCTION: OnClose(HWND) -// -// PURPOSE: Process the WM_CLOSE message -// -void OnClose(HWND hWnd) -{ - EndDialog(hWnd, 0); -} - - -// -// FUNCTION: DialogProc(HWND, UINT, WPARAM, LPARAM) -// -// PURPOSE: Processes messages for the main dialog. -// -INT_PTR CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - // Handle the WM_INITDIALOG message in OnInitDialog - HANDLE_MSG (hWnd, WM_INITDIALOG, OnInitDialog); - - // Handle the WM_COMMAND message in OnCommand - HANDLE_MSG (hWnd, WM_COMMAND, OnCommand); - - // Handle the WM_CLOSE message in OnClose - HANDLE_MSG (hWnd, WM_CLOSE, OnClose); - - default: - return FALSE; - } - return 0; -} - - -// -// FUNCTION: wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) -// -// PURPOSE: The entry point of the application. -// -int APIENTRY wWinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPWSTR lpCmdLine, - int nCmdShow) -{ - return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, DialogProc); -} - -#endif \ No newline at end of file diff --git a/host/MainFrm.cpp b/host/MainFrm.cpp index 927c448..7ce9e7f 100644 --- a/host/MainFrm.cpp +++ b/host/MainFrm.cpp @@ -55,11 +55,11 @@ CMainFrame::CMainFrame() // duplicate activation check GlobalLocker=CreateSemaphore(NULL, 0, 1, "DxWnd LOCKER"); if(GlobalLocker==NULL){ - MessageBoxEx(0, "CreateSemaphore FAILED.\nExiting.", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL); + MessageBoxLang(DXW_STRING_SEMAPHORE, DXW_STRING_WARNING, MB_OK | MB_ICONEXCLAMATION); return; } if(GetLastError()==ERROR_ALREADY_EXISTS){ - MessageBoxEx(0, "DxWnd is already running.\nExiting.", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL); + MessageBoxLang(DXW_STRING_DXWRUNNING, DXW_STRING_WARNING, MB_OK | MB_ICONEXCLAMATION); exit(1); } } diff --git a/host/MessageBox.cpp b/host/MessageBox.cpp new file mode 100644 index 0000000..50a0cbd --- /dev/null +++ b/host/MessageBox.cpp @@ -0,0 +1,38 @@ +#include "stdafx.h" +#include +#include + +int MessageBoxLang(UINT iText, UINT iCaption, UINT uType) +{ + WCHAR sBuffer[1024+1]; + WCHAR sCaption[48+1]; + LoadStringW(AfxGetResourceHandle(), iText, (LPWSTR)&sBuffer, sizeof(sBuffer)); + LoadStringW(AfxGetResourceHandle(), iCaption, (LPWSTR)&sCaption, sizeof(sCaption)); + + return MessageBoxExW(NULL, sBuffer, sCaption, uType, NULL); +} + +int MessageBoxLangArg(UINT iText, UINT iCaption, UINT uType, ...) +{ + va_list al; + WCHAR sBuffer[1024+1]; + WCHAR sFormat[1024+1]; + WCHAR sCaption[48+1]; + + LoadStringW(AfxGetResourceHandle(), iText, (LPWSTR)&sFormat, sizeof(sFormat)); + LoadStringW(AfxGetResourceHandle(), iCaption, (LPWSTR)&sCaption, sizeof(sCaption)); + + va_start(al, uType); + vswprintf(sBuffer, 1024, sFormat, al); + va_end(al); + + return MessageBoxExW(NULL, sBuffer, sCaption, uType, NULL); +} + +int MessageBoxLangWstr(LPWSTR lpBuffer, UINT iCaption, UINT uType) +{ + WCHAR sCaption[48+1]; + LoadStringW(AfxGetResourceHandle(), iCaption, (LPWSTR)&sCaption, sizeof(sCaption)); + + return MessageBoxExW(NULL, lpBuffer, sCaption, uType, NULL); +} diff --git a/host/Resource.h b/host/Resource.h index b339a52..ab85cd2 100644 Binary files a/host/Resource.h and b/host/Resource.h differ diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index 759ce05..fb1bfc2 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -41,6 +41,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_ZBUFFER0CLEAN, cTarget->m_ZBuffer0Clean); DDX_Check(pDX, IDC_NOPOWER2FIX, cTarget->m_NoPower2Fix); DDX_Check(pDX, IDC_NOPERFCOUNTER, cTarget->m_NoPerfCounter); + DDX_Check(pDX, IDC_HIDECDROMEMPTY, cTarget->m_HideCDROMEmpty); // 3D management DDX_Check(pDX, IDC_NOTEXTURES, cTarget->m_NoTextures); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 4595f1f..445743f 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -57,6 +57,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SingleProcAffinity = FALSE; m_LimitResources = FALSE; m_CDROMDriveType = FALSE; + m_HideCDROMEmpty = FALSE; m_FontBypass = FALSE; m_BufferedIOFix = FALSE; m_ZBufferClean = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index f0e2818..ed98333 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -129,6 +129,7 @@ public: BOOL m_NoPaletteUpdate; BOOL m_LimitResources; BOOL m_CDROMDriveType; + BOOL m_HideCDROMEmpty; BOOL m_FontBypass; BOOL m_BufferedIOFix; BOOL m_ZBufferClean; diff --git a/host/dxwnd.ini b/host/dxwnd.ini deleted file mode 100644 index 7c397d1..0000000 --- a/host/dxwnd.ini +++ /dev/null @@ -1,29 +0,0 @@ -[window] -posx=1283 -posy=380 -sizx=320 -sizy=200 -[target] -title0=a10 -path0=D:\Games\A10\A10Cuba.exe -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=134217762 -flagg0=1207959552 -flagh0=20 -flagi0=0 -tflag0=64 -initx0=0 -inity0=0 -minx0=0 -miny0=0 -maxx0=0 -maxy0=0 -posx0=50 -posy0=50 -sizx0=800 -sizy0=600 -maxfps0=0 -initts0=0 diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 77b0ef7..14d47b9 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp index 817acac..03d0c0b 100644 --- a/host/dxwndhost.cpp +++ b/host/dxwndhost.cpp @@ -61,6 +61,15 @@ void CNewCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast) gbDebug = TRUE; return; } + if (sParam.MakeLower().Left(5) == "lang="){ + HMODULE ResLib; + CString Lang; + Lang = sParam.MakeLower().Right(2); + ResLib=LoadLibrary("Resources_"+Lang+".dll"); + if(ResLib) AfxSetResourceHandle(ResLib); + else MessageBoxEx(NULL, "Missing language \""+Lang+"\"\nUsing default language \"en\"", "Warning", MB_OK, NULL); + return; + } if (sParam.Left(2).MakeLower() == "c:"){ strcpy_s(m_ConfigFileName, sizeof(m_ConfigFileName)-1, sParam.Mid(2,sizeof(m_ConfigFileName)-1)); return; @@ -139,12 +148,7 @@ BOOL CDxwndhostApp::InitInstance() BOOL const fIsElevated = IsProcessElevated(); BOOL MustRestart; if(fIsElevated) return TRUE; - MustRestart=MessageBoxEx(0, - "Administrator capability is missing.\n" - "It could be required to handle some programs.\n" - "Do you want to acquire it?", - "Warning", MB_OKCANCEL | MB_ICONQUESTION, NULL); - + MustRestart=MessageBoxLang(DXW_STRING_ADMINCAP, DXW_STRING_WARNING, MB_OKCANCEL | MB_ICONQUESTION); if(MustRestart==IDOK){ extern HANDLE GlobalLocker; CloseHandle(GlobalLocker); @@ -153,11 +157,18 @@ BOOL CDxwndhostApp::InitInstance() { // Launch itself as administrator. SHELLEXECUTEINFO sei = { sizeof(sei) }; + CString args; sei.lpVerb = "runas"; sei.lpFile = szPath; //sei.hwnd = (HWND)this->GetMainWnd(); sei.hwnd = (HWND)NULL; // set to NULL to force the confirmation dialog on top of everything... sei.nShow = SW_NORMAL; + args = ""; + for(int i=1; i<=__argc; i++) { + args += (LPCSTR)(__argv[i]); + args += " "; + } + sei.lpParameters = args; if (!ShellExecuteEx(&sei)){ DWORD dwError = GetLastError(); if (dwError == ERROR_CANCELLED){ @@ -236,15 +247,6 @@ void CDxwndhostApp::OnAppAbout() aboutDlg.DoModal(); } -//void CDxwndhostApp::OnAppExit() -//{ -// MessageBoxEx(0, -// "A hooked task is still running.\n" -// "Exiting now may crash it.\n" -// "Do you still want to exit?", -// "Warning", MB_OKCANCEL | MB_ICONQUESTION, NULL); -//} - ///////////////////////////////////////////////////////////////////////////// // CDxwndhostApp Message Handler diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 17a06fe..a50f32c 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ diff --git a/host/dxwndhost.rc2.txt b/host/dxwndhost.rc2.txt new file mode 100644 index 0000000..0a22beb Binary files /dev/null and b/host/dxwndhost.rc2.txt differ diff --git a/host/dxwndhost.vs2008.sln b/host/dxwndhost.vs2008.sln index 5bf4fb1..804a3d2 100644 --- a/host/dxwndhost.vs2008.sln +++ b/host/dxwndhost.vs2008.sln @@ -3,6 +3,10 @@ Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwndhost", "dxwndhost.vs2008.vcproj", "{FD0B0234-8EC5-43C0-A384-1B881DD3D925}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Resources_Ch", "..\locale\ch\Resources_Ch.vcproj", "{F8D07BBB-A04B-4C0C-8AF8-7F839A152456}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwnd", "..\dll\dxwnd.vs2008.vcproj", "{579E7FE7-2745-4100-A802-23511711FCDE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -13,6 +17,14 @@ Global {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Debug|Win32.Build.0 = Debug|Win32 {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.ActiveCfg = Release|Win32 {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.Build.0 = Release|Win32 + {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.ActiveCfg = Debug|Win32 + {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.Build.0 = Debug|Win32 + {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.ActiveCfg = Release|Win32 + {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.Build.0 = Release|Win32 + {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.ActiveCfg = Debug|Win32 + {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.Build.0 = Debug|Win32 + {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.ActiveCfg = Release|Win32 + {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 22c6a2a..2e19ae5 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhost.vs2008.vcproj b/host/dxwndhost.vs2008.vcproj index 9f3c46b..286ea2c 100644 --- a/host/dxwndhost.vs2008.vcproj +++ b/host/dxwndhost.vs2008.vcproj @@ -168,7 +168,7 @@ + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 39bba94..7e63ad8 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -74,10 +74,9 @@ END_MESSAGE_MAP() // v2.1.68: dialog box for status check. static BOOL CheckStatus() -{ +{ if(GetHookStatus(NULL)==DXW_RUNNING){ - MessageBoxEx(0, "A hooked task is still running.\nWait its termination.", - "Warning", MB_OK | MB_ICONEXCLAMATION, NULL); + MessageBoxLang(DXW_STRING_WAITTASK, DXW_STRING_WARNING, MB_OK | MB_ICONEXCLAMATION); return TRUE; } return FALSE; @@ -91,11 +90,8 @@ static void RevertScreenChanges(DEVMODE *InitDevMode) if ((CurDevMode.dmPelsHeight != InitDevMode->dmPelsHeight) || (CurDevMode.dmPelsWidth != InitDevMode->dmPelsWidth) || (CurDevMode.dmBitsPerPel != InitDevMode->dmBitsPerPel)){ - if (MessageBoxEx(0, - "Desktop setting has changed.\n" - "Do you want to restore the previous ones?", - "Warning", MB_YESNO | MB_ICONQUESTION, NULL)==IDYES) - ChangeDisplaySettings(InitDevMode, 0); + if (MessageBoxLang(DXW_STRING_RESTORE, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION)==IDYES) + ChangeDisplaySettings(InitDevMode, 0); } } @@ -166,6 +162,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_HandleExceptions) t->flags |= HANDLEEXCEPTIONS; if(dlg->m_LimitResources) t->flags2 |= LIMITRESOURCES; if(dlg->m_CDROMDriveType) t->flags3 |= CDROMDRIVETYPE; + if(dlg->m_HideCDROMEmpty) t->flags4 |= HIDECDROMEMPTY; if(dlg->m_FontBypass) t->flags3 |= FONTBYPASS; if(dlg->m_BufferedIOFix) t->flags3 |= BUFFEREDIOFIX; if(dlg->m_ZBufferClean) t->flags4 |= ZBUFFERCLEAN; @@ -356,6 +353,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SingleProcAffinity = t->flags3 & SINGLEPROCAFFINITY ? 1 : 0; dlg->m_LimitResources = t->flags2 & LIMITRESOURCES ? 1 : 0; dlg->m_CDROMDriveType = t->flags3 & CDROMDRIVETYPE ? 1 : 0; + dlg->m_HideCDROMEmpty = t->flags4 & HIDECDROMEMPTY ? 1 : 0; dlg->m_FontBypass = t->flags3 & FONTBYPASS ? 1 : 0; dlg->m_BufferedIOFix = t->flags3 & BUFFEREDIOFIX ? 1 : 0; dlg->m_ZBufferClean = t->flags4 & ZBUFFERCLEAN ? 1 : 0; @@ -697,12 +695,10 @@ CDxwndhostView::~CDxwndhostView() RevertScreenChanges(&this->InitDevMode); - if (this->isUpdated) - if (MessageBoxEx(0, - "Task list has changed.\n" - "Do you want to save it?", - "Warning", MB_YESNO | MB_ICONQUESTION, NULL)==IDYES) - this->SaveConfigFile(); + if (this->isUpdated){ + if (MessageBoxLang(DXW_STRING_LISTUPDATE, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION)==IDYES) + this->SaveConfigFile(); + } if(this->SystemTray.Enabled()){ this->SystemTray.StopAnimation(); @@ -714,11 +710,8 @@ void CDxwndhostView::OnExit() { // check for running apps .... if (GetHookStatus(NULL)==DXW_RUNNING){ - if (MessageBoxEx(0, - "A hooked task is still running.\n" - "Exiting now may crash it.\n" - "Do you still want to exit?", - "Warning", MB_OKCANCEL | MB_ICONQUESTION, NULL)==IDCANCEL) return; + if (MessageBoxLang(DXW_STRING_EXIT, DXW_STRING_WARNING, MB_OKCANCEL | MB_ICONQUESTION)==IDCANCEL) + return; } delete(this->GetParent()); } @@ -853,18 +846,19 @@ void CDxwndhostView::OnImport() char path[MAX_PATH]; for (i=0; strlen(TargetMaps[i].path) && i=MAXTARGETS){ - MessageBoxEx(0, "Maximum entries number reached.\nDelete some entry to add a new one.", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL); + MessageBoxLang(DXW_STRING_MAXENTRIES, DXW_STRING_WARNING, MB_OK | MB_ICONEXCLAMATION); return; } memset(&TargetMaps[i],0,sizeof(TARGETMAP)); // clean up, just in case.... @@ -1272,8 +1260,9 @@ void CDxwndhostView::OnDelete() FilePath=FilePath.Right(FilePath.GetLength()-len-1); } - res=MessageBoxEx(0, "Delete \""+FilePath+"\" ?", - "Warning", MB_YESNO | MB_ICONQUESTION, NULL); + wchar_t *wcstring = new wchar_t[MAX_PATH+1]; + mbstowcs_s(NULL, wcstring, MAX_PATH, FilePath, _TRUNCATE); + res=MessageBoxLangArg(DXW_STRING_DELENTRY, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION, wcstring); if(res!=IDYES) return; listctrl.DeleteItem(i); for(; i < MAXTARGETS - 1; i ++) { @@ -1324,8 +1313,7 @@ void CDxwndhostView::OnClearAllLogs() CString FilePath; HRESULT res; - res=MessageBoxEx(0, "Clear ALL logs?", - "Warning", MB_YESNO | MB_ICONQUESTION, NULL); + res=MessageBoxLang(DXW_STRING_CLEARALL, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION); if(res!=IDYES) return; for(i = 0; i < MAXTARGETS; i ++) { @@ -1419,12 +1407,12 @@ void CDxwndhostView::OnGoToTrayIcon() m_StartToTray ? NULL : "DxWnd DirectDraw windowizer", // NULL inhibits the Tray banner "DxWnd", NIIF_INFO, 10)){ - MessageBox(0, "SystemTray.Create failed", MB_OK); + MessageBoxLang(DXW_STRING_TRAYFAIL, DXW_STRING_ERROR, MB_OK); return; } IconId=(menu->GetMenuState(ID_HOOK_START, MF_BYCOMMAND)==MF_CHECKED)?IDI_DXWAIT:IDI_DXIDLE; if(!this->SystemTray.SetIcon(IconId)){ - MessageBox(0, "SystemTray.LoadIcon failed", MB_OK); + MessageBoxLang(DXW_STRING_ICONFAIL, DXW_STRING_ERROR, MB_OK); return; } StatusThread= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TrayIconUpdate, (LPVOID)&this->SystemTray, 0, &dwThrdId); @@ -1438,11 +1426,8 @@ void CDxwndhostView::OnGoToTrayIcon() void CDxwndhostView::OnSaveFile() { if (this->isUpdated) - if (MessageBoxEx(0, - "Task list has changed.\n" - "Do you want to save it?", - "Warning", MB_YESNO | MB_ICONQUESTION, NULL)==IDYES) - this->SaveConfigFile(); + if (MessageBoxLang(DXW_STRING_SAVELIST, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION)==IDYES) + this->SaveConfigFile(); } void CDxwndhostView::OnTrayRestore() @@ -1598,6 +1583,7 @@ DWORD WINAPI StartDebug(void *p) switch(debug_event.dwDebugEventCode){ case EXIT_PROCESS_DEBUG_EVENT: if(step){ + // DXW_STRING_STEPPING xpi=(EXIT_PROCESS_DEBUG_INFO *)&debug_event.u; sprintf(DebugMessage, "EXIT PROCESS RetCode=%x", xpi->dwExitCode); res=MessageBoxEx(0, DebugMessage, "Continue stepping?", MB_YESNO | MB_ICONQUESTION, NULL); @@ -1610,7 +1596,7 @@ DWORD WINAPI StartDebug(void *p) // ref: problems in setting default exception handler in Tomb Raider IV demo if(ThInfo->TM->flags & HANDLEEXCEPTIONS) { Sleep(500); - MessageBoxEx(0, "Wait for exception handler ...\nPress OK button", "Pause", MB_OK, NULL); + MessageBoxLang(DXW_STRING_EXCEPTION, DXW_STRING_WAIT, MB_OK); } if(step){ pi=(PROCESS_INFORMATION *)&debug_event.u; @@ -1621,6 +1607,7 @@ DWORD WINAPI StartDebug(void *p) } GetFullPathName("dxwnd.dll", MAX_PATH, path, NULL); if(!Inject(pinfo.dwProcessId, path)){ + // DXW_STRING_INJECTION sprintf(DebugMessage,"Injection error: pid=%x dll=%s", pinfo.dwProcessId, path); MessageBoxEx(0, DebugMessage, "Injection", MB_ICONEXCLAMATION, NULL); } @@ -1718,29 +1705,29 @@ void SwitchToColorDepth(int bpp) { DEVMODE CurrentDevMode; BOOL res; - char MsgBuf[256+1]; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &CurrentDevMode); - sprintf(MsgBuf, "ChangeDisplaySettings: color depth %d -> %d BPP\n", CurrentDevMode.dmBitsPerPel, bpp); - if(MessageBoxEx(0, MsgBuf, "Warning", MB_OKCANCEL | MB_ICONQUESTION, NULL)!=IDOK) return; + + if(MessageBoxLangArg(DXW_STRING_NEWCOLOR, DXW_STRING_WARNING, MB_OKCANCEL | MB_ICONQUESTION, CurrentDevMode.dmBitsPerPel, bpp)!=IDOK) + return; + //OutTraceDW("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> 16\n", // CurrentDevMode.dmPelsWidth, CurrentDevMode.dmPelsHeight, CurrentDevMode.dmBitsPerPel); CurrentDevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; CurrentDevMode.dmBitsPerPel = bpp; res=ChangeDisplaySettings(&CurrentDevMode, CDS_UPDATEREGISTRY); if(res!=DISP_CHANGE_SUCCESSFUL) { - char *err; + WCHAR *err; switch(res){ - case DISP_CHANGE_BADDUALVIEW: err="BADDUALVIEW"; break; - case DISP_CHANGE_BADFLAGS: err="BADFLAGS"; break; - case DISP_CHANGE_BADMODE: err="BADMODE"; break; - case DISP_CHANGE_BADPARAM: err="BADPARAM"; break; - case DISP_CHANGE_FAILED: err="FAILED"; break; - case DISP_CHANGE_NOTUPDATED: err="NOTUPDATED"; break; - case DISP_CHANGE_RESTART: err="RESTART"; break; - default: err="???"; break; + case DISP_CHANGE_BADDUALVIEW: err=L"BADDUALVIEW"; break; + case DISP_CHANGE_BADFLAGS: err=L"BADFLAGS"; break; + case DISP_CHANGE_BADMODE: err=L"BADMODE"; break; + case DISP_CHANGE_BADPARAM: err=L"BADPARAM"; break; + case DISP_CHANGE_FAILED: err=L"FAILED"; break; + case DISP_CHANGE_NOTUPDATED: err=L"NOTUPDATED"; break; + case DISP_CHANGE_RESTART: err=L"RESTART"; break; + default: err=L"???"; break; } - sprintf(MsgBuf, "ChangeDisplaySettings ERROR res=%s err=%d\n", err, GetLastError()); - MessageBoxEx(0, MsgBuf, "Error", MB_OKCANCEL | MB_ICONQUESTION, NULL); + MessageBoxLangArg(DXW_STRING_ERRCOLOR, DXW_STRING_ERROR, MB_OK | MB_ICONEXCLAMATION, err, GetLastError()); } } diff --git a/host/palette.bmp b/host/palette.bmp deleted file mode 100644 index d62c0c1..0000000 Binary files a/host/palette.bmp and /dev/null differ diff --git a/host/res/smallicons2.bmp b/host/res/smallicons2.bmp deleted file mode 100644 index 0bdfab4..0000000 Binary files a/host/res/smallicons2.bmp and /dev/null differ diff --git a/locale/cn/Release/BuildLog.htm b/locale/cn/Release/BuildLog.htm new file mode 100644 index 0000000..6cff08a Binary files /dev/null and b/locale/cn/Release/BuildLog.htm differ diff --git a/locale/cn/Release/Resources_CN.dll.intermediate.manifest b/locale/cn/Release/Resources_CN.dll.intermediate.manifest new file mode 100644 index 0000000..ecea6f7 --- /dev/null +++ b/locale/cn/Release/Resources_CN.dll.intermediate.manifest @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/locale/cn/Release/Resources_CN.res b/locale/cn/Release/Resources_CN.res new file mode 100644 index 0000000..e2f8457 Binary files /dev/null and b/locale/cn/Release/Resources_CN.res differ diff --git a/locale/cn/Release/mt.dep b/locale/cn/Release/mt.dep new file mode 100644 index 0000000..a52fe20 --- /dev/null +++ b/locale/cn/Release/mt.dep @@ -0,0 +1 @@ +Manifest resource last updated at 17:52:51.01 on 22/06/2014 diff --git a/locale/cn/Resources_Ch.suo b/locale/cn/Resources_Ch.suo new file mode 100644 index 0000000..41b9a01 Binary files /dev/null and b/locale/cn/Resources_Ch.suo differ diff --git a/locale/cn/Resources_Cn.aps b/locale/cn/Resources_Cn.aps new file mode 100644 index 0000000..d995815 Binary files /dev/null and b/locale/cn/Resources_Cn.aps differ diff --git a/locale/cn/Resources_Cn.ncb b/locale/cn/Resources_Cn.ncb new file mode 100644 index 0000000..eadc44b Binary files /dev/null and b/locale/cn/Resources_Cn.ncb differ diff --git a/locale/cn/Resources_Cn.rc b/locale/cn/Resources_Cn.rc new file mode 100644 index 0000000..ba7a392 Binary files /dev/null and b/locale/cn/Resources_Cn.rc differ diff --git a/locale/cn/Resources_Cn.sln b/locale/cn/Resources_Cn.sln new file mode 100644 index 0000000..529cbd9 --- /dev/null +++ b/locale/cn/Resources_Cn.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Resources_CN", "Resources_CN.vcproj", "{F8D07BBB-A04B-4C0C-8AF8-7F839A152456}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.ActiveCfg = Debug|Win32 + {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.Build.0 = Debug|Win32 + {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.ActiveCfg = Release|Win32 + {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/locale/cn/Resources_Cn.suo b/locale/cn/Resources_Cn.suo new file mode 100644 index 0000000..d8a3d33 Binary files /dev/null and b/locale/cn/Resources_Cn.suo differ diff --git a/locale/cn/Resources_Cn.vcproj b/locale/cn/Resources_Cn.vcproj new file mode 100644 index 0000000..f329caa --- /dev/null +++ b/locale/cn/Resources_Cn.vcproj @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/release/Resources_CN.pdb b/release/Resources_CN.pdb new file mode 100644 index 0000000..c9a4905 Binary files /dev/null and b/release/Resources_CN.pdb differ