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

v2_02_30_src

Former-commit-id: 5769977f0e9616d3d69752ed853e8fc2d8aa1550
This commit is contained in:
gho tik 2013-10-08 12:38:12 -04:00 committed by Refael ACkermann
parent 3ac3a3dfa3
commit 884ef0807b
34 changed files with 2098 additions and 6902 deletions

View File

@ -89,6 +89,9 @@
#define BLACKWHITE 0x00000080 // Simulate a B&W screen monitor mapping colors to grayscales #define BLACKWHITE 0x00000080 // Simulate a B&W screen monitor mapping colors to grayscales
#define SAVECAPS 0x00000100 // Saves and restores original surface flags & capabilities #define SAVECAPS 0x00000100 // Saves and restores original surface flags & capabilities
#define SINGLEPROCAFFINITY 0x00000200 // Set Process Affinity to a single core #define SINGLEPROCAFFINITY 0x00000200 // Set Process Affinity to a single core
#define EMULATEREGISTRY 0x00000400 // Emulate registry api to read extra keys
#define CDROMDRIVETYPE 0x00000800 // Pretends that GetDriveType() always returns DRIVE_CDROM
#define NOWINDOWMOVE 0x00001000 // Do not try to update window position & size on D3D rendering
// logging Tflags DWORD: // logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
@ -100,6 +103,7 @@
#define ASSERTDIALOG 0x00000040 // show assert messages in Dialog Box #define ASSERTDIALOG 0x00000040 // show assert messages in Dialog Box
#define OUTIMPORTTABLE 0x00000080 // dump import table contents #define OUTIMPORTTABLE 0x00000080 // dump import table contents
#define OUTDEBUG 0x00000100 // detailed debugging indormation #define OUTDEBUG 0x00000100 // detailed debugging indormation
#define OUTREGISTRY 0x00000200 // log registry operations
#define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE | LOCKEDSURFACE) #define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE | LOCKEDSURFACE)
#define HANDLEFPS (SHOWFPS | SHOWFPSOVERLAY | LIMITFPS | SKIPFPS) #define HANDLEFPS (SHOWFPS | SHOWFPSOVERLAY | LIMITFPS | SKIPFPS)
@ -172,6 +176,7 @@ LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM);
#define OutTraceD if(dxw.dwTFlags & OUTDDRAWTRACE) OutTrace #define OutTraceD if(dxw.dwTFlags & OUTDDRAWTRACE) OutTrace
#define OutTraceC if(dxw.dwTFlags & OUTCURSORTRACE) OutTrace #define OutTraceC if(dxw.dwTFlags & OUTCURSORTRACE) OutTrace
#define OutTraceB if(dxw.dwTFlags & OUTDEBUG) OutTrace #define OutTraceB if(dxw.dwTFlags & OUTDEBUG) OutTrace
#define OutTraceR if(dxw.dwTFlags & OUTREGISTRY) OutTrace
#define OutTraceP OutTrace #define OutTraceP OutTrace
#define OutTraceE OutTrace #define OutTraceE OutTrace
@ -179,6 +184,7 @@ LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM);
#define IsTraceX (dxw.dwTFlags & OUTPROXYTRACE) #define IsTraceX (dxw.dwTFlags & OUTPROXYTRACE)
#define IsTraceD (dxw.dwTFlags & OUTDDRAWTRACE) #define IsTraceD (dxw.dwTFlags & OUTDDRAWTRACE)
#define IsTraceC (dxw.dwTFlags & OUTCURSORTRACE) #define IsTraceC (dxw.dwTFlags & OUTCURSORTRACE)
#define IsTraceR (dxw.dwTFlags & OUTREGISTRY)
#define IsTraceP (TRUE) #define IsTraceP (TRUE)
#define IsTraceE (TRUE) #define IsTraceE (TRUE)
#define IsDebug (dxw.dwTFlags & OUTDEBUG) #define IsDebug (dxw.dwTFlags & OUTDEBUG)

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c374369324c6043bc75325e062677c9dc8755d0f27d6a013d54eb2065883ea0a oid sha256:0df4a17760b4266a73aaf34565be1febb6bcf0d2fc0d776ca6aeb7fb6c861e28
size 352768 size 365568

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e240953c0bad229baff47ef4265a34e717615da2a784cff305e2983a3bc4467d oid sha256:2f9e10ed36d2163eb58084363d6e218f827109487beda4962fd48c59fed8b1e8
size 523264 size 524288

File diff suppressed because it is too large Load Diff

View File

@ -182,8 +182,16 @@ fixed d3d8/9 hook to Get/SetGammaRamp. This should make a great number of recent
v2.02.29 v2.02.29
CORE: CORE:
hooked DirectDrawSurface::Lock method to center primary surface memory updates centered into the window (in no emulated mode) hooked DirectDrawSurface::Lock method to center primary surface memory updates centered into the window (in no emulated mode)
added "Locked surface" emulation type to enable scaled blitting to primary surface to stretch to the correct area.
Fixed BltFast handling to fix "Duckman" rendering problems.
GUI:
added support for "Locked surface" emulation type
v2.02.30
CORE:
Some ddraw::GetDC log message fixes
added preliminary registry emulation - tested ok with "duckman"
added separate flag for preliminary registry operation trace
added CDROM drive type emulation - tested ok with "Fighting Forces" RIP
fixed FixCursorPos routine: cursor x,y compensation must always use pseudo-fullscreen window parameters - fixes Imperialism II mouse problems
fixed Desktop Workarea position mode for ddraw games
added CoCreateInstanceEx hook - "Final Fighter" seems to be using it, but who knows why...?
added "Don't move D3D Rendering Window" window option to make "Fable Lost Chapters" working
GUI:
updated default values on new entry creation to map most-likely-to-work parameters

248
dll/advapi.cpp Normal file
View File

@ -0,0 +1,248 @@
#include <stdio.h>
#include "dxwnd.h"
#include "dxwcore.hpp"
#include "syslibs.h"
#include "dxhook.h"
#include "dxhelper.h"
static HookEntry_Type Hooks[]={
{"RegOpenKeyExA", NULL, (FARPROC *)&pRegOpenKeyEx, (FARPROC)extRegOpenKeyEx},
{"RegCloseKey", NULL, (FARPROC *)&pRegCloseKey, (FARPROC)extRegCloseKey},
{"RegQueryValueExA", NULL, (FARPROC *)&pRegQueryValueEx, (FARPROC)extRegQueryValueEx},
{"RegCreateKeyExA", NULL, (FARPROC *)&pRegCreateKeyEx, (FARPROC)extRegCreateKeyEx},
{"RegSetValueExA", NULL, (FARPROC *)&pRegSetValueEx, (FARPROC)extRegSetValueEx},
{0, NULL, 0, 0} // terminator
};
void HookAdvApi32(HMODULE module)
{
HookLibrary(module, Hooks, "ADVAPI32.dll");
}
FARPROC Remap_AdvApi32_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if (addr=RemapLibrary(proc, hModule, Hooks)) return addr;
return NULL;
}
#define HKEY_FAKE ((HKEY)0x7FFFFFFF)
#define HKEY_MASK 0x7FFFFF00
#define IsFake(hKey) (((DWORD)hKey & HKEY_MASK) == HKEY_MASK)
static char *hKey2String(HKEY hKey)
{
char *skey;
static char skeybuf[10];
if(IsFake(hKey)) return "HKEY_FAKE";
switch((ULONG)hKey){
case HKEY_CLASSES_ROOT: skey="HKEY_CLASSES_ROOT"; break;
case HKEY_CURRENT_CONFIG: skey="HKEY_CURRENT_CONFIG"; break;
case HKEY_CURRENT_USER: skey="HKEY_CURRENT_USER"; break;
case HKEY_LOCAL_MACHINE: skey="HKEY_LOCAL_MACHINE"; break;
case HKEY_USERS: skey="HKEY_USERS"; break;
default: sprintf(skeybuf, "0x%x", hKey); skey=skeybuf; break;
}
return skey;
}
// ---------------------------------------------------------------------------------
LONG WINAPI extRegOpenKeyEx(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD ulOptions,
REGSAM samDesired,
PHKEY phkResult)
{
LONG res;
char RegBuf[256+1];
OutTraceR("RegOpenKeyEx: hKey=%x(%s) SubKey=\"%s\" Options=%x\n",
hKey, hKey2String(hKey), lpSubKey, ulOptions);
res=(*pRegOpenKeyEx)(hKey, lpSubKey, ulOptions, samDesired, phkResult);
OutTraceR("RegOpenKeyEx: res=%x\n", res);
if((res==ERROR_SUCCESS) || !(dxw.dwFlags3 & EMULATEREGISTRY)) return res;
*phkResult=HKEY_FAKE;
FILE *regf;
char sKey[256+1];
sprintf(sKey,"%s\\%s", hKey2String(hKey), lpSubKey);
OutTraceD("RegOpenKeyEx: searching for key=\"%s\"\n", sKey);
regf=fopen("dxwnd.reg","r");
if(regf==NULL) return ERROR_FILE_NOT_FOUND;
fgets(RegBuf, 256, regf);
while (!feof(regf)){
if(RegBuf[0]=='['){
if(!strncmp(&RegBuf[1],sKey,strlen(sKey)) && RegBuf[strlen(sKey)+1]==']'){
OutTraceD("RegOpenKeyEx: found fake Key=\"%s\" hkResult=%x\n", sKey, *phkResult);
fclose(regf);
return ERROR_SUCCESS;
}
else (*phkResult)--;
}
fgets(RegBuf, 256, regf);
}
fclose(regf);
return ERROR_FILE_NOT_FOUND;
}
LONG WINAPI extRegQueryValueEx(
HKEY hKey,
LPCTSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData)
{
LONG res;
OutTraceR("RegQueryValueEx: hKey=%x(%s) ValueName=\"%s\" Reserved=%x\n", hKey, hKey2String(hKey), lpValueName, lpReserved);
if (!IsFake(hKey)){
res=(*pRegQueryValueEx)(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
if(IsTraceR){
if (res==ERROR_SUCCESS){
OutTrace("RegQueryValueEx: size=%d type=%x(%s) ",
lpcbData?*lpcbData:0, lpType?*lpType:0, lpType?ExplainRegType(*lpType):"none");
if(lpType) switch(*lpType){
case REG_SZ: OutTrace("Data=\"%s\"\n", lpData); break;
case REG_DWORD: OutTrace("Data=0x%x\n", *(DWORD *)lpData); break;
case REG_BINARY:
{
int i;
unsigned char *p;
p = lpData;
OutTrace("Data=");
for(i=0; i<*lpcbData; i++) OutTrace("%02.2X,", *p++);
OutTrace("\n");
}
break;
default: OutTrace("Data=???\n"); break;
}
else
OutTrace("\n");
}
else
OutTrace("res=%x\n", res);
}
return res;
}
// going through here means we're in EMULATEREGISTRY mode
//if(!(dxw.dwFlags3 & EMULATEREGISTRY)) return res;
// try emulated registry
FILE *regf;
char RegBuf[256+1];
char *pData;
HKEY hCurKey=HKEY_FAKE+1;
regf=fopen("dxwnd.reg","r");
if(regf==NULL) return ERROR_FILE_NOT_FOUND;
if(!lpValueName)lpValueName="";
fgets(RegBuf, 256, regf);
while (!feof(regf)){
if(RegBuf[0]=='['){
hCurKey--;
}
else {
if(hCurKey==hKey){
//OutTraceD("loop: \"%s\"\n", RegBuf);
if((RegBuf[0]=='"') &&
!strncmp(lpValueName, &RegBuf[1], strlen(lpValueName)) &&
(RegBuf[strlen(lpValueName)+1]=='"') &&
(RegBuf[strlen(lpValueName)+2]=='='))
{
res=ERROR_FILE_NOT_FOUND;
pData=&RegBuf[strlen(lpValueName)+3];
if(*pData=='"'){ // string value
//strcpy((char *)lpData, &RegBuf[strlen(lpValueName)+4]);
//lpData[strlen((char *)lpData)-2]=0; // eliminates " and \n
//if(lpType) *lpType=REG_SZ;
//*lpcbData=strlen((char *)lpData)+1;
*lpcbData=0;
pData++;
while(*pData && (*pData != '"')){
if(*pData=='\\') pData++;
*lpData++=*pData++;
*lpcbData++;
}
if(lpType) *lpType=REG_SZ;
//
OutTraceD("RegQueryValueEx: Data=\"%s\" type=REG_SZ\n", lpData);
res=ERROR_SUCCESS;
}
if(!strncmp(pData,"dword:",strlen("dword:"))){ //dword value
DWORD val;
pData+=strlen("dword:");
sscanf(pData, "%x", &val);
memcpy(lpData, &val, sizeof(DWORD));
if(lpType) *lpType=REG_DWORD;
*lpcbData=sizeof(DWORD);
OutTraceD("RegQueryValueEx: Data=0x%x type=REG_DWORD\n", val);
res=ERROR_SUCCESS;
}
if(!strncmp(pData,"hex:",strlen("hex:"))){ //dword value
pData+=strlen("hex:");
lpData[strlen((char *)lpData)-1]=0; // eliminates \n
if(lpType) *lpType=REG_BINARY;
*lpcbData=0;
OutTraceD("RegQueryValueEx: Data=");
while(strlen(pData)>1){
sscanf(pData, "%x,", (char *)lpData);
OutTraceD("%02.2x,", *(unsigned char *)lpData);
pData+=3;
lpData++;
(*lpcbData)++;
}
OutTraceD(" type=REG_BINARY cbData=%d\n", *lpcbData);
res=ERROR_SUCCESS;
}
fclose(regf);
return res;
}
}
}
fgets(RegBuf, 256, regf);
}
fclose(regf);
return ERROR_FILE_NOT_FOUND;
}
LONG WINAPI extRegCloseKey(HKEY hKey)
{
OutTraceR("RegCloseKey: hKey=%x\n", hKey);
if (IsFake(hKey)) return ERROR_SUCCESS;
return (*pRegCloseKey)(hKey);
}
LONG WINAPI extRegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE *lpData, DWORD cbData)
{
if (IsTraceR){
OutTrace("RegSetValueEx: hKey=%x Type=%x(%s) cbData=%d\n", hKey, lpValueName, dwType, ExplainRegType(dwType), cbData);
switch(dwType){
case REG_DWORD: OutTrace("Data=%x\n", *(DWORD *)lpData); break;
case REG_NONE: OutTrace("ValueName=\"%s\"\n", lpData); break;
default: OutTrace("\n");
}
}
if(IsFake(hKey) && (dxw.dwFlags3 & EMULATEREGISTRY)) return ERROR_SUCCESS;
return (*pRegSetValueEx)(hKey, lpValueName, Reserved, dwType, lpData, cbData);
}
LONG WINAPI extRegCreateKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved, LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition)
{
OutTraceR("RegCreateKeyEx: hKey=%x(%s) SubKey=\"%s\" Class=%x\n", hKey, hKey2String(hKey), lpSubKey, lpClass);
if (dxw.dwFlags3 && EMULATEREGISTRY){
*phkResult = HKEY_FAKE;
if(lpdwDisposition) *lpdwDisposition=REG_OPENED_EXISTING_KEY;
return ERROR_SUCCESS;
}
else
return (*pRegCreateKeyEx)(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired,
lpSecurityAttributes, phkResult, lpdwDisposition);
}

View File

@ -2384,8 +2384,10 @@ static void BlitError(HRESULT res, LPRECT lps, LPRECT lpd, int line)
return; return;
} }
static void BlitTrace(char *label, LPRECT lps, LPRECT lpd, DWORD flags, int line) static void BlitTrace(char *label, LPRECT lps, LPRECT lpd, int line)
{ {
extern HANDLE hTraceMutex;
WaitForSingleObject(hTraceMutex, INFINITE);
OutTrace("Blt: %s", label); OutTrace("Blt: %s", label);
if (lps) if (lps)
OutTrace(" src=(%d,%d)-(%d,%d)",lps->left, lps->top, lps->right, lps->bottom); OutTrace(" src=(%d,%d)-(%d,%d)",lps->left, lps->top, lps->right, lps->bottom);
@ -2395,7 +2397,8 @@ static void BlitTrace(char *label, LPRECT lps, LPRECT lpd, DWORD flags, int line
OutTrace(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom); OutTrace(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom);
else else
OutTrace(" dest=(NULL)"); OutTrace(" dest=(NULL)");
OutTrace(" flags=%x(%s) at %d\n", flags, ExplainBltFlags(flags), line); OutTrace(" at %d\n", __LINE__);
ReleaseMutex(hTraceMutex);
return; return;
} }
@ -2511,21 +2514,21 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
} }
} }
if (IsDebug) BlitTrace("NOPRIM", lpsrcrect, lpdestrect, dwflags, __LINE__); if (IsDebug) BlitTrace("NOPRIM", lpsrcrect, lpdestrect, __LINE__);
res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx); res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx);
// Blitting compressed data may work to screen surfaces only. In this case, it may be worth // Blitting compressed data may work to screen surfaces only. In this case, it may be worth
// trying blitting directly to lpDDSEmu_Prim: it makes DK2 intro movies working. // trying blitting directly to lpDDSEmu_Prim: it makes DK2 intro movies working.
switch(res){ switch(res){
case DDERR_UNSUPPORTED: case DDERR_UNSUPPORTED:
if (dxw.dwFlags1 & EMULATESURFACE){ if (dxw.dwFlags1 & EMULATESURFACE){
if (IsDebug) BlitTrace("UNSUPP", lpsrcrect ? &srcrect : NULL, lpdestrect, dwflags, __LINE__); if (IsDebug) BlitTrace("UNSUPP", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__);
res=(*pBlt)(lpDDSEmu_Prim, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx); res=(*pBlt)(lpDDSEmu_Prim, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx);
} }
break; break;
case DDERR_SURFACEBUSY: case DDERR_SURFACEBUSY:
(*pUnlockMethod(lpdds))(lpdds, NULL); (*pUnlockMethod(lpdds))(lpdds, NULL);
if (lpddssrc) (*pUnlockMethod(lpddssrc))(lpddssrc, NULL); if (lpddssrc) (*pUnlockMethod(lpddssrc))(lpddssrc, NULL);
if (IsDebug) BlitTrace("BUSY", lpsrcrect ? &srcrect : NULL, lpdestrect, dwflags, __LINE__); if (IsDebug) BlitTrace("BUSY", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__);
res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_WAIT, lpddbltfx); res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_WAIT, lpddbltfx);
break; break;
default: default:
@ -2547,7 +2550,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
// blit only when source and dest surface are different. Should make ScreenRefresh faster. // blit only when source and dest surface are different. Should make ScreenRefresh faster.
if (lpdds != lpddssrc) { if (lpdds != lpddssrc) {
if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc); if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc);
if (IsDebug) BlitTrace("PRIM-NOEMU", lpsrcrect, &destrect, dwflags, __LINE__); if (IsDebug) BlitTrace("PRIM-NOEMU", lpsrcrect, &destrect, __LINE__);
res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
} }
if(res){ if(res){
@ -2555,7 +2558,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
// Try to handle HDC lock concurrency.... // Try to handle HDC lock concurrency....
if(res==DDERR_SURFACEBUSY){ if(res==DDERR_SURFACEBUSY){
(*pUnlockMethod(lpdds))(lpdds, NULL); (*pUnlockMethod(lpdds))(lpdds, NULL);
if (IsDebug) BlitTrace("BUSY", lpsrcrect, &destrect, dwflags, __LINE__); if (IsDebug) BlitTrace("BUSY", lpsrcrect, &destrect, __LINE__);
res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__);
} }
@ -2591,7 +2594,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
res=0; res=0;
// blit only when source and dest surface are different. Should make ScreenRefresh faster. // blit only when source and dest surface are different. Should make ScreenRefresh faster.
if (lpdds != lpddssrc){ if (lpdds != lpddssrc){
if (IsDebug) BlitTrace("SRC2EMU", &emurect, &destrect, dwflags, __LINE__); if (IsDebug) BlitTrace("SRC2EMU", &emurect, &destrect, __LINE__);
res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
} }
@ -2605,7 +2608,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
*/ */
if(res==DDERR_UNSUPPORTED){ if(res==DDERR_UNSUPPORTED){
if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc); if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc);
if (IsDebug) BlitTrace("UNSUPP", &emurect, &destrect, dwflags, __LINE__); if (IsDebug) BlitTrace("UNSUPP", &emurect, &destrect, __LINE__);
res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__);
} }
@ -2614,7 +2617,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
if(res==DDERR_SURFACEBUSY){ if(res==DDERR_SURFACEBUSY){
res=(*pUnlockMethod(lpddssrc))(lpddssrc, NULL); res=(*pUnlockMethod(lpddssrc))(lpddssrc, NULL);
if(res) OutTraceE("Unlock ERROR: err=%x(%s)\n", res, ExplainDDError(res)); if(res) OutTraceE("Unlock ERROR: err=%x(%s)\n", res, ExplainDDError(res));
if (IsDebug) BlitTrace("BUSY", &emurect, &destrect, dwflags, __LINE__); if (IsDebug) BlitTrace("BUSY", &emurect, &destrect, __LINE__);
res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__);
} }
@ -2643,11 +2646,11 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
} }
if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpDDSSource); if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpDDSSource);
if (IsDebug) BlitTrace("BACK2PRIM", &emurect, &destrect, dwflags, __LINE__); if (IsDebug) BlitTrace("BACK2PRIM", &emurect, &destrect, __LINE__);
res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0);
if (res==DDERR_NOCLIPLIST){ if (res==DDERR_NOCLIPLIST){
RenewClipper(lpDD, lpDDSEmu_Prim); RenewClipper(lpDD, lpDDSEmu_Prim);
if (IsDebug) BlitTrace("NOCLIP", &emurect, &destrect, dwflags, __LINE__); if (IsDebug) BlitTrace("NOCLIP", &emurect, &destrect, __LINE__);
res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0);
} }
@ -3194,13 +3197,13 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC)
dxw.palNumEntries=256; dxw.palNumEntries=256;
res=(*pCreatePalette)(lpDD, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL); res=(*pCreatePalette)(lpDD, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL);
if (res) { if (res) {
OutTraceE("CreateSurface: CreatePalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); OutTraceE("GetDC: CreatePalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res; return res;
} }
} }
res=(*pSetPalette)(lpdds, lpDDP); res=(*pSetPalette)(lpdds, lpDDP);
if (res) { if (res) {
OutTraceE("CreateSurface: SetPalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); OutTraceE("GetDC: SetPalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res; return res;
} }
// retry .... // retry ....

View File

@ -1199,5 +1199,15 @@ char *ExplainMCIFlags(DWORD cmd, DWORD c)
return(eb); return(eb);
} }
char *ExplainRegType(DWORD c)
{
char *Captions[12]={
"REG_NONE", "REG_SZ", "REG_EXPAND_SZ", "REG_BINARY",
"REG_DWORD", "REG_DWORD_BIG_ENDIAN", "REG_LINK", "REG_MULTI_SZ",
"REG_RESOURCE_LIST", "REG_FULL_RESOURCE_DESCRIPTOR",
"REG_RESOURCE_REQUIREMENTS_LIST", "REG_QWORD"};
if (c>=0 && c<12) return Captions[c];
return "???";
}

View File

@ -32,3 +32,4 @@ extern char *ExplainLoadLibFlags(DWORD);
extern char *ExplainDevModeFields(DWORD); extern char *ExplainDevModeFields(DWORD);
extern char *ExplainMCICommands(DWORD); extern char *ExplainMCICommands(DWORD);
extern char *ExplainMCIFlags(DWORD, DWORD); extern char *ExplainMCIFlags(DWORD, DWORD);
extern char *ExplainRegType(DWORD);

View File

@ -56,7 +56,7 @@ static char *Flag2Names[32]={
static char *Flag3Names[32]={ static char *Flag3Names[32]={
"FORCEHOOKOPENGL", "MARKBLIT", "HOOKDLLS", "SUPPRESSD3DEXT", "FORCEHOOKOPENGL", "MARKBLIT", "HOOKDLLS", "SUPPRESSD3DEXT",
"HOOKENABLED", "FIXD3DFRAME", "FORCE16BPP", "BLACKWHITE", "HOOKENABLED", "FIXD3DFRAME", "FORCE16BPP", "BLACKWHITE",
"SAVECAPS", "SINGLEPROCAFFINITY", "Flag3:11", "Flag3:12", "SAVECAPS", "SINGLEPROCAFFINITY", "EMULATEREGISTRY", "CDROMDRIVETYPE",
"Flag3:13", "Flag3:14", "Flag3:15", "Flag3:16", "Flag3:13", "Flag3:14", "Flag3:15", "Flag3:16",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
@ -78,7 +78,7 @@ static char *Flag4Names[32]={
static char *TFlagNames[32]={ static char *TFlagNames[32]={
"OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE",
"OUTPROXYTRACE", "DXPROXED", "ASSERTDIALOG", "OUTIMPORTTABLE", "OUTPROXYTRACE", "DXPROXED", "ASSERTDIALOG", "OUTIMPORTTABLE",
"OUTDEBUG", "", "", "", "OUTDEBUG", "OUTREGISTRY", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
@ -625,6 +625,9 @@ void AdjustWindowPos(HWND hwnd, DWORD width, DWORD height)
OutTraceD("AdjustWindowPos: hwnd=%x, size=(%d,%d)\n", hwnd, width, height); OutTraceD("AdjustWindowPos: hwnd=%x, size=(%d,%d)\n", hwnd, width, height);
CalculateWindowPos(hwnd, width, height, &wp); CalculateWindowPos(hwnd, width, height, &wp);
OutTraceD("AdjustWindowPos: fixed pos=(%d,%d) size=(%d,%d)\n", wp.x, wp.y, wp.cx, wp.cy); OutTraceD("AdjustWindowPos: fixed pos=(%d,%d) size=(%d,%d)\n", wp.x, wp.y, wp.cx, wp.cy);
//if(!pSetWindowPos) pSetWindowPos=SetWindowPos;
//OutTraceD("pSetWindowPos=%x\n", pSetWindowPos);
OutTraceD("hwnd=%x pos=(%d,%d) size=(%d,%d)\n", pSetWindowPos, wp.x, wp.y, wp.cx, wp.cy);
if(!(*pSetWindowPos)(hwnd, 0, wp.x, wp.y, wp.cx, wp.cy, 0)){ if(!(*pSetWindowPos)(hwnd, 0, wp.x, wp.y, wp.cx, wp.cy, 0)){
OutTraceE("AdjustWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); OutTraceE("AdjustWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__);
} }
@ -815,7 +818,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
// v2.1.93: adjust clipping region // v2.1.93: adjust clipping region
OutTraceW("WindowProc: WinMsg=[0x%x]%s(%x,%x)\n", message, ExplainWinMessage(message), wparam, lparam); OutTraceW("WindowProc[%x]: WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
#if 0 #if 0
if(dxw.dwFlags2 & WALLPAPERMODE) { if(dxw.dwFlags2 & WALLPAPERMODE) {
@ -837,6 +840,8 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
switch(message){ switch(message){
// v2.02.13: added WM_GETMINMAXINFO/WM_NCCALCSIZE interception - (see Actua Soccer 3 problems...) // v2.02.13: added WM_GETMINMAXINFO/WM_NCCALCSIZE interception - (see Actua Soccer 3 problems...)
//case WM_NCDESTROY:
// return 0;
case WM_GETMINMAXINFO: case WM_GETMINMAXINFO:
if(dxw.dwFlags1 & LOCKWINPOS){ if(dxw.dwFlags1 & LOCKWINPOS){
extern void dxwFixMinMaxInfo(char *, HWND, LPARAM); extern void dxwFixMinMaxInfo(char *, HWND, LPARAM);
@ -845,7 +850,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
} }
break; break;
case WM_NCCALCSIZE: case WM_NCCALCSIZE:
if(dxw.dwFlags1 & LOCKWINPOS){ if((dxw.dwFlags1 & LOCKWINPOS) && (hwnd == dxw.GethWnd())){ // v2.02.30: don't alter child and other windows....
OutTraceD("WindowProc: WS_NCCALCSIZE wparam=%x\n", wparam); OutTraceD("WindowProc: WS_NCCALCSIZE wparam=%x\n", wparam);
if(wparam){ if(wparam){
// nothing so far .... // nothing so far ....
@ -978,7 +983,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
} }
if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
// scale mouse coordinates // scale mouse coordinates
curr=dxw.FixCursorPos(hwnd, prev); curr=dxw.FixCursorPos(prev); //v2.02.30
lparam = MAKELPARAM(curr.x, curr.y); lparam = MAKELPARAM(curr.x, curr.y);
OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y); OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
} }
@ -1001,7 +1006,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
// scale mouse coordinates // scale mouse coordinates
prev.x = LOWORD(lparam); prev.x = LOWORD(lparam);
prev.y = HIWORD(lparam); prev.y = HIWORD(lparam);
curr=dxw.FixCursorPos(hwnd, prev); curr=dxw.FixCursorPos(prev); //v2.02.30
lparam = MAKELPARAM(curr.x, curr.y); lparam = MAKELPARAM(curr.x, curr.y);
OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y); OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
} }
@ -1243,6 +1248,7 @@ void HookModule(HMODULE base, int dxversion)
HookDirectDraw(base, dxversion); HookDirectDraw(base, dxversion);
HookDirect3D(base, dxversion); HookDirect3D(base, dxversion);
if(dxw.dwFlags2 & HOOKOPENGL) HookOpenGLLibs(base, dxw.CustomOpenGLLib); if(dxw.dwFlags2 & HOOKOPENGL) HookOpenGLLibs(base, dxw.CustomOpenGLLib);
if((dxw.dwFlags3 & EMULATEREGISTRY) || (dxw.dwTFlags & OUTREGISTRY)) HookAdvApi32(base);
HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for? HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for?
} }

View File

@ -8,6 +8,7 @@ extern void HookImeLib(HMODULE);
extern void HookKernel32(HMODULE); extern void HookKernel32(HMODULE);
extern void HookUser32(HMODULE); extern void HookUser32(HMODULE);
extern void HookWinMM(HMODULE); extern void HookWinMM(HMODULE);
extern void HookAdvApi32(HMODULE);
extern void InitPosition(int, int, int, int, int, int); extern void InitPosition(int, int, int, int, int, int);
//void InitWindowPos(int, int, int, int); //void InitWindowPos(int, int, int, int);
@ -29,6 +30,7 @@ extern FARPROC Remap_trust_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_WinMM_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_WinMM_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_ImeLib_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_ImeLib_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_vfw_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_vfw_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_AdvApi32_ProcAddress(LPCSTR, HMODULE);
typedef struct { typedef struct {
char *APIName; char *APIName;

View File

@ -160,11 +160,6 @@ BOOL dxwCore::IsDesktop(HWND hwnd)
#define CLIP_TOLERANCE 4 #define CLIP_TOLERANCE 4
POINT dxwCore::FixCursorPos(POINT prev) POINT dxwCore::FixCursorPos(POINT prev)
{
return FixCursorPos(hWnd, prev);
}
POINT dxwCore::FixCursorPos(HWND hwnd, POINT prev)
{ {
POINT curr; POINT curr;
RECT rect; RECT rect;
@ -175,18 +170,34 @@ POINT dxwCore::FixCursorPos(HWND hwnd, POINT prev)
// scale mouse coordinates // scale mouse coordinates
// remember: rect from GetClientRect always start at 0,0! // remember: rect from GetClientRect always start at 0,0!
if(dxw.dwFlags1 & MODIFYMOUSE){ if(dxw.dwFlags1 & MODIFYMOUSE){
if (!(*pGetClientRect)(hwnd, &rect)) { int w, h, b; // width, height and border
if (!(*pGetClientRect)(hWnd, &rect)) { // v2.02.30: always use desktop win
OutTraceD("GetClientRect ERROR %d at %d\n", GetLastError(),__LINE__); OutTraceD("GetClientRect ERROR %d at %d\n", GetLastError(),__LINE__);
curr.x = curr.y = 0; curr.x = curr.y = 0;
} }
w = rect.right - rect.left;
h = rect.bottom - rect.top;
if ((dxw.Coordinates == DXW_DESKTOP_WORKAREA) && (dxw.dwFlags2 & KEEPASPECTRATIO)) {
if ((w * 600) > (h * 800)){
b = (w - (h * 800 / 600))/2;
curr.x -= b;
w -= 2*b;
}
else {
b = (h - (w * 600 / 800))/2;
curr.y -= b;
h -= 2*b;
}
}
if (curr.x < 0) curr.x = 0; if (curr.x < 0) curr.x = 0;
if (curr.y < 0) curr.y = 0; if (curr.y < 0) curr.y = 0;
if (curr.x > rect.right) curr.x = rect.right; if (curr.x > w) curr.x = w;
if (curr.y > rect.bottom) curr.y = rect.bottom; if (curr.y > h) curr.y = h;
if (rect.right) curr.x = (curr.x * dxw.GetScreenWidth()) / rect.right; if (w) curr.x = (curr.x * dxw.GetScreenWidth()) / w;
if (rect.bottom) curr.y = (curr.y * dxw.GetScreenHeight()) / rect.bottom; if (h) curr.y = (curr.y * dxw.GetScreenHeight()) / h;
} }
if((dxw.dwFlags1 & ENABLECLIPPING) && lpClipRegion){ if((dxw.dwFlags1 & ENABLECLIPPING) && lpClipRegion){
@ -282,33 +293,37 @@ RECT dxwCore::MapWindowRect(LPRECT lpRect)
POINT UpLeft={0,0}; POINT UpLeft={0,0};
RECT RetRect; RECT RetRect;
RECT ClientRect; RECT ClientRect;
int w, h, bx, by; // width, height and x,y borders
if (!(*pGetClientRect)(hWnd, &ClientRect)){ if (!(*pGetClientRect)(hWnd, &ClientRect)){
OutTraceE("GetClientRect ERROR: err=%d hwnd=%x at %d\n", GetLastError(), hWnd, __LINE__); OutTraceE("GetClientRect ERROR: err=%d hwnd=%x at %d\n", GetLastError(), hWnd, __LINE__);
} }
if(lpRect){ RetRect=ClientRect;
RetRect.left = lpRect->left * ClientRect.right / dwScreenWidth; bx = by = 0;
RetRect.right = lpRect->right * ClientRect.right / dwScreenWidth; if ((dxw.Coordinates == DXW_DESKTOP_WORKAREA) && (dwFlags2 & KEEPASPECTRATIO)){
RetRect.top = lpRect->top * ClientRect.bottom / dwScreenHeight; w = RetRect.right - RetRect.left;
RetRect.bottom = lpRect->bottom * ClientRect.bottom / dwScreenHeight; h = RetRect.bottom - RetRect.top;
} if ((w * 600) > (h * 800)){
else { bx = (w - (h * 800 / 600))/2;
RetRect=ClientRect;
if ((dxw.Coordinates == DXW_DESKTOP_WORKAREA) && (dwFlags2 & KEEPASPECTRATIO)){
int w, h, b; // width, height and border
w = RetRect.right - RetRect.left;
h = RetRect.bottom - RetRect.top;
if ((w * 600) > (h * 800)){
b = (w - (h * 800 / 600))/2;
RetRect.left = ClientRect.left + b;
RetRect.right = ClientRect.right - b;
}
else {
b = (h - (w * 600 / 800))/2;
RetRect.top = ClientRect.top + b;
RetRect.bottom = ClientRect.bottom - b;
}
} }
else {
by = (h - (w * 600 / 800))/2;
}
OutTraceD("bx=%d by=%d\n", bx, by);
} }
if(lpRect){
RetRect.left = (lpRect->left * ClientRect.right / dwScreenWidth) + bx;
RetRect.right = (lpRect->right * ClientRect.right / dwScreenWidth) - bx;
RetRect.top = (lpRect->top * ClientRect.bottom / dwScreenHeight) + by;
RetRect.bottom = (lpRect->bottom * ClientRect.bottom / dwScreenHeight) - by;
}
else{
RetRect.left = ClientRect.left + bx;
RetRect.right = ClientRect.right - bx;
RetRect.top = ClientRect.top + by;
RetRect.bottom = ClientRect.bottom - by;
}
if(!(*pClientToScreen)(hWnd, &UpLeft)){ if(!(*pClientToScreen)(hWnd, &UpLeft)){
OutTraceE("ClientToScreen ERROR: err=%d hwnd=%x at %d\n", GetLastError(), hWnd, __LINE__); OutTraceE("ClientToScreen ERROR: err=%d hwnd=%x at %d\n", GetLastError(), hWnd, __LINE__);
} }
@ -828,6 +843,7 @@ int dxwCore::GetDLLIndex(char *lpFileName)
"tapi32", "tapi32",
"netapi32", "netapi32",
"wintrust", "wintrust",
"advapi32",
NULL NULL
}; };

View File

@ -25,7 +25,6 @@ public: // methods
BOOL IsFullScreen() {return FullScreen;} BOOL IsFullScreen() {return FullScreen;}
BOOL IsDesktop(HWND); BOOL IsDesktop(HWND);
POINT FixCursorPos(POINT); POINT FixCursorPos(POINT);
POINT FixCursorPos(HWND, POINT);
void FixNCHITCursorPos(LPPOINT); void FixNCHITCursorPos(LPPOINT);
void SetClipCursor(void); void SetClipCursor(void);
void EraseClipCursor(void); void EraseClipCursor(void);

View File

@ -26,6 +26,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define VERSION "2.02.29" #define VERSION "2.02.29"
#define DDTHREADLOCK 1
LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam); LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam);
HINSTANCE hInst; HINSTANCE hInst;
@ -36,6 +38,7 @@ DXWNDSTATUS *pStatus;
HANDLE hMutex; HANDLE hMutex;
HANDLE hTraceMutex; HANDLE hTraceMutex;
HANDLE hLockMutex; HANDLE hLockMutex;
HANDLE hDDLockMutex;
HANDLE hKillMutex; HANDLE hKillMutex;
int HookStatus=DXW_IDLE; int HookStatus=DXW_IDLE;
static int TaskIndex=-1; static int TaskIndex=-1;
@ -68,6 +71,10 @@ BOOL APIENTRY DllMain( HANDLE hmodule,
if(!hTraceMutex) hTraceMutex = CreateMutex(0, FALSE, "Trace_Mutex"); if(!hTraceMutex) hTraceMutex = CreateMutex(0, FALSE, "Trace_Mutex");
hLockMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Lock_Mutex"); hLockMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Lock_Mutex");
if(!hLockMutex) hLockMutex = CreateMutex(0, FALSE, "Lock_Mutex"); if(!hLockMutex) hLockMutex = CreateMutex(0, FALSE, "Lock_Mutex");
if(DDTHREADLOCK){
hDDLockMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "DDLock_Mutex");
if(!hDDLockMutex) hDDLockMutex = CreateMutex(0, FALSE, "DDLock_Mutex");
}
InjectHook(); InjectHook();
return true; return true;
} }

Binary file not shown.

View File

@ -216,6 +216,10 @@
Name="Source Files" Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
> >
<File
RelativePath=".\advapi.cpp"
>
</File>
<File <File
RelativePath=".\ddraw.cpp" RelativePath=".\ddraw.cpp"
> >

View File

@ -473,7 +473,7 @@ HRESULT WINAPI extGetAdapterIdentifier(void *pd3dd, UINT Adapter, DWORD Flags, D
{ {
HRESULT res; HRESULT res;
OutTraceD("GetAdapterIdentifier: Adapter=%d flags=%x\n", Adapter, Flags); OutTraceD("GetAdapterIdentifier: Adapter=%d flags=%x\n", Adapter, Flags);
res=(*pGetAdapterIdentifier)(pd3dd, Adapter, Flags, pIdentifier); res=pGetAdapterIdentifier(pd3dd, Adapter, Flags, pIdentifier);
OutTraceD("GetAdapterIdentifier: ret=%x\n", res); OutTraceD("GetAdapterIdentifier: ret=%x\n", res);
return res; return res;
} }
@ -572,10 +572,13 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype,
D3DDISPLAYMODE mode; D3DDISPLAYMODE mode;
int Windowed; int Windowed;
OutTraceD("CreateDevice: D3DVersion=%d lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n",
dwD3DVersion, lpd3d, adapter, hfocuswindow, behaviorflags, ppresentparam->BackBufferWidth, ppresentparam->BackBufferHeight);
memcpy(param, ppresentparam, (dwD3DVersion == 9)?56:52); memcpy(param, ppresentparam, (dwD3DVersion == 9)?56:52);
dxw.SethWnd(hfocuswindow); dxw.SethWnd(hfocuswindow);
dxw.SetScreenSize(param[0], param[1]); dxw.SetScreenSize(param[0], param[1]);
AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); if(!(dxw.dwFlags3 & NOWINDOWMOVE)) AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight());
if(dxw.dwFlags3 & FIXD3DFRAME){ if(dxw.dwFlags3 & FIXD3DFRAME){
char ClassName[81]; char ClassName[81];
@ -1098,7 +1101,7 @@ HRESULT WINAPI extQueryInterfaceDev9(void *obj, REFIID riid, void** ppvObj)
HRESULT WINAPI extGetDirect3D(void *lpdd3dd, IDirect3D9 **ppD3D9) HRESULT WINAPI extGetDirect3D(void *lpdd3dd, IDirect3D9 **ppD3D9)
{ {
OutTraceD("Device::GetDirect3D\n"); OutTraceB("Device::GetDirect3D\n");
return (*pGetDirect3D)(lpdd3dd, ppD3D9); return (*pGetDirect3D)(lpdd3dd, ppD3D9);
} }

View File

@ -13,6 +13,7 @@ static HookEntry_Type Hooks[]={
{"LoadLibraryExA", (FARPROC)LoadLibraryExA, (FARPROC *)&pLoadLibraryExA, (FARPROC)extLoadLibraryExA}, {"LoadLibraryExA", (FARPROC)LoadLibraryExA, (FARPROC *)&pLoadLibraryExA, (FARPROC)extLoadLibraryExA},
{"LoadLibraryW", (FARPROC)LoadLibraryW, (FARPROC *)&pLoadLibraryW, (FARPROC)extLoadLibraryW}, {"LoadLibraryW", (FARPROC)LoadLibraryW, (FARPROC *)&pLoadLibraryW, (FARPROC)extLoadLibraryW},
{"LoadLibraryExW", (FARPROC)LoadLibraryExW, (FARPROC *)&pLoadLibraryExW, (FARPROC)extLoadLibraryExW}, {"LoadLibraryExW", (FARPROC)LoadLibraryExW, (FARPROC *)&pLoadLibraryExW, (FARPROC)extLoadLibraryExW},
{"GetDriveTypeA", (FARPROC)NULL, (FARPROC *)&pGetDriveType, (FARPROC)extGetDriveType},
{0, NULL, 0, 0} // terminator {0, NULL, 0, 0} // terminator
}; };
@ -426,6 +427,9 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc)
case SYSLIBIDX_WINTRUST: case SYSLIBIDX_WINTRUST:
if (remap=Remap_trust_ProcAddress(proc, hModule)) return remap; if (remap=Remap_trust_ProcAddress(proc, hModule)) return remap;
break; break;
case SYSLIBIDX_ADVAPI32:
if (remap=Remap_AdvApi32_ProcAddress(proc, hModule)) return remap;
break;
default: default:
break; break;
} }
@ -484,3 +488,10 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc)
OutTraceD("GetProcAddress: ret=%x\n", ret); OutTraceD("GetProcAddress: ret=%x\n", ret);
return ret; return ret;
} }
UINT WINAPI extGetDriveType(LPCTSTR lpRootPathName)
{
OutTraceD("GetDriveType: path=\"%s\"\n", lpRootPathName);
if (dxw.dwFlags3 & CDROMDRIVETYPE) return DRIVE_CDROM;
return (*pGetDriveType)(lpRootPathName);
}

View File

@ -7,7 +7,7 @@
static HookEntry_Type Hooks[]={ static HookEntry_Type Hooks[]={
{"CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance}, {"CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance},
// {"CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx}, remote object creation.... {"CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx},
{0, NULL, 0, 0} // terminator {0, NULL, 0, 0} // terminator
}; };
@ -95,3 +95,78 @@ HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
return res; return res;
} }
HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOuter, DWORD dwClsCtx, COSERVERINFO *pServerInfo, DWORD dwCount, MULTI_QI *pResults)
{
HRESULT res;
DWORD i;
OutTraceD("CoCreateInstanceEx: rclsid=%x UnkOuter=%x ClsContext=%x Count=%d\n",
rclsid, punkOuter, dwClsCtx, dwCount);
res=(*pCoCreateInstanceEx)(rclsid, punkOuter, dwClsCtx, pServerInfo, dwCount, pResults);
if(res) {
OutTraceE("CoCreateInstanceEx: ERROR res=%x\n", res);
return res;
}
for(i=0; i<dwCount; i++){
LPVOID FAR* ppv;
IID riid;
if(pResults[i].hr) continue;
riid=*pResults[i].pIID;
ppv=(LPVOID *)pResults[i].pItf;
// CLSID e436ebb3 implies loading quartz.dll to play movies through dshow:
// quartz.dll must be hooked.
if (*(DWORD *)&rclsid==0xe436ebb3){
HMODULE qlib;
OutTraceD("CoCreateInstanceEx: CLSID_FilterGraph RIID=%x\n", *(DWORD *)&riid);
qlib=(*pLoadLibraryA)("quartz.dll");
OutTraceD("CoCreateInstanceEx: quartz lib handle=%x\n", qlib);
HookKernel32(qlib);
HookUser32(qlib);
HookWinMM(qlib);
}
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){
LPDIRECTDRAW lpOldDDraw;
OutTraceD("CoCreateInstanceEx: CLSID_DirectDraw object\n");
switch (*(DWORD *)&riid){
case 0x6C14DB80:
OutTraceD("DirectDrawCreateEx: IID_DirectDraw RIID\n");
res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0);
if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
break;
case 0xB3A6F3E0:
OutTraceD("DirectDrawCreateEx: IID_DirectDraw2 RIID\n");
res=extDirectDrawCreate(NULL, &lpOldDDraw, 0);
if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv);
if(res)OutTraceD("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res));
lpOldDDraw->Release();
break;
case 0x9c59509a:
OutTraceD("DirectDrawCreateEx: IID_DirectDraw4 RIID\n");
res=extDirectDrawCreate(NULL, &lpOldDDraw, 0);
if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv);
if(res)OutTraceD("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res));
lpOldDDraw->Release();
case 0x15e65ec0:
OutTraceD("CoCreateInstanceEx: IID_DirectDraw7 RIID\n");
res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0);
if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
break;
case 0xe436ebb3:
break;
}
}
else
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv);
}
return res;
}

View File

@ -15,6 +15,16 @@ user32.dll.dll
type definitions type definitions
====================================================================*/ ====================================================================*/
// advapi32.dll
typedef LONG (WINAPI *RegCloseKey_Type)(HKEY);
typedef LONG (WINAPI *RegCreateKeyEx_Type)(HKEY, LPCTSTR, DWORD, LPTSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD);
typedef LONG (WINAPI *RegOpenKeyEx_Type)(HKEY, LPCTSTR, DWORD, REGSAM, PHKEY);
typedef LONG (WINAPI *RegQueryValueEx_Type)(HKEY, LPCTSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD);
typedef LONG (WINAPI *RegSetValueEx_Type)(HKEY, LPCTSTR, DWORD, DWORD, const BYTE *, DWORD);
// ImmLib.dll:
typedef BOOL (WINAPI *ImmNotifyIME_Type)(HIMC, DWORD, DWORD, DWORD); typedef BOOL (WINAPI *ImmNotifyIME_Type)(HIMC, DWORD, DWORD, DWORD);
typedef HIMC (WINAPI *ImmCreateContext_Type)(void); typedef HIMC (WINAPI *ImmCreateContext_Type)(void);
typedef BOOL (WINAPI *ImmDestroyContext_Type)(HIMC); typedef BOOL (WINAPI *ImmDestroyContext_Type)(HIMC);
@ -52,6 +62,7 @@ typedef BOOL (WINAPI *TextOut_Type)(HDC, int, int, LPCTSTR, int);
// Kernel32.dll: // Kernel32.dll:
typedef BOOL (WINAPI *GetDiskFreeSpaceA_Type)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); typedef BOOL (WINAPI *GetDiskFreeSpaceA_Type)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD);
typedef UINT (WINAPI *GetDriveType_Type)(LPCSTR);
typedef void (WINAPI *GetLocalTime_Type)(LPSYSTEMTIME); typedef void (WINAPI *GetLocalTime_Type)(LPSYSTEMTIME);
typedef FARPROC (WINAPI *GetProcAddress_Type)(HMODULE, LPCSTR); typedef FARPROC (WINAPI *GetProcAddress_Type)(HMODULE, LPCSTR);
typedef void (WINAPI *GetSystemTime_Type)(LPSYSTEMTIME); typedef void (WINAPI *GetSystemTime_Type)(LPSYSTEMTIME);
@ -70,7 +81,8 @@ typedef void (WINAPI *Sleep_Type)(DWORD);
typedef DWORD (WINAPI *SleepEx_Type)(DWORD, BOOL); typedef DWORD (WINAPI *SleepEx_Type)(DWORD, BOOL);
// ole32.dll: // ole32.dll:
typedef HRESULT (STDAPICALLTYPE *CoCreateInstance_Type)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv); typedef HRESULT (STDAPICALLTYPE *CoCreateInstance_Type)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*);
typedef HRESULT (STDAPICALLTYPE *CoCreateInstanceEx_Type)(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, DWORD, MULTI_QI *);
// user32.dll: // user32.dll:
typedef HDC (WINAPI *BeginPaint_Type)(HWND, LPPAINTSTRUCT); typedef HDC (WINAPI *BeginPaint_Type)(HWND, LPPAINTSTRUCT);
@ -82,6 +94,7 @@ typedef BOOL (WINAPI *ClipCursor_Type)(const RECT *);
typedef HWND (WINAPI *CreateDialogIndirectParam_Type)(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); typedef HWND (WINAPI *CreateDialogIndirectParam_Type)(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM);
typedef HWND (WINAPI *CreateDialogParam_Type)(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM); typedef HWND (WINAPI *CreateDialogParam_Type)(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM);
typedef HWND (WINAPI *CreateWindowExA_Type)(DWORD, LPCTSTR, LPCTSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); 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 LRESULT (WINAPI *DefWindowProc_Type)(HWND, UINT, WPARAM, LPARAM);
typedef BOOL (WINAPI *EndPaint_Type)(HWND, const PAINTSTRUCT *); typedef BOOL (WINAPI *EndPaint_Type)(HWND, const PAINTSTRUCT *);
typedef LONG (WINAPI *EnumDisplaySettings_Type)(LPCTSTR, DWORD, LPDEVMODEA); typedef LONG (WINAPI *EnumDisplaySettings_Type)(LPCTSTR, DWORD, LPDEVMODEA);
@ -93,6 +106,7 @@ typedef HDC (WINAPI *GDIGetDC_Type)(HWND);
typedef HWND (WINAPI *GetDesktopWindow_Type)(void); typedef HWND (WINAPI *GetDesktopWindow_Type)(void);
typedef BOOL (WINAPI *GetMessage_Type)(LPMSG, HWND, UINT, UINT); typedef BOOL (WINAPI *GetMessage_Type)(LPMSG, HWND, UINT, UINT);
typedef int (WINAPI *GetSystemMetrics_Type)(int); typedef int (WINAPI *GetSystemMetrics_Type)(int);
typedef HWND (WINAPI *GetTopWindow_Type)(HWND);
typedef LONG (WINAPI *GetWindowLong_Type)(HWND, int); typedef LONG (WINAPI *GetWindowLong_Type)(HWND, int);
typedef BOOL (WINAPI *GetWindowRect_Type)(HWND, LPRECT); typedef BOOL (WINAPI *GetWindowRect_Type)(HWND, LPRECT);
typedef BOOL (WINAPI *InvalidateRect_Type)(HWND, CONST RECT *, BOOL); typedef BOOL (WINAPI *InvalidateRect_Type)(HWND, CONST RECT *, BOOL);
@ -131,6 +145,16 @@ hooked APIs real pointers
#define DXWINITIALIZED #define DXWINITIALIZED
#endif #endif
// advapi32.dll
DXWEXTERN RegCloseKey_Type pRegCloseKey DXWINITIALIZED;
DXWEXTERN RegCreateKeyEx_Type pRegCreateKeyEx DXWINITIALIZED;
DXWEXTERN RegOpenKeyEx_Type pRegOpenKeyEx DXWINITIALIZED;
DXWEXTERN RegQueryValueEx_Type pRegQueryValueEx DXWINITIALIZED;
DXWEXTERN RegSetValueEx_Type pRegSetValueEx DXWINITIALIZED;
// ImmLib.dll
DXWEXTERN ImmNotifyIME_Type pImmNotifyIME DXWINITIALIZED; DXWEXTERN ImmNotifyIME_Type pImmNotifyIME DXWINITIALIZED;
DXWEXTERN ImmCreateContext_Type pImmCreateContext DXWINITIALIZED; DXWEXTERN ImmCreateContext_Type pImmCreateContext DXWINITIALIZED;
DXWEXTERN ImmDestroyContext_Type pImmDestroyContext DXWINITIALIZED; DXWEXTERN ImmDestroyContext_Type pImmDestroyContext DXWINITIALIZED;
@ -168,6 +192,7 @@ DXWEXTERN TextOut_Type pGDITextOutA DXWINITIALIZED;
// Kernel32.dll: // Kernel32.dll:
DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED; DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED;
DXWEXTERN GetDriveType_Type pGetDriveType DXWINITIALIZED;
DXWEXTERN GetLocalTime_Type pGetLocalTime DXWINITIALIZED; DXWEXTERN GetLocalTime_Type pGetLocalTime DXWINITIALIZED;
DXWEXTERN GetProcAddress_Type pGetProcAddress DXWINITIALIZED; DXWEXTERN GetProcAddress_Type pGetProcAddress DXWINITIALIZED;
DXWEXTERN GetSystemTime_Type pGetSystemTime DXWINITIALIZED; DXWEXTERN GetSystemTime_Type pGetSystemTime DXWINITIALIZED;
@ -186,6 +211,7 @@ DXWEXTERN SleepEx_Type pSleepEx DXWINITIALIZED;
// ole32.dll: // ole32.dll:
DXWEXTERN CoCreateInstance_Type pCoCreateInstance DXWINITIALIZED; DXWEXTERN CoCreateInstance_Type pCoCreateInstance DXWINITIALIZED;
DXWEXTERN CoCreateInstanceEx_Type pCoCreateInstanceEx DXWINITIALIZED;
// user32.dll: // user32.dll:
DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED; DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED;
@ -197,6 +223,7 @@ DXWEXTERN ClipCursor_Type pClipCursor DXWINITIALIZED;
DXWEXTERN CreateDialogIndirectParam_Type pCreateDialogIndirectParam DXWINITIALIZED; DXWEXTERN CreateDialogIndirectParam_Type pCreateDialogIndirectParam DXWINITIALIZED;
DXWEXTERN CreateDialogParam_Type pCreateDialogParam DXWINITIALIZED; DXWEXTERN CreateDialogParam_Type pCreateDialogParam DXWINITIALIZED;
DXWEXTERN CreateWindowExA_Type pCreateWindowExA DXWINITIALIZED; DXWEXTERN CreateWindowExA_Type pCreateWindowExA DXWINITIALIZED;
DXWEXTERN CreateWindowExW_Type pCreateWindowExW DXWINITIALIZED;
DXWEXTERN DefWindowProc_Type pDefWindowProc DXWINITIALIZED; DXWEXTERN DefWindowProc_Type pDefWindowProc DXWINITIALIZED;
DXWEXTERN EndPaint_Type pEndPaint DXWINITIALIZED; DXWEXTERN EndPaint_Type pEndPaint DXWINITIALIZED;
DXWEXTERN EnumDisplaySettings_Type pEnumDisplaySettings DXWINITIALIZED; DXWEXTERN EnumDisplaySettings_Type pEnumDisplaySettings DXWINITIALIZED;
@ -208,6 +235,7 @@ DXWEXTERN GDIGetDC_Type pGDIGetDC DXWINITIALIZED;
DXWEXTERN GetDesktopWindow_Type pGetDesktopWindow DXWINITIALIZED; DXWEXTERN GetDesktopWindow_Type pGetDesktopWindow DXWINITIALIZED;
DXWEXTERN GetMessage_Type pGetMessage DXWINITIALIZED; DXWEXTERN GetMessage_Type pGetMessage DXWINITIALIZED;
DXWEXTERN GetSystemMetrics_Type pGetSystemMetrics DXWINITIALIZED; DXWEXTERN GetSystemMetrics_Type pGetSystemMetrics DXWINITIALIZED;
DXWEXTERN GetTopWindow_Type pGetTopWindow DXWINITIALIZED;
DXWEXTERN GDIGetDC_Type pGDIGetWindowDC DXWINITIALIZED; DXWEXTERN GDIGetDC_Type pGDIGetWindowDC DXWINITIALIZED;
DXWEXTERN GetWindowLong_Type pGetWindowLong DXWINITIALIZED; DXWEXTERN GetWindowLong_Type pGetWindowLong DXWINITIALIZED;
DXWEXTERN GetWindowRect_Type pGetWindowRect DXWINITIALIZED; DXWEXTERN GetWindowRect_Type pGetWindowRect DXWINITIALIZED;
@ -235,6 +263,16 @@ DXWEXTERN timeGetTime_Type ptimeGetTime DXWINITIALIZED;
hook procedures (possibly more tnan one per each API...) hook procedures (possibly more tnan one per each API...)
====================================================================*/ ====================================================================*/
// advapi32.dll
extern LONG WINAPI extRegCloseKey(HKEY);
extern LONG WINAPI extRegCreateKeyEx(HKEY, LPCTSTR, DWORD, LPTSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD);
extern LONG WINAPI extRegOpenKeyEx(HKEY, LPCTSTR, DWORD, REGSAM, PHKEY);
extern LONG WINAPI extRegQueryValueEx(HKEY, LPCTSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD);
extern LONG WINAPI extRegSetValueEx(HKEY, LPCTSTR, DWORD, DWORD, const BYTE *, DWORD);
// ImmLib.dll
extern BOOL WINAPI extImmNotifyIME(HIMC, DWORD, DWORD, DWORD); extern BOOL WINAPI extImmNotifyIME(HIMC, DWORD, DWORD, DWORD);
extern HIMC WINAPI extImmCreateContext(void); extern HIMC WINAPI extImmCreateContext(void);
extern BOOL WINAPI extImmDestroyContext(HIMC); extern BOOL WINAPI extImmDestroyContext(HIMC);
@ -277,6 +315,7 @@ extern BOOL WINAPI extTextOutA(HDC, int, int, LPCTSTR, int);
// Kernel32.dll: // Kernel32.dll:
extern BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); extern BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD);
extern UINT WINAPI extGetDriveType(LPCSTR);
extern void WINAPI extGetLocalTime(LPSYSTEMTIME); extern void WINAPI extGetLocalTime(LPSYSTEMTIME);
extern FARPROC WINAPI extGetProcAddress(HMODULE, LPCSTR); extern FARPROC WINAPI extGetProcAddress(HMODULE, LPCSTR);
extern void WINAPI extGetSystemTime(LPSYSTEMTIME); extern void WINAPI extGetSystemTime(LPSYSTEMTIME);
@ -296,6 +335,7 @@ extern DWORD WINAPI extSleepEx(DWORD, BOOL);
// ole32.dll: // ole32.dll:
extern HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*); extern HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*);
extern HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, DWORD, MULTI_QI *);
// user32.dll: // user32.dll:
extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT); extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT);
@ -307,6 +347,7 @@ extern BOOL WINAPI extClipCursor(LPRECT);
extern HWND WINAPI extCreateDialogIndirectParam(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); extern HWND WINAPI extCreateDialogIndirectParam(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM);
extern HWND WINAPI extCreateDialogParam(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM); extern HWND WINAPI extCreateDialogParam(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM);
extern HWND WINAPI extCreateWindowExA(DWORD, LPCTSTR, LPCTSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); extern HWND WINAPI extCreateWindowExA(DWORD, LPCTSTR, LPCTSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
extern HWND WINAPI extCreateWindowExW(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
extern LRESULT WINAPI extDefWindowProc(HWND, UINT, WPARAM, LPARAM); extern LRESULT WINAPI extDefWindowProc(HWND, UINT, WPARAM, LPARAM);
extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *); extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *);
extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *); extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *);
@ -319,6 +360,7 @@ extern HDC WINAPI extDDGetDC(HWND);
extern HWND WINAPI extGetDesktopWindow(void); extern HWND WINAPI extGetDesktopWindow(void);
extern BOOL WINAPI extGetMessage(LPMSG, HWND, UINT, UINT); extern BOOL WINAPI extGetMessage(LPMSG, HWND, UINT, UINT);
extern int WINAPI extGetSystemMetrics(int); extern int WINAPI extGetSystemMetrics(int);
extern HWND WINAPI extGetTopWindow(HWND);
extern HDC WINAPI extGDIGetWindowDC(HWND); extern HDC WINAPI extGDIGetWindowDC(HWND);
extern HDC WINAPI extDDGetWindowDC(HWND); extern HDC WINAPI extDDGetWindowDC(HWND);
extern LONG WINAPI extGetWindowLong(HWND, int); extern LONG WINAPI extGetWindowLong(HWND, int);

View File

@ -22,6 +22,7 @@ static HookEntry_Type Hooks[]={
{"FillRect", (FARPROC)FillRect, (FARPROC *)&pFillRect, (FARPROC)extFillRect}, {"FillRect", (FARPROC)FillRect, (FARPROC *)&pFillRect, (FARPROC)extFillRect},
{"DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProc, (FARPROC)extDefWindowProc}, {"DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProc, (FARPROC)extDefWindowProc},
{"CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA}, {"CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA},
{"CreateWindowExW", (FARPROC)CreateWindowExW, (FARPROC *)&pCreateWindowExW, (FARPROC)extCreateWindowExW},
{"RegisterClassExA", (FARPROC)RegisterClassExA, (FARPROC *)&pRegisterClassExA, (FARPROC)extRegisterClassExA}, {"RegisterClassExA", (FARPROC)RegisterClassExA, (FARPROC *)&pRegisterClassExA, (FARPROC)extRegisterClassExA},
{"GetSystemMetrics", (FARPROC)GetSystemMetrics, (FARPROC *)&pGetSystemMetrics, (FARPROC)extGetSystemMetrics}, {"GetSystemMetrics", (FARPROC)GetSystemMetrics, (FARPROC *)&pGetSystemMetrics, (FARPROC)extGetSystemMetrics},
{"GetDesktopWindow", (FARPROC)GetDesktopWindow, (FARPROC *)&pGetDesktopWindow, (FARPROC)extGetDesktopWindow}, {"GetDesktopWindow", (FARPROC)GetDesktopWindow, (FARPROC *)&pGetDesktopWindow, (FARPROC)extGetDesktopWindow},
@ -400,8 +401,6 @@ BOOL WINAPI extDDInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase)
OutTraceD("InvalidateRect: hwnd=%x rect=NULL erase=%x\n", OutTraceD("InvalidateRect: hwnd=%x rect=NULL erase=%x\n",
hwnd, bErase); hwnd, bErase);
if(dxw.IsFullScreen() && dxw.IsDesktop(hwnd)) hwnd=dxw.GethWnd();
return (*pInvalidateRect)(hwnd, NULL, bErase); return (*pInvalidateRect)(hwnd, NULL, bErase);
} }
@ -414,8 +413,6 @@ BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase)
OutTraceD("InvalidateRect: hwnd=%x rect=NULL erase=%x\n", OutTraceD("InvalidateRect: hwnd=%x rect=NULL erase=%x\n",
hwnd, bErase); hwnd, bErase);
if(dxw.IsFullScreen() && dxw.IsDesktop(hwnd)) hwnd=dxw.GethWnd();
return (*pInvalidateRect)(hwnd, NULL, bErase); return (*pInvalidateRect)(hwnd, NULL, bErase);
} }
@ -497,17 +494,21 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong)
} }
if (nIndex==GWL_WNDPROC){ if (nIndex==GWL_WNDPROC){
long lres; WNDPROC lres;
WNDPROC OldProc;
// GPL fix // GPL fix
if(hwnd==0) { if(dxw.IsDesktop(hwnd)) {
hwnd=dxw.GethWnd(); hwnd=dxw.GethWnd();
OutTrace("SetWindowLong: NULL hwnd, FIXING hwnd=%x\n",hwnd); OutTraceD("SetWindowLong: DESKTOP hwnd, FIXING hwnd=%x\n",hwnd);
} }
// end of GPL fix // end of GPL fix
res=(LONG)WhndGetWindowProc(hwnd);
OldProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC);
if(OldProc==extWindowProc) OldProc=WhndGetWindowProc(hwnd);
WhndStackPush(hwnd, (WNDPROC)dwNewLong); WhndStackPush(hwnd, (WNDPROC)dwNewLong);
res=(LONG)OldProc;
SetLastError(0); SetLastError(0);
lres=(*pSetWindowLong)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); lres=(WNDPROC)(*pSetWindowLong)(hwnd, GWL_WNDPROC, (LONG)extWindowProc);
if(!lres && GetLastError())OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); if(!lres && GetLastError())OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__);
} }
else { else {
@ -575,7 +576,8 @@ HDWP WINAPI extDeferWindowPos(HDWP hWinPosInfo, HWND hwnd, HWND hWndInsertAfter,
OutTraceD("DeferWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n", OutTraceD("DeferWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n",
hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags); hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags);
if ((hwnd != dxw.GethWnd()) || !dxw.IsFullScreen()){ //if ((hwnd != dxw.GethWnd()) || !dxw.IsFullScreen()){
{
// just proxy // just proxy
res=(*pGDIDeferWindowPos)(hWinPosInfo, hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); res=(*pGDIDeferWindowPos)(hWinPosInfo, hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags);
if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__);
@ -620,6 +622,9 @@ LRESULT WINAPI extSendMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
LRESULT ret; LRESULT ret;
OutTraceW("SendMessage: hwnd=%x WinMsg=[0x%x]%s(%x,%x)\n", OutTraceW("SendMessage: hwnd=%x WinMsg=[0x%x]%s(%x,%x)\n",
hwnd, Msg, ExplainWinMessage(Msg), wParam, lParam); hwnd, Msg, ExplainWinMessage(Msg), wParam, lParam);
//if(Msg==WM_NCDESTROY) return 1;
if(dxw.dwFlags1 & MODIFYMOUSE){ if(dxw.dwFlags1 & MODIFYMOUSE){
switch (Msg){ switch (Msg){
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
@ -803,6 +808,7 @@ BOOL WINAPI extGetMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgF
Message=lpMsg->message & 0xFFFF; Message=lpMsg->message & 0xFFFF;
if((Message <= WM_MOUSELAST) && (Message >= WM_MOUSEFIRST)){ if((Message <= WM_MOUSELAST) && (Message >= WM_MOUSEFIRST)){
FixedHwnd=(hwnd)?hwnd:dxw.GethWnd(); FixedHwnd=(hwnd)?hwnd:dxw.GethWnd();
if(dxw.IsDesktop(FixedHwnd)) FixedHwnd=dxw.GethWnd(); // GPL fix...
lpMsg->pt=FixMessagePt(FixedHwnd, lpMsg->pt); lpMsg->pt=FixMessagePt(FixedHwnd, lpMsg->pt);
lpMsg->lParam = MAKELPARAM(lpMsg->pt.x, lpMsg->pt.y); lpMsg->lParam = MAKELPARAM(lpMsg->pt.x, lpMsg->pt.y);
OutTraceC("PeekMessage: fixed lparam/pt=(%d,%d)\n", lpMsg->pt.x, lpMsg->pt.y); OutTraceC("PeekMessage: fixed lparam/pt=(%d,%d)\n", lpMsg->pt.x, lpMsg->pt.y);
@ -1008,6 +1014,33 @@ ATOM WINAPI extRegisterClassExA(WNDCLASSEX *lpwcx)
return (*pRegisterClassExA)(lpwcx); return (*pRegisterClassExA)(lpwcx);
} }
HWND WINAPI extCreateWindowExW(
DWORD dwExStyle,
LPCWSTR lpClassName,
LPCWSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam)
{
char sClassName[256+1];
char sWindowName[256+1];
wcstombs_s(NULL, sClassName, lpClassName, 80);
wcstombs_s(NULL, sWindowName, lpWindowName, 80);
OutTraceD("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n",
lpClassName, lpWindowName, x, y, nWidth, nHeight,
dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle));
if(IsDebug) OutTrace("CreateWindowExW: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight());
return extCreateWindowExA(dwExStyle, sClassName, sWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
}
// GHO: pro Diablo // GHO: pro Diablo
HWND WINAPI extCreateWindowExA( HWND WINAPI extCreateWindowExA(
DWORD dwExStyle, DWORD dwExStyle,
@ -1027,14 +1060,14 @@ HWND WINAPI extCreateWindowExA(
WNDPROC pWindowProc; WNDPROC pWindowProc;
BOOL isValidHandle=TRUE; BOOL isValidHandle=TRUE;
OutTraceD("CreateWindowEx: class=\"%s\" wname=\"%s\" pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", OutTraceD("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n",
lpClassName, lpWindowName, x, y, nWidth, nHeight, lpClassName, lpWindowName, x, y, nWidth, nHeight,
dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle));
if(IsDebug) OutTrace("CreateWindowEx: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); if(IsDebug) OutTrace("CreateWindowExA: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight());
// no maximized windows in any case // no maximized windows in any case
if (dxw.dwFlags1 & PREVENTMAXIMIZE){ if (dxw.dwFlags1 & PREVENTMAXIMIZE){
OutTraceD("CreateWindowEx: handling PREVENTMAXIMIZE mode\n"); OutTraceD("CreateWindowExA: handling PREVENTMAXIMIZE mode\n");
dwStyle &= ~(WS_MAXIMIZE | WS_POPUP); dwStyle &= ~(WS_MAXIMIZE | WS_POPUP);
dwExStyle &= ~WS_EX_TOPMOST; dwExStyle &= ~WS_EX_TOPMOST;
} }
@ -1046,9 +1079,10 @@ HWND WINAPI extCreateWindowExA(
// rendering using CW_USEDEFAULT placement and 800x600 size while the previous // rendering using CW_USEDEFAULT placement and 800x600 size while the previous
// main win was 640x480 only! // main win was 640x480 only!
// v2.02.13: if it's a WS_CHILD window, don't reposition the x,y, placement for BIG win. // v2.02.13: if it's a WS_CHILD window, don't reposition the x,y, placement for BIG win.
// v2.02.30: fix (Fable - lost chapters) Fable creates a bigger win with negative x,y coordinates.
if ( if (
( (
((x==0)&&(y==0)) || ((x==CW_USEDEFAULT)&&(y==CW_USEDEFAULT)) ((x<=0)&&(y<=0)) || ((x==CW_USEDEFAULT)&&(y==CW_USEDEFAULT))
) )
&& &&
(((DWORD)nWidth>=dxw.GetScreenWidth())&&((DWORD)nHeight>=dxw.GetScreenHeight())) (((DWORD)nWidth>=dxw.GetScreenWidth())&&((DWORD)nHeight>=dxw.GetScreenHeight()))
@ -1059,6 +1093,11 @@ HWND WINAPI extCreateWindowExA(
){ ){
RECT screen; RECT screen;
POINT upleft = {0,0}; POINT upleft = {0,0};
// v2.02.30: fix (Fable - lost chapters)
if(nWidth==CW_USEDEFAULT) nWidth=dxw.GetScreenWidth();
if(nHeight==CW_USEDEFAULT) nHeight=dxw.GetScreenHeight();
// update virtual screen size if it has grown // update virtual screen size if it has grown
dxw.SetScreenSize(nWidth, nHeight); dxw.SetScreenSize(nWidth, nHeight);
// inserted some checks here, since the main window could be destroyed // inserted some checks here, since the main window could be destroyed
@ -1071,33 +1110,43 @@ HWND WINAPI extCreateWindowExA(
if (screen.right==0 || screen.bottom==0) break; if (screen.right==0 || screen.bottom==0) break;
isValidHandle = TRUE; isValidHandle = TRUE;
} while(FALSE); } while(FALSE);
if (isValidHandle){ if (isValidHandle){ // use parent's coordinates
if (!(dwStyle & WS_CHILD)){ if (!(dwStyle & WS_CHILD)){
x=upleft.x; x=upleft.x;
y=upleft.y; y=upleft.y;
} }
nWidth=screen.right; nWidth=screen.right;
nHeight=screen.bottom; nHeight=screen.bottom;
OutTraceD("CreateWindowEx: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", x, y, nWidth, nHeight); OutTraceD("CreateWindowExA: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", x, y, nWidth, nHeight);
} }
else { else {
// invalid parent coordinates: use initial placement, but leave the size. // invalid parent coordinates: use initial placement, but leave the size.
// should also fix the window style and compensate for borders here? // should also fix the window style and compensate for borders here?
if (!(dwStyle & WS_CHILD)){ // if (!(dwStyle & WS_CHILD)){ // commented out: can't be! see if condition
x=dxw.iPosX; x=dxw.iPosX;
y=dxw.iPosY; y=dxw.iPosY;
} //}
nWidth=dxw.iSizX; nWidth=dxw.iSizX;
nHeight=dxw.iSizY; nHeight=dxw.iSizY;
OutTraceD("CreateWindowEx: renewed BIG win pos=(%d,%d) size=(%d,%d)\n", x, y, nWidth, nHeight); OutTraceD("CreateWindowExA: renewed BIG win pos=(%d,%d) size=(%d,%d)\n", x, y, nWidth, nHeight);
} }
dxw.SetFullScreen(TRUE); dxw.SetFullScreen(TRUE);
if(dxw.Coordinates==DXW_DESKTOP_WORKAREA){
RECT workarea;
SystemParametersInfo(SPI_GETWORKAREA, NULL, &workarea, 0);
x=0;
y=0;
nWidth=workarea.right;
nHeight=workarea.bottom;
dwStyle=(dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW;
OutTraceD("CreateWindowExA: WORKAREA win pos=(%d,%d) size=(%d,%d)\n", x, y, nWidth, nHeight);
}
} }
if(!dxw.IsFullScreen()){ // v2.1.63: needed for "Monster Truck Madness" if(!dxw.IsFullScreen()){ // v2.1.63: needed for "Monster Truck Madness"
wndh= (*pCreateWindowExA)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, wndh= (*pCreateWindowExA)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight,
hWndParent, hMenu, hInstance, lpParam); hWndParent, hMenu, hInstance, lpParam);
OutTraceD("CreateWindowEx: windowed mode ret=%x\n", wndh); OutTraceD("CreateWindowExA: windowed mode ret=%x\n", wndh);
return wndh; return wndh;
} }
@ -1105,24 +1154,24 @@ HWND WINAPI extCreateWindowExA(
// Age of Empires.... // Age of Empires....
if (dwStyle & WS_CHILD){ if (dwStyle & WS_CHILD){
dxw.MapClient(&x, &y, &nWidth, &nHeight); dxw.MapClient(&x, &y, &nWidth, &nHeight);
OutTraceD("CreateWindowEx: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n", OutTraceD("CreateWindowExA: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n",
x, y, nWidth, nHeight); x, y, nWidth, nHeight);
} }
// needed for Diablo, that creates a new control parent window that must be // needed for Diablo, that creates a new control parent window that must be
// overlapped to the directdraw surface. // overlapped to the directdraw surface.
else if (dwExStyle & WS_EX_CONTROLPARENT){ else if (dwExStyle & WS_EX_CONTROLPARENT){
dxw.MapWindow(&x, &y, &nWidth, &nHeight); dxw.MapWindow(&x, &y, &nWidth, &nHeight);
OutTraceD("CreateWindowEx: fixed WS_EX_CONTROLPARENT pos=(%d,%d) size=(%d,%d)\n", OutTraceD("CreateWindowExA: fixed WS_EX_CONTROLPARENT pos=(%d,%d) size=(%d,%d)\n",
x, y, nWidth, nHeight); x, y, nWidth, nHeight);
} }
OutTraceB("CreateWindowEx: fixed pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", OutTraceB("CreateWindowExA: fixed pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n",
x, y, nWidth, nHeight, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); x, y, nWidth, nHeight, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle));
wndh= (*pCreateWindowExA)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, wndh= (*pCreateWindowExA)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight,
hWndParent, hMenu, hInstance, lpParam); hWndParent, hMenu, hInstance, lpParam);
if (wndh==(HWND)NULL){ if (wndh==(HWND)NULL){
OutTraceE("CreateWindowEx: ERROR err=%d Style=%x(%s) ExStyle=%x\n", OutTraceE("CreateWindowExA: ERROR err=%d Style=%x(%s) ExStyle=%x\n",
GetLastError(), dwStyle, ExplainStyle(dwStyle), dwExStyle); GetLastError(), dwStyle, ExplainStyle(dwStyle), dwExStyle);
return wndh; return wndh;
} }
@ -1132,7 +1181,7 @@ HWND WINAPI extCreateWindowExA(
extern void AdjustWindowPos(HWND, DWORD, DWORD); extern void AdjustWindowPos(HWND, DWORD, DWORD);
(*pSetWindowLong)(wndh, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW); (*pSetWindowLong)(wndh, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW);
(*pSetWindowLong)(wndh, GWL_EXSTYLE, 0); (*pSetWindowLong)(wndh, GWL_EXSTYLE, 0);
OutTraceD("CreateWindow: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", wndh); OutTraceD("CreateWindowExA: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", wndh);
AdjustWindowPos(wndh, nWidth, nHeight); AdjustWindowPos(wndh, nWidth, nHeight);
(*pShowWindow)(wndh, SW_SHOWNORMAL); (*pShowWindow)(wndh, SW_SHOWNORMAL);
} }
@ -1150,15 +1199,17 @@ HWND WINAPI extCreateWindowExA(
if(!res) OutTraceE("CreateWindowExA: SetWindowLong ERROR %x\n", GetLastError()); if(!res) OutTraceE("CreateWindowExA: SetWindowLong ERROR %x\n", GetLastError());
} }
OutTraceD("CreateWindowEx: ret=%x\n", wndh); OutTraceD("CreateWindowExA: ret=%x\n", wndh);
return wndh; return wndh;
} }
LRESULT WINAPI extCallWindowProc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) LRESULT WINAPI extCallWindowProc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{ {
// v2.02.30: fix (Imperialism II): apply to main window only !!!
HRESULT res; HRESULT res;
res=FixWindowProc("CallWindowProc", hwnd, Msg, wParam, &lParam); res = -1;
if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProc", hwnd, Msg, wParam, &lParam);
if (res==(HRESULT)-1) if (res==(HRESULT)-1)
return (*pCallWindowProc)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); return (*pCallWindowProc)(lpPrevWndFunc, hwnd, Msg, wParam, lParam);
@ -1168,9 +1219,11 @@ LRESULT WINAPI extCallWindowProc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPA
LRESULT WINAPI extDefWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) LRESULT WINAPI extDefWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{ {
// v2.02.30: fix (Imperialism II): apply to main window only !!!
HRESULT res; HRESULT res;
res=FixWindowProc("DefWindowProc", hwnd, Msg, wParam, &lParam); res = -1;
if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProc", hwnd, Msg, wParam, &lParam);
if (res==(HRESULT)-1) if (res==(HRESULT)-1)
return (*pDefWindowProc)(hwnd, Msg, wParam, lParam); return (*pDefWindowProc)(hwnd, Msg, wParam, lParam);
@ -1444,7 +1497,7 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint)
OutTraceD("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen()); OutTraceD("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen());
hdc=(*pBeginPaint)(hwnd, lpPaint); hdc=(*pBeginPaint)(hwnd, lpPaint);
return hdc; //return hdc;
// if not in fullscreen mode, that's all! // if not in fullscreen mode, that's all!
if(!dxw.IsFullScreen()) return hdc; if(!dxw.IsFullScreen()) return hdc;
@ -1483,7 +1536,7 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint)
OutTraceD("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); OutTraceD("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret);
if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__);
return ret; //return ret;
// if not in fullscreen mode, that's all! // if not in fullscreen mode, that's all!
if(!dxw.IsFullScreen()) return ret; if(!dxw.IsFullScreen()) return ret;
@ -1628,22 +1681,31 @@ int WINAPI extShowCursor(BOOL bShow)
return ret; return ret;
} }
int extDrawTextA(HDC hDC, LPCTSTR lpchText, int nCount, LPRECT lpRect, UINT uFormat) int WINAPI extDrawTextA(HDC hDC, LPCTSTR lpchText, int nCount, LPRECT lpRect, UINT uFormat)
{ {
return 0; return 0;
} }
int extDrawTextExA(HDC hDC, LPCTSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams) int WINAPI extDrawTextExA(HDC hDC, LPCTSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams)
{ {
return 0; return 0;
} }
BOOL extDrawFocusRect(HDC hDC, const RECT *lprc) BOOL WINAPI extDrawFocusRect(HDC hDC, const RECT *lprc)
{ {
return TRUE; return TRUE;
} }
BOOL extScrollDC(HDC hDC, int dx, int dy, const RECT *lprcScroll, const RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate) BOOL WINAPI extScrollDC(HDC hDC, int dx, int dy, const RECT *lprcScroll, const RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate)
{ {
return TRUE; return TRUE;
}
HWND WINAPI extGetTopWindow(HWND hwnd)
{
HWND ret;
OutTraceD("GetTopWindow: hwnd=%x fullscreen=%x\n", hwnd, dxw.IsFullScreen());
// a fullscreen program is supposed to be always top Z-order on the desktop!
ret = (dxw.IsFullScreen() && dxw.IsDesktop(hwnd)) ? dxw.GethWnd() : (*pGetTopWindow)(hwnd);
OutTraceD("GetTopWindow: ret=%x\n", ret);
return ret;
} }

View File

@ -36,7 +36,6 @@
#define IDD_TAB_COMPAT 160 #define IDD_TAB_COMPAT 160
#define IDD_TAB_GDI 161 #define IDD_TAB_GDI 161
#define IDD_TAB_COLOR 162 #define IDD_TAB_COLOR 162
#define IDC_AUTO 300 #define IDC_AUTO 300
#define IDC_DIRECTX1 301 #define IDC_DIRECTX1 301
#define IDC_DIRECTX7 302 #define IDC_DIRECTX7 302
@ -45,18 +44,15 @@
#define IDC_NODIRECTX 305 #define IDC_NODIRECTX 305
#define IDC_DIRECTX10 306 #define IDC_DIRECTX10 306
#define IDC_DIRECTX11 307 #define IDC_DIRECTX11 307
#define IDC_FILE 1000 #define IDC_FILE 1000
#define IDC_OPEN 1001 #define IDC_OPEN 1001
#define IDC_STATUSINFO 1005 #define IDC_STATUSINFO 1005
#define IDC_VERSION 1006 #define IDC_VERSION 1006
#define IDC_UNNOTIFY 1007 #define IDC_UNNOTIFY 1007
#define IDC_NOEMULATESURFACE 1008 #define IDC_NOEMULATESURFACE 1008
#define IDC_EMULATEBUFFER 1009 #define IDC_EMULATEBUFFER 1009
#define IDC_LOCKEDSURFACE 1010 #define IDC_LOCKEDSURFACE 1010
#define IDC_EMULATESURFACE 1011 #define IDC_EMULATESURFACE 1011
#define IDC_MODIFYMOUSE 1012 #define IDC_MODIFYMOUSE 1012
#define IDC_OUTTRACE 1013 #define IDC_OUTTRACE 1013
#define IDC_HANDLEDC 1014 #define IDC_HANDLEDC 1014
@ -111,6 +107,7 @@
#define IDC_CURSORTRACE 1063 #define IDC_CURSORTRACE 1063
#define IDC_IMPORTTABLE 1064 #define IDC_IMPORTTABLE 1064
#define IDC_HANDLEEXCEPTIONS 1065 #define IDC_HANDLEEXCEPTIONS 1065
#define IDC_IMPORTTABLE2 1065
#define IDC_BLITFROMBACKBUFFER 1066 #define IDC_BLITFROMBACKBUFFER 1066
#define IDC_OUTDEBUG 1067 #define IDC_OUTDEBUG 1067
#define IDC_SUPPRESSCLIPPING 1068 #define IDC_SUPPRESSCLIPPING 1068
@ -158,6 +155,10 @@
#define IDC_SAVECAPS 1110 #define IDC_SAVECAPS 1110
#define IDC_SINGLEPROCAFFINITY 1111 #define IDC_SINGLEPROCAFFINITY 1111
#define IDC_HOOKDI 1112 #define IDC_HOOKDI 1112
#define IDC_EMULATEREGISTRY 1113
#define IDC_CDROMDRIVETYPE 1114
#define IDC_OUTREGISTRY 1115
#define IDC_NOWINDOWMOVE 1116
#define ID_MODIFY 32771 #define ID_MODIFY 32771
#define ID_DELETE 32772 #define ID_DELETE 32772
#define ID_ADD 32773 #define ID_ADD 32773

View File

@ -34,6 +34,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_LIMITRESOURCES, cTarget->m_LimitResources); DDX_Check(pDX, IDC_LIMITRESOURCES, cTarget->m_LimitResources);
DDX_Check(pDX, IDC_SUPPRESSIME, cTarget->m_SuppressIME); DDX_Check(pDX, IDC_SUPPRESSIME, cTarget->m_SuppressIME);
DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt); DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt);
DDX_Check(pDX, IDC_CDROMDRIVETYPE, cTarget->m_CDROMDriveType);
} }
BEGIN_MESSAGE_MAP(CTabCompat, CDialog) BEGIN_MESSAGE_MAP(CTabCompat, CDialog)

View File

@ -43,6 +43,7 @@ void CTabLogs::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_OUTWINMESSAGES, cTarget->m_OutWinMessages); DDX_Check(pDX, IDC_OUTWINMESSAGES, cTarget->m_OutWinMessages);
DDX_Check(pDX, IDC_OUTDXTRACE, cTarget->m_OutDXTrace); DDX_Check(pDX, IDC_OUTDXTRACE, cTarget->m_OutDXTrace);
DDX_Check(pDX, IDC_IMPORTTABLE, cTarget->m_ImportTable); DDX_Check(pDX, IDC_IMPORTTABLE, cTarget->m_ImportTable);
DDX_Check(pDX, IDC_OUTREGISTRY, cTarget->m_RegistryOp);
if(gbDebug){ if(gbDebug){
DDX_Check(pDX, IDC_DXPROXED, cTarget->m_DXProxed); DDX_Check(pDX, IDC_DXPROXED, cTarget->m_DXProxed);
DDX_Check(pDX, IDC_ASSERT, cTarget->m_AssertDialog); DDX_Check(pDX, IDC_ASSERT, cTarget->m_AssertDialog);

View File

@ -34,6 +34,7 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_UNNOTIFY, cTarget->m_UnNotify); DDX_Check(pDX, IDC_UNNOTIFY, cTarget->m_UnNotify);
DDX_Check(pDX, IDC_WINDOWIZE, cTarget->m_Windowize); DDX_Check(pDX, IDC_WINDOWIZE, cTarget->m_Windowize);
DDX_Check(pDX, IDC_HOOKDLLS, cTarget->m_HookDLLs); DDX_Check(pDX, IDC_HOOKDLLS, cTarget->m_HookDLLs);
DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry);
DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin); DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin);
DDX_Check(pDX, IDC_HOOKENABLED, cTarget->m_HookEnabled); DDX_Check(pDX, IDC_HOOKENABLED, cTarget->m_HookEnabled);
DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner); DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner);

View File

@ -41,6 +41,7 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_RECOVERSCREENMODE, cTarget->m_RecoverScreenMode); DDX_Check(pDX, IDC_RECOVERSCREENMODE, cTarget->m_RecoverScreenMode);
DDX_Check(pDX, IDC_REFRESHONRESIZE, cTarget->m_RefreshOnResize); DDX_Check(pDX, IDC_REFRESHONRESIZE, cTarget->m_RefreshOnResize);
DDX_Check(pDX, IDC_FIXD3DFRAME, cTarget->m_FixD3DFrame); DDX_Check(pDX, IDC_FIXD3DFRAME, cTarget->m_FixD3DFrame);
DDX_Check(pDX, IDC_NOWINDOWMOVE, cTarget->m_NoWindowMove);
} }
BOOL CTabWindow::OnInitDialog() BOOL CTabWindow::OnInitDialog()

View File

@ -24,7 +24,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_Coordinates = 0; m_Coordinates = 0;
m_DxEmulationMode = 0; // default: no emulation m_DxEmulationMode = 0; // default: no emulation
m_HookDI = FALSE; m_HookDI = FALSE;
m_ModifyMouse = FALSE; m_ModifyMouse = TRUE; // default true !!
m_OutTrace = FALSE; m_OutTrace = FALSE;
m_OutDebug = FALSE; m_OutDebug = FALSE;
m_CursorTrace = FALSE; m_CursorTrace = FALSE;
@ -39,10 +39,12 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_SaveCaps = FALSE; m_SaveCaps = FALSE;
m_SingleProcAffinity = FALSE; m_SingleProcAffinity = FALSE;
m_LimitResources = FALSE; m_LimitResources = FALSE;
m_CDROMDriveType = FALSE;
m_UnNotify = FALSE; m_UnNotify = FALSE;
m_Windowize = TRUE; // default true !! m_Windowize = TRUE; // default true !!
m_HookDLLs = FALSE; m_HookDLLs = TRUE; // default true !!
m_HookEnabled = TRUE; // default true !! m_HookEnabled = TRUE; // default true !!
m_EmulateRegistry = FALSE; // default true !!
m_NoBanner = FALSE; m_NoBanner = FALSE;
m_StartDebug = FALSE; m_StartDebug = FALSE;
m_FilePath = _T(""); m_FilePath = _T("");
@ -66,7 +68,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_SuppressDXErrors = FALSE; m_SuppressDXErrors = FALSE;
m_MarkBlit = FALSE; m_MarkBlit = FALSE;
m_PreventMaximize = FALSE; m_PreventMaximize = FALSE;
m_ClientRemapping = FALSE; m_ClientRemapping = TRUE; // default true !!
m_MapGDIToPrimary = FALSE; m_MapGDIToPrimary = FALSE;
m_LockWinPos = FALSE; m_LockWinPos = FALSE;
m_LockWinStyle = FALSE; m_LockWinStyle = FALSE;
@ -78,6 +80,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_HideMultiMonitor = FALSE; m_HideMultiMonitor = FALSE;
m_WallpaperMode = FALSE; m_WallpaperMode = FALSE;
m_FixD3DFrame = FALSE; m_FixD3DFrame = FALSE;
m_NoWindowMove = FALSE;
m_Force16BPP = FALSE; m_Force16BPP = FALSE;
m_HookChildWin = FALSE; m_HookChildWin = FALSE;
m_MessageProc = FALSE; m_MessageProc = FALSE;

View File

@ -37,10 +37,12 @@ public:
BOOL m_DXProxed; BOOL m_DXProxed;
BOOL m_AssertDialog; BOOL m_AssertDialog;
BOOL m_ImportTable; BOOL m_ImportTable;
BOOL m_RegistryOp;
BOOL m_HandleDC; BOOL m_HandleDC;
BOOL m_UnNotify; BOOL m_UnNotify;
BOOL m_Windowize; BOOL m_Windowize;
BOOL m_HookDLLs; BOOL m_HookDLLs;
BOOL m_EmulateRegistry;
BOOL m_NoBanner; BOOL m_NoBanner;
BOOL m_StartDebug; BOOL m_StartDebug;
BOOL m_HookEnabled; BOOL m_HookEnabled;
@ -79,6 +81,7 @@ public:
BOOL m_HideMultiMonitor; BOOL m_HideMultiMonitor;
BOOL m_WallpaperMode; BOOL m_WallpaperMode;
BOOL m_FixD3DFrame; BOOL m_FixD3DFrame;
BOOL m_NoWindowMove;
BOOL m_HookChildWin; BOOL m_HookChildWin;
BOOL m_MessageProc; BOOL m_MessageProc;
BOOL m_FixNCHITTEST; BOOL m_FixNCHITTEST;
@ -100,6 +103,7 @@ public:
BOOL m_FullRectBlt; BOOL m_FullRectBlt;
BOOL m_NoPaletteUpdate; BOOL m_NoPaletteUpdate;
BOOL m_LimitResources; BOOL m_LimitResources;
BOOL m_CDROMDriveType;
BOOL m_SuppressIME; BOOL m_SuppressIME;
BOOL m_SetCompatibility; BOOL m_SetCompatibility;
BOOL m_SaveCaps; BOOL m_SaveCaps;

Binary file not shown.

View File

@ -273,6 +273,7 @@ BEGIN
CONTROL "Desktop work area",IDC_DESKTOPWORKAREA,"Button",BS_AUTORADIOBUTTON,170,208,95,10 CONTROL "Desktop work area",IDC_DESKTOPWORKAREA,"Button",BS_AUTORADIOBUTTON,170,208,95,10
CONTROL "Desktop center",IDC_DESKTOPCENTER,"Button",BS_AUTORADIOBUTTON,170,218,95,10 CONTROL "Desktop center",IDC_DESKTOPCENTER,"Button",BS_AUTORADIOBUTTON,170,218,95,10
CONTROL "Hook child WindowProc",IDC_HOOKCHILDWIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,142,124,10 CONTROL "Hook child WindowProc",IDC_HOOKCHILDWIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,142,124,10
CONTROL "Emulate Registry",IDC_EMULATEREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,162,124,10
END END
IDD_TAB_LOG DIALOGEX 0, 0, 300, 240 IDD_TAB_LOG DIALOGEX 0, 0, 300, 240
@ -280,16 +281,17 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
GROUPBOX "dxwnd.log logs",IDC_STATIC,7,3,129,131 GROUPBOX "dxwnd.log logs",IDC_STATIC,7,3,129,131
CONTROL "Win Events",IDC_OUTWINMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,70,73,12 CONTROL "Enable Trace",IDC_LOGENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,25,73,12
CONTROL "DirectX trace",IDC_OUTDXTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,58,73,12
CONTROL "DxWnd",IDC_OUTTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,46,73,12 CONTROL "DxWnd",IDC_OUTTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,46,73,12
CONTROL "Assert Dialog",IDC_ASSERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,152,73,12 CONTROL "DirectX trace",IDC_OUTDXTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,58,73,12
CONTROL "ddraw Proxy",IDC_DXPROXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,164,73,12 CONTROL "Win Events",IDC_OUTWINMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,70,73,12
CONTROL "Cursor/Mouse",IDC_CURSORTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,82,73,12 CONTROL "Cursor/Mouse",IDC_CURSORTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,82,73,12
CONTROL "Import Table",IDC_IMPORTTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,94,73,12 CONTROL "Import Table",IDC_IMPORTTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,94,73,12
CONTROL "Debug",IDC_OUTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,106,73,12
CONTROL "Enable Trace",IDC_LOGENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,25,73,12
GROUPBOX "debug mode only",IDC_STATIC,7,139,130,94 GROUPBOX "debug mode only",IDC_STATIC,7,139,130,94
CONTROL "Assert Dialog",IDC_ASSERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,152,73,12
CONTROL "ddraw Proxy",IDC_DXPROXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,164,73,12
CONTROL "Debug",IDC_OUTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,106,73,12
CONTROL "Registry op.",IDC_OUTREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,118,73,12
END END
IDD_TAB_DIRECTX DIALOGEX 0, 0, 300, 240 IDD_TAB_DIRECTX DIALOGEX 0, 0, 300, 240
@ -394,6 +396,8 @@ BEGIN
CONTROL "Hide multi-monitor config.",IDC_HIDEMULTIMONITOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,136,115,10 CONTROL "Hide multi-monitor config.",IDC_HIDEMULTIMONITOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,136,115,10
CONTROL "Wallpaper mode",IDC_WALLPAPERMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,148,115,10 CONTROL "Wallpaper mode",IDC_WALLPAPERMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,148,115,10
CONTROL "Fix Windows Frame in D3D",IDC_FIXD3DFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,160,115,10 CONTROL "Fix Windows Frame in D3D",IDC_FIXD3DFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,160,115,10
CONTROL "Don't move D3D rendering window",IDC_NOWINDOWMOVE,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,172,125,10
END END
IDD_TAB_EMPTY DIALOGEX 0, 0, 300, 240 IDD_TAB_EMPTY DIALOGEX 0, 0, 300, 240
@ -426,6 +430,7 @@ BEGIN
CONTROL "Suppress d3d9 extensions",IDC_SUPPRESSD3DEXT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,176,109,12 CONTROL "Suppress d3d9 extensions",IDC_SUPPRESSD3DEXT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,176,109,12
CONTROL "Set single core process affinity",IDC_SINGLEPROCAFFINITY, CONTROL "Set single core process affinity",IDC_SINGLEPROCAFFINITY,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,164,109,12 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,164,109,12
CONTROL "Set CDROM Drive Type",IDC_CDROMDRIVETYPE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,152,109,12
END END
IDD_TAB_GDI DIALOGEX 0, 0, 300, 240 IDD_TAB_GDI DIALOGEX 0, 0, 300, 240

Binary file not shown.

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="9,00" Version="9.00"
Name="dxwndhost" Name="dxwndhost"
ProjectGUID="{FD0B0234-8EC5-43C0-A384-1B881DD3D925}" ProjectGUID="{FD0B0234-8EC5-43C0-A384-1B881DD3D925}"
RootNamespace="dxwndhost" RootNamespace="dxwndhost"
@ -365,10 +365,6 @@
RelativePath=".\SystemTray.cpp" RelativePath=".\SystemTray.cpp"
> >
</File> </File>
<File
RelativePath=".\SystemTray.h"
>
</File>
<File <File
RelativePath=".\TabColor.cpp" RelativePath=".\TabColor.cpp"
> >
@ -474,6 +470,10 @@
RelativePath="StdAfx.h" RelativePath="StdAfx.h"
> >
</File> </File>
<File
RelativePath=".\SystemTray.h"
>
</File>
<File <File
RelativePath=".\TabColor.h" RelativePath=".\TabColor.h"
> >

View File

@ -111,6 +111,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_UnNotify) t->flags |= UNNOTIFY; if(dlg->m_UnNotify) t->flags |= UNNOTIFY;
if(dlg->m_Windowize) t->flags2 |= WINDOWIZE; if(dlg->m_Windowize) t->flags2 |= WINDOWIZE;
if(dlg->m_HookDLLs) t->flags3 |= HOOKDLLS; if(dlg->m_HookDLLs) t->flags3 |= HOOKDLLS;
if(dlg->m_EmulateRegistry) t->flags3 |= EMULATEREGISTRY;
if(dlg->m_HookEnabled) t->flags3 |= HOOKENABLED; if(dlg->m_HookEnabled) t->flags3 |= HOOKENABLED;
if(dlg->m_NoBanner) t->flags2 |= NOBANNER; if(dlg->m_NoBanner) t->flags2 |= NOBANNER;
if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG; if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG;
@ -133,9 +134,11 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_DXProxed) t->tflags |= DXPROXED; if(dlg->m_DXProxed) t->tflags |= DXPROXED;
if(dlg->m_AssertDialog) t->tflags |= ASSERTDIALOG; if(dlg->m_AssertDialog) t->tflags |= ASSERTDIALOG;
if(dlg->m_ImportTable) t->tflags |= OUTIMPORTTABLE; if(dlg->m_ImportTable) t->tflags |= OUTIMPORTTABLE;
if(dlg->m_RegistryOp) t->tflags |= OUTREGISTRY;
if(dlg->m_HandleDC) t->flags |= HANDLEDC; if(dlg->m_HandleDC) t->flags |= HANDLEDC;
if(dlg->m_HandleExceptions) t->flags |= HANDLEEXCEPTIONS; if(dlg->m_HandleExceptions) t->flags |= HANDLEEXCEPTIONS;
if(dlg->m_LimitResources) t->flags2 |= LIMITRESOURCES; if(dlg->m_LimitResources) t->flags2 |= LIMITRESOURCES;
if(dlg->m_CDROMDriveType) t->flags3 |= CDROMDRIVETYPE;
if(dlg->m_SuppressIME) t->flags2 |= SUPPRESSIME; if(dlg->m_SuppressIME) t->flags2 |= SUPPRESSIME;
if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT; if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT;
if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY; if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY;
@ -172,6 +175,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_HideMultiMonitor) t->flags2 |= HIDEMULTIMONITOR; if(dlg->m_HideMultiMonitor) t->flags2 |= HIDEMULTIMONITOR;
if(dlg->m_WallpaperMode) t->flags2 |= WALLPAPERMODE; if(dlg->m_WallpaperMode) t->flags2 |= WALLPAPERMODE;
if(dlg->m_FixD3DFrame) t->flags3 |= FIXD3DFRAME; if(dlg->m_FixD3DFrame) t->flags3 |= FIXD3DFRAME;
if(dlg->m_NoWindowMove) t->flags3 |= NOWINDOWMOVE;
if(dlg->m_Force16BPP) t->flags3 |= FORCE16BPP; if(dlg->m_Force16BPP) t->flags3 |= FORCE16BPP;
if(dlg->m_HookChildWin) t->flags |= HOOKCHILDWIN; if(dlg->m_HookChildWin) t->flags |= HOOKCHILDWIN;
if(dlg->m_MessageProc) t->flags |= MESSAGEPROC; if(dlg->m_MessageProc) t->flags |= MESSAGEPROC;
@ -222,6 +226,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_UnNotify = t->flags & UNNOTIFY ? 1 : 0; dlg->m_UnNotify = t->flags & UNNOTIFY ? 1 : 0;
dlg->m_Windowize = t->flags2 & WINDOWIZE ? 1 : 0; dlg->m_Windowize = t->flags2 & WINDOWIZE ? 1 : 0;
dlg->m_HookDLLs = t->flags3 & HOOKDLLS ? 1 : 0; dlg->m_HookDLLs = t->flags3 & HOOKDLLS ? 1 : 0;
dlg->m_EmulateRegistry = t->flags3 & EMULATEREGISTRY ? 1 : 0;
dlg->m_HookEnabled = t->flags3 & HOOKENABLED ? 1 : 0; dlg->m_HookEnabled = t->flags3 & HOOKENABLED ? 1 : 0;
dlg->m_NoBanner = t->flags2 & NOBANNER ? 1 : 0; dlg->m_NoBanner = t->flags2 & NOBANNER ? 1 : 0;
dlg->m_StartDebug = t->flags2 & STARTDEBUG ? 1 : 0; dlg->m_StartDebug = t->flags2 & STARTDEBUG ? 1 : 0;
@ -242,6 +247,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_DXProxed = t->tflags & DXPROXED ? 1 : 0; dlg->m_DXProxed = t->tflags & DXPROXED ? 1 : 0;
dlg->m_AssertDialog = t->tflags & ASSERTDIALOG ? 1 : 0; dlg->m_AssertDialog = t->tflags & ASSERTDIALOG ? 1 : 0;
dlg->m_ImportTable = t->tflags & OUTIMPORTTABLE ? 1 : 0; dlg->m_ImportTable = t->tflags & OUTIMPORTTABLE ? 1 : 0;
dlg->m_RegistryOp = t->tflags & OUTREGISTRY ? 1 : 0;
dlg->m_HandleDC = t->flags & HANDLEDC ? 1 : 0; dlg->m_HandleDC = t->flags & HANDLEDC ? 1 : 0;
dlg->m_HandleExceptions = t->flags & HANDLEEXCEPTIONS ? 1 : 0; dlg->m_HandleExceptions = t->flags & HANDLEEXCEPTIONS ? 1 : 0;
dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0; dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0;
@ -250,6 +256,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_SaveCaps = t->flags3 & SAVECAPS ? 1 : 0; dlg->m_SaveCaps = t->flags3 & SAVECAPS ? 1 : 0;
dlg->m_SingleProcAffinity = t->flags3 & SINGLEPROCAFFINITY ? 1 : 0; dlg->m_SingleProcAffinity = t->flags3 & SINGLEPROCAFFINITY ? 1 : 0;
dlg->m_LimitResources = t->flags2 & LIMITRESOURCES ? 1 : 0; dlg->m_LimitResources = t->flags2 & LIMITRESOURCES ? 1 : 0;
dlg->m_CDROMDriveType = t->flags3 & CDROMDRIVETYPE ? 1 : 0;
dlg->m_SaveLoad = t->flags & SAVELOAD ? 1 : 0; dlg->m_SaveLoad = t->flags & SAVELOAD ? 1 : 0;
dlg->m_SlowDown = t->flags & SLOWDOWN ? 1 : 0; dlg->m_SlowDown = t->flags & SLOWDOWN ? 1 : 0;
dlg->m_BlitFromBackBuffer = t->flags & BLITFROMBACKBUFFER ? 1 : 0; dlg->m_BlitFromBackBuffer = t->flags & BLITFROMBACKBUFFER ? 1 : 0;
@ -281,6 +288,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_HideMultiMonitor = t->flags2 & HIDEMULTIMONITOR ? 1 : 0; dlg->m_HideMultiMonitor = t->flags2 & HIDEMULTIMONITOR ? 1 : 0;
dlg->m_WallpaperMode = t->flags2 & WALLPAPERMODE ? 1 : 0; dlg->m_WallpaperMode = t->flags2 & WALLPAPERMODE ? 1 : 0;
dlg->m_FixD3DFrame = t->flags3 & FIXD3DFRAME ? 1 : 0; dlg->m_FixD3DFrame = t->flags3 & FIXD3DFRAME ? 1 : 0;
dlg->m_NoWindowMove = t->flags3 & NOWINDOWMOVE ? 1 : 0;
dlg->m_Force16BPP = t->flags3 & FORCE16BPP ? 1 : 0; dlg->m_Force16BPP = t->flags3 & FORCE16BPP ? 1 : 0;
dlg->m_HookChildWin = t->flags & HOOKCHILDWIN ? 1 : 0; dlg->m_HookChildWin = t->flags & HOOKCHILDWIN ? 1 : 0;
dlg->m_MessageProc = t->flags & MESSAGEPROC ? 1 : 0; dlg->m_MessageProc = t->flags & MESSAGEPROC ? 1 : 0;