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:
parent
da2430b7d0
commit
30e8b70f4d
@ -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);
|
||||||
|
9
src/dd.c
9
src/dd.c
@ -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))
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
37
src/utils.c
37
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"
|
||||||
@ -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 &&
|
||||||
|
Loading…
x
Reference in New Issue
Block a user