unpatch SetThreadPriority, GetThreadPriority, SetThreadPriorityBoost

This commit is contained in:
RadWolfie 2022-01-15 03:15:55 -06:00 committed by ergo720
parent a791b7609c
commit b39801df11
5 changed files with 58 additions and 13 deletions

View File

@ -355,11 +355,11 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("CreateFiber", xbox::EMUPATCH(CreateFiber), PATCH_IS_FIBER),
PATCH_ENTRY("DeleteFiber", xbox::EMUPATCH(DeleteFiber), PATCH_IS_FIBER),
PATCH_ENTRY("GetExitCodeThread", xbox::EMUPATCH(GetExitCodeThread), PATCH_ALWAYS),
PATCH_ENTRY("GetThreadPriority", xbox::EMUPATCH(GetThreadPriority), PATCH_ALWAYS),
//PATCH_ENTRY("GetThreadPriority", xbox::EMUPATCH(GetThreadPriority), PATCH_ALWAYS),
PATCH_ENTRY("OutputDebugStringA", xbox::EMUPATCH(OutputDebugStringA), PATCH_ALWAYS),
//PATCH_ENTRY("RaiseException", xbox::EMUPATCH(RaiseException), PATCH_ALWAYS),
PATCH_ENTRY("SetThreadPriority", xbox::EMUPATCH(SetThreadPriority), PATCH_ALWAYS),
PATCH_ENTRY("SetThreadPriorityBoost", xbox::EMUPATCH(SetThreadPriorityBoost), PATCH_ALWAYS),
//PATCH_ENTRY("SetThreadPriority", xbox::EMUPATCH(SetThreadPriority), PATCH_ALWAYS),
//PATCH_ENTRY("SetThreadPriorityBoost", xbox::EMUPATCH(SetThreadPriorityBoost), PATCH_ALWAYS),
PATCH_ENTRY("SignalObjectAndWait", xbox::EMUPATCH(SignalObjectAndWait), PATCH_ALWAYS),
PATCH_ENTRY("SwitchToFiber", xbox::EMUPATCH(SwitchToFiber), PATCH_IS_FIBER),
PATCH_ENTRY("XMountMUA", xbox::EMUPATCH(XMountMUA), PATCH_ALWAYS),

View File

@ -896,6 +896,7 @@ xbox::dword_xt WINAPI xbox::EMUPATCH(XInputSetLightgunCalibration)
RETURN(ret);
}
#if 0
// ******************************************************************
// * patch: SetThreadPriorityBoost
// ******************************************************************
@ -923,7 +924,9 @@ xbox::bool_xt WINAPI xbox::EMUPATCH(SetThreadPriorityBoost)
RETURN(0);
}
}
#endif
#if 0
// ******************************************************************
// * patch: SetThreadPriority
// ******************************************************************
@ -951,8 +954,10 @@ xbox::bool_xt WINAPI xbox::EMUPATCH(SetThreadPriority)
RETURN(0);
}
}
#endif
#if 0
// ******************************************************************
// * patch: GetThreadPriority
// ******************************************************************
@ -976,6 +981,7 @@ int WINAPI xbox::EMUPATCH(GetThreadPriority)
RETURN(THREAD_PRIORITY_ERROR_RETURN);
}
}
#endif
// ******************************************************************
// * patch: GetExitCodeThread

View File

@ -509,6 +509,7 @@ xbox::bool_xt WINAPI EMUPATCH(CloseHandle)
HANDLE hObject
);
#if 0 // Handled by KeSetBasePriorityThread
// ******************************************************************
// * patch: SetThreadPriority
// ******************************************************************
@ -517,7 +518,9 @@ xbox::bool_xt WINAPI EMUPATCH(SetThreadPriority)
HANDLE hThread,
int nPriority
);
#endif
#if 0 // Handled by KeQueryBasePriorityThread
// ******************************************************************
// * patch: GetThreadPriority
// ******************************************************************
@ -525,7 +528,9 @@ int WINAPI EMUPATCH(GetThreadPriority)
(
HANDLE hThread
);
#endif
#if 0 // Handled by KeSetDisableBoostThread
// ******************************************************************
// * patch: SetThreadPriorityBoost
// ******************************************************************
@ -534,6 +539,7 @@ xbox::bool_xt WINAPI EMUPATCH(SetThreadPriorityBoost)
HANDLE hThread,
bool_xt DisablePriorityBoost
);
#endif
// ******************************************************************
// * patch: GetExitCodeThread

View File

@ -408,10 +408,10 @@ XBSYSAPI EXPORTNUM(143) long_xt NTAPI KeSetBasePriorityThread
IN long_xt Priority
);
XBSYSAPI EXPORTNUM(144) ulong_xt NTAPI KeSetDisableBoostThread
XBSYSAPI EXPORTNUM(144) boolean_xt NTAPI KeSetDisableBoostThread
(
IN PKTHREAD Thread,
IN ulong_xt Disable
IN boolean_xt Disable
);
// ******************************************************************

View File

@ -83,6 +83,7 @@ namespace NtDll
#include "core\kernel\support\EmuFile.h" // For IsEmuHandle(), NtStatusToString()
#include "core\kernel\support\NativeHandle.h"
#include "Timer.h"
#include "Util.h"
#include <chrono>
#include <thread>
@ -1220,9 +1221,16 @@ XBSYSAPI EXPORTNUM(124) xbox::long_xt NTAPI xbox::KeQueryBasePriorityThread
{
LOG_FUNC_ONE_ARG(Thread);
LOG_UNIMPLEMENTED();
KIRQL OldIrql;
KiLockDispatcherDatabase(&OldIrql);
RETURN(0);
// It cannot fail because all thread handles are created by ob
const auto& nativeHandle = GetNativeHandle(PspGetCurrentThread()->UniqueThread);
long_xt ret = GetThreadPriority(*nativeHandle);
KiUnlockDispatcherDatabase(OldIrql);
RETURN(ret);
}
// ******************************************************************
@ -1640,23 +1648,40 @@ XBSYSAPI EXPORTNUM(143) xbox::long_xt NTAPI xbox::KeSetBasePriorityThread
LOG_FUNC_ARG_OUT(Priority)
LOG_FUNC_END;
KIRQL oldIRQL;
KiLockDispatcherDatabase(&oldIRQL);
// It cannot fail because all thread handles are created by ob
const auto &nativeHandle = GetNativeHandle(reinterpret_cast<PETHREAD>(Thread)->UniqueThread);
const auto &nativeHandle = GetNativeHandle(PspGetCurrentThread()->UniqueThread);
LONG ret = GetThreadPriority(*nativeHandle);
// This would work normally, but it will slow down the emulation,
// don't do that if the priority is higher then normal (so our own)!
if((Priority <= THREAD_PRIORITY_NORMAL) && ((HANDLE)Thread != GetCurrentThread())) {
SetThreadPriority(*nativeHandle, Priority);
if(Priority <= THREAD_PRIORITY_NORMAL) {
HANDLE nhandle;
// Verify if the thread is the same as current thread.
// Then use special handle to correct the problem for Windows' call usage.
if (Thread == KeGetCurrentPrcb()->CurrentThread) {
nhandle = NtCurrentThread();
}
else {
nhandle = *nativeHandle;
}
BOOL result = SetThreadPriority(nhandle, Priority);
if (!result) {
EmuLog(LOG_LEVEL::WARNING, "SetThreadPriority failed: %s", WinError2Str().c_str());
}
}
KiUnlockDispatcherDatabase(oldIRQL);
RETURN(ret);
}
XBSYSAPI EXPORTNUM(144) xbox::ulong_xt NTAPI xbox::KeSetDisableBoostThread
XBSYSAPI EXPORTNUM(144) xbox::boolean_xt NTAPI xbox::KeSetDisableBoostThread
(
IN PKTHREAD Thread,
IN ulong_xt Disable
IN boolean_xt Disable
)
{
LOG_FUNC_BEGIN
@ -1667,9 +1692,17 @@ XBSYSAPI EXPORTNUM(144) xbox::ulong_xt NTAPI xbox::KeSetDisableBoostThread
KIRQL oldIRQL;
KiLockDispatcherDatabase(&oldIRQL);
ULONG prevDisableBoost = Thread->DisableBoost;
// It cannot fail because all thread handles are created by ob
const auto &nativeHandle = GetNativeHandle(PspGetCurrentThread()->UniqueThread);
boolean_xt prevDisableBoost = Thread->DisableBoost;
Thread->DisableBoost = (CHAR)Disable;
BOOL bRet = SetThreadPriorityBoost(*nativeHandle, Disable);
if (!bRet) {
EmuLog(LOG_LEVEL::WARNING, "SetThreadPriorityBoost failed: %s", WinError2Str().c_str());
}
KiUnlockDispatcherDatabase(oldIRQL);
RETURN(prevDisableBoost);