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:
parent
dd3b8535bf
commit
6778f01eb9
@ -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:
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:935f85ba0560e2c0a319ea4a007c0f24de314cc7207710fdcd4d41e6a4fbb39a
|
||||
size 593920
|
||||
oid sha256:b9f75f7b545dbfc03a38bf99d8260cbbe4dee01c82b7955c61769a126c643b82
|
||||
size 622080
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:82bd1f60071207b5033f2deade63c46438a048357e3cb0e4d5aa5b379da92186
|
||||
size 545792
|
||||
oid sha256:91dd24684d705c58f1e0bb5870715a997c93b285d02075571f0f8ef87068adec
|
||||
size 548352
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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
|
@ -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
|
@ -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".
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
@ -54,3 +54,4 @@ extern char *ExplainDICooperativeFlags(DWORD);
|
||||
extern char *ExplainRegionType(DWORD);
|
||||
extern char *ExplainPixelFormat(LPDDPIXELFORMAT);
|
||||
extern char *ExplainZBufferBitDepths(DWORD);
|
||||
extern char *GetObjectTypeStr(HDC);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
BIN
dll/dxwnd.aps
BIN
dll/dxwnd.aps
Binary file not shown.
@ -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.
@ -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"
|
||||
>
|
||||
|
2186
dll/gdi32.cpp
2186
dll/gdi32.cpp
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
74
dll/msims32.cpp
Normal 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
461
dll/shareddc.cpp
Normal 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, ¤tPos);
|
||||
(*pMoveToEx)(origDc, currentPos.x, currentPos.y, NULL);
|
||||
dxw.MapClient(¤tPos);
|
||||
(*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
55
dll/shareddc.hpp
Normal 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;
|
@ -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
3302
dll/user32.09.cpp
Normal file
File diff suppressed because it is too large
Load Diff
966
dll/user32.cpp
966
dll/user32.cpp
File diff suppressed because it is too large
Load Diff
219
dll/virtualdc.cpp
Normal file
219
dll/virtualdc.cpp
Normal 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
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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.
@ -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
|
||||
|
@ -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.
@ -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)
|
||||
|
BIN
host/host.aps
BIN
host/host.aps
Binary file not shown.
BIN
host/resource
BIN
host/resource
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user