mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
v2_04_20_src
This commit is contained in:
parent
6c06d0dac5
commit
b5e4788f9b
@ -283,6 +283,8 @@
|
||||
#define HOOKDLGWIN 0x80000000 // Hook dialog WindowProc
|
||||
|
||||
// 9th flags DWORD dxw.dwFlags9:
|
||||
#define FIXTHINFRAME 0x00000001 // Fix window style like OVERLAPPEDWINDOW but with thin border
|
||||
|
||||
// 10th flags DWORD dxw.dwFlags10:
|
||||
|
||||
// logging Tflags DWORD:
|
||||
|
@ -1584,3 +1584,15 @@ fix: joystick api promoted to hot patching to get a more powerful hooking
|
||||
add: hooking of WM_STYLECHANGING/STYLECHANGED messages to allow D3D rendering within the window borders instead of over the whole window area - fixes "Nightmare Creatures" and others.
|
||||
fix: fixed "Need fos Speed 5" peculiarity: QueryInterface of an object on top of itself.
|
||||
|
||||
v2.04.20
|
||||
GUI:
|
||||
add: two more 32bit words for additional flags
|
||||
add: timestamp and dxwnd version added to exported files
|
||||
fix: window style selector through radio buttons
|
||||
fix: implementation of View->Shims
|
||||
DLL:
|
||||
add: management of 3DREF surfaces to handle D3D CreateDevice with offscreen surface
|
||||
add: FIXTHINFRAME option to get overlapped window with thin border
|
||||
fix: revised implementation for DirectDrawSurface getCaps and GetSurfaceDesc wrappers
|
||||
add: hooker for SetWindowsHookEx WH_MOUSE_LL events - used by "Royal Tramp 2"
|
||||
fix: added WM_NCMOUSELEAVE to the list of potentially offending messages
|
||||
|
@ -1054,6 +1054,12 @@ HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface
|
||||
dxwss.PushZBufferSurface(*lplpdds, dxversion, lpddsd->ddsCaps.dwCaps);
|
||||
OutTraceDW("CreateSurface: ZBufferSize=%d\n", ZBufferSize);
|
||||
}
|
||||
else {
|
||||
if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) {
|
||||
OutTraceDW("CreateSurface: lpDD3DRef=%x save 3DREF caps=%x(%s)\n", *lplpdds, lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps));
|
||||
dxwss.Push3DRefSurface(*lplpdds, dxversion, lpddsd->ddsCaps.dwCaps);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
|
135
dll/ddraw.cpp
135
dll/ddraw.cpp
@ -541,10 +541,8 @@ static DWORD GetFlipWaitFlags(DWORD dwFlipFlags)
|
||||
|
||||
static DWORD SetPrimaryCaps(DWORD dwCaps)
|
||||
{
|
||||
dwCaps |= DDSD_Prim.ddsCaps.dwCaps;
|
||||
dwCaps |= (DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE); // primary surfaces must be this way
|
||||
dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way
|
||||
if(dwCaps & DDSCAPS_3DDEVICE) dwCaps |= DDSCAPS_LOCALVIDMEM;
|
||||
return dwCaps;
|
||||
}
|
||||
|
||||
@ -553,8 +551,6 @@ static DWORD SetBackBufferCaps(DWORD dwCaps)
|
||||
// v2.03.11: added DDSCAPS_FLIP capability to backbuffer surface: "Ignition" checks for it before Flip-ping to primary
|
||||
dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_FLIP|DDSCAPS_LOCALVIDMEM); // you never know....
|
||||
dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way
|
||||
if(dwCaps & DDSCAPS_3DDEVICE) dwCaps |= DDSCAPS_LOCALVIDMEM;
|
||||
//if(dwCaps & DDSCAPS_3DDEVICE) dwCaps |= (DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX);
|
||||
return dwCaps;
|
||||
}
|
||||
|
||||
@ -2336,7 +2332,7 @@ HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pS
|
||||
|
||||
if(bFixFrame){
|
||||
AdjustWindowFrame(hwnd, dxw.GetScreenWidth(), dxw.GetScreenHeight());
|
||||
if (dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(hwnd);
|
||||
if ((dxw.dwFlags1 & FIXWINFRAME) || (dxw.dwFlags9 & FIXTHINFRAME)) dxw.FixWindowFrame(hwnd);
|
||||
}
|
||||
|
||||
GetHookInfo()->IsFullScreen=dxw.IsFullScreen();
|
||||
@ -2563,19 +2559,12 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
|
||||
return DD_OK;
|
||||
}
|
||||
}
|
||||
// arguable utility ....
|
||||
// commented out: causes "Arx Fatalis" crash assigning ZBUFFER to the wrong surface?
|
||||
// would that be necessary on some game?
|
||||
//if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS){
|
||||
// if (lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){
|
||||
// *lplpddas = lpDDZBuffer;
|
||||
// OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x add=%x\n",
|
||||
// dxversion, IsPrim?"PRIM":(IsBack?"BACK":"PLAIN"), lpdds, lpDDZBuffer);
|
||||
// //if (pAddRefS) (*pAddRefS)(lpDDZBuffer);
|
||||
// lpDDZBuffer->AddRef();
|
||||
// return DD_OK;
|
||||
// }
|
||||
//}
|
||||
|
||||
// Warning: AVOID simulating a ZBUFFER attach to any surface that has not it really attached
|
||||
// otherwise the program steps over but crashes afterwards, as soon as it tries to use the ZBUFFER.
|
||||
// Better return the error (most programs overcome the problem) or change caps policy so that the
|
||||
// ZBUFFER becomes attached.
|
||||
// Ref: "Arx Fatalis", "TOCA Touring Car Championship"
|
||||
|
||||
OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__);
|
||||
}
|
||||
@ -2608,7 +2597,6 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
|
||||
}
|
||||
OutTraceDW("GetAttachedSurface(%d): ZBUFFER caps=%x(%s) (%s)\n", dxversion, dwCaps, ExplainDDSCaps(dwCaps), sMode);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return res;
|
||||
@ -4824,44 +4812,58 @@ HRESULT WINAPI cbDump(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext)
|
||||
static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS caps)
|
||||
{
|
||||
HRESULT res;
|
||||
BOOL IsPrim, IsBack, IsZBuf, IsFixed;
|
||||
IsPrim=dxwss.IsAPrimarySurface(lpdds);
|
||||
IsBack=dxwss.IsABackBufferSurface(lpdds);
|
||||
IsFixed=FALSE;
|
||||
BOOL IsFixed=FALSE;
|
||||
int role;
|
||||
SurfaceDB_Type *ps;
|
||||
char *sLabel;
|
||||
|
||||
sLabel = "";
|
||||
if(IsPrim) sLabel="(PRIM)";
|
||||
if(IsBack) sLabel="(BACK)";
|
||||
ps = dxwss.GetSurface(lpdds);
|
||||
|
||||
// BEWARE: ZBUFFER surfaces could be created automatically so that they could exist without
|
||||
// being regisered in surface stack. You must query the actual surface capabilities.
|
||||
res=(*pGetCapsS)(lpdds, caps);
|
||||
if(res)
|
||||
OutTraceE("GetCaps(S%d): ERROR lpdds=%x%s err=%x(%s)\n", dxInterface, lpdds, sLabel, res, ExplainDDError(res));
|
||||
OutTraceE("GetCaps(S%d): ERROR lpdds=%x err=%x(%s)\n", dxInterface, lpdds, res, ExplainDDError(res));
|
||||
else
|
||||
OutTraceDDRAW("GetCaps(S%d): lpdds=%x%s caps=%x(%s)\n", dxInterface, lpdds, sLabel, caps->dwCaps, ExplainDDSCaps(caps->dwCaps));
|
||||
OutTraceDDRAW("GetCaps(S%d): lpdds=%x caps=%x(%s)\n", dxInterface, lpdds, caps->dwCaps, ExplainDDSCaps(caps->dwCaps));
|
||||
|
||||
IsZBuf=(caps->dwCaps & DDSCAPS_ZBUFFER);
|
||||
if(IsZBuf) sLabel="(ZBUFFER)";
|
||||
sLabel="";
|
||||
role = SURFACE_ROLE_UNKNOWN;
|
||||
if (ps) {
|
||||
role = ps->uRole;
|
||||
switch(role){
|
||||
case SURFACE_ROLE_PRIMARY: sLabel="(PRIM)"; break;
|
||||
case SURFACE_ROLE_BACKBUFFER: sLabel="(BACK)"; break;
|
||||
case SURFACE_ROLE_ZBUFFER: sLabel="(ZBUF)"; break;
|
||||
case SURFACE_ROLE_3DREF: sLabel="(3DREF)"; break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (caps->dwCaps & DDSCAPS_ZBUFFER) {
|
||||
sLabel="(ZBUF)";
|
||||
role = SURFACE_ROLE_ZBUFFER;
|
||||
}
|
||||
}
|
||||
|
||||
if(!(dxw.IsEmulated || dxw.Windowize)) return res;
|
||||
|
||||
while(TRUE){ // fake loop
|
||||
if (IsPrim) {
|
||||
switch(role) {
|
||||
case SURFACE_ROLE_PRIMARY:
|
||||
IsFixed=TRUE;
|
||||
caps->dwCaps = SetPrimaryCaps(caps->dwCaps);
|
||||
caps->dwCaps = SetPrimaryCaps(dxwss.GetCaps(lpdds));
|
||||
break;
|
||||
}
|
||||
if (IsBack) {
|
||||
case SURFACE_ROLE_BACKBUFFER:
|
||||
IsFixed=TRUE;
|
||||
caps->dwCaps = SetBackBufferCaps(caps->dwCaps);
|
||||
caps->dwCaps = SetBackBufferCaps(dxwss.GetCaps(lpdds));
|
||||
break;
|
||||
}
|
||||
if (IsZBuf) {
|
||||
case SURFACE_ROLE_ZBUFFER:
|
||||
IsFixed=TRUE;
|
||||
caps->dwCaps = SetZBufferCaps(dxwss.GetCaps(lpdds));
|
||||
break;
|
||||
}
|
||||
break; // inconditional break;
|
||||
case SURFACE_ROLE_3DREF:
|
||||
IsFixed=TRUE;
|
||||
caps->dwCaps = dxwss.GetCaps(lpdds);
|
||||
break;
|
||||
}
|
||||
|
||||
if(IsFixed) OutTraceDW("GetCaps(S%d): lpdds=%x FIXED %s caps=%x(%s)\n", dxInterface, lpdds, sLabel, caps->dwCaps, ExplainDDSCaps(caps->dwCaps));
|
||||
@ -4883,10 +4885,9 @@ HRESULT WINAPI extGetCaps7S(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS2 caps)
|
||||
static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd)
|
||||
{
|
||||
HRESULT res;
|
||||
BOOL IsPrim, IsBack, IsZBuf, IsFixed;
|
||||
IsPrim=dxwss.IsAPrimarySurface(lpdds);
|
||||
IsBack=dxwss.IsABackBufferSurface(lpdds);
|
||||
IsFixed=FALSE;
|
||||
BOOL IsFixed = FALSE;
|
||||
SurfaceDB_Type *ps;
|
||||
int role;
|
||||
char *sLabel;
|
||||
|
||||
if (!pGetSurfaceDesc) {
|
||||
@ -4894,6 +4895,8 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
ps = dxwss.GetSurface(lpdds);
|
||||
|
||||
int prevsize = lpddsd->dwSize;
|
||||
switch(dxversion){
|
||||
case 1:
|
||||
@ -4913,37 +4916,51 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS
|
||||
OutTraceE("GetSurfaceDesc(%d): ERROR err=%x(%s)\n", dxversion, res, ExplainDDError(res));
|
||||
return res;
|
||||
}
|
||||
IsZBuf=(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER);
|
||||
|
||||
sLabel="";
|
||||
if(IsPrim) sLabel="(PRIM)";
|
||||
if(IsBack) sLabel="(BACK)";
|
||||
if(IsZBuf) sLabel="(ZBUFFER)";
|
||||
role = SURFACE_ROLE_UNKNOWN;
|
||||
if (ps) {
|
||||
role = ps->uRole;
|
||||
switch(role){
|
||||
case SURFACE_ROLE_PRIMARY: sLabel="(PRIM)"; break;
|
||||
case SURFACE_ROLE_BACKBUFFER: sLabel="(BACK)"; break;
|
||||
case SURFACE_ROLE_ZBUFFER: sLabel="(ZBUF)"; break;
|
||||
case SURFACE_ROLE_3DREF: sLabel="(3DREF)"; break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) {
|
||||
sLabel="(ZBUF)";
|
||||
role = SURFACE_ROLE_ZBUFFER;
|
||||
}
|
||||
}
|
||||
|
||||
OutTraceDDRAW("GetSurfaceDesc(%d): lpdds=%x%s %s\n", dxversion, lpdds, sLabel, LogSurfaceAttributes((LPDDSURFACEDESC2)lpddsd, "GetSurfaceDesc", __LINE__));
|
||||
|
||||
if(!(dxw.IsEmulated || dxw.Windowize)) return res;
|
||||
|
||||
while(TRUE){ // fake loop
|
||||
if (IsPrim) {
|
||||
switch(role) {
|
||||
case SURFACE_ROLE_PRIMARY:
|
||||
IsFixed=TRUE;
|
||||
if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat;
|
||||
lpddsd->ddsCaps.dwCaps = SetPrimaryCaps(lpddsd->ddsCaps.dwCaps);
|
||||
//if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat;
|
||||
lpddsd->ddsCaps.dwCaps = SetPrimaryCaps(dxwss.GetCaps(lpdds));
|
||||
lpddsd->dwBackBufferCount=DDSD_Prim.dwBackBufferCount;
|
||||
lpddsd->dwHeight=dxw.GetScreenHeight();
|
||||
lpddsd->dwWidth=dxw.GetScreenWidth();
|
||||
break;
|
||||
}
|
||||
if (IsBack) {
|
||||
case SURFACE_ROLE_BACKBUFFER:
|
||||
IsFixed=TRUE;
|
||||
lpddsd->ddsCaps.dwCaps = SetBackBufferCaps(lpddsd->ddsCaps.dwCaps);
|
||||
//if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; // v2.04.20
|
||||
lpddsd->ddsCaps.dwCaps = SetBackBufferCaps(dxwss.GetCaps(lpdds));
|
||||
break;
|
||||
}
|
||||
if (IsZBuf) {
|
||||
case SURFACE_ROLE_ZBUFFER:
|
||||
IsFixed=TRUE;
|
||||
lpddsd->ddsCaps.dwCaps = SetZBufferCaps(dxwss.GetCaps(lpdds));
|
||||
break;
|
||||
}
|
||||
break; // inconditional break
|
||||
case SURFACE_ROLE_3DREF:
|
||||
IsFixed=TRUE;
|
||||
lpddsd->ddsCaps.dwCaps = dxwss.GetCaps(lpdds);
|
||||
break;
|
||||
}
|
||||
|
||||
if(IsFixed){
|
||||
|
@ -110,7 +110,9 @@ static void OutTraceHeader(FILE *fp, DWORD tflags)
|
||||
for(i=0, dword=dxw.dwFlags6; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(5,i));
|
||||
for(i=0, dword=dxw.dwFlags7; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(6,i));
|
||||
for(i=0, dword=dxw.dwFlags8; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(7,i));
|
||||
for(i=0, dword=tflags ; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(8,i));
|
||||
for(i=0, dword=dxw.dwFlags9; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(8,i));
|
||||
for(i=0, dword=dxw.dwFlags10;i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(9,i));
|
||||
for(i=0, dword=tflags ; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(10,i));
|
||||
fprintf(fp, "***\n");
|
||||
}
|
||||
|
||||
@ -1400,10 +1402,10 @@ void HookInit(TARGETMAP *target, HWND hwnd)
|
||||
// update window styles: just this window or, when FIXPARENTWIN is set, the father one as well.
|
||||
|
||||
if (hwnd && dxw.Windowize && dxw.IsFullScreen()) {
|
||||
if(dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(dxw.hChildWnd);
|
||||
if((dxw.dwFlags1 & FIXWINFRAME) || (dxw.dwFlags9 & FIXTHINFRAME)) dxw.FixWindowFrame(dxw.hChildWnd);
|
||||
AdjustWindowPos(dxw.hChildWnd, target->sizx, target->sizy);
|
||||
if(dxw.dwFlags1 & FIXPARENTWIN) {
|
||||
if(dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(dxw.hParentWnd);
|
||||
if((dxw.dwFlags1 & FIXWINFRAME) || (dxw.dwFlags9 & FIXTHINFRAME)) dxw.FixWindowFrame(dxw.hParentWnd);
|
||||
AdjustWindowPos(dxw.hParentWnd, target->sizx, target->sizy);
|
||||
}
|
||||
}
|
||||
|
@ -94,6 +94,8 @@ void dxwCore::InitTarget(TARGETMAP *target)
|
||||
dwFlags6 = target->flags6;
|
||||
dwFlags7 = target->flags7;
|
||||
dwFlags8 = target->flags8;
|
||||
dwFlags9 = target->flags9;
|
||||
dwFlags10= target->flags10;
|
||||
dwTFlags = target->tflags;
|
||||
Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE;
|
||||
IsVisible = TRUE;
|
||||
@ -1256,7 +1258,10 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||
OutTraceDW("%s: new Style=%x(%s)\n",
|
||||
ApiName, lpSS->styleNew, ExplainStyle(lpSS->styleNew));
|
||||
if (dxw.dwFlags1 & FIXWINFRAME){ // set canonical style
|
||||
lpSS->styleNew= WS_OVERLAPPEDWINDOW;
|
||||
lpSS->styleNew= WS_OVERLAPPEDWINDOW;
|
||||
}
|
||||
if (dxw.dwFlags9 & FIXTHINFRAME){ // set canonical style with thin border
|
||||
lpSS->styleNew= WS_OVERLAPPEDTHIN;
|
||||
}
|
||||
if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value
|
||||
lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_STYLE);
|
||||
|
@ -4,6 +4,13 @@
|
||||
#define DDSQLEN 0x20
|
||||
#define MAXFONTS 0x40
|
||||
|
||||
#define WS_OVERLAPPEDTHIN (WS_OVERLAPPED | \
|
||||
WS_CAPTION | \
|
||||
WS_SYSMENU | \
|
||||
WS_THICKFRAME | \
|
||||
WS_MINIMIZEBOX | \
|
||||
WS_MAXIMIZEBOX)
|
||||
|
||||
typedef struct {
|
||||
DWORD dwTimerType;
|
||||
union{
|
||||
@ -40,7 +47,9 @@ typedef struct {
|
||||
typedef enum {
|
||||
SURFACE_ROLE_PRIMARY = 0,
|
||||
SURFACE_ROLE_BACKBUFFER,
|
||||
SURFACE_ROLE_ZBUFFER
|
||||
SURFACE_ROLE_ZBUFFER,
|
||||
SURFACE_ROLE_3DREF,
|
||||
SURFACE_ROLE_UNKNOWN
|
||||
} Enum_Surface_Role_Type;
|
||||
|
||||
typedef struct {
|
||||
@ -259,15 +268,21 @@ public:
|
||||
LPDIRECTDRAWSURFACE GetZBufferSurface(void);
|
||||
void PushZBufferSurface(LPDIRECTDRAWSURFACE, int, DWORD);
|
||||
BOOL IsAZBufferSurface(LPDIRECTDRAWSURFACE);
|
||||
LPDIRECTDRAWSURFACE GetBackBufferSurface(void); void PopSurface(LPDIRECTDRAWSURFACE);
|
||||
void DuplicateSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, int);
|
||||
LPDIRECTDRAWSURFACE GetBackBufferSurface(void);
|
||||
void Push3DRefSurface(LPDIRECTDRAWSURFACE, int, DWORD);
|
||||
BOOL IsA3DRefSurface(LPDIRECTDRAWSURFACE);
|
||||
LPDIRECTDRAWSURFACE Get3DRefBufferSurface(void);
|
||||
void PopSurface(LPDIRECTDRAWSURFACE);
|
||||
DWORD DuplicateSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, int);
|
||||
DWORD GetCaps(LPDIRECTDRAWSURFACE);
|
||||
SurfaceDB_Type *GetSurface(LPDIRECTDRAWSURFACE);
|
||||
|
||||
protected:
|
||||
SurfaceDB_Type SurfaceDB[DDSQLEN+1];
|
||||
LPDIRECTDRAWSURFACE lpDDSPrimary;
|
||||
LPDIRECTDRAWSURFACE lpDDSBackBuffer;
|
||||
LPDIRECTDRAWSURFACE lpDDSZBuffer;
|
||||
LPDIRECTDRAWSURFACE lpDDS3DRef;
|
||||
|
||||
private:
|
||||
void PushSurface(LPDIRECTDRAWSURFACE, USHORT, USHORT, DWORD);
|
||||
|
@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "TlHelp32.h"
|
||||
|
||||
#define VERSION "2.04.19.fx1"
|
||||
#define VERSION "2.04.20"
|
||||
|
||||
#define DDTHREADLOCK 1
|
||||
|
||||
@ -286,7 +286,7 @@ void InjectHook()
|
||||
}
|
||||
}
|
||||
|
||||
static char *FlagNames[9][32] ={{
|
||||
static char *FlagNames[11][32] ={{
|
||||
// Flags1
|
||||
"UNNOTIFY", "EMULATESURFACE", "CLIPCURSOR", "NEEDADMINCAPS",
|
||||
"HOOKDI", "MODIFYMOUSE", "HANDLEEXCEPTIONS", "SAVELOAD",
|
||||
@ -367,6 +367,24 @@ static char *FlagNames[9][32] ={{
|
||||
"BACKGROUNDPRIORITY", "OFFSCREENZBUFFER", "VIRTUALHEAP", "ZBUFFERHARDCLEAN",
|
||||
"LOADLIBRARYERR", "SHAREDDCHYBRID", "FIXADJUSTWINRECT", "HOOKDLGWIN",
|
||||
},{
|
||||
// Flags9
|
||||
"FIXTHINFRAME", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "", },{
|
||||
// Flags10
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "", },{
|
||||
// TFlags
|
||||
"OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE",
|
||||
"OUTSEPARATED", "**", "ASSERTDIALOG", "OUTIMPORTTABLE",
|
||||
@ -382,7 +400,7 @@ LPCSTR GetFlagCaption(int flag, int bit)
|
||||
{
|
||||
//if((flag<0) || (flag>(9*32))) return "";
|
||||
//return FlagNames[flag >> 5][flag & 0x1F];
|
||||
if((flag<0) || (flag>8)) return "";
|
||||
if((flag<0) || (flag>10)) return "";
|
||||
if((bit<0) || (bit>31)) return "";
|
||||
return FlagNames[flag][bit];
|
||||
}
|
Binary file not shown.
@ -8,8 +8,8 @@
|
||||
#include "dxwnd.h"
|
||||
#include "dxwcore.hpp"
|
||||
|
||||
//#define DXW_SURFACE_STACK_TRACING
|
||||
//#define OutTraceSDB OutTrace
|
||||
#define DXW_SURFACE_STACK_TRACING
|
||||
#define OutTraceSDB OutTrace
|
||||
|
||||
dxwSStack::dxwSStack()
|
||||
{
|
||||
@ -17,6 +17,7 @@ dxwSStack::dxwSStack()
|
||||
lpDDSPrimary = NULL;
|
||||
lpDDSBackBuffer = NULL;
|
||||
lpDDSZBuffer = NULL;
|
||||
lpDDS3DRef = NULL;
|
||||
memset(SurfaceDB, 0, sizeof(SurfaceDB));
|
||||
}
|
||||
|
||||
@ -31,6 +32,7 @@ static char *sRole(USHORT role)
|
||||
case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break;
|
||||
case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break;
|
||||
case SURFACE_ROLE_ZBUFFER: s="(ZBUF)"; break;
|
||||
case SURFACE_ROLE_3DREF: s="(3DREF)"; break;
|
||||
default: s="??"; break; // should never happen ...
|
||||
}
|
||||
return s;
|
||||
@ -43,10 +45,12 @@ static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB)
|
||||
char sMsg[81];
|
||||
int iPCount = 0;
|
||||
int iBCount = 0;
|
||||
int iZCount = 0;
|
||||
for (int i=0;i<DDSQLEN;i++) {
|
||||
if (SurfaceDB[i].lpdds == NULL) break;
|
||||
if ((SurfaceDB[i].uRole == SURFACE_ROLE_PRIMARY) && SurfaceDB[i].uRef) iPCount++;
|
||||
if ((SurfaceDB[i].uRole == SURFACE_ROLE_BACKBUFFER) && SurfaceDB[i].uRef) iBCount++;
|
||||
if ((SurfaceDB[i].uRole == SURFACE_ROLE_ZBUFFER) && SurfaceDB[i].uRef) iZCount++;
|
||||
}
|
||||
if(iPCount > 1) {
|
||||
sprintf(sMsg, "Primary count = %d", iPCount);
|
||||
@ -56,6 +60,10 @@ static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB)
|
||||
sprintf(sMsg, "Backbuffer count = %d", iPCount);
|
||||
MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION);
|
||||
}
|
||||
if(iZCount > 1) {
|
||||
sprintf(sMsg, "Zbuffer count = %d", iZCount);
|
||||
MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION);
|
||||
}
|
||||
}
|
||||
|
||||
static void DumpSurfaceList(SurfaceDB_Type *SurfaceDB)
|
||||
@ -87,53 +95,33 @@ char *dxwSStack::ExplainSurfaceRole(LPDIRECTDRAWSURFACE ps)
|
||||
void dxwSStack::ClearSurfaceList()
|
||||
{
|
||||
#ifdef DXW_SURFACE_STACK_TRACING
|
||||
OutTrace(">>> SURFACELIST CLEAR ALL\n");
|
||||
OutTrace(">>> SURFACELIST CLEAR UNREF\n");
|
||||
#endif
|
||||
// v2.03.91.fx5: emptying the list entirely is no good for "Warhammer 40K Rites of War"
|
||||
// better leave the last used primary and backbuffer surfaces.
|
||||
int i;
|
||||
SurfaceDB_Type LastEntries[3];
|
||||
LastEntries[0].lpdds = 0;
|
||||
LastEntries[1].lpdds = 0;
|
||||
LastEntries[2].lpdds = 0;
|
||||
int i, j;
|
||||
SurfaceDB_Type NewEntries[DDSQLEN];
|
||||
lpDDSPrimary = NULL;
|
||||
lpDDSBackBuffer = NULL;
|
||||
lpDDSZBuffer = NULL;
|
||||
// search for last (more recent) entries and copy to safe place
|
||||
for (i=0;i<DDSQLEN;i++) {
|
||||
lpDDS3DRef = NULL;
|
||||
// search for valid entries and copy to safe place
|
||||
for (i=0, j=0; i<DDSQLEN; i++) {
|
||||
if(SurfaceDB[i].lpdds == NULL) break;
|
||||
LastEntries[SurfaceDB[i].uRole]=SurfaceDB[i];
|
||||
if(SurfaceDB[i].uRef) NewEntries[j++]=SurfaceDB[i];
|
||||
}
|
||||
// clear all
|
||||
for (i=0;i<DDSQLEN;i++) {
|
||||
SurfaceDB[i].lpdds = NULL;
|
||||
SurfaceDB[i].uRef = FALSE;
|
||||
SurfaceDB[i].uRole = 0;
|
||||
SurfaceDB[i].uVersion = 0;
|
||||
}
|
||||
// bring back the valid entries to db
|
||||
i = 0;
|
||||
if(LastEntries[0].lpdds) {
|
||||
SurfaceDB[i++]=LastEntries[0];
|
||||
lpDDSPrimary = LastEntries[0].lpdds;
|
||||
#ifdef DXW_SURFACE_STACK_TRACING
|
||||
OutTrace(">>> SAVED lpDDSPrimary=%x\n", lpDDSPrimary);
|
||||
#endif
|
||||
}
|
||||
if(LastEntries[1].lpdds) {
|
||||
SurfaceDB[i++]=LastEntries[1];
|
||||
lpDDSBackBuffer = LastEntries[1].lpdds;
|
||||
#ifdef DXW_SURFACE_STACK_TRACING
|
||||
OutTrace(">>> SAVED lpDDSBackBuffer=%x\n", lpDDSBackBuffer);
|
||||
#endif
|
||||
}
|
||||
if(LastEntries[2].lpdds) {
|
||||
SurfaceDB[i++]=LastEntries[2];
|
||||
lpDDSZBuffer = LastEntries[2].lpdds;
|
||||
#ifdef DXW_SURFACE_STACK_TRACING
|
||||
OutTrace(">>> SAVED lpDDSZBuffer=%x\n", lpDDSZBuffer);
|
||||
#endif
|
||||
NewEntries[j].lpdds = NULL; // terminator
|
||||
// move back to original list
|
||||
for (i=0; i<DDSQLEN; i++) {
|
||||
if(NewEntries[i].lpdds == NULL) break;
|
||||
SurfaceDB[i]=NewEntries[i];
|
||||
switch(SurfaceDB[i].uRole){
|
||||
case SURFACE_ROLE_PRIMARY: lpDDSPrimary = SurfaceDB[i].lpdds; break;
|
||||
case SURFACE_ROLE_BACKBUFFER: lpDDSBackBuffer = SurfaceDB[i].lpdds; break;
|
||||
case SURFACE_ROLE_ZBUFFER: lpDDSZBuffer = SurfaceDB[i].lpdds; break;
|
||||
}
|
||||
}
|
||||
SurfaceDB[i].lpdds = 0; // terminator
|
||||
#ifdef DXW_SURFACE_STACK_TRACING
|
||||
DumpSurfaceList(SurfaceDB);
|
||||
#endif
|
||||
@ -204,30 +192,49 @@ void dxwSStack::PushZBufferSurface(LPDIRECTDRAWSURFACE ps, int version, DWORD dw
|
||||
PushSurface(ps, SURFACE_ROLE_ZBUFFER, (USHORT)version, dwCaps);
|
||||
}
|
||||
|
||||
void dxwSStack::DuplicateSurface(LPDIRECTDRAWSURFACE psfrom, LPDIRECTDRAWSURFACE psto, int version)
|
||||
void dxwSStack::Push3DRefSurface(LPDIRECTDRAWSURFACE ps, int version, DWORD dwCaps)
|
||||
{
|
||||
int i, j;
|
||||
PushSurface(ps, SURFACE_ROLE_3DREF, (USHORT)version, dwCaps);
|
||||
}
|
||||
|
||||
DWORD dxwSStack::DuplicateSurface(LPDIRECTDRAWSURFACE psfrom, LPDIRECTDRAWSURFACE psto, int version)
|
||||
{
|
||||
int i;
|
||||
SurfaceDB_Type *e;
|
||||
SurfaceDB_Type sentry;
|
||||
#ifdef DXW_SURFACE_STACK_TRACING
|
||||
OutTraceSDB(">>> SURFACELIST DUPL: from=%x to=%x vers=%d\n", psfrom, psto, version);
|
||||
#endif
|
||||
// search for source or empty slot
|
||||
for (i=0;i<DDSQLEN;i++) {
|
||||
e=&SurfaceDB[i];
|
||||
if ((e->lpdds==psfrom) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list
|
||||
}
|
||||
// if not found, return
|
||||
if (!e->lpdds) return;
|
||||
// search for an empty slot
|
||||
j = i;
|
||||
for (j=0;j<DDSQLEN;j++) if (!SurfaceDB[j].lpdds) break;
|
||||
if (!e->lpdds) return 0;
|
||||
// save surface entry
|
||||
sentry = *e;
|
||||
// search for destination or empty slot
|
||||
for (i=0;i<DDSQLEN;i++) {
|
||||
e=&SurfaceDB[i];
|
||||
if ((e->lpdds==psto) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list
|
||||
}
|
||||
if(i == DDSQLEN) {
|
||||
//MessageBox(0, "Surface stack is full", "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION);
|
||||
//return;
|
||||
for(int j=0;j<DDSQLEN-1;j++) SurfaceDB[j]=SurfaceDB[j+1]; // scale down the whole stack one entry
|
||||
e=&SurfaceDB[DDSQLEN-1];
|
||||
}
|
||||
// duplicate the entry with the new lpdds and version but old role / capabilities
|
||||
SurfaceDB[j] = SurfaceDB[i];
|
||||
SurfaceDB[j].lpdds = psto;
|
||||
SurfaceDB[j].uVersion = version;
|
||||
|
||||
// either overriding the old entry or writing a new one
|
||||
*e = sentry;
|
||||
e->lpdds = psto;
|
||||
e->uVersion = version;
|
||||
e->uRef = TRUE;
|
||||
#ifdef DXW_SURFACE_STACK_TRACING
|
||||
DumpSurfaceList(SurfaceDB);
|
||||
#endif
|
||||
return e->dwCaps;
|
||||
}
|
||||
|
||||
void dxwSStack::PopSurface(LPDIRECTDRAWSURFACE ps)
|
||||
@ -302,6 +309,18 @@ BOOL dxwSStack::IsAZBufferSurface(LPDIRECTDRAWSURFACE ps)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL dxwSStack::IsA3DRefSurface(LPDIRECTDRAWSURFACE ps)
|
||||
{
|
||||
int i;
|
||||
// treat NULL surface ptr as a non primary
|
||||
if(!ps) return FALSE;
|
||||
for (i=0;i<DDSQLEN;i++) {
|
||||
if (SurfaceDB[i].lpdds==0) return FALSE;
|
||||
if (SurfaceDB[i].lpdds==ps) return (SurfaceDB[i].uRole == SURFACE_ROLE_3DREF);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
LPDIRECTDRAWSURFACE dxwSStack::GetSurfaceByRole(USHORT role)
|
||||
{
|
||||
// Get a surface marked for the desired role (either PRIMARY or BACKBUFFER) and
|
||||
@ -351,3 +370,17 @@ DWORD dxwSStack::GetCaps(LPDIRECTDRAWSURFACE ps)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
SurfaceDB_Type *dxwSStack::GetSurface(LPDIRECTDRAWSURFACE ps)
|
||||
{
|
||||
for (int i=0;i<DDSQLEN;i++) {
|
||||
if (SurfaceDB[i].lpdds==0) return NULL;
|
||||
if (SurfaceDB[i].lpdds==ps) {
|
||||
#ifdef DXW_SURFACE_STACK_TRACING
|
||||
OutTraceSDB(">>> GETCAPS: lpdds=%x caps=%x(%s)\n", ps, SurfaceDB[i].dwCaps, ExplainDDSCaps(SurfaceDB[i].dwCaps));
|
||||
#endif
|
||||
return &SurfaceDB[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
|
||||
int iObjectType;
|
||||
int iObjectVersion;
|
||||
extern LPDIRECTDRAWSURFACE lpDDSEmu_Prim;
|
||||
DWORD caps;
|
||||
|
||||
IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds);
|
||||
IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds);
|
||||
@ -203,16 +204,18 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
|
||||
|
||||
switch(iObjectType){
|
||||
case TYPE_OBJECT_UNKNOWN:
|
||||
if(*obp != lpdds) dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); // clear any past attribution
|
||||
dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion);
|
||||
if(caps=dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion)){
|
||||
OutTraceDW("QueryInterface: MOVE caps=%x(%s)\n", caps, ExplainDDSCaps(caps));
|
||||
}
|
||||
break;
|
||||
case TYPE_OBJECT_DIRECTDRAW:
|
||||
HookDDSession((LPDIRECTDRAW *)obp, iObjectVersion);
|
||||
break;
|
||||
case TYPE_OBJECT_DDRAWSURFACE:
|
||||
dxw.dwDDVersion=iObjectVersion;
|
||||
if(*obp != lpdds) dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); // clear any past attribution
|
||||
dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion);
|
||||
if(caps=dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion)){
|
||||
OutTraceDW("QueryInterface: MOVE caps=%x(%s)\n", caps, ExplainDDSCaps(caps));
|
||||
}
|
||||
if(IsPrim){
|
||||
OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp);
|
||||
HookDDSurface((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion, TRUE);
|
||||
|
@ -16,6 +16,13 @@
|
||||
#include <Winuser.h>
|
||||
|
||||
#define FIXCHILDSIZE FALSE
|
||||
//#define TRANSLATEMESSAGEHOOK
|
||||
|
||||
#ifdef TRANSLATEMESSAGEHOOK
|
||||
typedef BOOL (WINAPI *TranslateMessage_Type)(MSG *);
|
||||
BOOL WINAPI extTranslateMessage(MSG *);
|
||||
TranslateMessage_Type pTranslateMessage;
|
||||
#endif
|
||||
|
||||
#define _Warn(s) MessageBox(0, s, "to do", MB_ICONEXCLAMATION)
|
||||
|
||||
@ -43,9 +50,9 @@ UINT WINAPI extSetDIBColorTable(HDC, UINT, UINT, const RGBQUAD *);
|
||||
#endif
|
||||
|
||||
static HookEntryEx_Type Hooks[]={
|
||||
|
||||
//{HOOK_IAT_CANDIDATE, 0, "TranslateMessage", (FARPROC)TranslateMessage, (FARPROC *)&pTranslateMessage, (FARPROC)extTranslateMessage},
|
||||
|
||||
#ifdef TRANSLATEMESSAGEHOOK
|
||||
{HOOK_IAT_CANDIDATE, 0, "TranslateMessage", (FARPROC)TranslateMessage, (FARPROC *)&pTranslateMessage, (FARPROC)extTranslateMessage},
|
||||
#endif
|
||||
{HOOK_IAT_CANDIDATE, 0, "UpdateWindow", (FARPROC)UpdateWindow, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow}, // v2.04.04: needed for "Hide Desktop" option
|
||||
//{HOOK_IAT_CANDIDATE, 0, "GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement},
|
||||
//{HOOK_IAT_CANDIDATE, 0, "SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement},
|
||||
@ -801,6 +808,15 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon
|
||||
dwNewLong &= ~WS_CLIPSIBLINGS;
|
||||
}
|
||||
}
|
||||
|
||||
if (dxw.dwFlags1 & FIXTHINFRAME){
|
||||
//if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD)){
|
||||
if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD) && dxw.IsDesktop(hwnd)){
|
||||
OutTraceDW("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong);
|
||||
dwNewLong |= WS_OVERLAPPEDTHIN;
|
||||
dwNewLong &= ~WS_CLIPSIBLINGS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// v2.03.94.fx2: removed dxw.IsFullScreen() check here ... WinProc routine must be verified in all conditions
|
||||
@ -3664,6 +3680,7 @@ LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
HOOKPROC glpMessageHookProcessFunction;
|
||||
HOOKPROC glpMouseHookProcessFunction;
|
||||
HOOKPROC glpMouseHookProcessFunctionLL;
|
||||
|
||||
LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
@ -3682,17 +3699,48 @@ LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static POINT FixMousePoint(POINT pt)
|
||||
{
|
||||
dxw.UnmapWindow(&pt);
|
||||
if(pt.x < 0) pt.x = 0;
|
||||
if(pt.x >= (LONG)dxw.GetScreenWidth()) pt.x = dxw.GetScreenWidth()-1;
|
||||
if(pt.y < 0) pt.y = 0;
|
||||
if(pt.y >= (LONG)dxw.GetScreenHeight()) pt.y = dxw.GetScreenHeight()-1;
|
||||
return pt;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT ret;
|
||||
OutTraceC("MouseHookProc: code=%x wParam=%x lParam=%x\n", code, wParam, lParam);
|
||||
MOUSEHOOKSTRUCT *pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
|
||||
if (pMouseStruct != NULL){
|
||||
OutTraceC("MouseHookProc: event=%s pos=(%d,%d)\n", ExplainWinMessage(wParam), pMouseStruct->pt.x, pMouseStruct->pt.y);
|
||||
extGetCursorPos(&(pMouseStruct->pt));
|
||||
}
|
||||
ret = (*glpMouseHookProcessFunction)(code, wParam, lParam);
|
||||
return ret;
|
||||
if(code < 0) return CallNextHookEx(0, code, wParam, lParam);
|
||||
|
||||
if(lParam){
|
||||
MOUSEHOOKSTRUCT MouseStruct = *(MOUSEHOOKSTRUCT *)lParam;
|
||||
MouseStruct.pt = FixMousePoint(MouseStruct.pt);
|
||||
OutTraceC("MouseHookProc: event=%s pos=(%d,%d)->(%d,%d)\n",
|
||||
ExplainWinMessage(wParam),
|
||||
((MOUSEHOOKSTRUCT *)lParam)->pt.x, ((MOUSEHOOKSTRUCT *)lParam)->pt.y,
|
||||
MouseStruct.pt.x, MouseStruct.pt.y);
|
||||
return (*glpMouseHookProcessFunction)(code, wParam, (LPARAM)&MouseStruct);
|
||||
}
|
||||
return (*glpMouseHookProcessFunction)(code, wParam, lParam);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK extMouseHookProcLL(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
OutTraceC("MouseHookProcLL: code=%x wParam=%x lParam=%x\n", code, wParam, lParam);
|
||||
if(code < 0) return CallNextHookEx(0, code, wParam, lParam);
|
||||
|
||||
if(lParam){
|
||||
MSLLHOOKSTRUCT MouseStruct = *(MSLLHOOKSTRUCT *)lParam;
|
||||
MouseStruct.pt = FixMousePoint(MouseStruct.pt);
|
||||
OutTraceC("MouseHookProcLL: event=%s pos=(%d,%d)->(%d,%d)\n",
|
||||
ExplainWinMessage(wParam),
|
||||
((MSLLHOOKSTRUCT *)lParam)->pt.x, ((MSLLHOOKSTRUCT *)lParam)->pt.y,
|
||||
MouseStruct.pt.x, MouseStruct.pt.y);
|
||||
return (*glpMouseHookProcessFunctionLL)(code, wParam, (LPARAM)&MouseStruct);
|
||||
}
|
||||
return (*glpMouseHookProcessFunctionLL)(code, wParam, lParam);
|
||||
}
|
||||
|
||||
static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx, int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId)
|
||||
@ -3709,6 +3757,7 @@ static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx,
|
||||
lpfn=extMessageHookProc;
|
||||
}
|
||||
}
|
||||
|
||||
// v2.03.39: "One Must Fall Battlegrounds" keyboard fix
|
||||
if((idHook == WH_KEYBOARD) && (dwThreadId == NULL)) {
|
||||
dwThreadId = GetCurrentThreadId();
|
||||
@ -3727,10 +3776,17 @@ static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if((dxw.dwFlags8 & FIXMOUSEHOOK) && (idHook == WH_MOUSE)){
|
||||
OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active\n");
|
||||
glpMouseHookProcessFunction = lpfn;
|
||||
lpfn=extMouseHookProc;
|
||||
if(dxw.dwFlags8 & FIXMOUSEHOOK){
|
||||
if(idHook == WH_MOUSE){
|
||||
OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active on WH_MOUSE\n");
|
||||
glpMouseHookProcessFunction = lpfn;
|
||||
lpfn=extMouseHookProc;
|
||||
}
|
||||
if (idHook == WH_MOUSE_LL){
|
||||
OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active on WH_MOUSE_LL\n");
|
||||
glpMouseHookProcessFunctionLL = lpfn;
|
||||
lpfn=extMouseHookProcLL;
|
||||
}
|
||||
}
|
||||
|
||||
ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId);
|
||||
@ -4053,7 +4109,7 @@ BOOL WINAPI extDrawMenuBar(HWND hWnd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#ifdef TRANSLATEMESSAGEHOOK
|
||||
BOOL WINAPI extTranslateMessage(MSG *pMsg)
|
||||
{
|
||||
BOOL ret;
|
||||
@ -4063,8 +4119,8 @@ BOOL WINAPI extTranslateMessage(MSG *pMsg)
|
||||
pMsg->pt=dxw.ScreenToClient(pMsg->pt);
|
||||
pMsg->pt=dxw.FixCursorPos(pMsg->pt);
|
||||
|
||||
pMsg->pt.x *= 4;
|
||||
pMsg->pt.y *= 4;
|
||||
//pMsg->pt.x *= 4;
|
||||
//pMsg->pt.y *= 4;
|
||||
//if((pMsg->message <= WM_MOUSELAST) && (pMsg->message >= WM_MOUSEFIRST))
|
||||
// pMsg->lParam = MAKELPARAM(pMsg->pt.x, pMsg->pt.y);
|
||||
OutTraceDW("TranslateMessage: new pos=(%d,%d)\n", pMsg->pt.x, pMsg->pt.y);
|
||||
|
@ -279,6 +279,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
|
||||
|
||||
if(dxw.dwFlags3 & (FILTERMESSAGES|DEFAULTMESSAGES)){
|
||||
switch(message){
|
||||
case WM_NCMOUSELEAVE:
|
||||
case WM_NCMOUSEMOVE:
|
||||
case WM_NCLBUTTONDOWN:
|
||||
case WM_NCLBUTTONUP:
|
||||
|
@ -6,12 +6,13 @@
|
||||
#include "ShimsDialog.h"
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432457
|
||||
// PDB WINAPI SdbOpenDatabase(
|
||||
// HSDB WINAPI SdbOpenDatabase(
|
||||
// LPCTSTR pwszPath,
|
||||
// PATH_TYPE eType
|
||||
//);
|
||||
// What is PDB!? Assuming it is a pointer to somewhere => "void*"
|
||||
typedef void* PDB;
|
||||
|
||||
// What is HSDB!? Assuming it is a pointer to somewhere => "void*"
|
||||
typedef void* HSDB;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432389.aspx
|
||||
typedef enum _PATH_TYPE
|
||||
@ -61,6 +62,14 @@ typedef DWORD TAGREF;
|
||||
#define TAG_APP_ID (0x11 | TAG_TYPE_BINARY)
|
||||
#define CONTEXT_PLATFORM_ID (0x8 | TAG_TYPE_BINARY)
|
||||
|
||||
#define HID_DOS_PATHS 0x00000001
|
||||
#define HID_DATABASE_FULLPATH 0x00000002
|
||||
#define HID_NO_DATABASE 0x00000004
|
||||
#define HID_DATABASE_TYPE_MASK 0xF00F0000
|
||||
|
||||
#define SDB_DATABASE_MAIN_SHIM 0x80030000
|
||||
#define SDB_DATABASE_MAIN_MSI 0x80020000
|
||||
#define SDB_DATABASE_MAIN_DRIVERS 0x80040000
|
||||
|
||||
typedef struct TAG_RC_Entry
|
||||
{
|
||||
@ -91,44 +100,55 @@ static DWORD s_TagGuids[] =
|
||||
// APIs:
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/bb432457.aspx
|
||||
//PDB WINAPI SdbOpenDatabase(
|
||||
//HSDB WINAPI SdbOpenDatabase(
|
||||
// __in LPCTSTR pwszPath,
|
||||
// __in PATH_TYPE eType
|
||||
//);
|
||||
typedef PDB (WINAPI *PSdbOpenDatabase)(
|
||||
LPCWSTR pwszPath, // Docu wrong? LPCTSTR shouldn't it be LPCWSTR!?
|
||||
typedef HSDB (WINAPI *PSdbOpenDatabase)(
|
||||
LPCTSTR pwszPath, // Docu wrong? LPCTSTR shouldn't it be LPCWSTR!?
|
||||
PATH_TYPE eType
|
||||
);
|
||||
PSdbOpenDatabase pSdbOpenDatabase = NULL;
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/bb432452.aspx
|
||||
//HSDB WINAPI SdbInitDatabase(
|
||||
// __in DWORD dwFlags,
|
||||
// __in LPCTSTR pszDatabasePath
|
||||
//);
|
||||
typedef HSDB (WINAPI *PSdbInitDatabase)(
|
||||
DWORD dwFlags,
|
||||
LPCTSTR pszDatabasePath
|
||||
);
|
||||
PSdbInitDatabase pSdbInitDatabase = NULL;
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/cc895520
|
||||
//void WINAPI SdbCloseDatabase(
|
||||
// __inout PDB pdb
|
||||
// __inout HSDB pdb
|
||||
//);
|
||||
typedef VOID (WINAPI *PSdbCloseDatabase)(
|
||||
PDB handle // assuming the passed handle...
|
||||
HSDB handle // assuming the passed handle...
|
||||
);
|
||||
PSdbCloseDatabase pSdbCloseDatabase = NULL;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432446
|
||||
//TAGID WINAPI SdbGetFirstChild(
|
||||
// PDB pdb,
|
||||
// HSDB pdb,
|
||||
// TAGID tiParent
|
||||
//);
|
||||
typedef TAGID (WINAPI *PSdbGetFirstChild)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiParent
|
||||
);
|
||||
PSdbGetFirstChild pSdbGetFirstChild = NULL;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432449
|
||||
//TAGID WINAPI SdbGetNextChild(
|
||||
// PDB pdb,
|
||||
// HSDB pdb,
|
||||
// TAGID tiParent,
|
||||
// TAGID tiPrev
|
||||
//);
|
||||
typedef TAGID (WINAPI *PSdbGetNextChild)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiParent,
|
||||
TAGID tiPrev
|
||||
);
|
||||
@ -136,11 +156,11 @@ PSdbGetNextChild pSdbGetNextChild = NULL;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432451
|
||||
//TAG WINAPI SdbGetTagFromTagID(
|
||||
// PDB pdb,
|
||||
// HSDB pdb,
|
||||
// TAGID tiWhich
|
||||
//);
|
||||
typedef TAG (WINAPI *PSdbGetTagFromTagID)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiWhich
|
||||
);
|
||||
PSdbGetTagFromTagID pSdbGetTagFromTagID = NULL;
|
||||
@ -156,13 +176,13 @@ PSdbTagToString pSdbTagToString = NULL;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432464
|
||||
//BOOL WINAPI SdbReadStringTag(
|
||||
// PDB pdb,
|
||||
// HSDB pdb,
|
||||
// TAGID tiWhich,
|
||||
// LPTSTR pwszBuffer,
|
||||
// DWORD cchBufferSize
|
||||
//);
|
||||
typedef BOOL (WINAPI *PSdbReadStringTag)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiWhich,
|
||||
LPTSTR pwszBuffer,
|
||||
DWORD cchBufferSize
|
||||
@ -171,23 +191,23 @@ PSdbReadStringTag pSdbReadStringTag = NULL;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432450.aspx
|
||||
//LPWSTR WINAPI SdbGetStringTagPtr(
|
||||
// PDB pdb,
|
||||
// HSDB pdb,
|
||||
// TAGID tiWhich
|
||||
//);
|
||||
typedef LPWSTR (WINAPI *PSdbGetStringTagPtr)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiWhich
|
||||
);
|
||||
PSdbGetStringTagPtr pSdbGetStringTagPtr = NULL;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432462.aspx
|
||||
//DWORD WINAPI SdbReadDWORDTag(
|
||||
// PDB pdb,
|
||||
// HSDB pdb,
|
||||
// TAGID tiWhich,
|
||||
// DWORD dwDefault
|
||||
//);
|
||||
typedef DWORD (WINAPI *PSdbReadDWORDTag)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiWhich,
|
||||
DWORD dwDefault
|
||||
);
|
||||
@ -195,22 +215,22 @@ PSdbReadDWORDTag pSdbReadDWORDTag = NULL;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432463.aspx
|
||||
//ULONGLONG WINAPI SdbReadQWORDTag(
|
||||
// PDB pdb,
|
||||
// HSDB pdb,
|
||||
// TAGID tiWhich,
|
||||
// ULONGLONG qwDefault
|
||||
//);
|
||||
typedef ULONGLONG (WINAPI *PSdbReadQWORDTag)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiWhich,
|
||||
ULONGLONG qwDefault
|
||||
);
|
||||
PSdbReadQWORDTag pSdbReadQWORDTag = NULL;
|
||||
|
||||
// http://msdn2.microsoft.com/en-us/library/bb432455
|
||||
//PDB WINAPI SdbOpenApphelpDetailsDatabase(
|
||||
//HSDB WINAPI SdbOpenApphelpDetailsDatabase(
|
||||
// LPCWSTR pwsDetailsDatabasePath
|
||||
//);
|
||||
typedef PDB (WINAPI *PSdbOpenApphelpDetailsDatabase)(
|
||||
typedef HSDB (WINAPI *PSdbOpenApphelpDetailsDatabase)(
|
||||
LPCWSTR pwsDetailsDatabasePath
|
||||
);
|
||||
PSdbOpenApphelpDetailsDatabase pSdbOpenApphelpDetailsDatabase = NULL;
|
||||
@ -226,22 +246,22 @@ PSdbOpenApphelpResourceFile pSdbOpenApphelpResourceFile = NULL;
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/bb432443
|
||||
//PVOID WINAPI SdbGetBinaryTagData(
|
||||
// __in PDB pdb,
|
||||
// __in HSDB pdb,
|
||||
// __in TAGID tiWhich
|
||||
//);
|
||||
typedef PVOID (WINAPI *PSdbGetBinaryTagData)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiWhich
|
||||
);
|
||||
PSdbGetBinaryTagData pSdbGetBinaryTagData = NULL;
|
||||
|
||||
// ???
|
||||
//DWORD WINAPI SdbGetTagDataSize(
|
||||
// __in PDB pdb,
|
||||
// __in HSDB pdb,
|
||||
// __in TAGID tiWhich
|
||||
//);
|
||||
typedef DWORD (WINAPI *PSdbGetTagDataSize)(
|
||||
PDB pdb,
|
||||
HSDB pdb,
|
||||
TAGID tiWhich
|
||||
);
|
||||
PSdbGetTagDataSize pSdbGetTagDataSize = NULL;
|
||||
@ -264,8 +284,6 @@ typedef struct tagSDBQUERYRESULT {
|
||||
GUID rgGuidDB[SDB_MAX_SDBS];
|
||||
} SDBQUERYRESULT, *PSDBQUERYRESULT;
|
||||
|
||||
typedef void* HSDB;
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/bb432448
|
||||
typedef BOOL (WINAPI *PSdbGetMatchingExe)(
|
||||
HSDB hSDB,
|
||||
@ -360,10 +378,17 @@ char * MatchExe(char *FileName)
|
||||
static char sBuf[10000];
|
||||
LPWSTR szFileName = (LPWSTR)malloc((strlen(FileName)+1)*sizeof(WCHAR));
|
||||
MultiByteToWideChar(CP_ACP, 0, FileName, -1, szFileName, strlen(FileName));
|
||||
BOOL bRet;
|
||||
HSDB hSDB;
|
||||
|
||||
HINSTANCE hAppHelp = LoadLibrary(_T("apphelp.dll"));
|
||||
if(!hAppHelp){
|
||||
sprintf(sBuf, "error %d loading apphelp.dll\n", GetLastError());
|
||||
return sBuf;
|
||||
}
|
||||
|
||||
pSdbOpenDatabase = (PSdbOpenDatabase) GetProcAddress(hAppHelp, "SdbOpenDatabase");
|
||||
pSdbInitDatabase = (PSdbInitDatabase) GetProcAddress(hAppHelp, "SdbInitDatabase");
|
||||
pSdbCloseDatabase = (PSdbCloseDatabase) GetProcAddress(hAppHelp, "SdbCloseDatabase");
|
||||
pSdbGetFirstChild = (PSdbGetFirstChild) GetProcAddress(hAppHelp, "SdbGetFirstChild");
|
||||
pSdbGetNextChild = (PSdbGetNextChild) GetProcAddress(hAppHelp, "SdbGetNextChild");
|
||||
@ -384,55 +409,67 @@ char * MatchExe(char *FileName)
|
||||
if(pSdbGetMatchingExe == NULL){
|
||||
// rough protection: we assume that if this is found, then all fpointers are there.
|
||||
sprintf(sBuf, "Unsupported Shim DB\n", FileName);
|
||||
FreeLibrary(hAppHelp);
|
||||
return sBuf;
|
||||
}
|
||||
|
||||
BOOL bRet = pSdbGetMatchingExe(NULL, (LPCWSTR)szFileName, NULL, NULL, 0, &result);
|
||||
if (bRet){
|
||||
sprintf(sBuf, "Shim found for file: %s\n", FileName);
|
||||
const size_t flagsLen = 1024;
|
||||
char szFlagsStr[flagsLen];
|
||||
Flags2String(result.dwFlags, szFlagsStr, flagsLen);
|
||||
sprintf(sBuf, "%sFlags: 0x%x: %s\n", sBuf, result.dwFlags, szFlagsStr);
|
||||
|
||||
if (result.trApphelp != TAGREF_NULL) sprintf(sBuf, "%sAppHelp-Message: 0x%x\n", sBuf, result.trApphelp);
|
||||
|
||||
for(DWORD i=0; i<result.dwExeCount; i++){
|
||||
sprintf(sBuf, "%sExe-Shim: 0x%x, ", sBuf, result.atrExes[i]);
|
||||
Flags2String(result.adwExeFlags[i], szFlagsStr, flagsLen);
|
||||
sprintf(sBuf, "%sFlags: 0x%x: %s\n", sBuf, result.adwExeFlags[i], szFlagsStr);
|
||||
}
|
||||
|
||||
for(DWORD i=0; i<result.dwLayerCount; i++){
|
||||
sprintf(sBuf, "%sLayer-Shim: 0x%x\n", sBuf, result.atrLayers[i]);
|
||||
}
|
||||
|
||||
Flags2String(result.dwLayerFlags, szFlagsStr, flagsLen);
|
||||
sprintf(sBuf, "%sLayer-Flags: 0x%x: %s\n", sBuf, result.dwLayerFlags, szFlagsStr);
|
||||
|
||||
for(DWORD i=0; i<SDB_MAX_SDBS; i++){
|
||||
if (result.rgGuidDB[i] != GUID_NULL){
|
||||
sprintf(sBuf, "%sShim-Database: %8.8X-%4.4X-%4.4X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X\n",
|
||||
sBuf,
|
||||
result.rgGuidDB[i].Data1,
|
||||
result.rgGuidDB[i].Data2,
|
||||
result.rgGuidDB[i].Data3,
|
||||
result.rgGuidDB[i].Data4[0],
|
||||
result.rgGuidDB[i].Data4[1],
|
||||
result.rgGuidDB[i].Data4[2],
|
||||
result.rgGuidDB[i].Data4[3],
|
||||
result.rgGuidDB[i].Data4[4],
|
||||
result.rgGuidDB[i].Data4[5],
|
||||
result.rgGuidDB[i].Data4[6],
|
||||
result.rgGuidDB[i].Data4[7]
|
||||
);
|
||||
}
|
||||
}
|
||||
//pSdbReleaseMatchingExe( ??? );
|
||||
//hSDB = pSdbInitDatabase(HID_DATABASE_TYPE_MASK|SDB_DATABASE_MAIN_SHIM, NULL);
|
||||
hSDB = pSdbInitDatabase(SDB_DATABASE_MAIN_SHIM, NULL);
|
||||
if(!hSDB){
|
||||
sprintf(sBuf, "Can't initialize shims database\n");
|
||||
return (sBuf);
|
||||
}
|
||||
else{
|
||||
|
||||
bRet = pSdbGetMatchingExe(NULL, (LPCWSTR)szFileName, NULL, NULL, 0, &result);
|
||||
if(!bRet){
|
||||
sprintf(sBuf, "No Shim found for file: %s\n", FileName);
|
||||
FreeLibrary(hAppHelp);
|
||||
return (sBuf);
|
||||
}
|
||||
|
||||
sprintf(sBuf, "Shim found for file: %s\n", FileName);
|
||||
const size_t flagsLen = 1024;
|
||||
char szFlagsStr[flagsLen];
|
||||
Flags2String(result.dwFlags, szFlagsStr, flagsLen);
|
||||
sprintf(sBuf, "%sFlags: 0x%x: %s\n", sBuf, result.dwFlags, szFlagsStr);
|
||||
|
||||
if (result.trApphelp != TAGREF_NULL) sprintf(sBuf, "%sAppHelp-Message: 0x%x\n", sBuf, result.trApphelp);
|
||||
|
||||
for(DWORD i=0; i<result.dwExeCount; i++){
|
||||
sprintf(sBuf, "%sExe-Shim: 0x%x, ", sBuf, result.atrExes[i]);
|
||||
Flags2String(result.adwExeFlags[i], szFlagsStr, flagsLen);
|
||||
sprintf(sBuf, "%sFlags: 0x%x: %s\n", sBuf, result.adwExeFlags[i], szFlagsStr);
|
||||
}
|
||||
|
||||
for(DWORD i=0; i<result.dwLayerCount; i++){
|
||||
sprintf(sBuf, "%sLayer-Shim: 0x%x\n", sBuf, result.atrLayers[i]);
|
||||
}
|
||||
|
||||
Flags2String(result.dwLayerFlags, szFlagsStr, flagsLen);
|
||||
sprintf(sBuf, "%sLayer-Flags: 0x%x: %s\n", sBuf, result.dwLayerFlags, szFlagsStr);
|
||||
|
||||
sprintf(sBuf, "%sCustomSDBMap: 0x%x\n", sBuf, result.dwCustomSDBMap);
|
||||
for(DWORD i=0; i<SDB_MAX_SDBS; i++){
|
||||
if (result.rgGuidDB[i] != GUID_NULL){
|
||||
sprintf(sBuf, "%sShim-Database: %8.8X-%4.4X-%4.4X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X\n",
|
||||
sBuf,
|
||||
result.rgGuidDB[i].Data1,
|
||||
result.rgGuidDB[i].Data2,
|
||||
result.rgGuidDB[i].Data3,
|
||||
result.rgGuidDB[i].Data4[0],
|
||||
result.rgGuidDB[i].Data4[1],
|
||||
result.rgGuidDB[i].Data4[2],
|
||||
result.rgGuidDB[i].Data4[3],
|
||||
result.rgGuidDB[i].Data4[4],
|
||||
result.rgGuidDB[i].Data4[5],
|
||||
result.rgGuidDB[i].Data4[6],
|
||||
result.rgGuidDB[i].Data4[7]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pSdbReleaseMatchingExe(hSDB, (TAGREF)&result);
|
||||
FreeLibrary(hAppHelp);
|
||||
return sBuf;
|
||||
}
|
||||
|
||||
|
@ -29,12 +29,15 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX)
|
||||
CDialog::DoDataExchange(pDX);
|
||||
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent()));
|
||||
|
||||
// window management
|
||||
DDX_Check(pDX, IDC_FIXWINFRAME, cTarget->m_FixWinFrame);
|
||||
DDX_Check(pDX, IDC_PREVENTMAXIMIZE, cTarget->m_PreventMaximize);
|
||||
// window style
|
||||
DDX_Radio(pDX, IDC_DEFAULTSTYLE, cTarget->m_WindowStyle);
|
||||
DDX_Check(pDX, IDC_LOCKWINSTYLE, cTarget->m_LockWinStyle);
|
||||
|
||||
// window management
|
||||
//DDX_Check(pDX, IDC_FIXWINFRAME, cTarget->m_FixWinFrame);
|
||||
DDX_Check(pDX, IDC_PREVENTMAXIMIZE, cTarget->m_PreventMaximize);
|
||||
DDX_Check(pDX, IDC_FIXPARENTWIN, cTarget->m_FixParentWin);
|
||||
DDX_Check(pDX, IDC_MODALSTYLE, cTarget->m_ModalStyle);
|
||||
//DDX_Check(pDX, IDC_MODALSTYLE, cTarget->m_ModalStyle);
|
||||
DDX_Check(pDX, IDC_FORCEWINRESIZE, cTarget->m_ForceWinResize);
|
||||
DDX_Check(pDX, IDC_HIDEMULTIMONITOR, cTarget->m_HideMultiMonitor);
|
||||
DDX_Check(pDX, IDC_RECOVERSCREENMODE, cTarget->m_RecoverScreenMode);
|
||||
|
@ -163,7 +163,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_AutoRefresh = FALSE;
|
||||
m_IndependentRefresh = FALSE;
|
||||
m_TextureFormat = FALSE;
|
||||
m_FixWinFrame = FALSE;
|
||||
//m_FixWinFrame = FALSE;
|
||||
m_VideoToSystemMem = FALSE;
|
||||
m_FixTextOut = FALSE;
|
||||
m_SharedDC = FALSE;
|
||||
@ -195,7 +195,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_ClientRemapping = TRUE; // default true !!
|
||||
m_LockWinStyle = FALSE;
|
||||
m_FixParentWin = FALSE;
|
||||
m_ModalStyle = FALSE;
|
||||
//m_ModalStyle = FALSE;
|
||||
m_KeepAspectRatio = FALSE;
|
||||
m_ForceWinResize = FALSE;
|
||||
m_HideMultiMonitor = FALSE;
|
||||
|
@ -42,6 +42,7 @@ public:
|
||||
int m_LogMode;
|
||||
int m_MonitorId;
|
||||
int m_WinMovementType;
|
||||
int m_WindowStyle;
|
||||
BOOL m_HookDI;
|
||||
BOOL m_HookDI8;
|
||||
BOOL m_EmulateRelMouse;
|
||||
@ -112,7 +113,7 @@ public:
|
||||
BOOL m_AutoRefresh;
|
||||
BOOL m_IndependentRefresh;
|
||||
BOOL m_TextureFormat;
|
||||
BOOL m_FixWinFrame;
|
||||
//BOOL m_FixWinFrame;
|
||||
BOOL m_VideoToSystemMem;
|
||||
BOOL m_FixTextOut;
|
||||
BOOL m_SharedDC;
|
||||
@ -144,7 +145,7 @@ public:
|
||||
BOOL m_ClientRemapping;
|
||||
BOOL m_LockWinStyle;
|
||||
BOOL m_FixParentWin;
|
||||
BOOL m_ModalStyle;
|
||||
//BOOL m_ModalStyle;
|
||||
BOOL m_KeepAspectRatio;
|
||||
BOOL m_ForceWinResize;
|
||||
BOOL m_HideMultiMonitor;
|
||||
|
@ -55,8 +55,12 @@ BOOL CViewFlagsDialog::OnInitDialog()
|
||||
for(i=0, dword = t->flags7; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(6,i));
|
||||
sflags.Append("\nFlags8: ");
|
||||
for(i=0, dword = t->flags8; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(7,i));
|
||||
sflags.Append("\nFlags9: ");
|
||||
for(i=0, dword = t->flags8; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(8,i));
|
||||
sflags.Append("\nFlags10: ");
|
||||
for(i=0, dword = t->flags8; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(9,i));
|
||||
sflags.Append("\nTFlags: ");
|
||||
for(i=0, dword = t->tflags; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(8,i));
|
||||
for(i=0, dword = t->tflags; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(10,i));
|
||||
|
||||
this->SetDlgItemTextA(IDC_DESKTOPINFO, sflags);
|
||||
this->SetWindowTextA(t->path);
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,75 +0,0 @@
|
||||
// dxwndhostDoc.cpp : CDxwndhostDoc Define the behavior of the class.
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "dxwndhost.h"
|
||||
|
||||
#include "dxwndhostDoc.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CDxwndhostDoc
|
||||
|
||||
IMPLEMENT_DYNCREATE(CDxwndhostDoc, CDocument)
|
||||
|
||||
BEGIN_MESSAGE_MAP(CDxwndhostDoc, CDocument)
|
||||
//{{AFX_MSG_MAP(CDxwndhostDoc)
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CDxwndhostDoc class constructor / destructor
|
||||
|
||||
CDxwndhostDoc::CDxwndhostDoc()
|
||||
{
|
||||
}
|
||||
|
||||
CDxwndhostDoc::~CDxwndhostDoc()
|
||||
{
|
||||
}
|
||||
|
||||
BOOL CDxwndhostDoc::OnNewDocument()
|
||||
{
|
||||
if (!CDocument::OnNewDocument())
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CDxwndhostDoc Serialization
|
||||
|
||||
void CDxwndhostDoc::Serialize(CArchive& ar)
|
||||
{
|
||||
if (ar.IsStoring())
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CDxwndhostDoc Diagnostic Class
|
||||
|
||||
#ifdef _DEBUG
|
||||
void CDxwndhostDoc::AssertValid() const
|
||||
{
|
||||
CDocument::AssertValid();
|
||||
}
|
||||
|
||||
void CDxwndhostDoc::Dump(CDumpContext& dc) const
|
||||
{
|
||||
CDocument::Dump(dc);
|
||||
}
|
||||
#endif //_DEBUG
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CDxwndhostDoc Command
|
@ -354,6 +354,13 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
case 2: t->flags8 |= DDSFORMAT; break;
|
||||
}
|
||||
|
||||
switch(dlg->m_WindowStyle){
|
||||
case 0: break;
|
||||
case 1: t->flags2 |= MODALSTYLE; break;
|
||||
case 2: t->flags |= FIXWINFRAME; break;
|
||||
case 3: t->flags9 |= FIXTHINFRAME; break;
|
||||
}
|
||||
|
||||
if(dlg->m_HookDI) t->flags |= HOOKDI;
|
||||
if(dlg->m_HookDI8) t->flags |= HOOKDI8;
|
||||
if(dlg->m_EmulateRelMouse) t->flags6 |= EMULATERELMOUSE;
|
||||
@ -453,7 +460,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_AutoRefresh) t->flags |= AUTOREFRESH;
|
||||
if(dlg->m_IndependentRefresh) t->flags2 |= INDEPENDENTREFRESH;
|
||||
if(dlg->m_TextureFormat) t->flags5 |= TEXTUREFORMAT;
|
||||
if(dlg->m_FixWinFrame) t->flags |= FIXWINFRAME;
|
||||
//if(dlg->m_FixWinFrame) t->flags |= FIXWINFRAME;
|
||||
if(dlg->m_VideoToSystemMem) t->flags |= SWITCHVIDEOMEMORY;
|
||||
if(dlg->m_FixTextOut) t->flags |= FIXTEXTOUT;
|
||||
if(dlg->m_HookGlide) t->flags4 |= HOOKGLIDE;
|
||||
@ -483,7 +490,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_ClientRemapping) t->flags |= CLIENTREMAPPING;
|
||||
if(dlg->m_LockWinStyle) t->flags |= LOCKWINSTYLE;
|
||||
if(dlg->m_FixParentWin) t->flags |= FIXPARENTWIN;
|
||||
if(dlg->m_ModalStyle) t->flags2 |= MODALSTYLE;
|
||||
//if(dlg->m_ModalStyle) t->flags2 |= MODALSTYLE;
|
||||
if(dlg->m_KeepAspectRatio) t->flags2 |= KEEPASPECTRATIO;
|
||||
if(dlg->m_ForceWinResize) t->flags2 |= FORCEWINRESIZE;
|
||||
if(dlg->m_HideMultiMonitor) t->flags2 |= HIDEMULTIMONITOR;
|
||||
@ -689,6 +696,11 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if( t->flags8 & RAWFORMAT) dlg->m_TextureFileFormat = 1;
|
||||
if( t->flags8 & DDSFORMAT) dlg->m_TextureFileFormat = 2;
|
||||
|
||||
dlg->m_WindowStyle = 0;
|
||||
if(t->flags2 & MODALSTYLE) dlg->m_WindowStyle = 1;
|
||||
if(t->flags & FIXWINFRAME) dlg->m_WindowStyle = 2;
|
||||
if(t->flags9 & FIXTHINFRAME) dlg->m_WindowStyle = 3;
|
||||
|
||||
dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0;
|
||||
dlg->m_HookDI8 = t->flags & HOOKDI8 ? 1 : 0;
|
||||
dlg->m_EmulateRelMouse = t->flags6 & EMULATERELMOUSE ? 1 : 0;
|
||||
@ -788,7 +800,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
dlg->m_AutoRefresh = t->flags & AUTOREFRESH ? 1 : 0;
|
||||
dlg->m_IndependentRefresh = t->flags2 & INDEPENDENTREFRESH ? 1 : 0;
|
||||
dlg->m_TextureFormat = t->flags5 & TEXTUREFORMAT ? 1 : 0;
|
||||
dlg->m_FixWinFrame = t->flags & FIXWINFRAME ? 1 : 0;
|
||||
//dlg->m_FixWinFrame = t->flags & FIXWINFRAME ? 1 : 0;
|
||||
dlg->m_VideoToSystemMem = t->flags & SWITCHVIDEOMEMORY ? 1 : 0;
|
||||
dlg->m_FixTextOut = t->flags & FIXTEXTOUT ? 1 : 0;
|
||||
dlg->m_SharedDC = t->flags6 & SHAREDDC ? 1 : 0;
|
||||
@ -819,7 +831,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
dlg->m_ClientRemapping = t->flags & CLIENTREMAPPING ? 1 : 0;
|
||||
dlg->m_LockWinStyle = t->flags & LOCKWINSTYLE ? 1 : 0;
|
||||
dlg->m_FixParentWin = t->flags & FIXPARENTWIN ? 1 : 0;
|
||||
dlg->m_ModalStyle = t->flags2 & MODALSTYLE ? 1 : 0;
|
||||
//dlg->m_ModalStyle = t->flags2 & MODALSTYLE ? 1 : 0;
|
||||
dlg->m_KeepAspectRatio = t->flags2 & KEEPASPECTRATIO ? 1 : 0;
|
||||
dlg->m_ForceWinResize = t->flags2 & FORCEWINRESIZE ? 1 : 0;
|
||||
dlg->m_HideMultiMonitor = t->flags2 & HIDEMULTIMONITOR ? 1 : 0;
|
||||
@ -973,6 +985,14 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i,
|
||||
sprintf_s(val, sizeof(val), "%i", TargetMap->flags8);
|
||||
WritePrivateProfileString("target", key, val, InitPath);
|
||||
// -------
|
||||
sprintf_s(key, sizeof(key), "flagn%i", i);
|
||||
sprintf_s(val, sizeof(val), "%i", TargetMap->flags9);
|
||||
WritePrivateProfileString("target", key, val, InitPath);
|
||||
// -------
|
||||
sprintf_s(key, sizeof(key), "flago%i", i);
|
||||
sprintf_s(val, sizeof(val), "%i", TargetMap->flags10);
|
||||
WritePrivateProfileString("target", key, val, InitPath);
|
||||
// -------
|
||||
sprintf_s(key, sizeof(key), "tflag%i", i);
|
||||
sprintf_s(val, sizeof(val), "%i", TargetMap->tflags);
|
||||
WritePrivateProfileString("target", key, val, InitPath);
|
||||
@ -1041,6 +1061,16 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i,
|
||||
EscBuf = NULL;
|
||||
}
|
||||
|
||||
static void SaveExportStamp(char *InitPath)
|
||||
{
|
||||
char val[32];
|
||||
GetDllVersion(val);
|
||||
time_t _tm = time(NULL);
|
||||
struct tm *curtime = localtime(& _tm);
|
||||
WritePrivateProfileString("stamp", "version", val, InitPath);
|
||||
WritePrivateProfileString("stamp", "time", asctime(curtime), InitPath);
|
||||
}
|
||||
|
||||
static void ClearTarget(int i, char *InitPath)
|
||||
{
|
||||
char key[32];
|
||||
@ -1070,6 +1100,10 @@ static void ClearTarget(int i, char *InitPath)
|
||||
WritePrivateProfileString("target", key, 0, InitPath);
|
||||
sprintf_s(key, sizeof(key), "flagm%i", i);
|
||||
WritePrivateProfileString("target", key, 0, InitPath);
|
||||
sprintf_s(key, sizeof(key), "flagn%i", i);
|
||||
WritePrivateProfileString("target", key, 0, InitPath);
|
||||
sprintf_s(key, sizeof(key), "flago%i", i);
|
||||
WritePrivateProfileString("target", key, 0, InitPath);
|
||||
sprintf_s(key, sizeof(key), "tflag%i", i);
|
||||
WritePrivateProfileString("target", key, 0, InitPath);
|
||||
sprintf_s(key, sizeof(key), "initx%i", i);
|
||||
@ -1186,6 +1220,12 @@ static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, c
|
||||
sprintf_s(key, sizeof(key), "flagm%i", i);
|
||||
TargetMap->flags8 = GetPrivateProfileInt("target", key, 0, InitPath);
|
||||
// -------
|
||||
sprintf_s(key, sizeof(key), "flagn%i", i);
|
||||
TargetMap->flags9 = GetPrivateProfileInt("target", key, 0, InitPath);
|
||||
// -------
|
||||
sprintf_s(key, sizeof(key), "flago%i", i);
|
||||
TargetMap->flags10= GetPrivateProfileInt("target", key, 0, InitPath);
|
||||
// -------
|
||||
sprintf_s(key, sizeof(key), "tflag%i", i);
|
||||
TargetMap->tflags = GetPrivateProfileInt("target", key, 0, InitPath);
|
||||
// -------
|
||||
@ -1508,6 +1548,7 @@ void CDxwndhostView::OnExport()
|
||||
TFlags = TargetMap->tflags;
|
||||
TargetMap->tflags = 0;
|
||||
SaveConfigItem(&TargetMaps[i], &PrivateMaps[i], 0, path);
|
||||
SaveExportStamp(path);
|
||||
TargetMap->tflags = TFlags;
|
||||
if(GetPrivateProfileInt("window", "updatepaths", 1, gInitPath)) {
|
||||
GetFolderFromPath(path);
|
||||
|
BIN
host/resource
BIN
host/resource
Binary file not shown.
BIN
proxy/d3d8.suo
BIN
proxy/d3d8.suo
Binary file not shown.
BIN
proxy/d3d9.suo
BIN
proxy/d3d9.suo
Binary file not shown.
BIN
proxy/ddraw.suo
BIN
proxy/ddraw.suo
Binary file not shown.
@ -45,6 +45,8 @@ void InitDxWnd(void)
|
||||
target.flags6 = GetIntEntry("flagk0", 0);
|
||||
target.flags7 = GetIntEntry("flagl0", 0);
|
||||
target.flags8 = GetIntEntry("flagm0", 0);
|
||||
target.flags9 = GetIntEntry("flagn0", 0);
|
||||
target.flags10 = GetIntEntry("flago0", 0);
|
||||
target.tflags = GetIntEntry("tflag0", 0);
|
||||
target.dflags = GetIntEntry("dflag0", 0);
|
||||
target.posx = GetIntEntry("posx0", 0);
|
||||
|
BIN
proxy/wing32.suo
BIN
proxy/wing32.suo
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user