diff --git a/build/dxwnd.dll b/build/dxwnd.dll index d0fdae3..95dafc8 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22f399a262f8cb3071bb10d366ee021b542e9c13b6122b70370ecc319b970489 +oid sha256:5a1ab8f9170fce5bf01058d18f19fba15c7014eb872a8e7a2ec36f4e2ea399bc size 628736 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 2be50fe..62116aa 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:393da7c339ffda956ed69f340401cd4dfeef582666d42a812699a641e698d691 -size 558080 +oid sha256:9f7c9d1fe78caeb4054e32420034aba59350b965fb86959352d22a1a46a32ea8 +size 555520 diff --git a/build/exports/Carmageddon 2 (GLIDE).dxw b/build/exports/Carmageddon 2 (GLIDE).dxw index d5dbd86..d497a20 100644 --- a/build/exports/Carmageddon 2 (GLIDE).dxw +++ b/build/exports/Carmageddon 2 (GLIDE).dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134217730 -flagg0=1208025088 +flag0=-2013265866 +flagg0=1207959552 flagh0=20 -flagi0=12 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,14 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +notes0= +registry0= +flagj0=0 +flagk0=32768 +flagl0=0 +flagm0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Carmageddon 2 (SW).dxw b/build/exports/Carmageddon 2 (SW).dxw index a94d107..286cdf2 100644 --- a/build/exports/Carmageddon 2 (SW).dxw +++ b/build/exports/Carmageddon 2 (SW).dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=671088674 -flagg0=1208025088 +flag0=671088694 +flagg0=1207959552 flagh0=33562644 -flagi0=12 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,14 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +notes0= +registry0= +flagj0=0 +flagk0=32768 +flagl0=0 +flagm0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Dylan Dog Horror at Luna Park.dxw b/build/exports/Dylan Dog Horror at Luna Park.dxw new file mode 100644 index 0000000..ffd6c95 --- /dev/null +++ b/build/exports/Dylan Dog Horror at Luna Park.dxw @@ -0,0 +1,29 @@ +[target] +title0=Dylan Dog Horror at Luna Park +path0=D:\Games\DylanDog\hlp.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1744830464 +flagh0=1048596 +flagi0=138412038 +flagj0=5248 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Imperialism II.dxw b/build/exports/Imperialism II.dxw index d9d16fd..7689444 100644 --- a/build/exports/Imperialism II.dxw +++ b/build/exports/Imperialism II.dxw @@ -28,5 +28,8 @@ launchpath0= notes0= registry0= flagj0=0 -flagk0=0 +flagk0=32768 swapeffect0=0 +flagl0=4 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Indiana Jones and the Infernal Machine.dxw b/build/exports/Indiana Jones and the Infernal Machine.dxw new file mode 100644 index 0000000..9a9ad47 --- /dev/null +++ b/build/exports/Indiana Jones and the Infernal Machine.dxw @@ -0,0 +1,29 @@ +[target] +title0=Indiana Jones and the Infernal Machine +path0=D:\Games\Indiana Jones Infernal Machine\Resource\Indy3D.exe +launchpath0= +module0= +opengllib0= +notes0=Beware!\nThe game on nowadays computers works only using a no-cd crack \nand a dedicated installer for 64 bit platforms! +registry0= +ver0=0 +coord0=0 +flag0=673185826 +flagg0=1207959552 +flagh0=20 +flagi0=-2009071610 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/SPWaW 2016.dxw b/build/exports/SPWaW 2016.dxw new file mode 100644 index 0000000..1fd8f86 --- /dev/null +++ b/build/exports/SPWaW 2016.dxw @@ -0,0 +1,29 @@ +[target] +title0=SPWaW 2016 +path0=D:\Games\The Depot\SPWaW 2016\mech.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=1 +flag0=49186 +flagg0=1207992338 +flagh0=532 +flagi0=18907136 +flagj0=1152 +flagk0=0 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=1340 +sizy0=1000 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Settlers 3, the.dxw b/build/exports/Settlers 3, the.dxw index bc1c9de..79a8396 100644 --- a/build/exports/Settlers 3, the.dxw +++ b/build/exports/Settlers 3, the.dxw @@ -9,7 +9,7 @@ flag0=-1476394974 flagg0=1207959618 flagh0=20 flagi0=4194308 -tflag0=64 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -26,3 +26,10 @@ winver0=0 maxres0=-1 launchpath0= flagj0=128 +notes0= +registry0= +flagk0=0 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Star Wars Episode I Racer.dxw b/build/exports/Star Wars Episode I Racer.dxw index 235bbd3..e39d065 100644 --- a/build/exports/Star Wars Episode I Racer.dxw +++ b/build/exports/Star Wars Episode I Racer.dxw @@ -27,5 +27,9 @@ maxres0=0 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index c2ba941..4567e6e 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -3119,7 +3119,8 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate // seems to fix problems in "Warhammer 40K Rites Of War" that uses a ddraw session after reaching 0 refcount. // v2.2.84: avoid the extra referenced in non windowed mode since it causes the window shift reported by gsky916 // for Wind Fantasy SP. - if((dxw.dwDDVersion==1) && dxw.Windowize) lpdd->AddRef(); + // v2.3.59: same extra reference is needed by "Wahammer Chaos Gate" that uses ddraw interface release 2 + if((dxw.dwDDVersion>=2) && dxw.Windowize) lpdd->AddRef(); return DD_OK; } diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 9f17ce0..54db3fb 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.58" +#define VERSION "2.03.59" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index b46f3b0..57f1b56 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/host/ShimsDialog.cpp b/host/ShimsDialog.cpp new file mode 100644 index 0000000..bd65761 --- /dev/null +++ b/host/ShimsDialog.cpp @@ -0,0 +1,432 @@ +// ShimsDialog.cpp : implementation file +// + +#include "stdafx.h" +#include "dxwndhost.h" +#include "ShimsDialog.h" + +// http://msdn2.microsoft.com/en-us/library/bb432457 +// PDB WINAPI SdbOpenDatabase( +// LPCTSTR pwszPath, +// PATH_TYPE eType +//); +// What is PDB!? Assuming it is a pointer to somewhere => "void*" +typedef void* PDB; + +// http://msdn2.microsoft.com/en-us/library/bb432389.aspx +typedef enum _PATH_TYPE +{ + DOS_PATH, + NT_PATH +}PATH_TYPE; + +// http://msdn2.microsoft.com/en-us/library/bb432488 +typedef DWORD TAGID; +#define TAGID_NULL (0) +#define TAGID_ROOT (0) + +// TAG !? +typedef DWORD TAG; + +// http://msdn2.microsoft.com/en-us/library/bb432489 +typedef DWORD TAGREF; +#define TAGREF_NULL (0) +#define TAGREF_ROOT (0) + +// http://msdn2.microsoft.com/en-us/library/bb432490 +// TAG-Types: +#define TAG_TYPE_NULL 0x1000 +#define TAG_TYPE_BYTE 0x2000 +#define TAG_TYPE_WORD 0x3000 +#define TAG_TYPE_DWORD 0x4000 +#define TAG_TYPE_QWORD 0x5000 +#define TAG_TYPE_STRINGREF 0x6000 +#define TAG_TYPE_LIST 0x7000 +#define TAG_TYPE_STRING 0x8000 +#define TAG_TYPE_BINARY 0x9000 + +// It seems that this type is "masked" +#define TAG_TYPE_MASK 0xF000 + +// http://msdn2.microsoft.com/en-us/library/bb432487 +#define TAG_APP_NAME_RC_ID (0x24 | TAG_TYPE_DWORD) +#define TAG_VENDOR_NAME_RC_ID (0x25 | TAG_TYPE_DWORD) +#define TAG_SUMMARY_MSG_RC_ID (0x26 | TAG_TYPE_DWORD) +#define TAG_DESCRIPTION_RC_ID (0x28 | TAG_TYPE_DWORD) +#define TAG_PARAMETER1_RC_ID (0x29 | TAG_TYPE_DWORD) + +#define TAG_EXE_ID (0x4 | TAG_TYPE_BINARY) +#define TAG_DATABASE_ID (0x7 | TAG_TYPE_BINARY) +#define TAG_FIX_ID (0x10 | TAG_TYPE_BINARY) +#define TAG_APP_ID (0x11 | TAG_TYPE_BINARY) +#define CONTEXT_PLATFORM_ID (0x8 | TAG_TYPE_BINARY) + + +typedef struct TAG_RC_Entry +{ + DWORD tag; + LPCWSTR szName; +} TAG_RC_Entry; + +// The following tags returns an reference to an resource... (Vista and later) +static TAG_RC_Entry s_TagRcEntries[] = +{ + {TAG_APP_NAME_RC_ID, L"APP_NAME_RC_ID"}, + {TAG_VENDOR_NAME_RC_ID, L"VENDOR_NAME_RC_ID"}, + {TAG_SUMMARY_MSG_RC_ID, L"SUMMARY_MSG_RC_ID"}, + {TAG_DESCRIPTION_RC_ID, L"DESCRIPTION_RC_ID"}, // at least for this one, MS forgot to add the mapping from TAG to name (SdbTagToString) + {TAG_PARAMETER1_RC_ID, L"PARAMETER1_RC_ID"}, +}; + +// The following Tags could be displayed as GUIDs (if the len is 0x10) +static DWORD s_TagGuids[] = +{ + TAG_EXE_ID, + TAG_DATABASE_ID, + TAG_FIX_ID, + TAG_APP_ID, + CONTEXT_PLATFORM_ID, +}; + +// APIs: + +// http://msdn.microsoft.com/en-us/library/bb432457.aspx +//PDB WINAPI SdbOpenDatabase( +// __in LPCTSTR pwszPath, +// __in PATH_TYPE eType +//); +typedef PDB (WINAPI *PSdbOpenDatabase)( + LPCWSTR pwszPath, // Docu wrong? LPCTSTR shouldn't it be LPCWSTR!? + PATH_TYPE eType +); +PSdbOpenDatabase pSdbOpenDatabase = NULL; + +// http://msdn.microsoft.com/en-us/library/cc895520 +//void WINAPI SdbCloseDatabase( +// __inout PDB pdb +//); +typedef VOID (WINAPI *PSdbCloseDatabase)( + PDB handle // assuming the passed handle... +); +PSdbCloseDatabase pSdbCloseDatabase = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432446 +//TAGID WINAPI SdbGetFirstChild( +// PDB pdb, +// TAGID tiParent +//); +typedef TAGID (WINAPI *PSdbGetFirstChild)( + PDB pdb, + TAGID tiParent +); +PSdbGetFirstChild pSdbGetFirstChild = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432449 +//TAGID WINAPI SdbGetNextChild( +// PDB pdb, +// TAGID tiParent, +// TAGID tiPrev +//); +typedef TAGID (WINAPI *PSdbGetNextChild)( + PDB pdb, + TAGID tiParent, + TAGID tiPrev +); +PSdbGetNextChild pSdbGetNextChild = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432451 +//TAG WINAPI SdbGetTagFromTagID( +// PDB pdb, +// TAGID tiWhich +//); +typedef TAG (WINAPI *PSdbGetTagFromTagID)( + PDB pdb, + TAGID tiWhich +); +PSdbGetTagFromTagID pSdbGetTagFromTagID = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432470 +//LPCTSTR WINAPI SdbTagToString( +// TAG tag +//); +typedef LPCWSTR (WINAPI *PSdbTagToString)( // LPCTSTR => LPCWSTR !? + TAG tag +); +PSdbTagToString pSdbTagToString = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432464 +//BOOL WINAPI SdbReadStringTag( +// PDB pdb, +// TAGID tiWhich, +// LPTSTR pwszBuffer, +// DWORD cchBufferSize +//); +typedef BOOL (WINAPI *PSdbReadStringTag)( + PDB pdb, + TAGID tiWhich, + LPTSTR pwszBuffer, + DWORD cchBufferSize +); +PSdbReadStringTag pSdbReadStringTag = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432450.aspx +//LPWSTR WINAPI SdbGetStringTagPtr( +// PDB pdb, +// TAGID tiWhich +//); +typedef LPWSTR (WINAPI *PSdbGetStringTagPtr)( + PDB pdb, + TAGID tiWhich +); +PSdbGetStringTagPtr pSdbGetStringTagPtr = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432462.aspx +//DWORD WINAPI SdbReadDWORDTag( +// PDB pdb, +// TAGID tiWhich, +// DWORD dwDefault +//); +typedef DWORD (WINAPI *PSdbReadDWORDTag)( + PDB pdb, + TAGID tiWhich, + DWORD dwDefault +); +PSdbReadDWORDTag pSdbReadDWORDTag = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432463.aspx +//ULONGLONG WINAPI SdbReadQWORDTag( +// PDB pdb, +// TAGID tiWhich, +// ULONGLONG qwDefault +//); +typedef ULONGLONG (WINAPI *PSdbReadQWORDTag)( + PDB pdb, + TAGID tiWhich, + ULONGLONG qwDefault +); +PSdbReadQWORDTag pSdbReadQWORDTag = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432455 +//PDB WINAPI SdbOpenApphelpDetailsDatabase( +// LPCWSTR pwsDetailsDatabasePath +//); +typedef PDB (WINAPI *PSdbOpenApphelpDetailsDatabase)( + LPCWSTR pwsDetailsDatabasePath +); +PSdbOpenApphelpDetailsDatabase pSdbOpenApphelpDetailsDatabase = NULL; + +// http://msdn2.microsoft.com/en-us/library/bb432456 +//HMODULE WINAPI SdbOpenApphelpResourceFile( +// LPCWSTR pwszACResourceFile +//); +typedef HMODULE (WINAPI *PSdbOpenApphelpResourceFile)( + LPCWSTR pwszACResourceFile +); +PSdbOpenApphelpResourceFile pSdbOpenApphelpResourceFile = NULL; + +// http://msdn.microsoft.com/en-us/library/bb432443 +//PVOID WINAPI SdbGetBinaryTagData( +// __in PDB pdb, +// __in TAGID tiWhich +//); +typedef PVOID (WINAPI *PSdbGetBinaryTagData)( + PDB pdb, + TAGID tiWhich +); +PSdbGetBinaryTagData pSdbGetBinaryTagData = NULL; + +// ??? +//DWORD WINAPI SdbGetTagDataSize( +// __in PDB pdb, +// __in TAGID tiWhich +//); +typedef DWORD (WINAPI *PSdbGetTagDataSize)( + PDB pdb, + TAGID tiWhich +); +PSdbGetTagDataSize pSdbGetTagDataSize = NULL; + +// http://msdn.microsoft.com/en-us/library/bb432459 +#define SDB_MAX_EXES 16 +#define SDB_MAX_LAYERS 8 +#define SDB_MAX_SDBS 16 +typedef struct tagSDBQUERYRESULT { + TAGREF atrExes[SDB_MAX_EXES]; + DWORD adwExeFlags[SDB_MAX_EXES]; + TAGREF atrLayers[SDB_MAX_LAYERS]; + DWORD dwLayerFlags; + TAGREF trApphelp; + DWORD dwExeCount; + DWORD dwLayerCount; + GUID guidID; + DWORD dwFlags; + DWORD dwCustomSDBMap; + GUID rgGuidDB[SDB_MAX_SDBS]; +} SDBQUERYRESULT, *PSDBQUERYRESULT; + +typedef void* HSDB; + +// http://msdn.microsoft.com/en-us/library/bb432448 +typedef BOOL (WINAPI *PSdbGetMatchingExe)( + HSDB hSDB, + LPCWSTR szPath, + LPCWSTR szModuleName, + LPCWSTR pszEnvironment, + DWORD dwFlags, + PSDBQUERYRESULT pQueryResult +); +PSdbGetMatchingExe pSdbGetMatchingExe = NULL; + +#define SDBGMEF_IGNORE_ENVIRONMENT 1 + +#define SHIMREG_DISABLE_SHIM 0x1 +#define SHIMREG_DISABLE_APPHELP 0x2 +#define SHIMREG_APPHELP_NOUI 0x4 +#define SHIMREG_APPHELP_CANCEL 0x10000000 +#define SHIMREG_DISABLE_SXS 0x10 +#define SHIMREG_DISABLE_LAYER 0x20 +#define SHIMREG_DISABLE_DRIVER 0x40 + +typedef void (WINAPI* PSdbReleaseMatchingExe)( + HSDB hSDB, + TAGREF trExe +); +PSdbReleaseMatchingExe pSdbReleaseMatchingExe = NULL; + + + +// CShimsDialog dialog + +IMPLEMENT_DYNAMIC(CShimsDialog, CDialog) + +CShimsDialog::CShimsDialog(CWnd* pParent /*=NULL*/, char *path) + : CDialog(CShimsDialog::IDD, pParent) +{ + //ExePath = (LPWSTR)malloc((strlen(path)+1)*sizeof(WCHAR)); + //MultiByteToWideChar(CP_ACP, 0, path, -1, ExePath, strlen(path)); + ExePath = path; + +} + +CShimsDialog::~CShimsDialog() +{ + free(ExePath); + ExePath=NULL; +} + +void CShimsDialog::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CShimsDialog, CDialog) +END_MESSAGE_MAP() + +#define IDStatusTIMER 1 + +// CShimsDialog message handlers + +BOOL CShimsDialog::OnInitDialog() +{ + CDialog::OnInitDialog(); + char *MatchExe(char *); + this->SetDlgItemText(IDC_STATUSINFO, MatchExe(ExePath)); + return TRUE; // return TRUE unless you set the focus to a control +} + +void CShimsDialog::OnOK() +{ + CDialog::OnOK(); +} + +void Flags2String(DWORD dwFlags, char *szFlags, size_t flagsLen) +{ + szFlags[0] = 0; + if (dwFlags & SHIMREG_DISABLE_SHIM) strcat_s(szFlags, flagsLen, "Disable-Shim,"); + if (dwFlags & SHIMREG_DISABLE_APPHELP) strcat_s(szFlags, flagsLen, "Disable-Apphelp,"); + if (dwFlags & SHIMREG_APPHELP_NOUI) strcat_s(szFlags, flagsLen, "Apphelp-NoUI,"); + if (dwFlags & SHIMREG_APPHELP_CANCEL) strcat_s(szFlags, flagsLen, "Apphelp-Cancel,"); + if (dwFlags & SHIMREG_DISABLE_SXS) strcat_s(szFlags, flagsLen, "Disable-SxS,"); + if (dwFlags & SHIMREG_DISABLE_LAYER) strcat_s(szFlags, flagsLen, "Disable-Layer,"); + if (dwFlags & SHIMREG_DISABLE_DRIVER) strcat_s(szFlags, flagsLen, "Disable-Driver,"); + + if (szFlags[strlen(szFlags)-1]==',') szFlags[strlen(szFlags)-1]=0; +} + +char * MatchExe(char *FileName) +{ + SDBQUERYRESULT result; + static char sBuf[10000]; + LPWSTR szFileName = (LPWSTR)malloc((strlen(FileName)+1)*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, FileName, -1, szFileName, strlen(FileName)); + + HINSTANCE hAppHelp = LoadLibrary(_T("apphelp.dll")); + + pSdbOpenDatabase = (PSdbOpenDatabase) GetProcAddress(hAppHelp, "SdbOpenDatabase"); + pSdbCloseDatabase = (PSdbCloseDatabase) GetProcAddress(hAppHelp, "SdbCloseDatabase"); + pSdbGetFirstChild = (PSdbGetFirstChild) GetProcAddress(hAppHelp, "SdbGetFirstChild"); + pSdbGetNextChild = (PSdbGetNextChild) GetProcAddress(hAppHelp, "SdbGetNextChild"); + pSdbGetTagFromTagID = (PSdbGetTagFromTagID) GetProcAddress(hAppHelp, "SdbGetTagFromTagID"); + pSdbTagToString = (PSdbTagToString) GetProcAddress(hAppHelp, "SdbTagToString"); + pSdbGetStringTagPtr = (PSdbGetStringTagPtr) GetProcAddress(hAppHelp, "SdbGetStringTagPtr"); + //pSdbReadStringTag = (PSdbReadStringTag) GetProcAddress(hAppHelp, "SdbReadStringTag"); + pSdbReadDWORDTag = (PSdbReadDWORDTag) GetProcAddress(hAppHelp, "SdbReadDWORDTag"); + pSdbReadQWORDTag = (PSdbReadQWORDTag) GetProcAddress(hAppHelp, "SdbReadQWORDTag"); + //pSdbOpenApphelpDetailsDatabase = (PSdbOpenApphelpDetailsDatabase) GetProcAddress(hAppHelp, "SdbOpenApphelpDetailsDatabase"); + pSdbOpenApphelpResourceFile = (PSdbOpenApphelpResourceFile) GetProcAddress(hAppHelp, "SdbOpenApphelpResourceFile"); + + pSdbGetBinaryTagData = (PSdbGetBinaryTagData) GetProcAddress(hAppHelp, "SdbGetBinaryTagData"); + pSdbGetTagDataSize = (PSdbGetTagDataSize) GetProcAddress(hAppHelp, "SdbGetTagDataSize"); + pSdbGetMatchingExe = (PSdbGetMatchingExe) GetProcAddress(hAppHelp, "SdbGetMatchingExe"); + pSdbReleaseMatchingExe = (PSdbReleaseMatchingExe) GetProcAddress(hAppHelp, "SdbReleaseMatchingExe"); + + 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; iGetParent()->GetParent())); + DDX_Text(pDX, IDC_MODULE, cTarget->m_Module); + DDX_Check(pDX, IDC_HOOKENABLED, cTarget->m_HookEnabled); + DDX_Check(pDX, IDC_STARTDEBUG, cTarget->m_StartDebug); + DDX_Check(pDX, IDC_HOTPATCH, cTarget->m_HotPatch); + DDX_Check(pDX, IDC_HOOKDLLS, cTarget->m_HookDLLs); + DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin); + + // Kernel32 + DDX_Radio(pDX, IDC_SONDEFAULT, cTarget->m_SonProcessMode); +} + +BEGIN_MESSAGE_MAP(CTabHook, CDialog) + //{{AFX_MSG_MAP(CTabHook) + // NOTE: the ClassWizard will add message map macros here + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CTabHook message handlers diff --git a/host/TabHook.h b/host/TabHook.h new file mode 100644 index 0000000..10bdf76 --- /dev/null +++ b/host/TabHook.h @@ -0,0 +1,49 @@ +#if !defined(AFX_TABMOUSE_H__12345678_C906_446C_822D_322B5AB6C4C4__INCLUDED_) +#define AFX_TABMOUSE_H__12345678_C906_446C_822D_322B5AB6C4C4__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// TabHook.h : header file +// +#include "resource.h" +#include "TargetDlg.h" + +///////////////////////////////////////////////////////////////////////////// +// CTabHook dialog + +//class CTabHook : public CTargetDlg +class CTabHook : public CDialog +{ +// Construction +public: + CTabHook(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CTabDirectX) + enum { IDD = IDD_TAB_HOOK }; + // NOTE: the ClassWizard will add data members here + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CTabDirectX) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(CTabDirectX) + // NOTE: the ClassWizard will add member functions here + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_TABTHREE_H__798A9124_C906_446C_822D_322B5AB6C4C4__INCLUDED_) diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp index daf3cd1..686ae4f 100644 --- a/host/TabProgram.cpp +++ b/host/TabProgram.cpp @@ -41,18 +41,12 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX) DDX_Text(pDX, IDC_FILE, cTarget->m_FilePath); DDX_Text(pDX, IDC_LAUNCH, cTarget->m_LaunchPath); DDX_Text(pDX, IDC_TITLE, cTarget->m_Title); - DDX_Text(pDX, IDC_MODULE, cTarget->m_Module); DDX_Check(pDX, IDC_NEEDADMINCAPS, cTarget->m_NeedAdminCaps); DDX_Check(pDX, IDC_UNNOTIFY, cTarget->m_UnNotify); DDX_Check(pDX, IDC_WINDOWIZE, cTarget->m_Windowize); - DDX_Check(pDX, IDC_HOTPATCH, cTarget->m_HotPatch); - DDX_Check(pDX, IDC_HOOKDLLS, cTarget->m_HookDLLs); DDX_Check(pDX, IDC_CONFIRMONCLOSE, cTarget->m_ConfirmOnClose); DDX_Check(pDX, IDC_TERMINATEONCLOSE, cTarget->m_TerminateOnClose); DDX_Check(pDX, IDC_FULLSCREENONLY, cTarget->m_FullScreenOnly); - DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin); - DDX_Check(pDX, IDC_HOOKENABLED, cTarget->m_HookEnabled); - DDX_Check(pDX, IDC_STARTDEBUG, cTarget->m_StartDebug); DDX_Check(pDX, IDC_SAVELOAD, cTarget->m_SaveLoad); DDX_Check(pDX, IDC_KEEPASPECTRATIO, cTarget->m_KeepAspectRatio); DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner); diff --git a/host/TabSysLibs.cpp b/host/TabSysLibs.cpp index 7e1d469..5825109 100644 --- a/host/TabSysLibs.cpp +++ b/host/TabSysLibs.cpp @@ -52,9 +52,6 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_STRETCHMOVIES, cTarget->m_StretchMovies); DDX_Check(pDX, IDC_FIXMOVIESCOLOR, cTarget->m_FixMoviesColor); DDX_Check(pDX, IDC_BYPASSMCI, cTarget->m_BypassMCI); - - // Kernel32 - DDX_Radio(pDX, IDC_SONDEFAULT, cTarget->m_SonProcessMode); } BEGIN_MESSAGE_MAP(CTabSysLibs, CDialog) diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index bc28eb3..af883d7 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -241,6 +241,8 @@ BOOL CTargetDlg::OnInitDialog() char sCaption[48+1]; LoadString(AfxGetResourceHandle(), DXW_TAB_MAIN, sCaption, sizeof(sCaption)); m_tabdxTabCtrl.InsertItem(i++, _T(sCaption)); + LoadString(AfxGetResourceHandle(), DXW_TAB_HOOK, sCaption, sizeof(sCaption)); + m_tabdxTabCtrl.InsertItem(i++, _T(sCaption)); LoadString(AfxGetResourceHandle(), DXW_TAB_VIDEO, sCaption, sizeof(sCaption)); m_tabdxTabCtrl.InsertItem(i++, _T(sCaption)); LoadString(AfxGetResourceHandle(), DXW_TAB_INPUT, sCaption, sizeof(sCaption)); diff --git a/host/dxTabCtrl.cpp b/host/dxTabCtrl.cpp index 755f1a1..eab7457 100644 --- a/host/dxTabCtrl.cpp +++ b/host/dxTabCtrl.cpp @@ -22,7 +22,7 @@ #include "dxTabCtrl.h" #include "TabProgram.h" -#include "TabLogs.h" +#include "TabHook.h" #include "TabDirectX.h" #include "TabDirect3D.h" #include "TabInput.h" @@ -31,6 +31,7 @@ #include "TabOpenGL.h" #include "TabCompat.h" #include "TabColor.h" +#include "TabLogs.h" #include "TabRegistry.h" #include "TabNotes.h" #include "TabSysLibs.h" @@ -51,6 +52,7 @@ CDXTabCtrl::CDXTabCtrl() { int i=0; m_tabPages[i++]=new CTabProgram; + m_tabPages[i++]=new CTabHook; m_tabPages[i++]=new CTabWindow; m_tabPages[i++]=new CTabInput; m_tabPages[i++]=new CTabDirectX; @@ -79,6 +81,7 @@ void CDXTabCtrl::Init() m_tabCurrent=0; m_tabPages[i++]->Create(IDD_TAB_PROGRAM, this); + m_tabPages[i++]->Create(IDD_TAB_HOOK, this); m_tabPages[i++]->Create(IDD_TAB_OUTPUT, this); m_tabPages[i++]->Create(IDD_TAB_INPUT, this); m_tabPages[i++]->Create(IDD_TAB_DIRECTX, this); diff --git a/host/dxTabCtrl.h b/host/dxTabCtrl.h index 053db8e..6a9e4cb 100644 --- a/host/dxTabCtrl.h +++ b/host/dxTabCtrl.h @@ -16,7 +16,7 @@ class CDXTabCtrl : public CTabCtrl // Construction public: CDXTabCtrl(); - CDialog *m_tabPages[12]; // this must match the total number of tab elements! + CDialog *m_tabPages[13]; // this must match the total number of tab elements! int m_tabCurrent; int m_nNumberOfPages; enum { IDD = IDC_TABPANEL }; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index b405cf7..7ec552d 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index f551700..d5205e9 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 025237b..f744f16 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhost.vs2008.vcproj b/host/dxwndhost.vs2008.vcproj index 70126fb..d63db86 100644 --- a/host/dxwndhost.vs2008.vcproj +++ b/host/dxwndhost.vs2008.vcproj @@ -373,6 +373,10 @@ RelativePath=".\PaletteDialog.h" > + + @@ -423,6 +427,10 @@ RelativePath=".\TabDirectX.cpp" > + + @@ -548,6 +556,10 @@ RelativePath=".\TabDirectX.h" > + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index aacd57b..ef7d000 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -16,6 +16,7 @@ #include "DesktopDialog.h" #include "PaletteDialog.h" #include "TimeSliderDialog.h" +#include "ShimsDialog.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -133,6 +134,7 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView) ON_COMMAND(ID_RUN, OnRun) ON_COMMAND(ID_TRAY_RESTORE, OnTrayRestore) ON_COMMAND(ID_VIEW_STATUS, OnViewStatus) + ON_COMMAND(ID_VIEW_SHIMS, OnViewShims) ON_COMMAND(ID_VIEW_DESKTOP, OnViewDesktop) ON_COMMAND(ID_VIEW_PALETTE, OnViewPalette) ON_COMMAND(ID_VIEW_TIMESLIDER, OnViewTimeSlider) @@ -2115,6 +2117,22 @@ void CDxwndhostView::OnViewStatus() pDlg->ShowWindow(SW_SHOW); } +void CDxwndhostView::OnViewShims() +{ + POSITION pos; + int i; + char *ExePath; + CListCtrl& listctrl = GetListCtrl(); + + if(!(pos = listctrl.GetFirstSelectedItemPosition())) return; + i = listctrl.GetNextSelectedItem(pos); + ExePath = TargetMaps[i].path; + + CShimsDialog *pDlg = new CShimsDialog(NULL, ExePath); + BOOL ret = pDlg->Create(CShimsDialog::IDD, this); + pDlg->ShowWindow(SW_SHOW); +} + void CDxwndhostView::OnViewDesktop() { CDesktopDialog *pDlg = new CDesktopDialog(); @@ -2377,7 +2395,8 @@ DWORD WINAPI StartDebug(void *p) } if(TargetHandle) CloseHandle((HANDLE)TargetHandle); #endif - bContinueDebugging=false; + // commented out: apparently, there must be some previous thread that starts before the hooker + // bContinueDebugging=false; break; case LOAD_DLL_DEBUG_EVENT: CloseHandle(((LOAD_DLL_DEBUG_INFO *)&debug_event.u)->hFile); diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index f9bde0d..bef96e9 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -91,6 +91,7 @@ protected: afx_msg void OnHookStop(); afx_msg void OnTrayRestore(); afx_msg void OnViewStatus(); + afx_msg void OnViewShims(); afx_msg void OnViewDesktop(); afx_msg void OnViewPalette(); afx_msg void OnViewTimeSlider(); diff --git a/host/host.aps b/host/host.aps index df6ce6c..99d099a 100644 Binary files a/host/host.aps and b/host/host.aps differ diff --git a/host/resource b/host/resource index ac1b3f7..d909a8a 100644 Binary files a/host/resource and b/host/resource differ