1
0
mirror of https://github.com/DxWnd/DxWnd.reloaded synced 2024-12-30 09:25:35 +01:00

v2_03_54_src

Former-commit-id: b58c6e078b773a7c67d434277da1587bc6f2a0a3
This commit is contained in:
gho tik 2016-04-03 12:42:48 -04:00 committed by Refael ACkermann
parent dd3b8535bf
commit 6778f01eb9
45 changed files with 6912 additions and 903 deletions

View File

@ -216,6 +216,7 @@
// seventh flags DWORD dxw.dwFlags7:
#define LIMITDDRAW 0x00000001 // Limit the maximum available ddraw object version
#define DISABLEDISABLEALTTAB 0x00000002 // Disables the compatibility patch that disables the Alt-Tab key and other special combinations
// eighth flags DWORD dxw.dwFlags8:

View File

@ -1,31 +0,0 @@
[window]
posx=50
posy=50
sizx=320
sizy=200
lang=default
;lang=automatic
;updatepaths=1
;debug=1
;multiprocesshook=0
;checkadmin=0
[texture]
MinTexX=16
MaxTexX=0
MinTexY=16
MaxTexY=0
[keymapping]
timetoggle=0x72
altf4=0x73
timeslow=0x74
timefast=0x75
cliptoggle=
refresh=
logtoggle=
plocktoggle=
fpstoggle=
printscreen=0x7B
corner=0x7A
freezetime=0x79

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:935f85ba0560e2c0a319ea4a007c0f24de314cc7207710fdcd4d41e6a4fbb39a
size 593920
oid sha256:b9f75f7b545dbfc03a38bf99d8260cbbe4dee01c82b7955c61769a126c643b82
size 622080

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:82bd1f60071207b5033f2deade63c46438a048357e3cb0e4d5aa5b379da92186
size 545792
oid sha256:91dd24684d705c58f1e0bb5870715a997c93b285d02075571f0f8ef87068adec
size 548352

View File

@ -5,11 +5,11 @@ module0=
opengllib0=
ver0=0
coord0=0
flag0=-394124766
flag0=1753358370
flagg0=134217728
flagh0=20
flagi0=4194304
tflag0=0
flagi0=0
tflag0=3
initx0=0
inity0=0
minx0=0
@ -22,14 +22,3 @@ sizx0=800
sizy0=600
maxfps0=0
initts0=0
launchpath0=
notes0=
registry0=
flagj0=0
flagk0=0
flagl0=0
flagm0=0
winver0=0
maxres0=0
swapeffect0=0
maxddinterface0=7

View File

@ -6,7 +6,7 @@ module0=
opengllib0=
ver0=0
coord0=0
flag0=679477794
flag0=679477792
flagg0=1207959552
flagh0=20
flagi0=205520900
@ -26,10 +26,3 @@ initts0=0
winver0=0
maxres0=-1
flagj0=128
notes0=
registry0=
flagk0=65536
flagl0=0
flagm0=0
swapeffect0=0
maxddinterface0=7

View File

@ -1,29 +0,0 @@
[target]
title0=Dark Colony (16 bit)
path0=D:\Games\DarkColony\DCOLONY\DC16.EXE
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=134234166
flagg0=1207959552
flagh0=20
flagi0=4194308
flagj0=67108992
flagk0=0
flagl0=0
flagm0=0
tflag0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0
maxddinterface0=7

View File

@ -5,7 +5,7 @@ module0=
opengllib0=
ver0=0
coord0=0
flag0=134234166
flag0=134218274
flagg0=1207959552
flagh0=20
flagi0=4194308
@ -30,6 +30,3 @@ notes0=
registry0=
flagk0=0
swapeffect0=0
flagl0=0
flagm0=0
maxddinterface0=7

View File

@ -1,28 +0,0 @@
[target]
title0=Nox (GOG)
path0=D:\Games\Nox GOG\Game.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=681574434
flagg0=1207959552
flagh0=20
flagi0=134217732
flagj0=4224
flagk0=65536
flagl0=0
flagm0=0
tflag0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0

View File

@ -1,28 +0,0 @@
[target]
title0=Nox (RIP)
path0=D:\Games\Nox RIP\GAME.EXE
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=2
flag0=681574434
flagg0=1207959568
flagh0=20
flagi0=138412036
flagj0=5248
flagk0=65536
flagl0=0
flagm0=0
tflag0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0

View File

@ -1022,4 +1022,11 @@ fix: used fake resolutions also in USER32 EnumDisplaySettings
fix: avoid hooking directinput dlls if not requested when loaded dynamically
fix: added recovery of lost device in DirectInput GetDeviceData method
fix: changed SetHook so that it can get function pointers without necessarily replacing them
add: option "Limit ddraw interface" to exclude support for IDirectDrawInterface greater than limit (range 1-7)
add: option "Limit ddraw interface" to exclude support for IDirectDrawInterface greater than limit (range 1-7)
v2.03.53(skipped)
v2.03.54
add: syslib shared dc mode preliminary implementation, thank to Narzoul's ideas. Works for "MS Golf 98" and "Deadlock II rel. 1.2"
fix: handling of cursor hide/show for programs that don't go through the message window ("Deadlock II rel. 1.2")
add: /R:n command line option to automatically start DxWnd in icon tray, run the n-th program in configuration and terminate.
add: option to disable the disabling of Alt-Tab key through SetWindowHooks through WH_KEYBOARD_LL event. Mae it posssible to use Alt-Tab key on "Dungeon Kepper II".

View File

@ -148,6 +148,8 @@ DirectDrawCreateEx_Type pDirectDrawCreateEx = NULL;
DirectDrawEnumerate_Type pDirectDrawEnumerate = NULL;
DirectDrawEnumerateEx_Type pDirectDrawEnumerateEx = NULL;
DirectDrawCreateClipper_Type pDirectDrawCreateClipper = NULL;
HandleDDThreadLock_Type pAcquireDDThreadLock = NULL;
HandleDDThreadLock_Type pReleaseDDThreadLock = NULL;
/* DirectDraw hook pointers */
QueryInterface_Type pQueryInterfaceD1;
@ -310,6 +312,8 @@ static HookEntry_Type ddHooks[]={
{HOOK_HOT_CANDIDATE, "DirectDrawEnumerateA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerate, (FARPROC)extDirectDrawEnumerate},
{HOOK_HOT_CANDIDATE, "DirectDrawEnumerateExA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateEx, (FARPROC)extDirectDrawEnumerateEx},
{HOOK_HOT_CANDIDATE, "DirectDrawCreateClipper", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateClipper, (FARPROC)extDirectDrawCreateClipper},
{HOOK_HOT_CANDIDATE, "AcquireDDThreadLock", (FARPROC)NULL, (FARPROC *)&pAcquireDDThreadLock, (FARPROC)NULL},
{HOOK_HOT_CANDIDATE, "ReleaseDDThreadLock", (FARPROC)NULL, (FARPROC *)&pReleaseDDThreadLock, (FARPROC)NULL},
//{HOOK_IAT_CANDIDATE, "DirectDrawEnumerateW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateW, (FARPROC)extDirectDrawCreate},
//{HOOK_IAT_CANDIDATE, "DirectDrawEnumerateExW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateExW, (FARPROC)extDirectDrawCreate},
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator

View File

@ -1907,4 +1907,27 @@ char *ExplainPixelFormat(LPDDPIXELFORMAT ddpfPixelFormat)
strcat(sBuf, sItem);
}
return sBuf;
}
char *GetObjectTypeStr(HDC hdc)
{
char *s;
switch (GetObjectType(hdc)){
case OBJ_PEN: s="PEN"; break;
case OBJ_BRUSH: s="BRUSH"; break;
case OBJ_DC: s="DC"; break;
case OBJ_METADC: s="METADC"; break;
case OBJ_PAL: s="PAL"; break;
case OBJ_FONT: s="FONT"; break;
case OBJ_BITMAP: s="BITMAP"; break;
case OBJ_REGION: s="REGION"; break;
case OBJ_METAFILE: s="METAFILE"; break;
case OBJ_MEMDC: s="MEMDC"; break;
case OBJ_EXTPEN: s="EXTPEN"; break;
case OBJ_ENHMETADC: s="ENHMETADC"; break;
case OBJ_ENHMETAFILE: s="ENHMETAFILE"; break;
case OBJ_COLORSPACE: s="COLORSPACE"; break;
default: s="unknown"; break;
}
return s;
}

View File

@ -54,3 +54,4 @@ extern char *ExplainDICooperativeFlags(DWORD);
extern char *ExplainRegionType(DWORD);
extern char *ExplainPixelFormat(LPDDPIXELFORMAT);
extern char *ExplainZBufferBitDepths(DWORD);
extern char *GetObjectTypeStr(HDC);

View File

@ -8,6 +8,7 @@
#include <psapi.h>
#include "dxwnd.h"
#include "dxwcore.hpp"
#include "shareddc.hpp"
#include "dxhook.h"
#include "glhook.h"
#include "glidehook.h"
@ -28,6 +29,7 @@
dxwCore dxw;
dxwSStack dxwss;
dxwWStack dxwws;
dxwSDC sdc;
extern LRESULT CALLBACK MessageHook(int, WPARAM, LPARAM);
@ -1368,7 +1370,7 @@ void HookInit(TARGETMAP *target, HWND hwnd)
InitScreenParameters();
if(hwnd) HookWindowProc(hwnd);
// in fullscreen mode, messages seem to reach and get processed by the parent window
if((!dxw.Windowize) && hwnd) HookWindowProc(GetParent(hwnd));
if((!dxw.Windowize) && hwnd) HookWindowProc(dxw.hParentWnd);
// initialize window: if
// 1) not in injection mode (hwnd != 0) and
@ -1409,8 +1411,9 @@ FARPROC RemapLibrary(LPCSTR proc, HMODULE hModule, HookEntry_Type *Hooks)
void *remapped_addr;
for(; Hooks->APIName; Hooks++){
if (!strcmp(proc,Hooks->APIName)){
if((((dxw.dwFlags4 & HOTPATCH) && (Hooks->HookStatus == HOOK_HOT_CANDIDATE)) || // hot patch candidate still to process - or
((dxw.dwFlags4 & HOTPATCHALWAYS) && (Hooks->HookStatus != HOOK_HOT_LINKED)))){ // force hot patch and not already hooked
if ((Hooks->HookStatus == HOOK_HOT_REQUIRED) ||
((dxw.dwFlags4 & HOTPATCH) && (Hooks->HookStatus == HOOK_HOT_CANDIDATE)) || // hot patch candidate still to process - or
((dxw.dwFlags4 & HOTPATCHALWAYS) && (Hooks->HookStatus != HOOK_HOT_LINKED))){ // force hot patch and not already hooked
if(!Hooks->OriginalAddress) {
Hooks->OriginalAddress=(*pGetProcAddress)(hModule, Hooks->APIName);
@ -1462,7 +1465,8 @@ void HookLibrary(HMODULE hModule, HookEntry_Type *Hooks, char *DLLName)
// continue;
//}
if((((dxw.dwFlags4 & HOTPATCH) && (Hooks->HookStatus == HOOK_HOT_CANDIDATE)) || // hot patch candidate still to process - or
if(((Hooks->HookStatus == HOOK_HOT_REQUIRED) ||
((dxw.dwFlags4 & HOTPATCH) && (Hooks->HookStatus == HOOK_HOT_CANDIDATE)) || // hot patch candidate still to process - or
((dxw.dwFlags4 & HOTPATCHALWAYS) && (Hooks->HookStatus != HOOK_HOT_LINKED))) // force hot patch and not already hooked
&&
Hooks->StoreAddress){ // and save ptr available

View File

@ -47,6 +47,7 @@ extern FARPROC Remap_DInput8_ProcAddress(LPCSTR, HMODULE);
typedef enum {
HOOK_IAT_CANDIDATE = 0,
HOOK_HOT_CANDIDATE,
HOOK_HOT_REQUIRED,
HOOK_IAT_LINKED,
HOOK_HOT_LINKED
} HookEntry_Status;

View File

@ -11,6 +11,7 @@
#include "d3d9.h"
extern GetDC_Type pGetDC;
extern ReleaseDC_Type pReleaseDC;
extern HandleDDThreadLock_Type pReleaseDDThreadLock;
/* ------------------------------------------------------------------ */
// Internal function pointers
@ -72,8 +73,12 @@ void dxwCore::SetFullScreen(BOOL fs)
BOOL dxwCore::IsFullScreen()
{
//if(!Windowize) return FALSE;
return FullScreen;
return (Windowize && FullScreen);
}
BOOL dxwCore::IsToRemap(HDC hdc)
{
return (Windowize && FullScreen && (OBJ_DC == (*pGetObjectType)(hdc)));
}
void dxwCore::InitTarget(TARGETMAP *target)
@ -128,9 +133,10 @@ void dxwCore::InitTarget(TARGETMAP *target)
iRatioX = iSizX ? iSizX : 800;
iRatioY = iSizY ? iSizY : 600;
GDIEmulationMode = GDIMODE_STRETCHED; // default
GDIEmulationMode = GDIMODE_NONE; // default
if (dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED;
if (dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED;
if (dwFlags6 & SHAREDDC) GDIEmulationMode = GDIMODE_SHAREDDC;
}
void dxwCore::SetScreenSize(void)
@ -367,19 +373,6 @@ POINT dxwCore::FixCursorPos(POINT prev)
if (h) curr.y = (curr.y * dxw.GetScreenHeight()) / h;
}
//if(dxw.dwFlags4 & FRAMECOMPENSATION){
// static int dx, dy, todo=TRUE;
// if (todo){
// POINT FrameOffset = dxw.GetFrameOffset();
// dx=FrameOffset.x;
// dy=FrameOffset.y;
// OutTraceC("GetCursorPos: frame compensation=(%d,%d)\n", dx, dy);
// todo=FALSE;
// }
// curr.x += dx;
// curr.y += dy;
//}
if((dxw.dwFlags1 & ENABLECLIPPING) && lpClipRegion){
// v2.1.93:
// in clipping mode, avoid the cursor position to lay outside the valid rect
@ -400,14 +393,6 @@ POINT dxwCore::FixCursorPos(POINT prev)
if (curr.y >= (LONG)dxw.GetScreenHeight()-CLIP_TOLERANCE) curr.y=dxw.GetScreenHeight()-1;
}
//if(0){ // Scrolling Slow-down
// if( (curr.x <= 0) ||
// (curr.x >= (LONG)(dxw.GetScreenWidth()-1)) ||
// (curr.y <= 0) ||
// (curr.y >= (LONG)(dxw.GetScreenHeight()-1)))
// (*pSleep)(800);
//}
return curr;
}
@ -1632,7 +1617,7 @@ void dxwCore::ResetEmulatedDC()
BOOL dxwCore::IsVirtual(HDC hdc)
{
return (hdc==VirtualHDC) && (dwFlags3 & GDIEMULATEDC);
return (hdc==VirtualHDC) && (GDIEmulationMode == GDIMODE_EMULATED);
}
HDC dxwCore::AcquireSharedDC(HWND hwnd)
@ -1640,12 +1625,15 @@ HDC dxwCore::AcquireSharedDC(HWND hwnd)
extern HDC hFlippedDC;
LPDIRECTDRAWSURFACE lpDDSPrim;
lpDDSPrim = dxwss.GetPrimarySurface();
if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC);
while((hFlippedDC == NULL) && lpDDSPrim) {
OutTraceDW("AcquireSharedDC: found primary surface with no DC, unref lpdds=%x\n", lpDDSPrim);
dxwss.UnrefSurface(lpDDSPrim);
lpDDSPrim = dxwss.GetPrimarySurface();
if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC);
if (lpDDSPrim) {
if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)();
(*pGetDC)(lpDDSPrim, &hFlippedDC);
while((hFlippedDC == NULL) && lpDDSPrim) {
OutTraceDW("AcquireSharedDC: found primary surface with no DC, unref lpdds=%x\n", lpDDSPrim);
dxwss.UnrefSurface(lpDDSPrim);
lpDDSPrim = dxwss.GetPrimarySurface();
if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC);
}
}
if (!(hwnd == dxw.GethWnd())) {
POINT father, child, offset;

View File

@ -56,6 +56,7 @@ public: // methods
void SetFullScreen(BOOL);
void SetFullScreen(BOOL, int);
BOOL IsFullScreen();
BOOL IsToRemap(HDC);
BOOL IsDesktop(HWND);
BOOL IsRealDesktop(HWND);
POINT FixCursorPos(POINT);
@ -357,8 +358,12 @@ typedef enum {
DXVK_SIZE
};
#define GDIMODE_STRETCHED 0
#define GDIMODE_EMULATED 1
typedef enum {
GDIMODE_NONE = 0,
GDIMODE_STRETCHED,
GDIMODE_EMULATED,
GDIMODE_SHAREDDC
};
typedef HRESULT (WINAPI *ColorConversion_Type)(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *);
extern ColorConversion_Type pColorConversion;

Binary file not shown.

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "TlHelp32.h"
#define VERSION "2.03.52"
#define VERSION "2.03.54"
#define DDTHREADLOCK 1
//#define LOCKTHREADS

Binary file not shown.

View File

@ -445,6 +445,10 @@
RelativePath=".\msghook.cpp"
>
</File>
<File
RelativePath=".\msims32.cpp"
>
</File>
<File
RelativePath=".\msvfw.cpp"
>
@ -457,6 +461,10 @@
RelativePath=".\opengl.cpp"
>
</File>
<File
RelativePath=".\shareddc.cpp"
>
</File>
<File
RelativePath=".\smack.cpp"
>
@ -526,6 +534,10 @@
RelativePath=".\resource.h"
>
</File>
<File
RelativePath=".\shareddc.hpp"
>
</File>
<File
RelativePath=".\syslibs.h"
>

File diff suppressed because it is too large Load Diff

View File

@ -20,6 +20,8 @@
extern void D3D9TextureHandling(void *, int);
extern void D3D8TextureHandling(void *, int);
void *lpD3DActiveDevice = NULL;
typedef HRESULT (WINAPI *QueryInterface_Type)(void *, REFIID riid, void** ppvObj);
// D3D8/9 API
@ -212,6 +214,7 @@ typedef HRESULT (WINAPI *SetTexture9_Type)(void *, DWORD, void *);
//typedef ULONG (WINAPI *CreateRenderTarget8_Type)(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, IDirect3DSurface8**);
typedef ULONG (WINAPI *CreateRenderTarget8_Type)(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**);
typedef ULONG (WINAPI *CreateRenderTarget9_Type)(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**);
typedef ULONG (WINAPI *BeginScene_Type)(void *);
typedef ULONG (WINAPI *EndScene_Type)(void *);
@ -250,6 +253,7 @@ BOOL WINAPI voidDisableD3DSpy(void);
//ULONG WINAPI extCreateRenderTarget8(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, IDirect3DSurface8**);
ULONG WINAPI extCreateRenderTarget8(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**);
ULONG WINAPI extCreateRenderTarget9(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**);
ULONG WINAPI extBeginScene8(void *);
ULONG WINAPI extEndScene8(void *);
ULONG WINAPI extBeginScene9(void *);
@ -291,6 +295,7 @@ SetGammaRamp_Type pSetGammaRamp = 0;
GetGammaRamp_Type pGetGammaRamp = 0;
CreateRenderTarget8_Type pCreateRenderTarget8 = 0;
CreateRenderTarget9_Type pCreateRenderTarget9 = 0;
BeginScene_Type pBeginScene8 = 0;
EndScene_Type pEndScene8 = 0;
BeginScene_Type pBeginScene9 = 0;
@ -540,6 +545,7 @@ void HookD3DDevice9(void** ppD3Ddev9)
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 124), extUpdateTexture, (void **)&pUpdateTexture, "UpdateTexture(D9)");
#endif
//SetHook((void *)(**(DWORD **)ppD3Ddev9 + 112), extCreateRenderTarget9, (void **)&pCreateRenderTarget9, "CreateRenderTarget(D9)");
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 164), extBeginScene9, (void **)&pBeginScene9, "BeginScene(D9)");
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 168), extEndScene9, (void **)&pEndScene9, "EndScene(D9)");
//SetHook((void *)(**(DWORD **)ppD3Ddev9 +188), extSetViewport, (void **)&pSetViewport, "SetViewport(D9)");
@ -1153,6 +1159,7 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype,
return res;
}
OutTraceD3D("SUCCESS! device=%x\n", *ppd3dd);
lpD3DActiveDevice = *ppd3dd;
if(dwD3DVersion == 8){
HookD3DDevice8(ppd3dd);
@ -1259,6 +1266,7 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp
return res;
}
OutTraceD3D("SUCCESS!\n");
lpD3DActiveDevice = *ppd3dd;
HookD3DDevice9(ppd3dd);

View File

@ -5,6 +5,7 @@ typedef HRESULT (WINAPI *DirectDrawCreateEx_Type)(GUID *, LPDIRECTDRAW *, REFIID
typedef HRESULT (WINAPI *DirectDrawEnumerate_Type)(LPDDENUMCALLBACK, LPVOID);
typedef HRESULT (WINAPI *DirectDrawEnumerateEx_Type)(LPDDENUMCALLBACKEX, LPVOID, DWORD);
typedef HRESULT (WINAPI *DirectDrawCreateClipper_Type)(DWORD, LPDIRECTDRAWCLIPPER *, IUnknown *);
typedef void (WINAPI *HandleDDThreadLock_Type)(void);
typedef HDC (WINAPI *GDIGetDC_Type)(HWND);
typedef int (WINAPI *GDIReleaseDC_Type)(HWND, HDC);

View File

@ -9,6 +9,7 @@
//#undef IsTraceDW
//#define IsTraceDW TRUE
#define LOCKINJECTIONTHREADS
#define TRYFATNAMES TRUE
BOOL WINAPI extCheckRemoteDebuggerPresent(HANDLE, PBOOL);
LPVOID WINAPI extVirtualAlloc(LPVOID, SIZE_T, DWORD, DWORD);
@ -792,6 +793,7 @@ HANDLE WINAPI extCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
HANDLE ret;
int err=0;
OutTraceDW("CreateFile: FileName=%s DesiredAccess=%x SharedMode=%x Disposition=%x Flags=%x\n",
lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, dwFlagsAndAttributes);
@ -809,8 +811,29 @@ HANDLE WINAPI extCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS
if(ret && (ret != (HANDLE)INVALID_SET_FILE_POINTER))
OutTrace("CreateFile: ret=%x\n", ret);
else
OutTrace("CreateFile ERROR: err=%d\n", GetLastError());
OutTrace("CreateFile ERROR: err=%d\n", err=GetLastError());
}
#if 0
if(TRYFATNAMES && (!ret) && (err==ERROR_FILE_NOT_FOUND)){
char ShortPath[MAX_PATH+1];
int iLastBackSlash, iFnameLength;
char *sFileName;
strncpy(ShortPath, lpFileName, MAX_PATH);
iLastBackSlash = -1;
for(size_t i=0; i<strlen(ShortPath); i++) if((ShortPath[i]=='\\') || (ShortPath[i]=='/')) iLastBackSlash=i;
sFileName = &ShortPath[iLastBackSlash+1];
for(size_t i=0; i<strlen(sFileName); i++) if(sFileName[i]=='.') iFnameLength=i;
if(iFnameLength > 8){
sFileName[6] = '~';
sFileName[7] = '1';
strcpy(&sFileName[8], &sFileName[iFnameLength]);
}
OutTrace("CreateFile: try FAT path=\"%s\"\n", ShortPath);
ret=(*pCreateFile)(ShortPath, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
#endif
return ret;
}

74
dll/msims32.cpp Normal file
View File

@ -0,0 +1,74 @@
#define _CRT_SECURE_NO_WARNINGS
#include "dxwnd.h"
#include "dxwcore.hpp"
#include "syslibs.h"
#include "hddraw.h"
#include "dxhook.h"
#include "dxhelper.h"
#include "shareddc.hpp"
#include "stdio.h"
static BOOL bGDIRecursionFlag = FALSE;
#define _Warn(s) MessageBox(0, s, "to do", MB_ICONEXCLAMATION)
typedef BOOL (WINAPI *AlphaBlend_Type)(HDC hdcDest, int xoriginDest, int yoriginDest, int wDest, int hDest, HDC hdcSrc, int xoriginSrc, int yoriginSrc, int wSrc, int hSrc, BLENDFUNCTION ftn);
AlphaBlend_Type pAlphaBlend = NULL;
BOOL WINAPI extAlphaBlend(HDC hdcDest, int xoriginDest, int yoriginDest, int wDest, int hDest, HDC hdcSrc, int xoriginSrc, int yoriginSrc, int wSrc, int hSrc, BLENDFUNCTION ftn);
typedef BOOL (WINAPI *GradientFill_Type)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG);
GradientFill_Type pGradientFill = NULL;
BOOL WINAPI extGradientFill(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG);
typedef BOOL (WINAPI *TransparentBlt_Type)(HDC, int, int, int, int, HDC, int, int, int, int, UINT);
TransparentBlt_Type pTransparentBlt = NULL;
BOOL WINAPI extTransparentBlt(HDC, int, int, int, int, HDC, int, int, int, int, UINT);
static HookEntry_Type Hooks[]={
{HOOK_IAT_CANDIDATE, "AlphaBlend", (FARPROC)NULL, (FARPROC *)&pAlphaBlend, (FARPROC)extAlphaBlend},
{HOOK_IAT_CANDIDATE, "GradientFill", (FARPROC)NULL, (FARPROC *)&pGradientFill, (FARPROC)extGradientFill},
{HOOK_IAT_CANDIDATE, "TransparentBlt", (FARPROC)NULL, (FARPROC *)&pTransparentBlt, (FARPROC)extTransparentBlt},
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
static char *libname = "msimg32.dll";
void HookMSIMG32Init()
{
HookLibInit(Hooks);
}
void HookMSIMG32(HMODULE module)
{
HookLibrary(module, Hooks, libname);
}
FARPROC Remap_MSIMG32_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if(addr=RemapLibrary(proc, hModule, Hooks)) return addr;
return NULL;
}
BOOL WINAPI extAlphaBlend(HDC hdcDest, int xoriginDest, int yoriginDest, int wDest, int hDest, HDC hdcSrc, int xoriginSrc, int yoriginSrc, int wSrc, int hSrc, BLENDFUNCTION ftn)
{
_Warn("AlphaBlend");
return TRUE;
}
BOOL WINAPI extGradientFill(HDC hdc, PTRIVERTEX pVertex, ULONG nVertex, PVOID pMesh, ULONG nMesh, ULONG ulMode)
{
_Warn("GradientFill");
return TRUE;
}
BOOL WINAPI extTransparentBlt(HDC hdcDest, int xoriginDest, int yoriginDest, int wDest, int hDest,
HDC hdcSrc, int xoriginSrc, int yoriginSrc, int wSrc, int hSrc, UINT crTransparent)
{
_Warn("TransparentBlt");
return TRUE;
}

461
dll/shareddc.cpp Normal file
View File

@ -0,0 +1,461 @@
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <d3d9.h>
#include "dxwnd.h"
#include "dxwcore.hpp"
#include "syslibs.h"
#include "dxhelper.h"
#include "resource.h"
#include "hddraw.h"
#include "shareddc.hpp"
//#define D3D9TRY
#define SHAREDDCDEBUG FALSE
#if SHAREDDCDEBUG
#define _Warn(s) {char cap[80]; sprintf(cap, "Warn at %d", __LINE__); MessageBox(NULL, (s), cap, MB_OK);}
#else
#define _Warn(s)
#endif
extern ReleaseDC_Type pReleaseDC;
extern HandleDDThreadLock_Type pReleaseDDThreadLock;
extern GetDC_Type pGetDC;
/*---------------------------------------------------------------------------------+
| |
| Constructor, Desctructor |
| |
+---------------------------------------------------------------------------------*/
dxwSDC::dxwSDC()
{
OutTraceB("dxwSDC::dxwSDC: Initialize\n");
PrimaryDC = NULL;
lpDDSPrimary = NULL;
LastScreenWidth = LastScreenHeight = 0;
LastHDC = NULL;
CurrenthWnd = NULL;
}
dxwSDC::~dxwSDC()
{
OutTraceB("dxwSDC::~dxwSDC: Destroy\n");
}
/*---------------------------------------------------------------------------------+
| |
| GetPrimaryDC: builds a suitable DC to write to, according to the input DC |
| |
+---------------------------------------------------------------------------------*/
static IDirect3DSurface9 *pDestSurface = NULL;
HDC dxwSDC::GetPrimaryDC(HDC hdc)
{
HRESULT res;
extern HandleDDThreadLock_Type pReleaseDDThreadLock;
extern GetDC_Type pGetDC;
extern ReleaseDC_Type pReleaseDC;
extern void *lpD3DActiveDevice;
OutTraceB("dxwSDC::GetPrimaryDC: hdc=%x\n", hdc);
#ifdef D3D9TRY
if(lpD3DActiveDevice){
// search for D3D first
//RECT client;
//(*pGetClientRect)(dxw.GethWnd(), &client);
//if(pDestSurface == NULL){
// //res=((IDirect3DDevice9 *)lpD3DActiveDevice)->CreateOffscreenPlainSurface(ScreenWidth, ScreenHeight, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, &pDestSurface, NULL);
// //res=((IDirect3DDevice9 *)lpD3DActiveDevice)->CreateOffscreenPlainSurface(dxw.GetScreenWidth(), dxw.GetScreenHeight(), D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, &pDestSurface, NULL);
// res=((IDirect3DDevice9 *)lpD3DActiveDevice)->CreateOffscreenPlainSurface(client.right, client.bottom, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, &pDestSurface, NULL);
// if(res){
// OutTraceE("dxwSDC::CreateOffscreenPlainSurface: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__);
// return NULL;
// _Warn("CreateOffscreenPlainSurface ERROR");
// }
//}
//res=((IDirect3DDevice9 *)lpD3DActiveDevice)->GetFrontBufferData(1, pDestSurface);
//if(res){
// OutTraceE("GetFrontBufferData: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__);
// _Warn("GetFrontBufferData ERROR");
//}
IDirect3DSurface9 *pRenderSurface;
res=((IDirect3DDevice9 *)lpD3DActiveDevice)->GetRenderTarget(0, &pRenderSurface);
if(res){
OutTraceE("d3d9::GetRenderTarget: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__);
_Warn("d3d9::GetRenderTarget ERROR");
}
//res=((IDirect3DDevice9 *)lpD3DActiveDevice)->GetRenderTargetData(pRenderSurface, pDestSurface);
//if(res){
// OutTraceE("d3d9::GetRenderTargetData: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__);
// _Warn("d3d9::GetRenderTargetData ERROR");
//}
//res=pDestSurface->GetDC(&PrimaryDC);
res=pRenderSurface->GetDC(&PrimaryDC);
if(res){
OutTraceE("d3d9::GetDC: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__);
//_Warn("d3d9::GetDC ERROR");
VirtualSurfaceType = VIRTUAL_ON_D3D;
return NULL;
}
VirtualSurfaceType = VIRTUAL_ON_D3D;
}
else {
#else
{
#endif
// else look for ddraw
//if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)();
lpDDSPrimary = dxwss.GetPrimarySurface();
if (lpDDSPrimary) {
if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)();
res=((*pGetDC)(lpDDSPrimary, &PrimaryDC));
while((PrimaryDC == NULL) && lpDDSPrimary) {
OutTraceB("dxwSDC::GetPrimaryDC: found primary surface with no DC, unref lpdds=%x\n", lpDDSPrimary);
dxwss.UnrefSurface(lpDDSPrimary);
lpDDSPrimary = dxwss.GetPrimarySurface();
if (lpDDSPrimary) (*pGetDC)(lpDDSPrimary, &PrimaryDC);
}
if (!PrimaryDC) {
_Warn("No primary DC");
OutTraceB("dxwSDC::GetPrimaryDC: no ddraw primary DC\n");
return NULL;
}
// avoid double Getdc on same hdc and lock
// if(PrimaryDC == hdc) (*pReleaseDC)(lpDDSPrimary, PrimaryDC);
OutTraceB("dxwSDC::GetPrimaryDC: ddraw PrimaryDC=%x\n", PrimaryDC);
VirtualSurfaceType = VIRTUAL_ON_DDRAW;
}
else {
// finally, search GDI DC
PrimaryDC = (*pGDIGetDC)(dxw.GethWnd());
if (!PrimaryDC) {
_Warn("No window DC");
OutTraceB("dxwSDC::GetPrimaryDC: no windows DC\n");
return NULL;
}
OutTraceB("dxwSDC::GetPrimaryDC: gdi PrimaryDC=%x\n", PrimaryDC);
VirtualSurfaceType = VIRTUAL_ON_WINDOW;
}
}
// whenever the hdc changes, rebuild the virtual DC
if(hdc != LastHDC) do {
LastHDC = hdc;
RECT client;
if(VirtualHDC){
//(*pGDIReleaseDC)(dxw.GethWnd(), VirtualHDC);
DeleteObject(VirtualHDC);
}
if(!(VirtualHDC=(*pGDICreateCompatibleDC)(PrimaryDC))){
OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
_Warn("CreateCompatibleDC ERROR");
break;
}
if(!(CurrenthWnd = WindowFromDC(hdc))){
OutTraceE("dxwSDC::GetPrimaryDC: WindowFromDC ERROR err=%d at=%d\n", GetLastError(), __LINE__);
_Warn("WindowFromDC ERROR");
break;
}
if(!(*pGetClientRect)(CurrenthWnd, &client)){
OutTraceE("dxwSDC::GetPrimaryDC: GetClietError ERROR err=%d at=%d\n", GetLastError(), __LINE__);
_Warn("GetClietError ERROR");
break;
}
dxw.UnmapClient(&client);
ScreenWidth = client.right;
ScreenHeight = client.bottom;
OutTraceB("dxwSDC::GetPrimaryDC: VirtualHDC INITIALIZE size=(%dx%d)\n", LastScreenWidth, LastScreenHeight);
if(!(VirtualPic=(*pCreateCompatibleBitmap)(PrimaryDC, ScreenWidth, ScreenHeight))){
OutTraceE("dxwSDC::GetPrimaryDC: CreateCompatibleBitmap ERROR err=%d at=%d\n", GetLastError(), __LINE__);
_Warn("CreateCompatibleBitmap ERROR");
}
if(!SelectObject(VirtualHDC, VirtualPic)){
OutTraceE("dxwSDC::GetPrimaryDC: SelectObject ERROR err=%d at=%d\n", GetLastError(), __LINE__);
_Warn("SelectObject ERROR");
}
DeleteObject(VirtualPic);
VirtualPic = 0;
} while(0);
if(CurrenthWnd && CurrenthWnd!=dxw.GethWnd()){
POINT zero1 = {0, 0};
POINT zero2 = {0, 0};
(*pClientToScreen)(CurrenthWnd, &zero1);
(*pClientToScreen)(dxw.GethWnd(), &zero2);
WinOffset.x = zero1.x - zero2.x;
WinOffset.y = zero1.y - zero2.y;
VirtualOffset = WinOffset;
dxw.UnmapClient(&VirtualOffset);
OutTraceB("dxwSDC::GetPrimaryDC: WinOffset=(%d,%d)->(%d,%d)\n", WinOffset.x, WinOffset.y, VirtualOffset.x, VirtualOffset.y);
}
else {
WinOffset.x = 0;
WinOffset.y = 0;
VirtualOffset.x = 0;
VirtualOffset.y = 0;
OutTraceB("dxwSDC::GetPrimaryDC: same window\n");
}
if(PrimaryDC){
if(!(*pGDIBitBlt)(VirtualHDC, 0, 0, ScreenWidth, ScreenHeight, PrimaryDC, VirtualOffset.x, VirtualOffset.y, SRCCOPY)){
OutTraceE("dxwSDC::GetPrimaryDC: StretchBlt ERROR err=%d at=%d\n", GetLastError(), __LINE__);
_Warn("StretchBlt ERROR");
}
OutTraceB("dxwSDC::GetPrimaryDC: fill=(0,0)-(%d,%d) from=(%d,%d)\n", ScreenWidth, ScreenHeight, VirtualOffset.x, VirtualOffset.y);
}
POINT origin = {};
POINT mainwin = {};
GetDCOrgEx(hdc, &origin);
GetDCOrgEx((*pGDIGetDC)(dxw.GethWnd()), &mainwin);
origin.x -= mainwin.x;
origin.y -= mainwin.y;
OutTraceB("dxwSDC::GetPrimaryDC: origin=(%d,%d)\n", origin.x, origin.y);
copyDcAttributes(VirtualHDC, hdc, origin);
setClippingRegion(VirtualHDC, hdc, origin);
return VirtualHDC;
}
/*---------------------------------------------------------------------------------+
| |
| GetHdc: returns the DC to write for the GDI call |
| |
+---------------------------------------------------------------------------------*/
HDC dxwSDC::GetHdc(void)
{
return VirtualHDC;
}
/*---------------------------------------------------------------------------------+
| |
| PutPrimaryDC: transfers the DC content to the primary surface and the screen |
| |
+---------------------------------------------------------------------------------*/
BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen, int XDest, int YDest, int nDestWidth, int nDestHeight)
{
extern ReleaseDC_Type pReleaseDC;
extern Unlock1_Type pUnlock1;
BOOL ret;
HRESULT res;
ret = TRUE;
if (nDestWidth == 0) nDestWidth=ScreenWidth-XDest;
if (nDestHeight == 0) nDestHeight=ScreenHeight-YDest;
if (IsDebug){
char sRect[81];
if(UpdateScreen) sprintf(sRect, "pos=(%d,%d) size=(%dx%d) winoffset=(%d,%d) virtoffset=(%d,%d)",
XDest, YDest, nDestWidth, nDestHeight, WinOffset.x, WinOffset.y, VirtualOffset.x, VirtualOffset.y);
else strcpy(sRect, "");
char *sType;
switch(VirtualSurfaceType){
case VIRTUAL_ON_D3D: sType="D3D"; break;
case VIRTUAL_ON_DDRAW: sType="DDRAW"; break;
case VIRTUAL_ON_WINDOW: sType="WINDOW"; break;
default: sType="???"; break;
}
OutTrace("dxwSDC::PutPrimaryDC: hdc=%x type=%s update=%x %s\n", hdc, sType, UpdateScreen, sRect);
}
if(UpdateScreen){
switch(VirtualSurfaceType){
#ifdef D3D9TRY
case VIRTUAL_ON_D3D:
RECT client;
SetStretchBltMode(PrimaryDC, HALFTONE);
(*pGetClientRect)(dxw.GethWnd(), &client);
if(PrimaryDC) ret=(*pGDIStretchBlt)(PrimaryDC, 0, 0, client.right, client.bottom, VirtualHDC, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), SRCCOPY);
ret=(*pGDIReleaseDC)(dxw.GethWnd(), PrimaryDC);
//ret=(*pGDIReleaseDC)(dxw.GethWnd(), PrimaryDC);
if(!ret) OutTrace("dxwSDC::PutPrimaryDC: ReleaseDC ERROR err=%d\n", GetLastError());
//pDestSurface->Release();
break;
#endif
case VIRTUAL_ON_DDRAW:
ret=(*pGDIBitBlt)(PrimaryDC, XDest+VirtualOffset.x, YDest+VirtualOffset.y, nDestWidth, nDestHeight, VirtualHDC, XDest, YDest, SRCCOPY);
if(!ret || (ret==GDI_ERROR)) {
OutTraceE("dxwSDC::PutPrimaryDC: BitBlt ERROR ret=%x err=%d\n", ret, GetLastError());
}
res=(*pReleaseDC)(lpDDSPrimary, PrimaryDC);
if(res){
OutTraceE("dxwSDC::PutPrimaryDC: ReleaseDC ERROR res=%x\n", res);
}
dxw.ScreenRefresh();
break;
case VIRTUAL_ON_WINDOW:
SetStretchBltMode(PrimaryDC, HALFTONE);
RECT RealArea, VirtualArea;
// some fullscreen games ("Imperialism II") blitted from negative coordinates -2,-2 !!
if(XDest < 0) {
nDestWidth += XDest;
XDest=0;
}
if(YDest < 0) {
nDestHeight += YDest;
YDest=0;
}
VirtualArea.left = XDest;
VirtualArea.top = YDest;
VirtualArea.right = nDestWidth;
VirtualArea.bottom = nDestHeight;
RealArea = VirtualArea;
dxw.MapClient(&RealArea);
OffsetRect(&RealArea, WinOffset.x, WinOffset.y);
ret=TRUE;
if(PrimaryDC)ret=(*pGDIStretchBlt)(PrimaryDC, RealArea.left, RealArea.top, RealArea.right, RealArea.bottom, VirtualHDC, VirtualArea.left, VirtualArea.top, VirtualArea.right, VirtualArea.bottom, SRCCOPY);
ret=(*pGDIReleaseDC)(dxw.GethWnd(), PrimaryDC);
break;
}
}
else {
switch(VirtualSurfaceType){
case VIRTUAL_ON_DDRAW:
res=(*pReleaseDC)(lpDDSPrimary, PrimaryDC);
if(res){
OutTraceE("dxwSDC::PutPrimaryDC: ReleaseDC ERROR res=%x\n", res);
}
break;
case VIRTUAL_ON_WINDOW:
ret=(*pGDIReleaseDC)(dxw.GethWnd(), PrimaryDC);
if(!ret){
OutTraceE("dxwSDC::PutPrimaryDC: ReleaseDC ERROR err=%d\n", GetLastError());
}
break;
}
}
OutTraceB("dxwSDC::PutPrimaryDC: hdc=%x PrimaryDC=%x ret=%x\n", hdc, PrimaryDC, ret);
return ret;
}
BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen)
{
return PutPrimaryDC(hdc, UpdateScreen, 0, 0, LastScreenWidth, LastScreenHeight);
}
/*---------------------------------------------------------------------------------+
| |
| Service routines |
| |
+---------------------------------------------------------------------------------*/
void dxwSDC::copyDcAttributes(HDC destDC, HDC origDc, POINT origin)
{
origFont = SelectObject(destDC, GetCurrentObject(origDc, OBJ_FONT));
origBrush = SelectObject(destDC, GetCurrentObject(origDc, OBJ_BRUSH));
origPen = SelectObject(destDC, GetCurrentObject(origDc, OBJ_PEN));
SetArcDirection(destDC, GetArcDirection(origDc));
SetBkColor(destDC, GetBkColor(origDc));
SetBkMode(destDC, GetBkMode(origDc));
SetDCBrushColor(destDC, GetDCBrushColor(origDc));
SetDCPenColor(destDC, GetDCPenColor(origDc));
SetPolyFillMode(destDC, GetPolyFillMode(origDc));
SetROP2(destDC, GetROP2(origDc));
SetStretchBltMode(destDC, GetStretchBltMode(origDc));
SetTextAlign(destDC, GetTextAlign(origDc));
SetTextCharacterExtra(destDC, GetTextCharacterExtra(origDc));
SetTextColor(destDC, GetTextColor(origDc));
OutTrace("copyDcAttributes: orig=(%d,%d)\n", origin.x, origin.y);
if(!(*pSetWindowOrgEx)(destDC, -origin.x, -origin.y, NULL))
OutTraceE("copyDcAttributes: SetWindowOrgEx ERROR orig=(%d,%d) err=%d\n", origin.x, origin.y, GetLastError());
POINT brushOrg = {};
GetBrushOrgEx(origDc, &brushOrg);
SetBrushOrgEx(destDC, brushOrg.x, brushOrg.y, NULL);
POINT currentPos = {};
(*pMoveToEx)(origDc, 0, 0, &currentPos);
(*pMoveToEx)(origDc, currentPos.x, currentPos.y, NULL);
dxw.MapClient(&currentPos);
(*pMoveToEx)(destDC, currentPos.x, currentPos.y, NULL);
}
typedef struct
{
HDC compatDc;
POINT origin;
HWND rootWnd;
} ExcludeClipRectsData_Type;
static BOOL CALLBACK excludeClipRectsForOverlappingWindows(HWND hwnd, LPARAM lParam)
{
ExcludeClipRectsData_Type *excludeClipRectsData = (ExcludeClipRectsData_Type *)lParam;
if (hwnd == dxw.GethWnd()) return FALSE; // stop
if (!IsWindowVisible(hwnd)) return TRUE; // go ahead
RECT rect = {};
(*pGetWindowRect)(hwnd, &rect);
OffsetRect(&rect, -excludeClipRectsData->origin.x, -excludeClipRectsData->origin.y);
ExcludeClipRect(excludeClipRectsData->compatDc, rect.left, rect.top, rect.right, rect.bottom);
OutTrace("dxwSDC::excludeClipRects: hwnd=%x rect=(%d,%d)-(%d,%d)\n", hwnd, rect.left, rect.top, rect.right, rect.bottom);
return TRUE;
}
void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT& origin)
{
OutTrace("dxwSDC::setClippingRegion: compdc=%x origdc=%x origin=(%d,%d)\n", compatDc, origDc, origin.x, origin.y);
HRGN clipRgn = CreateRectRgn(0, 0, 0, 0);
const bool isEmptyClipRgn = (1 != GetRandomRgn(origDc, clipRgn, SYSRGN));
OutTrace("dxwSDC::setClippingRegion: isEmptyClipRgn=%x\n", isEmptyClipRgn);
// scale clip region
POINT upleft={0, 0};
//(*pClientToScreen)(dxw.GethWnd(), &upleft);
(*pClientToScreen)(CurrenthWnd, &upleft);
if(IsDebug){
OutTrace("dxwSDC::setClippingRegion: upleft=(%d,%d)\n", upleft.x, upleft.y);
}
OffsetRgn(clipRgn, -upleft.x, -upleft.y);
if(IsDebug){
RECT RgnBox;
GetRgnBox(clipRgn, &RgnBox);
OutTrace("dxwSDC::setClippingRegion: RgnBox=(%d,%d)-(%d,%d) size=(%dx%d)\n",
RgnBox.left, RgnBox.top, RgnBox.right, RgnBox.bottom, RgnBox.right-RgnBox.left, RgnBox.bottom-RgnBox.top);
}
// end of scaling
SelectClipRgn(compatDc, isEmptyClipRgn ? NULL : clipRgn);
DeleteObject(clipRgn);
HRGN origClipRgn = (*pCreateRectRgn)(0, 0, 0, 0);
if (1 == GetClipRgn(origDc, origClipRgn))
{
OutTrace("dxwSDC::setClippingRegion: GetClipRgn==1\n");
OffsetRgn(origClipRgn, origin.x, origin.y);
ExtSelectClipRgn(compatDc, origClipRgn, RGN_AND);
if(IsDebug){
RECT RgnBox;
GetRgnBox(origClipRgn, &RgnBox); // for logging only
OutTrace("dxwSDC::setClippingRegion: OrigRgnBox=(%d,%d)-(%d,%d)\n", RgnBox.left, RgnBox.top, RgnBox.right, RgnBox.bottom);
}
}
DeleteObject(origClipRgn);
return;
// to finish .....
// on Win10 this part seems unnecessary and giving troubles .....
//dxw.MapClient(&origin);
if (!isEmptyClipRgn)
{
HWND hwnd = WindowFromDC(origDc);
if (hwnd)
{
ExcludeClipRectsData_Type excludeClipRectsData = { compatDc, origin, GetAncestor(hwnd, GA_ROOT) };
EnumWindows(&excludeClipRectsForOverlappingWindows,(LPARAM)(&excludeClipRectsData));
}
}
}

55
dll/shareddc.hpp Normal file
View File

@ -0,0 +1,55 @@
#include <windows.h>
#include "syslibs.h"
typedef enum {
VIRTUAL_UNDEFINED = 0,
VIRTUAL_ON_WINDOW,
VIRTUAL_ON_DDRAW,
VIRTUAL_ON_D3D,
VIRTUAL_ON_OPENGL,
VIRTUAL_ERROR
} Virtual_type;
class dxwSDC
{
// Construction/destruction
public:
dxwSDC();
virtual ~dxwSDC();
// Operations
public: // methods
HDC GetPrimaryDC(HDC);
HDC GetHdc(void);
BOOL PutPrimaryDC(HDC, BOOL, int, int, int, int);
BOOL PutPrimaryDC(HDC, BOOL);
private:
void copyDcAttributes(HDC, HDC, POINT);
void setClippingRegion(HDC, HDC, POINT&);
HDC PrimaryDC;
HDC VirtualHDC;
HDC CurrentHDC;
HWND CurrenthWnd;
LPDIRECTDRAWSURFACE lpDDSPrimary;
HBITMAP VirtualPic;
HGDIOBJ origFont;
HGDIOBJ origBrush;
HGDIOBJ origPen;
POINT WinOffset;
POINT VirtualOffset;
int ScreenWidth, ScreenHeight;
int LastScreenWidth, LastScreenHeight;
HDC LastHDC;
Virtual_type VirtualSurfaceType;
struct ExcludeClipRectsData
{
HDC compatDc;
POINT origin;
HWND rootWnd;
};
};
extern dxwSDC sdc;

View File

@ -38,7 +38,8 @@ typedef BOOL (WINAPI *ImmGetOpenStatus_Type)(HIMC);
// GDI32.dll:
typedef BOOL (WINAPI *BitBlt_Type)(HDC, int, int, int, int, HDC, int, int, DWORD);
typedef HDC (WINAPI *CreateCompatibleDC_Type)(HDC);
typedef HDC (WINAPI *CreateDC_Type)(LPCSTR, LPCSTR, LPCSTR, const DEVMODE *);
typedef HDC (WINAPI *CreateDCA_Type)(LPCSTR, LPCSTR, LPCSTR, const DEVMODE *);
typedef HDC (WINAPI *CreateDCW_Type)(LPWSTR, LPWSTR, LPWSTR, const DEVMODE *);
typedef HFONT (WINAPI *CreateFont_Type)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR);
typedef HFONT (WINAPI *CreateFontIndirect_Type)(const LOGFONT*);
typedef HDC (WINAPI *CreateICA_Type)(LPCTSTR, LPCTSTR, LPCTSTR, const DEVMODE *);
@ -69,7 +70,9 @@ typedef BOOL (WINAPI *SetDeviceGammaRamp_Type)(HDC, LPVOID);
typedef COLORREF(WINAPI *SetTextColor_Type)(HDC, COLORREF);
typedef BOOL (WINAPI *StretchBlt_Type)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
typedef int (WINAPI *StretchDIBits_Type)(HDC, int, int, int, int, int, int, int, int, const VOID *, const BITMAPINFO *, UINT, DWORD);
typedef BOOL (WINAPI *TextOut_Type)(HDC, int, int, LPCTSTR, int);
typedef BOOL (WINAPI *TextOutA_Type)(HDC, int, int, LPCTSTR, int);
typedef BOOL (WINAPI *TextOutW_Type)(HDC, int, int, LPCWSTR, int);
typedef BOOL (WINAPI *PolyBezier_Type)(HDC, const POINT *, DWORD);
typedef BOOL (WINAPI *PolyBezierTo_Type)(HDC, const POINT *, DWORD);
typedef BOOL (WINAPI *PolylineTo_Type)(HDC, const POINT *, DWORD);
typedef BOOL (WINAPI *PolyDraw_Type)(HDC, const POINT *, const BYTE *, int);
@ -161,8 +164,10 @@ typedef HWND (WINAPI *CreateDialogParam_Type)(HINSTANCE, LPCTSTR, HWND, DLGPROC,
typedef HWND (WINAPI *CreateWindowExA_Type)(DWORD, LPCTSTR, LPCTSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
typedef HWND (WINAPI *CreateWindowExW_Type)(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
typedef LRESULT (WINAPI *DefWindowProc_Type)(HWND, UINT, WPARAM, LPARAM);
typedef int (WINAPI *DrawText_Type)(HDC, LPCTSTR, int, LPRECT, UINT);
typedef int (WINAPI *DrawTextEx_Type)(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
typedef int (WINAPI *DrawTextA_Type)(HDC, LPCTSTR, int, LPRECT, UINT);
typedef int (WINAPI *DrawTextW_Type)(HDC, LPCWSTR, int, LPRECT, UINT);
typedef int (WINAPI *DrawTextExA_Type)(HDC, LPCTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
typedef int (WINAPI *DrawTextExW_Type)(HDC, LPCWSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
typedef BOOL (WINAPI *EndPaint_Type)(HWND, const PAINTSTRUCT *);
typedef LONG (WINAPI *EnumDisplaySettings_Type)(LPCTSTR, DWORD, LPDEVMODEA);
typedef int (WINAPI *FillRect_Type)(HDC, const RECT *, HBRUSH);
@ -184,8 +189,10 @@ typedef int (WINAPI *MapWindowPoints_Type)(HWND, HWND, LPPOINT, UINT);
typedef BOOL (WINAPI *MoveWindow_Type)(HWND, int, int, int, int, BOOL);
typedef BOOL (WINAPI *PeekMessage_Type)(LPMSG, HWND, UINT, UINT, UINT);
typedef BOOL (WINAPI *RedrawWindow_Type)(HWND, const RECT *, HRGN, UINT);
typedef ATOM (WINAPI *RegisterClassExA_Type)(WNDCLASSEX *);
typedef ATOM (WINAPI *RegisterClassA_Type)(WNDCLASS *);
typedef ATOM (WINAPI *RegisterClassExA_Type)(WNDCLASSEXA *);
typedef ATOM (WINAPI *RegisterClassA_Type)(WNDCLASSA *);
typedef ATOM (WINAPI *RegisterClassExW_Type)(WNDCLASSEXW *);
typedef ATOM (WINAPI *RegisterClassW_Type)(WNDCLASSW *);
typedef int (WINAPI *GDIReleaseDC_Type)(HWND, HDC);
typedef BOOL (WINAPI *ScreenToClient_Type)(HWND, LPPOINT);
typedef LRESULT (WINAPI *SendMessage_Type)(HWND, UINT, WPARAM, LPARAM);
@ -197,6 +204,7 @@ typedef BOOL (WINAPI *SetWindowPos_Type)(HWND, HWND, int, int, int, int, UINT);
typedef int (WINAPI *ShowCursor_Type)(BOOL);
typedef BOOL (WINAPI *ShowWindow_Type)(HWND, int);
typedef LONG (WINAPI *TabbedTextOutA_Type)(HDC, int, int, LPCTSTR, int, int, const LPINT, int);
typedef LONG (WINAPI *TabbedTextOutW_Type)(HDC, int, int, LPCWSTR, int, int, const LPINT, int);
typedef BOOL (WINAPI *DestroyWindow_Type)(HWND);
typedef BOOL (WINAPI *CloseWindow_Type)(HWND);
typedef BOOL (WINAPI *SetSysColors_Type)(int, const INT *, const COLORREF *);
@ -264,7 +272,8 @@ DXWEXTERN ImmGetOpenStatus_Type pImmGetOpenStatus DXWINITIALIZED;
// GDI32.dll:
DXWEXTERN BitBlt_Type pGDIBitBlt DXWINITIALIZED;
DXWEXTERN CreateCompatibleDC_Type pGDICreateCompatibleDC DXWINITIALIZED;
DXWEXTERN CreateDC_Type pGDICreateDC DXWINITIALIZED;
DXWEXTERN CreateDCA_Type pGDICreateDCA DXWINITIALIZED;
DXWEXTERN CreateDCW_Type pGDICreateDCW DXWINITIALIZED;
DXWEXTERN CreateFont_Type pGDICreateFont DXWINITIALIZED;
DXWEXTERN CreateFontIndirect_Type pGDICreateFontIndirect DXWINITIALIZED;
DXWEXTERN CreateICA_Type pCreateICA DXWINITIALIZED;
@ -295,12 +304,14 @@ DXWEXTERN SetDeviceGammaRamp_Type pGDISetDeviceGammaRamp DXWINITIALIZED;
DXWEXTERN SetTextColor_Type pGDISetTextColor DXWINITIALIZED;
DXWEXTERN StretchBlt_Type pGDIStretchBlt DXWINITIALIZED;
DXWEXTERN StretchDIBits_Type pStretchDIBits DXWINITIALIZED;
DXWEXTERN TextOut_Type pGDITextOutA DXWINITIALIZED;
DXWEXTERN TextOutA_Type pGDITextOutA DXWINITIALIZED;
DXWEXTERN TextOutW_Type pGDITextOutW DXWINITIALIZED;
DXWEXTERN LineTo_Type pLineTo DXWINITIALIZED;
DXWEXTERN ArcTo_Type pArcTo DXWINITIALIZED;
DXWEXTERN MoveToEx_Type pMoveToEx DXWINITIALIZED;
DXWEXTERN PolyDraw_Type pPolyDraw DXWINITIALIZED;
DXWEXTERN PolylineTo_Type pPolylineTo DXWINITIALIZED;
DXWEXTERN PolyBezier_Type pPolyBezier DXWINITIALIZED;
DXWEXTERN PolyBezierTo_Type pPolyBezierTo DXWINITIALIZED;
DXWEXTERN SetDIBitsToDevice_Type pSetDIBitsToDevice DXWINITIALIZED;
DXWEXTERN CreateCompatibleBitmap_Type pCreateCompatibleBitmap DXWINITIALIZED;
@ -387,8 +398,10 @@ DXWEXTERN CreateWindowExA_Type pCreateWindowExA DXWINITIALIZED;
DXWEXTERN CreateWindowExW_Type pCreateWindowExW DXWINITIALIZED;
DXWEXTERN DefWindowProc_Type pDefWindowProcA DXWINITIALIZED;
DXWEXTERN DefWindowProc_Type pDefWindowProcW DXWINITIALIZED;
DXWEXTERN DrawText_Type pDrawText DXWINITIALIZED;
DXWEXTERN DrawTextEx_Type pDrawTextEx DXWINITIALIZED;
DXWEXTERN DrawTextA_Type pDrawTextA DXWINITIALIZED;
DXWEXTERN DrawTextW_Type pDrawTextW DXWINITIALIZED;
DXWEXTERN DrawTextExA_Type pDrawTextExA DXWINITIALIZED;
DXWEXTERN DrawTextExW_Type pDrawTextExW DXWINITIALIZED;
DXWEXTERN EndPaint_Type pEndPaint DXWINITIALIZED;
DXWEXTERN EnumDisplaySettings_Type pEnumDisplaySettings DXWINITIALIZED;
DXWEXTERN FillRect_Type pFillRect DXWINITIALIZED;
@ -414,6 +427,8 @@ DXWEXTERN PeekMessage_Type pPeekMessage DXWINITIALIZED;
DXWEXTERN RedrawWindow_Type pRedrawWindow DXWINITIALIZED;
DXWEXTERN RegisterClassExA_Type pRegisterClassExA DXWINITIALIZED;
DXWEXTERN RegisterClassA_Type pRegisterClassA DXWINITIALIZED;
DXWEXTERN RegisterClassExW_Type pRegisterClassExW DXWINITIALIZED;
DXWEXTERN RegisterClassW_Type pRegisterClassW DXWINITIALIZED;
DXWEXTERN GDIReleaseDC_Type pGDIReleaseDC DXWINITIALIZED;
DXWEXTERN ScreenToClient_Type pScreenToClient DXWINITIALIZED;
DXWEXTERN SendMessage_Type pSendMessageA DXWINITIALIZED;
@ -427,6 +442,7 @@ DXWEXTERN SetWindowPos_Type pSetWindowPos DXWINITIALIZED;
DXWEXTERN ShowCursor_Type pShowCursor DXWINITIALIZED;
DXWEXTERN ShowWindow_Type pShowWindow DXWINITIALIZED;
DXWEXTERN TabbedTextOutA_Type pTabbedTextOutA DXWINITIALIZED;
DXWEXTERN TabbedTextOutW_Type pTabbedTextOutW DXWINITIALIZED;
DXWEXTERN DestroyWindow_Type pDestroyWindow DXWINITIALIZED;
DXWEXTERN CloseWindow_Type pCloseWindow DXWINITIALIZED;
DXWEXTERN SetSysColors_Type pSetSysColors DXWINITIALIZED;
@ -485,7 +501,8 @@ extern BOOL WINAPI extImmGetOpenStatus(HIMC);
extern BOOL WINAPI extGDIBitBlt(HDC, int, int, int, int, HDC, int, int, DWORD);
extern HDC WINAPI extGDICreateCompatibleDC(HDC);
extern HDC WINAPI extEMUCreateCompatibleDC(HDC);
extern HDC WINAPI extGDICreateDC(LPSTR, LPSTR, LPSTR, CONST DEVMODE *);
extern HDC WINAPI extGDICreateDCA(LPSTR, LPSTR, LPSTR, CONST DEVMODE *);
extern HDC WINAPI extGDICreateDCW(LPWSTR, LPWSTR, LPWSTR, CONST DEVMODE *);
extern HFONT WINAPI extCreateFont(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR);
extern HFONT WINAPI extCreateFontIndirect(const LOGFONT*);
extern HDC WINAPI extCreateICA(LPCTSTR, LPCTSTR, LPCTSTR, const DEVMODE *);
@ -515,6 +532,8 @@ extern BOOL WINAPI extSetDeviceGammaRamp(HDC, LPVOID);
extern BOOL WINAPI extGDIStretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
extern int WINAPI extStretchDIBits(HDC, int, int, int, int, int, int, int, int, const VOID *, const BITMAPINFO *, UINT, DWORD);
extern BOOL WINAPI extTextOutA(HDC, int, int, LPCTSTR, int);
extern BOOL WINAPI extTextOutW(HDC, int, int, LPCWSTR, int);
extern BOOL WINAPI extPolyBezier(HDC, const POINT *, DWORD);
extern BOOL WINAPI extPolyBezierTo(HDC, const POINT *, DWORD);
extern BOOL WINAPI extPolylineTo(HDC, const POINT *, DWORD);
extern BOOL WINAPI extPolyDraw(HDC, const POINT *, const BYTE *, int);
@ -610,6 +629,8 @@ extern LRESULT WINAPI extDefWindowProcA(HWND, UINT, WPARAM, LPARAM);
extern LRESULT WINAPI extDefWindowProcW(HWND, UINT, WPARAM, LPARAM);
extern int WINAPI extDrawTextA(HDC, LPCTSTR, int, LPRECT, UINT);
extern int WINAPI extDrawTextExA(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
extern int WINAPI extDrawTextW(HDC, LPCWSTR, int, LPRECT, UINT);
extern int WINAPI extDrawTextExW(HDC, LPCWSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *);
extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *);
extern int WINAPI extFillRect(HDC, const RECT *, HBRUSH);
@ -618,7 +639,6 @@ extern BOOL WINAPI extGetClientRect(HWND, LPRECT);
extern BOOL WINAPI extGetClipCursor(LPRECT);
extern BOOL WINAPI extGetCursorPos(LPPOINT);
extern HDC WINAPI extGDIGetDC(HWND);
extern HDC WINAPI extEMUGetDC(HWND);
extern HWND WINAPI extGetDesktopWindow(void);
extern BOOL WINAPI extGetMonitorInfoA(HMONITOR, LPMONITORINFO);
extern BOOL WINAPI extGetMonitorInfoW(HMONITOR, LPMONITORINFO);
@ -636,6 +656,8 @@ extern BOOL WINAPI extPeekMessage(LPMSG, HWND, UINT, UINT, UINT);
extern BOOL WINAPI extRedrawWindow(HWND, const RECT *, HRGN, UINT);
extern ATOM WINAPI extRegisterClassExA(WNDCLASSEXA *);
extern ATOM WINAPI extRegisterClassA(WNDCLASSA *);
extern ATOM WINAPI extRegisterClassExW(WNDCLASSEXW *);
extern ATOM WINAPI extRegisterClassW(WNDCLASSW *);
extern int WINAPI extGDIReleaseDC(HWND, HDC);
extern BOOL WINAPI extScreenToClient(HWND, LPPOINT);
extern LRESULT WINAPI extSendMessageA(HWND, UINT, WPARAM, LPARAM);
@ -649,6 +671,7 @@ extern BOOL WINAPI extSetWindowPos(HWND, HWND, int, int, int, int, UINT);
extern int WINAPI extShowCursor(BOOL);
extern BOOL WINAPI extShowWindow(HWND, int);
extern LONG WINAPI extTabbedTextOutA(HDC, int, int, LPCTSTR, int, int, const LPINT, int);
extern LONG WINAPI extTabbedTextOutW(HDC, int, int, LPCWSTR, int, int, const LPINT, int);
extern BOOL WINAPI extDestroyWindow(HWND);
extern BOOL WINAPI extCloseWindow(HWND);
extern BOOL WINAPI extSetSysColors(int, const INT *, const COLORREF *);
@ -687,3 +710,4 @@ extern void HookGDI32Init();
extern void HookImagehlpInit();
/* eof */

3302
dll/user32.09.cpp Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

219
dll/virtualdc.cpp Normal file
View File

@ -0,0 +1,219 @@
#define _CRT_SECURE_NO_WARNINGS
#define SYSLIBNAMES_DEFINES
#include <stdio.h>
#include "dxwnd.h"
#include "dxwcore.hpp"
#include "syslibs.h"
#include "dxhelper.h"
#include "resource.h"
#include "hddraw.h"
extern GetDC_Type pGetDC;
extern ReleaseDC_Type pReleaseDC;
extern HandleDDThreadLock_Type pReleaseDDThreadLock;
#define OutTraceTMP OutTrace
HDC dxwVDC::GetPrimaryDC()
{
HDC PrimaryDC;
LPDIRECTDRAWSURFACE lpDDSPrim;
PrimaryDC = NULL;
lpDDSPrim = dxwss.GetPrimarySurface();
if (lpDDSPrim) {
if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)();
(*pGetDC)(lpDDSPrim, &PrimaryDC);
while((PrimaryDC == NULL) && lpDDSPrim) {
OutTraceDW("GetFlippedDC: found primary surface with no DC, unref lpdds=%x\n", lpDDSPrim);
dxwss.UnrefSurface(lpDDSPrim);
lpDDSPrim = dxwss.GetPrimarySurface();
if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &PrimaryDC);
}
}
OutTrace("GetFlippedDC: return primary surface dc=%x\n", PrimaryDC);
return PrimaryDC;
}
HDC dxwVDC::AcquireEmulatedDC(HWND hwnd, HDC *PrimaryDC)
{
HDC wdc;
RECT WinRect;
HDC RealHDC;
/*---------------------------------
extern HDC hFlippedDC;
LPDIRECTDRAWSURFACE lpDDSPrim;
hFlippedDC = GetPrimaryDC();
----------------------------------*/
if(!(wdc=(*pGDIGetDC)(hwnd))){
OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
return NULL;
}
RealHDC=wdc;
RECT LastVRect;
LastVRect = VirtualPicRect;
if(!(hwnd=WindowFromDC(wdc)))
OutTraceE("WindowFromDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
(*pGetClientRect)(hwnd, &WinRect);
if(dxw.IsDesktop(hwnd)){
// when screen resolution changes, better renew service resources
VirtualPicRect = dxw.GetScreenRect();
if((LastVRect.right != VirtualPicRect.right) || (LastVRect.bottom != VirtualPicRect.bottom)) {
DeleteObject(VirtualHDC);
VirtualHDC = NULL;
DeleteObject(VirtualPic);
VirtualPic = NULL;
}
}
else {
VirtualPicRect = WinRect;
dxw.UnmapClient(&VirtualPicRect);
}
OutTraceB("AcquireEmulatedDC: hwnd=%x Desktop=%x WinRect=(%d,%d)(%d,%d) VirtRect=(%d,%d)(%d,%d)\n",
hwnd, dxw.IsDesktop(hwnd),
WinRect.left, WinRect.top, WinRect.right, WinRect.bottom,
VirtualPicRect.left, VirtualPicRect.top, VirtualPicRect.right, VirtualPicRect.bottom);
if (!VirtualHDC){
OutTraceB("AcquireEmulatedDC: INITIALIZE\n");
if(!(VirtualHDC=CreateCompatibleDC(wdc)))
OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!(VirtualPic=CreateCompatibleBitmap(wdc, dxw.GetScreenWidth(), dxw.GetScreenHeight())))
OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!SelectObject(VirtualHDC, VirtualPic))
OutTraceE("SelectObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
/*---------------------------------*/
//HRGN hRgn;
//RECT screen;
//screen = dxw.GetScreenRect();
//hRgn = CreateRectRgnIndirect(&screen);
//SelectClipRgn (VirtualHDC, hRgn);
//screen = dxw.GetScreenRect();
//hRgn = CreateRectRgnIndirect(&screen);
//SelectClipRgn (wdc, hRgn);
/*---------------------------------*/
/*---------------------------------*/
if (!(hwnd == dxw.GethWnd())) {
POINT father, child, offset;
father.x = father.y = 0;
child.x = child.y = 0;
(*pClientToScreen)(dxw.GethWnd(),&father);
(*pClientToScreen)(hwnd,&child);
offset.x = child.x - father.x;
offset.y = child.y - father.y;
dxw.UnmapClient(&offset);
OutTraceDW("AcquireEmulatedDC: child window hwnd=%x offset=(%d,%d)\n", hwnd, offset.x, offset.y);
(*pSetViewportOrgEx)(VirtualHDC, offset.x, offset.y, NULL);
}
else
(*pSetViewportOrgEx)(VirtualHDC, 0, 0, NULL);
if(*PrimaryDC = GetPrimaryDC()){ // better copy from virtual primary ....
OutTraceTMP("AcquireEmulatedDC: intialize from primary dc=%x\n", PrimaryDC);
if(!(*pGDIBitBlt)(VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, *PrimaryDC, 0, 0, SRCCOPY))
OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
}
else { // otherwise stretch from current windows DC
OutTraceTMP("AcquireEmulatedDC: intialize from windows dc=%x\n", wdc);
if(!(*pGDIStretchBlt)(VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, wdc, 0, 0, WinRect.right, WinRect.bottom, SRCCOPY))
OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
}
}
return VirtualHDC;
}
BOOL dxwVDC::ReleaseEmulatedDC(HWND hwnd)
{
HDC wdc;
RECT WinRect;
HDC PrimaryDC;
(*pGetClientRect)(hwnd, &WinRect);
OutTraceB("ReleaseEmulatedDC: hwnd=%x Desktop=%x WinRect=(%d,%d)(%d,%d) VirtRect=(%d,%d)(%d,%d)\n",
hwnd, dxw.IsDesktop(hwnd),
WinRect.left, WinRect.top, WinRect.right, WinRect.bottom,
VirtualPicRect.left, VirtualPicRect.top, VirtualPicRect.right, VirtualPicRect.bottom);
if(PrimaryDC = GetPrimaryDC()){ // better copy from virtual primary ....
OutTraceTMP("AcquireEmulatedDC: flush to from primary dc=%x\n", PrimaryDC);
if(!(*pGDIBitBlt)(PrimaryDC, VirtualPicRect.left, VirtualPicRect.top, VirtualPicRect.right, VirtualPicRect.bottom, VirtualHDC, 0, 0, SRCCOPY))
OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
}
else
{
if(!(wdc=(*pGDIGetDC)(hwnd)))
OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
OutTraceTMP("AcquireEmulatedDC: flush to windows dc=%x\n", wdc);
SetStretchBltMode(wdc, HALFTONE);
if(!(*pGDIStretchBlt)(wdc, 0, 0, WinRect.right, WinRect.bottom, VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, SRCCOPY))
OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
}
(*pGDIReleaseDC)(hwnd, VirtualHDC);
return TRUE;
}
void dxwVDC::ResetEmulatedDC()
{
VirtualHDC=NULL;
VirtualPic=NULL;
VirtualOffsetX=0;
VirtualOffsetY=0;
}
BOOL dxwVDC::IsVirtual(HDC hdc)
{
return (hdc==VirtualHDC) /* && (dwFlags3 & GDIEMULATEDC)*/;
}
#if 0
BOOL dxwCore::ReleaseSharedDC(HWND hwnd, HDC hDC)
{
HRESULT ret;
LPDIRECTDRAWSURFACE lpDDSPrim;
lpDDSPrim = dxwss.GetPrimarySurface();
if(!lpDDSPrim) return(TRUE);
OutTraceDW("GDI.ReleaseDC: releasing flipped GDI hdc=%x\n", hDC);
ret=(*pReleaseDC)(dxwss.GetPrimarySurface(), hDC);
if (!(hwnd == dxw.GethWnd())) {
POINT father, child, offset;
RECT rect;
HDC hdc;
father.x = father.y = 0;
child.x = child.y = 0;
(*pClientToScreen)(dxw.GethWnd(),&father);
(*pClientToScreen)(hwnd,&child);
offset.x = child.x - father.x;
offset.y = child.y - father.y;
if(offset.x || offset.y){
// if the graphis was blitted to primary but below a modal child window,
// bring that up to the window surface to make it visible.
BOOL ret2;
(*pGetClientRect)(hwnd, &rect);
hdc=(*pGDIGetDC)(hwnd);
if(!hdc) OutTrace("GDI.ReleaseDC: GetDC ERROR=%d at %d\n", GetLastError(), __LINE__);
ret2=(*pGDIBitBlt)(hdc, rect.left, rect.top, rect.right, rect.bottom, hDC, offset.x, offset.y, SRCCOPY);
if(!ret2) OutTrace("GDI.ReleaseDC: BitBlt ERROR=%d at %d\n", GetLastError(), __LINE__);
ret2=(*pGDIReleaseDC)(hwnd, hdc);
if(!ret2)OutTrace("GDI.ReleaseDC: ReleaseDC ERROR=%d at %d\n", GetLastError(), __LINE__);
// this may flicker ....
(*pInvalidateRect)(hwnd, NULL, FALSE);
}
}
if (ret) OutTraceE("GDI.ReleaseDC ERROR: err=%x(%s) at %d\n", ret, ExplainDDError(ret), __LINE__);
else dxw.ScreenRefresh();
return (ret == DD_OK);
}
#endif

View File

@ -42,6 +42,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_EASPORTSHACK, cTarget->m_EASportsHack);
DDX_Check(pDX, IDC_LEGACYALLOC, cTarget->m_LegacyAlloc);
DDX_Check(pDX, IDC_DISABLEMAXWINMODE, cTarget->m_DisableMaxWinMode);
DDX_Check(pDX, IDC_DISABLEDISABLEALTTAB, cTarget->m_DisableDisableAltTab);
DDX_Check(pDX, IDC_NOIMAGEHLP, cTarget->m_NoImagehlp);
DDX_Check(pDX, IDC_REPLACEPRIVOPS, cTarget->m_ReplacePrivOps);

View File

@ -31,7 +31,6 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_CLIENTREMAPPING, cTarget->m_ClientRemapping);
DDX_Radio(pDX, IDC_GDINONE, cTarget->m_DCEmulationMode);
DDX_Check(pDX, IDC_FIXTEXTOUT, cTarget->m_FixTextOut);
DDX_Check(pDX, IDC_SHAREDDC, cTarget->m_SharedDC);
DDX_Check(pDX, IDC_NOFILLRECT, cTarget->m_NoFillRect);
DDX_Check(pDX, IDC_REUSEEMULATEDDC, cTarget->m_ReuseEmulatedDC);
DDX_Check(pDX, IDC_CREATEDESKTOP, cTarget->m_CreateDesktop);

View File

@ -2,6 +2,7 @@
//
#include "stdafx.h"
#include "shlwapi.h"
#include "dxwndhost.h"
#include "TargetDlg.h"
@ -59,6 +60,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_EASportsHack = FALSE;
m_LegacyAlloc = FALSE;
m_DisableMaxWinMode = FALSE;
m_DisableDisableAltTab = FALSE;
m_NoImagehlp = FALSE;
m_ReplacePrivOps = FALSE;
m_ForcesHEL = FALSE;
@ -103,8 +105,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_Windowize = TRUE; // default true !!
m_HotPatch = FALSE;
m_HookDLLs = TRUE; // default true !!
m_TerminateOnClose = FALSE; // default true !!
m_ConfirmOnClose = FALSE; // default true !!
m_TerminateOnClose = FALSE;
m_ConfirmOnClose = FALSE;
m_HookEnabled = TRUE; // default true !!
m_EmulateRegistry = FALSE;
m_OverrideRegistry = FALSE;
@ -231,19 +233,6 @@ BOOL CTargetDlg::OnInitDialog()
int i=0;
AfxEnableControlContainer();
CDialog::OnInitDialog();
#if 0
m_tabdxTabCtrl.InsertItem(i++, _T("Main"));
m_tabdxTabCtrl.InsertItem(i++, _T("Video"));
m_tabdxTabCtrl.InsertItem(i++, _T("Input"));
m_tabdxTabCtrl.InsertItem(i++, _T("DirectX"));
m_tabdxTabCtrl.InsertItem(i++, _T("Timing"));
m_tabdxTabCtrl.InsertItem(i++, _T("Log"));
m_tabdxTabCtrl.InsertItem(i++, _T("Libs"));
m_tabdxTabCtrl.InsertItem(i++, _T("Compat"));
m_tabdxTabCtrl.InsertItem(i++, _T("Registry"));
m_tabdxTabCtrl.InsertItem(i++, _T("Notes"));
if (gbDebug) m_tabdxTabCtrl.InsertItem(i++, _T("Debug"));
#else
char sCaption[48+1];
LoadString(AfxGetResourceHandle(), DXW_TAB_MAIN, sCaption, sizeof(sCaption));
m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
@ -269,7 +258,6 @@ BOOL CTargetDlg::OnInitDialog()
m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
LoadString(AfxGetResourceHandle(), DXW_TAB_DEBUG, sCaption, sizeof(sCaption));
if (gbDebug) m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
#endif
m_tabdxTabCtrl.Init();
return TRUE;
}
@ -293,7 +281,94 @@ BEGIN_MESSAGE_MAP(CTargetDlg, CDialog)
//{{AFX_MSG_MAP(CTargetDlg)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDTRY, &CTargetDlg::OnBnClickedTry)
ON_BN_CLICKED(IDKILL, &CTargetDlg::OnBnClickedKill)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTargetDlg Message Handler
void CTargetDlg::OnBnClickedTry()
{
#if 0
NMHDR nmh;
nmh.code = ID_PRUN;
nmh.idFrom = NULL;
nmh.hwndFrom = NULL;
this->GetParent()->SendMessage(WM_NOTIFY, 0, (LPARAM)&nmh);
#else
char path[MAX_PATH+1];
char fullpath[MAX_PATH+1];
char sMsg[81];
int iHookStatus;
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
TARGETMAP RestrictedMaps[2];
extern void SetTargetFromDlg(TARGETMAP *, CTargetDlg *);
extern BOOL CheckStatus(void);
static BOOL IsLocked = FALSE;
if(IsLocked) return;
if (CheckStatus()) return; // don't try when status is active
IsLocked = TRUE;
m_tabdxTabCtrl.OnOK();
SetTargetFromDlg(&RestrictedMaps[0], this);
memset(&RestrictedMaps[1], 0, sizeof(TARGETMAP));
strcpy_s(path, sizeof(path), m_FilePath.GetBuffer());
PathRemoveFileSpec(path);
SetTarget(RestrictedMaps);
iHookStatus=GetHookStatus(NULL);
if(iHookStatus == DXW_IDLE) StartHook();
if(m_StartDebug){
extern DWORD WINAPI StartDebug(void *);
TARGETMAP TargetMap;
PRIVATEMAP PrivateMap;
ThreadInfo_Type ThreadInfo;
strcpy(TargetMap.path, m_FilePath);
strcpy(PrivateMap.launchpath, m_LaunchPath);
ThreadInfo.TM=&TargetMap;
ThreadInfo.PM=&PrivateMap;
CloseHandle(CreateThread( NULL, 0, StartDebug, &ThreadInfo, 0, NULL));
}
else{
ZeroMemory(&sinfo, sizeof(sinfo));
sinfo.cb = sizeof(sinfo);
strncpy(fullpath, m_LaunchPath.IsEmpty() ? m_FilePath.GetBuffer() : m_LaunchPath.GetBuffer(), MAX_PATH);
if(!CreateProcess(NULL, fullpath,
0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, path, &sinfo, &pinfo)){
sprintf(sMsg, "CreateProcess ERROR %d", GetLastError());
MessageBox(sMsg, "Error", MB_ICONEXCLAMATION);
}
CloseHandle(pinfo.hProcess); // no longer needed, avoid handle leakage
CloseHandle(pinfo.hThread); // no longer needed, avoid handle leakage
}
// wait & recover
Sleep(5000);
//SetTarget(CDxwndhostView::TargetMaps);
if(iHookStatus == DXW_IDLE) EndHook();
IsLocked = FALSE;
#endif
}
void CTargetDlg::OnBnClickedKill()
{
char FilePath[MAX_PATH+1];
char *lpProcName, *lpNext;
HRESULT res;
extern BOOL KillProcByName(char *, BOOL);
strncpy(FilePath, m_FilePath.GetBuffer(), MAX_PATH);
lpProcName=FilePath;
while (lpNext=strchr(lpProcName,'\\')) lpProcName=lpNext+1;
if(!KillProcByName(lpProcName, FALSE)){
wchar_t *wcstring = new wchar_t[48+1];
mbstowcs_s(NULL, wcstring, 48, lpProcName, _TRUNCATE);
res=MessageBoxLangArg(DXW_STRING_KILLTASK, DXW_STRING_WARNING, MB_YESNO | MB_ICONQUESTION, wcstring);
if(res!=IDYES) return;
KillProcByName(lpProcName, TRUE);
}
else{
MessageBoxLang(DXW_STRING_NOKILLTASK, DXW_STRING_INFO, MB_ICONEXCLAMATION);
}
}

View File

@ -199,6 +199,7 @@ public:
BOOL m_EASportsHack;
BOOL m_LegacyAlloc;
BOOL m_DisableMaxWinMode;
BOOL m_DisableDisableAltTab;
BOOL m_NoImagehlp;
BOOL m_ForcesHEL;
BOOL m_SetZBufferBitDepths;
@ -256,6 +257,8 @@ protected:
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedTry();
afx_msg void OnBnClickedKill();
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ Will insert additional declarations immediately before the previous line.

Binary file not shown.

View File

@ -34,6 +34,8 @@ END_MESSAGE_MAP()
UINT m_StartToTray = FALSE;
UINT m_InitialState = DXW_ACTIVE;
BOOL gbDebug = FALSE;
BOOL gTransientMode = FALSE;
int iProgIndex;
extern char m_ConfigFileName[20+1] = "dxwnd.ini";
class CNewCommandLineInfo : public CCommandLineInfo
@ -50,6 +52,13 @@ char LangString[20+1] = {0};
void CNewCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
{
// syntax:
// /t -- start minimized in tray icon
// /i -- start in idle state
// /d -- start in debug mode
// /lang=<XX> -- loads the language resources in Resources_<XX>.dll extension
// /c:<path> -- loads <path> config file instead of default dxwnd.ini
// /e -- terminates (Ends) the active dxwnd session
if(bFlag) {
CString sParam(lpszParam);
if (sParam.MakeLower() == "t"){
@ -87,6 +96,13 @@ void CNewCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
KillProcByName("DxWnd.exe", TRUE);
exit(0);
}
if (sParam.Left(2).MakeLower() == "r:"){
gTransientMode = TRUE;
m_StartToTray=TRUE;
char *p = (char *)sParam.GetString();
iProgIndex = atoi(&p[2]);
return;
}
}
// Call the base class to ensure proper command line processing

View File

@ -34,6 +34,12 @@ typedef struct PRIVATEMAP
char *registry;
}PRIVATEMAP;
typedef struct {
TARGETMAP *TM;
PRIVATEMAP *PM;
} ThreadInfo_Type;
ThreadInfo_Type;
extern char gInitPath[MAX_PATH];
/////////////////////////////////////////////////////////////////////////////

Binary file not shown.

Binary file not shown.

View File

@ -31,6 +31,8 @@ extern UINT m_InitialState;
extern char m_ConfigFileName[20+1];
extern BOOL Inject(DWORD, const char *);
extern int KillProcByName(char *, BOOL);
extern BOOL gTransientMode;
extern int iProgIndex;
PRIVATEMAP *pTitles; // global ptr: get rid of it!!
TARGETMAP *pTargets; // idem.
@ -141,7 +143,7 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView)
END_MESSAGE_MAP()
// v2.1.68: dialog box for status check.
static BOOL CheckStatus()
BOOL CheckStatus()
{
if(GetHookStatus(NULL)==DXW_RUNNING){
MessageBoxLang(DXW_STRING_WAITTASK, DXW_STRING_WARNING, MB_OK | MB_ICONEXCLAMATION);
@ -163,7 +165,7 @@ static void RevertScreenChanges(DEVMODE *InitDevMode)
}
}
static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
{
strcpy_s(t->path, sizeof(t->path), dlg->m_FilePath);
strcpy_s(t->module, sizeof(t->module), dlg->m_Module);
@ -221,6 +223,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
case 0: break;
case 1: t->flags2 |= GDISTRETCHED; break;
case 2: t->flags3 |= GDIEMULATEDC; break;
case 3: t->flags6 |= SHAREDDC; break;
//case 3: t->flags |= MAPGDITOPRIMARY; break;
}
@ -300,6 +303,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_EASportsHack) t->flags5 |= EASPORTSHACK;
if(dlg->m_LegacyAlloc) t->flags6 |= LEGACYALLOC;
if(dlg->m_DisableMaxWinMode) t->flags6 |= DISABLEMAXWINMODE;
if(dlg->m_DisableDisableAltTab) t->flags7 |= DISABLEDISABLEALTTAB;
if(dlg->m_NoImagehlp) t->flags5 |= NOIMAGEHLP;
if(dlg->m_ForcesHEL) t->flags3 |= FORCESHEL;
if(dlg->m_SetZBufferBitDepths) t->flags6 |= SETZBUFFERBITDEPTHS;
@ -335,7 +339,6 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_CursorClipping) t->flags |= CLIPCURSOR;
if(dlg->m_VideoToSystemMem) t->flags |= SWITCHVIDEOMEMORY;
if(dlg->m_FixTextOut) t->flags |= FIXTEXTOUT;
if(dlg->m_SharedDC) t->flags6 |= SHAREDDC;
if(dlg->m_HookGlide) t->flags4 |= HOOKGLIDE;
if(dlg->m_RemapMCI) t->flags5 |= REMAPMCI;
if(dlg->m_NoMovies) t->flags6 |= NOMOVIES;
@ -472,6 +475,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_DCEmulationMode = 0;
if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1;
if(t->flags3 & GDIEMULATEDC) dlg->m_DCEmulationMode = 2;
if(t->flags6 & SHAREDDC ) dlg->m_DCEmulationMode = 3;
//if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3;
dlg->m_ResTypes = 0;
@ -525,6 +529,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_EASportsHack = t->flags5 & EASPORTSHACK ? 1 : 0;
dlg->m_LegacyAlloc = t->flags6 & LEGACYALLOC ? 1 : 0;
dlg->m_DisableMaxWinMode = t->flags6 & DISABLEMAXWINMODE ? 1 : 0;
dlg->m_DisableDisableAltTab = t->flags7 & DISABLEDISABLEALTTAB ? 1 : 0;
dlg->m_NoImagehlp = t->flags5 & NOIMAGEHLP ? 1 : 0;
dlg->m_ForcesHEL = t->flags3 & FORCESHEL ? 1 : 0;
dlg->m_SetZBufferBitDepths = t->flags6 & SETZBUFFERBITDEPTHS ? 1 : 0;
@ -1075,6 +1080,10 @@ void CDxwndhostView::OnInitialUpdate()
this->isUpdated=FALSE;
pTitles = &PrivateMaps[0];
pTargets= &TargetMaps[0];
if(gTransientMode){
this->OnRun();
}
}
/////////////////////////////////////////////////////////////////////////////
@ -1753,9 +1762,10 @@ DWORD WINAPI TrayIconUpdate(CSystemTray *Tray)
char sMsg[1024];
char *Status;
char DllVersion[21];
int TickCount;
int TickCount, IdleCount;
PrevDxStatus=-1; // a different one...
TickCount=0;
IdleCount=0;
while (TRUE) {
// once a second ...
Sleep(1000);
@ -1770,10 +1780,18 @@ DWORD WINAPI TrayIconUpdate(CSystemTray *Tray)
TickCount=0;
Tray->StopAnimation();
Tray->SetIcon(IconId);
if(gTransientMode) {
IdleCount++;
if(IdleCount > 2) {
delete(Tray->GetAncestor(GA_ROOTOWNER));
exit(0);
}
}
}
else {
// animation state machine ....
TickCount++;
IdleCount=0;
if (DxStatus!=PrevDxStatus) {
Tray->SetIcon(IconId);
}
@ -1999,12 +2017,6 @@ static char *ExceptionCaption(DWORD ec)
// For thread messaging
#define DEBUG_EVENT_MESSAGE WM_APP + 0x100
typedef struct {
TARGETMAP *TM;
PRIVATEMAP *PM;
} ThreadInfo_Type;
ThreadInfo_Type ThreadInfo;
DWORD WINAPI StartDebug(void *p)
{
ThreadInfo_Type *ThInfo;
@ -2137,22 +2149,37 @@ DWORD WINAPI StartDebug(void *p)
void CDxwndhostView::OnRun()
{
static BOOL IsLocked = FALSE;
if(IsLocked) return;
IsLocked = TRUE;
CListCtrl& listctrl = GetListCtrl();
POSITION pos;
int i;
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
char path[MAX_PATH];
TARGETMAP RestrictedMaps[2];
//extern CString GetFileNameFromHandle(HANDLE);
if(!listctrl.GetSelectedCount()) return;
pos = listctrl.GetFirstSelectedItemPosition();
i = listctrl.GetNextSelectedItem(pos);
if(gTransientMode){
i=iProgIndex-1;
if(i<0) i=0;
}
else {
if(!listctrl.GetSelectedCount()) return;
pos = listctrl.GetFirstSelectedItemPosition();
i = listctrl.GetNextSelectedItem(pos);
}
ZeroMemory(&sinfo, sizeof(sinfo));
sinfo.cb = sizeof(sinfo);
// create a virtually single entry in the targetmap array
memcpy(&RestrictedMaps[0], &TargetMaps[i], sizeof(TARGETMAP));
memset(&RestrictedMaps[1], 0, sizeof(TARGETMAP));
strcpy_s(path, sizeof(path), TargetMaps[i].path);
PathRemoveFileSpec(path);
SetTarget(RestrictedMaps);
if(TargetMaps[i].flags2 & STARTDEBUG){
ThreadInfo_Type ThreadInfo;
ThreadInfo.TM=&TargetMaps[i];
ThreadInfo.PM=&PrivateMaps[i];
CloseHandle(CreateThread( NULL, 0, StartDebug, &ThreadInfo, 0, NULL));
@ -2164,6 +2191,10 @@ void CDxwndhostView::OnRun()
CloseHandle(pinfo.hProcess); // no longer needed, avoid handle leakage
CloseHandle(pinfo.hThread); // no longer needed, avoid handle leakage
}
// wait & recover
Sleep(5000);
SetTarget(TargetMaps);
IsLocked = FALSE;
}
void SwitchToColorDepth(int bpp)

Binary file not shown.

Binary file not shown.