1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

add workaround for windows 11 freeze issues

This commit is contained in:
FunkyFr3sh 2024-12-30 04:32:53 +01:00
parent da2430b7d0
commit 30e8b70f4d
4 changed files with 54 additions and 2 deletions

View File

@ -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);

View File

@ -1824,7 +1824,14 @@ 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())
{
util_set_process_affinity();
}
else
{
SetProcessAffinityMask(proc, 1);
}
} }
else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity))
{ {

View File

@ -180,6 +180,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;

View File

@ -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"
@ -71,6 +72,42 @@ 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)
{
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 &&