mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-25 01:57:47 +01:00
only SetThreadAffinityMask for threads created by local modules
This commit is contained in:
parent
78b2da620a
commit
354b688a2c
@ -1,20 +1,24 @@
|
|||||||
#ifndef DELAY_IMPORTS_H
|
#ifndef DELAY_IMPORTS_H
|
||||||
#define DELAY_IMPORTS_H
|
#define DELAY_IMPORTS_H
|
||||||
|
|
||||||
|
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
|
||||||
#define ThreadQuerySetWin32StartAddress 9
|
#define ThreadQuerySetWin32StartAddress 9
|
||||||
|
|
||||||
typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG);
|
typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG);
|
||||||
typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE);
|
|
||||||
typedef const char* (CDECL* WINE_GET_VERSIONPROC)();
|
typedef const char* (CDECL* WINE_GET_VERSIONPROC)();
|
||||||
typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release);
|
typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release);
|
||||||
typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG);
|
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 NtQueryInformationThread;
|
extern NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread;
|
||||||
extern RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo;
|
extern RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo;
|
||||||
extern WINE_GET_VERSIONPROC wine_get_version;
|
extern WINE_GET_VERSIONPROC wine_get_version;
|
||||||
extern WINE_GET_HOST_VERSIONPROC wine_get_host_version;
|
extern WINE_GET_HOST_VERSIONPROC wine_get_host_version;
|
||||||
|
|
||||||
extern VERSETCONDITIONMASKPROC VerSetConditionMaskProc;
|
extern VERSETCONDITIONMASKPROC VerSetConditionMaskProc;
|
||||||
|
extern GETMODULEHANDLEEXAPROC GetModuleHandleExAProc;
|
||||||
|
|
||||||
void imports_init();
|
void imports_init();
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ WINE_GET_VERSIONPROC wine_get_version;
|
|||||||
WINE_GET_HOST_VERSIONPROC wine_get_host_version;
|
WINE_GET_HOST_VERSIONPROC wine_get_host_version;
|
||||||
|
|
||||||
VERSETCONDITIONMASKPROC VerSetConditionMaskProc;
|
VERSETCONDITIONMASKPROC VerSetConditionMaskProc;
|
||||||
|
GETMODULEHANDLEEXAPROC GetModuleHandleExAProc;
|
||||||
|
|
||||||
void imports_init()
|
void imports_init()
|
||||||
{
|
{
|
||||||
@ -24,5 +25,6 @@ void imports_init()
|
|||||||
if (mod)
|
if (mod)
|
||||||
{
|
{
|
||||||
VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask");
|
VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask");
|
||||||
|
GetModuleHandleExAProc = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
45
src/utils.c
45
src/utils.c
@ -13,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"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -103,7 +104,49 @@ void util_set_thread_affinity(DWORD tid)
|
|||||||
HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid);
|
HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid);
|
||||||
if (thread)
|
if (thread)
|
||||||
{
|
{
|
||||||
SetThreadAffinityMask(thread, 1);
|
void* start = NULL;
|
||||||
|
NTSTATUS status = STATUS_PENDING;
|
||||||
|
|
||||||
|
if (NtQueryInformationThread)
|
||||||
|
{
|
||||||
|
status = NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == STATUS_SUCCESS && start && GetModuleHandleExAProc)
|
||||||
|
{
|
||||||
|
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 (GetModuleHandleExAProc(
|
||||||
|
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);
|
CloseHandle(thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user