mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-25 01:57:47 +01:00
Merge branch 'windows11-freeze'
This commit is contained in:
commit
0a32150af9
@ -27,6 +27,7 @@
|
|||||||
<ClCompile Include="src\crc32.c" />
|
<ClCompile Include="src\crc32.c" />
|
||||||
<ClCompile Include="src\ddclipper.c" />
|
<ClCompile Include="src\ddclipper.c" />
|
||||||
<ClCompile Include="src\debug.c" />
|
<ClCompile Include="src\debug.c" />
|
||||||
|
<ClCompile Include="src\delay_imports.c" />
|
||||||
<ClCompile Include="src\detours\creatwth.cpp" />
|
<ClCompile Include="src\detours\creatwth.cpp" />
|
||||||
<ClCompile Include="src\detours\detours.cpp" />
|
<ClCompile Include="src\detours\detours.cpp" />
|
||||||
<ClCompile Include="src\detours\disasm.cpp" />
|
<ClCompile Include="src\detours\disasm.cpp" />
|
||||||
@ -80,6 +81,7 @@
|
|||||||
<ClInclude Include="inc\d3dcaps.h" />
|
<ClInclude Include="inc\d3dcaps.h" />
|
||||||
<ClInclude Include="inc\ddclipper.h" />
|
<ClInclude Include="inc\ddclipper.h" />
|
||||||
<ClInclude Include="inc\ddraw.h" />
|
<ClInclude Include="inc\ddraw.h" />
|
||||||
|
<ClInclude Include="inc\delay_imports.h" />
|
||||||
<ClInclude Include="inc\directinput.h" />
|
<ClInclude Include="inc\directinput.h" />
|
||||||
<ClInclude Include="inc\dllmain.h" />
|
<ClInclude Include="inc\dllmain.h" />
|
||||||
<ClInclude Include="inc\fps_limiter.h" />
|
<ClInclude Include="inc\fps_limiter.h" />
|
||||||
|
@ -168,6 +168,9 @@
|
|||||||
<ClCompile Include="src\keyboard.c">
|
<ClCompile Include="src\keyboard.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\delay_imports.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="inc\debug.h">
|
<ClInclude Include="inc\debug.h">
|
||||||
@ -299,6 +302,9 @@
|
|||||||
<ClInclude Include="inc\d3dcaps.h">
|
<ClInclude Include="inc\d3dcaps.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="inc\delay_imports.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="res.rc">
|
<ResourceCompile Include="res.rc">
|
||||||
|
25
inc/delay_imports.h
Normal file
25
inc/delay_imports.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef DELAY_IMPORTS_H
|
||||||
|
#define DELAY_IMPORTS_H
|
||||||
|
|
||||||
|
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
|
||||||
|
#define ThreadQuerySetWin32StartAddress 9
|
||||||
|
|
||||||
|
typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG);
|
||||||
|
typedef const char* (CDECL* WINE_GET_VERSIONPROC)();
|
||||||
|
typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release);
|
||||||
|
typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG);
|
||||||
|
|
||||||
|
typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE);
|
||||||
|
typedef BOOL(WINAPI* GETMODULEHANDLEEXAPROC)(DWORD, LPCSTR, HMODULE*);
|
||||||
|
|
||||||
|
extern NTQUERYINFORMATIONTHREADPROC delay_NtQueryInformationThread;
|
||||||
|
extern RTLVERIFYVERSIONINFOPROC delay_RtlVerifyVersionInfo;
|
||||||
|
extern WINE_GET_VERSIONPROC delay_wine_get_version;
|
||||||
|
extern WINE_GET_HOST_VERSIONPROC delay_wine_get_host_version;
|
||||||
|
|
||||||
|
extern VERSETCONDITIONMASKPROC delay_VerSetConditionMask;
|
||||||
|
extern GETMODULEHANDLEEXAPROC delay_GetModuleHandleExA;
|
||||||
|
|
||||||
|
void delay_imports_init();
|
||||||
|
|
||||||
|
#endif
|
@ -6,8 +6,9 @@
|
|||||||
|
|
||||||
|
|
||||||
HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast);
|
HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast);
|
||||||
|
void util_set_process_affinity();
|
||||||
|
void util_set_thread_affinity(DWORD tid);
|
||||||
void util_pull_messages();
|
void util_pull_messages();
|
||||||
unsigned long util_get_crc32(char* filename);
|
|
||||||
DWORD util_get_timestamp(HMODULE mod);
|
DWORD util_get_timestamp(HMODULE mod);
|
||||||
FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name);
|
FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name);
|
||||||
BOOL util_caller_is_ddraw_wrapper(void* return_address);
|
BOOL util_caller_is_ddraw_wrapper(void* return_address);
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#define VerSetConditionMask verhelp_set_mask
|
#define VerSetConditionMask verhelp_set_mask
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void verhelp_init();
|
|
||||||
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask);
|
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask);
|
||||||
ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition);
|
ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition);
|
||||||
const char* verhelp_wine_get_version();
|
const char* verhelp_wine_get_version();
|
||||||
|
68
src/config.c
68
src/config.c
@ -392,7 +392,6 @@ static void cfg_create_ini()
|
|||||||
"; 7th Legion\n"
|
"; 7th Legion\n"
|
||||||
"[legion]\n"
|
"[legion]\n"
|
||||||
"maxgameticks=25\n"
|
"maxgameticks=25\n"
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
"\n"
|
||||||
"; Atrox\n"
|
"; Atrox\n"
|
||||||
"[Atrox]\n"
|
"[Atrox]\n"
|
||||||
@ -430,10 +429,6 @@ static void cfg_create_ini()
|
|||||||
"nonexclusive=true\n"
|
"nonexclusive=true\n"
|
||||||
"adjmouse=true\n"
|
"adjmouse=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Abomination - The Nemesis Project\n"
|
|
||||||
"[abomb]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; American Conquest / Cossacks\n"
|
"; American Conquest / Cossacks\n"
|
||||||
"[DMCR]\n"
|
"[DMCR]\n"
|
||||||
"resolutions=2\n"
|
"resolutions=2\n"
|
||||||
@ -530,10 +525,6 @@ static void cfg_create_ini()
|
|||||||
"[AN]\n"
|
"[AN]\n"
|
||||||
"adjmouse=true\n"
|
"adjmouse=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Another War\n"
|
|
||||||
"[AnotherWar]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Atlantis\n"
|
"; Atlantis\n"
|
||||||
"[ATLANTIS]\n"
|
"[ATLANTIS]\n"
|
||||||
"renderer=opengl\n"
|
"renderer=opengl\n"
|
||||||
@ -652,10 +643,6 @@ static void cfg_create_ini()
|
|||||||
"noactivateapp=true\n"
|
"noactivateapp=true\n"
|
||||||
"nonexclusive=true\n"
|
"nonexclusive=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Championship Manager 99-00\n"
|
|
||||||
"[cm9900]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Command & Conquer: Sole Survivor\n"
|
"; Command & Conquer: Sole Survivor\n"
|
||||||
"[SOLE]\n"
|
"[SOLE]\n"
|
||||||
"maxgameticks=120\n"
|
"maxgameticks=120\n"
|
||||||
@ -929,10 +916,6 @@ static void cfg_create_ini()
|
|||||||
"[dominion]\n"
|
"[dominion]\n"
|
||||||
"flipclear=true\n"
|
"flipclear=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Excalibur 2555AD\n"
|
|
||||||
"[_FISH]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Escape Velocity Nova\n"
|
"; Escape Velocity Nova\n"
|
||||||
"[EV Nova]\n"
|
"[EV Nova]\n"
|
||||||
"nonexclusive=true\n"
|
"nonexclusive=true\n"
|
||||||
@ -959,10 +942,6 @@ static void cfg_create_ini()
|
|||||||
"[f-16]\n"
|
"[f-16]\n"
|
||||||
"resolutions=1\n"
|
"resolutions=1\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Fable\n"
|
|
||||||
"[FABLE]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Fallout Tactics: Brotherhood of Steel\n"
|
"; Fallout Tactics: Brotherhood of Steel\n"
|
||||||
"[BOS/2]\n"
|
"[BOS/2]\n"
|
||||||
"checkfile=.\\binkw32.dll\n"
|
"checkfile=.\\binkw32.dll\n"
|
||||||
@ -976,10 +955,6 @@ static void cfg_create_ini()
|
|||||||
"[FT Tools]\n"
|
"[FT Tools]\n"
|
||||||
"hook_peekmessage=true\n"
|
"hook_peekmessage=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Falcon 4.0 (Microprose version)\n"
|
|
||||||
"[falcon4]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Flight Simulator 98\n"
|
"; Flight Simulator 98\n"
|
||||||
"[FLTSIM95]\n"
|
"[FLTSIM95]\n"
|
||||||
"flightsim98_hack=true\n"
|
"flightsim98_hack=true\n"
|
||||||
@ -1046,7 +1021,6 @@ static void cfg_create_ini()
|
|||||||
"; G-Police\n"
|
"; G-Police\n"
|
||||||
"[GPOLICE]\n"
|
"[GPOLICE]\n"
|
||||||
"maxgameticks=60\n"
|
"maxgameticks=60\n"
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
"\n"
|
||||||
"; Gangsters: Organized Crime\n"
|
"; Gangsters: Organized Crime\n"
|
||||||
"[gangsters]\n"
|
"[gangsters]\n"
|
||||||
@ -1288,10 +1262,6 @@ static void cfg_create_ini()
|
|||||||
"[Lionheart]\n"
|
"[Lionheart]\n"
|
||||||
"hook_peekmessage=true\n"
|
"hook_peekmessage=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Links Extreme\n"
|
|
||||||
"[EXTREME]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Lost Vikings 2\n"
|
"; Lost Vikings 2\n"
|
||||||
"[LOSTV95]\n"
|
"[LOSTV95]\n"
|
||||||
"fake_mode=320x240x16\n"
|
"fake_mode=320x240x16\n"
|
||||||
@ -1299,7 +1269,6 @@ static void cfg_create_ini()
|
|||||||
"; Nightmare Creatures\n"
|
"; Nightmare Creatures\n"
|
||||||
"[NC]\n"
|
"[NC]\n"
|
||||||
"maxgameticks=30\n"
|
"maxgameticks=30\n"
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
"\n"
|
||||||
"; Moto Racer (software mode)\n"
|
"; Moto Racer (software mode)\n"
|
||||||
"[moto]\n"
|
"[moto]\n"
|
||||||
@ -1372,10 +1341,6 @@ static void cfg_create_ini()
|
|||||||
"maxgameticks=60\n"
|
"maxgameticks=60\n"
|
||||||
"limiter_type=4\n"
|
"limiter_type=4\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Mission Deliver Kindness\n"
|
|
||||||
"[MDK95]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; New Robinson\n"
|
"; New Robinson\n"
|
||||||
"[ROBY]\n"
|
"[ROBY]\n"
|
||||||
"adjmouse=true\n"
|
"adjmouse=true\n"
|
||||||
@ -1512,10 +1477,6 @@ static void cfg_create_ini()
|
|||||||
"[Pax Imperia]\n"
|
"[Pax Imperia]\n"
|
||||||
"nonexclusive=true\n"
|
"nonexclusive=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Panzer Dragoon\n"
|
|
||||||
"[PANZERDG]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Play with the Teletubbies\n"
|
"; Play with the Teletubbies\n"
|
||||||
"[PlayWTT]\n"
|
"[PlayWTT]\n"
|
||||||
"hook=3\n"
|
"hook=3\n"
|
||||||
@ -1573,35 +1534,22 @@ static void cfg_create_ini()
|
|||||||
"[RtK]\n"
|
"[RtK]\n"
|
||||||
"fixchilds=3\n"
|
"fixchilds=3\n"
|
||||||
"lock_mouse_top_left=true\n"
|
"lock_mouse_top_left=true\n"
|
||||||
"singlecpu=false\n"
|
|
||||||
"limiter_type=2\n"
|
"limiter_type=2\n"
|
||||||
"game_handles_close=true\n"
|
"game_handles_close=true\n"
|
||||||
"maxgameticks=59\n"
|
"maxgameticks=59\n"
|
||||||
"anti_aliased_fonts_min_size=99\n"
|
"anti_aliased_fonts_min_size=99\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Rent-A-Hero\n"
|
|
||||||
"[Rent-A-Hero]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; ROAD RASH\n"
|
"; ROAD RASH\n"
|
||||||
"[RoadRash]\n"
|
"[RoadRash]\n"
|
||||||
"adjmouse=true\n"
|
"adjmouse=true\n"
|
||||||
"nonexclusive=true\n"
|
"nonexclusive=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Rising Lands (patched)\n"
|
|
||||||
"[Rising]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Robin Hood - The Legend of Sherwood (GOG)\n"
|
"; Robin Hood - The Legend of Sherwood (GOG)\n"
|
||||||
"[Game/4]\n"
|
"[Game/4]\n"
|
||||||
"checkfile=.\\Robin Hood.exe\n"
|
"checkfile=.\\Robin Hood.exe\n"
|
||||||
"singlecpu=false\n"
|
"singlecpu=false\n"
|
||||||
"fix_not_responding=true\n"
|
"fix_not_responding=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Roland Garros 98 (software mode)\n"
|
|
||||||
"[rg98]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Robin Hood - The Legend of Sherwood (Steam)\n"
|
"; Robin Hood - The Legend of Sherwood (Steam)\n"
|
||||||
"[_rh]\n"
|
"[_rh]\n"
|
||||||
"singlecpu=false\n"
|
"singlecpu=false\n"
|
||||||
@ -1625,7 +1573,6 @@ static void cfg_create_ini()
|
|||||||
"\n"
|
"\n"
|
||||||
"; Swarog\n"
|
"; Swarog\n"
|
||||||
"[Swarog]\n"
|
"[Swarog]\n"
|
||||||
"singlecpu=false\n"
|
|
||||||
"maxfps=60\n"
|
"maxfps=60\n"
|
||||||
"maxgameticks=60\n"
|
"maxgameticks=60\n"
|
||||||
"minfps=-1\n"
|
"minfps=-1\n"
|
||||||
@ -1744,10 +1691,6 @@ static void cfg_create_ini()
|
|||||||
"maxgameticks=30\n"
|
"maxgameticks=30\n"
|
||||||
"limiter_type=4\n"
|
"limiter_type=4\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; The Curse Of Monkey Island\n"
|
|
||||||
"[COMI]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; The Tone Rebellion\n"
|
"; The Tone Rebellion\n"
|
||||||
"[Float]\n"
|
"[Float]\n"
|
||||||
"hook_peekmessage=true\n"
|
"hook_peekmessage=true\n"
|
||||||
@ -1767,7 +1710,6 @@ static void cfg_create_ini()
|
|||||||
"; Virtual Springfield\n"
|
"; Virtual Springfield\n"
|
||||||
"[VIRTUAL]\n"
|
"[VIRTUAL]\n"
|
||||||
"game_handles_close=true\n"
|
"game_handles_close=true\n"
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
"\n"
|
||||||
"; Total Annihilation: Kingdoms\n"
|
"; Total Annihilation: Kingdoms\n"
|
||||||
"[Kingdoms]\n"
|
"[Kingdoms]\n"
|
||||||
@ -1779,10 +1721,6 @@ static void cfg_create_ini()
|
|||||||
"lock_mouse_top_left=true\n"
|
"lock_mouse_top_left=true\n"
|
||||||
"fixchilds=3\n"
|
"fixchilds=3\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; The Neverhood\n"
|
|
||||||
"[nhc]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; The X-Files DVD\n"
|
"; The X-Files DVD\n"
|
||||||
"[XFiles]\n"
|
"[XFiles]\n"
|
||||||
"windowed=true\n"
|
"windowed=true\n"
|
||||||
@ -1884,10 +1822,6 @@ static void cfg_create_ini()
|
|||||||
"[WH40K]\n"
|
"[WH40K]\n"
|
||||||
"maxgameticks=250\n"
|
"maxgameticks=250\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Weird War\n"
|
|
||||||
"[WeirdWar]\n"
|
|
||||||
"singlecpu=false\n"
|
|
||||||
"\n"
|
|
||||||
"; Wizardry 8\n"
|
"; Wizardry 8\n"
|
||||||
"[Wiz8]\n"
|
"[Wiz8]\n"
|
||||||
"sirtech_hack=true\n"
|
"sirtech_hack=true\n"
|
||||||
@ -1914,7 +1848,6 @@ static void cfg_create_ini()
|
|||||||
"\n"
|
"\n"
|
||||||
"; Jeff Wayne's 'The War Of The Worlds'\n"
|
"; Jeff Wayne's 'The War Of The Worlds'\n"
|
||||||
"[WoW]\n"
|
"[WoW]\n"
|
||||||
"singlecpu=false\n"
|
|
||||||
"minfps=-1\n"
|
"minfps=-1\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Zeus and Poseidon\n"
|
"; Zeus and Poseidon\n"
|
||||||
@ -1924,7 +1857,6 @@ static void cfg_create_ini()
|
|||||||
"; Zork Nemesis\n"
|
"; Zork Nemesis\n"
|
||||||
"[znemesis]\n"
|
"[znemesis]\n"
|
||||||
"fix_not_responding=true\n"
|
"fix_not_responding=true\n"
|
||||||
"singlecpu=false\n"
|
|
||||||
"maxgameticks=60\n"
|
"maxgameticks=60\n"
|
||||||
"limiter_type=4\n"
|
"limiter_type=4\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
12
src/dd.c
12
src/dd.c
@ -1824,7 +1824,17 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
|
|||||||
|
|
||||||
if (g_config.singlecpu)
|
if (g_config.singlecpu)
|
||||||
{
|
{
|
||||||
SetProcessAffinityMask(proc, 1);
|
if (!IsWine() && IsWindows11OrGreater())
|
||||||
|
{
|
||||||
|
if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity))
|
||||||
|
SetProcessAffinityMask(proc, system_affinity);
|
||||||
|
|
||||||
|
util_set_process_affinity();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetProcessAffinityMask(proc, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity))
|
else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity))
|
||||||
{
|
{
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "crc32.h"
|
#include "crc32.h"
|
||||||
#include "dllmain.h"
|
#include "dllmain.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "delay_imports.h"
|
||||||
|
|
||||||
|
|
||||||
double g_dbg_frame_time = 0;
|
double g_dbg_frame_time = 0;
|
||||||
@ -89,10 +90,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception)
|
|||||||
HMODULE mod = NULL;
|
HMODULE mod = NULL;
|
||||||
char filename[MAX_PATH] = { 0 };
|
char filename[MAX_PATH] = { 0 };
|
||||||
|
|
||||||
BOOL(WINAPI * getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) =
|
if (delay_GetModuleHandleExA && delay_GetModuleHandleExA(
|
||||||
(void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA");
|
|
||||||
|
|
||||||
if (getModuleHandleExA && getModuleHandleExA(
|
|
||||||
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||||
exception->ExceptionRecord->ExceptionAddress,
|
exception->ExceptionRecord->ExceptionAddress,
|
||||||
&mod))
|
&mod))
|
||||||
|
30
src/delay_imports.c
Normal file
30
src/delay_imports.c
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
#include "versionhelpers.h"
|
||||||
|
#include "delay_imports.h"
|
||||||
|
|
||||||
|
NTQUERYINFORMATIONTHREADPROC delay_NtQueryInformationThread;
|
||||||
|
RTLVERIFYVERSIONINFOPROC delay_RtlVerifyVersionInfo;
|
||||||
|
WINE_GET_VERSIONPROC delay_wine_get_version;
|
||||||
|
WINE_GET_HOST_VERSIONPROC delay_wine_get_host_version;
|
||||||
|
|
||||||
|
VERSETCONDITIONMASKPROC delay_VerSetConditionMask;
|
||||||
|
GETMODULEHANDLEEXAPROC delay_GetModuleHandleExA;
|
||||||
|
|
||||||
|
void delay_imports_init()
|
||||||
|
{
|
||||||
|
HMODULE mod = GetModuleHandleA("ntdll.dll");
|
||||||
|
if (mod)
|
||||||
|
{
|
||||||
|
delay_NtQueryInformationThread = (NTQUERYINFORMATIONTHREADPROC)GetProcAddress(mod, "NtQueryInformationThread");
|
||||||
|
delay_RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo");
|
||||||
|
delay_wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version");
|
||||||
|
delay_wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version");
|
||||||
|
}
|
||||||
|
|
||||||
|
mod = GetModuleHandleA("Kernel32.dll");
|
||||||
|
if (mod)
|
||||||
|
{
|
||||||
|
delay_VerSetConditionMask = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask");
|
||||||
|
delay_GetModuleHandleExA = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA");
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,7 @@
|
|||||||
#include "indeo.h"
|
#include "indeo.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "versionhelpers.h"
|
#include "versionhelpers.h"
|
||||||
|
#include "delay_imports.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
|
|
||||||
|
|
||||||
@ -33,7 +34,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|||||||
{
|
{
|
||||||
g_ddraw_module = hDll;
|
g_ddraw_module = hDll;
|
||||||
|
|
||||||
verhelp_init();
|
delay_imports_init();
|
||||||
|
|
||||||
if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0))
|
if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0))
|
||||||
{
|
{
|
||||||
@ -180,6 +181,13 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
{
|
||||||
|
if (g_config.singlecpu && !IsWine() && IsWindows11OrGreater())
|
||||||
|
{
|
||||||
|
util_set_thread_affinity(GetCurrentThreadId());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
116
src/utils.c
116
src/utils.c
@ -2,6 +2,7 @@
|
|||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <tlhelp32.h>
|
||||||
#include "ddraw.h"
|
#include "ddraw.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "dd.h"
|
#include "dd.h"
|
||||||
@ -12,6 +13,7 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "versionhelpers.h"
|
#include "versionhelpers.h"
|
||||||
|
#include "delay_imports.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -71,6 +73,85 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void util_set_process_affinity()
|
||||||
|
{
|
||||||
|
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
|
||||||
|
if (snap == INVALID_HANDLE_VALUE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
THREADENTRY32 entry = { 0 };
|
||||||
|
entry.dwSize = sizeof(THREADENTRY32);
|
||||||
|
|
||||||
|
if (!Thread32First(snap, &entry))
|
||||||
|
{
|
||||||
|
CloseHandle(snap);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (entry.th32OwnerProcessID == GetCurrentProcessId())
|
||||||
|
{
|
||||||
|
util_set_thread_affinity(entry.th32ThreadID);
|
||||||
|
}
|
||||||
|
} while (Thread32Next(snap, &entry));
|
||||||
|
|
||||||
|
CloseHandle(snap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void util_set_thread_affinity(DWORD tid)
|
||||||
|
{
|
||||||
|
HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid);
|
||||||
|
if (thread)
|
||||||
|
{
|
||||||
|
void* start = NULL;
|
||||||
|
NTSTATUS status = STATUS_PENDING;
|
||||||
|
|
||||||
|
if (delay_NtQueryInformationThread)
|
||||||
|
{
|
||||||
|
status =
|
||||||
|
delay_NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == STATUS_SUCCESS && start && delay_GetModuleHandleExA)
|
||||||
|
{
|
||||||
|
char game_exe_path[MAX_PATH] = { 0 };
|
||||||
|
char game_dir[MAX_PATH] = { 0 };
|
||||||
|
|
||||||
|
if (GetModuleFileNameA(NULL, game_exe_path, sizeof(game_exe_path)))
|
||||||
|
{
|
||||||
|
_splitpath(game_exe_path, NULL, game_dir, NULL, NULL);
|
||||||
|
|
||||||
|
char mod_path[MAX_PATH] = { 0 };
|
||||||
|
char mod_dir[MAX_PATH] = { 0 };
|
||||||
|
char mod_filename[MAX_PATH] = { 0 };
|
||||||
|
HMODULE mod = NULL;
|
||||||
|
|
||||||
|
if (delay_GetModuleHandleExA(
|
||||||
|
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, start, &mod))
|
||||||
|
{
|
||||||
|
if (GetModuleFileNameA(mod, mod_path, sizeof(mod_path)))
|
||||||
|
{
|
||||||
|
_splitpath(mod_path, NULL, mod_dir, mod_filename, NULL);
|
||||||
|
|
||||||
|
if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 ||
|
||||||
|
_strcmpi(mod_filename, "WINMM") == 0)
|
||||||
|
{
|
||||||
|
SetThreadAffinityMask(thread, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetThreadAffinityMask(thread, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(thread);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void util_pull_messages()
|
void util_pull_messages()
|
||||||
{
|
{
|
||||||
if (g_config.fix_not_responding &&
|
if (g_config.fix_not_responding &&
|
||||||
@ -183,10 +264,7 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name)
|
|||||||
|
|
||||||
BOOL util_caller_is_ddraw_wrapper(void* return_address)
|
BOOL util_caller_is_ddraw_wrapper(void* return_address)
|
||||||
{
|
{
|
||||||
BOOL (WINAPI *getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) =
|
if (!delay_GetModuleHandleExA)
|
||||||
(void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA");
|
|
||||||
|
|
||||||
if (!getModuleHandleExA)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate");
|
void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate");
|
||||||
@ -200,9 +278,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
|
|||||||
HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll");
|
HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll");
|
||||||
if (D3dHook_dll)
|
if (D3dHook_dll)
|
||||||
{
|
{
|
||||||
if ((getModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) ||
|
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) ||
|
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll))
|
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll))
|
||||||
{
|
{
|
||||||
MessageBoxA(
|
MessageBoxA(
|
||||||
NULL,
|
NULL,
|
||||||
@ -218,9 +296,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
|
|||||||
HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll");
|
HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll");
|
||||||
if (wndmode_dll)
|
if (wndmode_dll)
|
||||||
{
|
{
|
||||||
if ((getModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) ||
|
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) ||
|
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll))
|
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll))
|
||||||
{
|
{
|
||||||
MessageBoxA(
|
MessageBoxA(
|
||||||
NULL,
|
NULL,
|
||||||
@ -236,9 +314,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
|
|||||||
HMODULE windmode_dll = GetModuleHandleA("windmode.dll");
|
HMODULE windmode_dll = GetModuleHandleA("windmode.dll");
|
||||||
if (windmode_dll)
|
if (windmode_dll)
|
||||||
{
|
{
|
||||||
if ((getModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) ||
|
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) ||
|
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll))
|
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll))
|
||||||
{
|
{
|
||||||
MessageBoxA(
|
MessageBoxA(
|
||||||
NULL,
|
NULL,
|
||||||
@ -254,9 +332,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
|
|||||||
HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll");
|
HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll");
|
||||||
if (dxwnd_dll)
|
if (dxwnd_dll)
|
||||||
{
|
{
|
||||||
if ((getModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) ||
|
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) ||
|
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll))
|
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll))
|
||||||
{
|
{
|
||||||
MessageBoxA(
|
MessageBoxA(
|
||||||
NULL,
|
NULL,
|
||||||
@ -272,9 +350,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
|
|||||||
HMODULE age_dll = GetModuleHandleA("age.dll");
|
HMODULE age_dll = GetModuleHandleA("age.dll");
|
||||||
if (age_dll)
|
if (age_dll)
|
||||||
{
|
{
|
||||||
if ((getModuleHandleExA(flags, return_address, &mod) && mod == age_dll) ||
|
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) ||
|
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) ||
|
||||||
(getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll))
|
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll))
|
||||||
{
|
{
|
||||||
HKEY hkey;
|
HKEY hkey;
|
||||||
LONG status =
|
LONG status =
|
||||||
|
@ -1,56 +1,30 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "versionhelpers.h"
|
#include "versionhelpers.h"
|
||||||
|
#include "delay_imports.h"
|
||||||
|
|
||||||
typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG);
|
|
||||||
typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE);
|
|
||||||
typedef const char* (CDECL* WINE_GET_VERSIONPROC)();
|
|
||||||
typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release);
|
|
||||||
|
|
||||||
static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo;
|
|
||||||
static VERSETCONDITIONMASKPROC VerSetConditionMaskProc;
|
|
||||||
static WINE_GET_VERSIONPROC wine_get_version;
|
|
||||||
static WINE_GET_HOST_VERSIONPROC wine_get_host_version;
|
|
||||||
|
|
||||||
/* GetProcAddress is rather slow so we use a function to initialize it once on startup */
|
|
||||||
void verhelp_init()
|
|
||||||
{
|
|
||||||
HMODULE mod = GetModuleHandleA("ntdll.dll");
|
|
||||||
if (mod)
|
|
||||||
{
|
|
||||||
RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo");
|
|
||||||
wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version");
|
|
||||||
wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version");
|
|
||||||
}
|
|
||||||
|
|
||||||
mod = GetModuleHandleA("Kernel32.dll");
|
|
||||||
if (mod)
|
|
||||||
{
|
|
||||||
VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask)
|
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask)
|
||||||
{
|
{
|
||||||
return RtlVerifyVersionInfo ?
|
return delay_RtlVerifyVersionInfo ?
|
||||||
RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 :
|
delay_RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 :
|
||||||
VerifyVersionInfoW(versionInfo, typeMask, conditionMask);
|
VerifyVersionInfoW(versionInfo, typeMask, conditionMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition)
|
ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition)
|
||||||
{
|
{
|
||||||
return VerSetConditionMaskProc ? VerSetConditionMaskProc(ConditionMask, TypeMask, Condition) : 0;
|
return delay_VerSetConditionMask ? delay_VerSetConditionMask(ConditionMask, TypeMask, Condition) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* verhelp_wine_get_version()
|
const char* verhelp_wine_get_version()
|
||||||
{
|
{
|
||||||
return wine_get_version ? wine_get_version() : NULL;
|
return delay_wine_get_version ? delay_wine_get_version() : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void verhelp_wine_get_host_version(const char** sysname, const char** release)
|
void verhelp_wine_get_host_version(const char** sysname, const char** release)
|
||||||
{
|
{
|
||||||
if (wine_get_host_version)
|
if (delay_wine_get_host_version)
|
||||||
{
|
{
|
||||||
wine_get_host_version(sysname, release);
|
delay_wine_get_host_version(sysname, release);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user