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("CreateFiber", xbox::EMUPATCH(CreateFiber), PATCH_IS_FIBER),
PATCH_ENTRY("DeleteFiber", xbox::EMUPATCH(DeleteFiber), PATCH_IS_FIBER), PATCH_ENTRY("DeleteFiber", xbox::EMUPATCH(DeleteFiber), PATCH_IS_FIBER),
PATCH_ENTRY("GetExitCodeThread", xbox::EMUPATCH(GetExitCodeThread), PATCH_ALWAYS), 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("OutputDebugStringA", xbox::EMUPATCH(OutputDebugStringA), PATCH_ALWAYS),
//PATCH_ENTRY("RaiseException", xbox::EMUPATCH(RaiseException), PATCH_ALWAYS), //PATCH_ENTRY("RaiseException", xbox::EMUPATCH(RaiseException), PATCH_ALWAYS),
PATCH_ENTRY("SetThreadPriority", xbox::EMUPATCH(SetThreadPriority), PATCH_ALWAYS), //PATCH_ENTRY("SetThreadPriority", xbox::EMUPATCH(SetThreadPriority), PATCH_ALWAYS),
PATCH_ENTRY("SetThreadPriorityBoost", xbox::EMUPATCH(SetThreadPriorityBoost), PATCH_ALWAYS), //PATCH_ENTRY("SetThreadPriorityBoost", xbox::EMUPATCH(SetThreadPriorityBoost), PATCH_ALWAYS),
PATCH_ENTRY("SignalObjectAndWait", xbox::EMUPATCH(SignalObjectAndWait), PATCH_ALWAYS), PATCH_ENTRY("SignalObjectAndWait", xbox::EMUPATCH(SignalObjectAndWait), PATCH_ALWAYS),
PATCH_ENTRY("SwitchToFiber", xbox::EMUPATCH(SwitchToFiber), PATCH_IS_FIBER), PATCH_ENTRY("SwitchToFiber", xbox::EMUPATCH(SwitchToFiber), PATCH_IS_FIBER),
PATCH_ENTRY("XMountMUA", xbox::EMUPATCH(XMountMUA), PATCH_ALWAYS), PATCH_ENTRY("XMountMUA", xbox::EMUPATCH(XMountMUA), PATCH_ALWAYS),

View File

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

View File

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

View File

@ -408,10 +408,10 @@ XBSYSAPI EXPORTNUM(143) long_xt NTAPI KeSetBasePriorityThread
IN long_xt Priority IN long_xt Priority
); );
XBSYSAPI EXPORTNUM(144) ulong_xt NTAPI KeSetDisableBoostThread XBSYSAPI EXPORTNUM(144) boolean_xt NTAPI KeSetDisableBoostThread
( (
IN PKTHREAD Thread, 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\EmuFile.h" // For IsEmuHandle(), NtStatusToString()
#include "core\kernel\support\NativeHandle.h" #include "core\kernel\support\NativeHandle.h"
#include "Timer.h" #include "Timer.h"
#include "Util.h"
#include <chrono> #include <chrono>
#include <thread> #include <thread>
@ -1220,9 +1221,16 @@ XBSYSAPI EXPORTNUM(124) xbox::long_xt NTAPI xbox::KeQueryBasePriorityThread
{ {
LOG_FUNC_ONE_ARG(Thread); 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_ARG_OUT(Priority)
LOG_FUNC_END; LOG_FUNC_END;
KIRQL oldIRQL;
KiLockDispatcherDatabase(&oldIRQL);
// It cannot fail because all thread handles are created by ob // 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); LONG ret = GetThreadPriority(*nativeHandle);
// This would work normally, but it will slow down the emulation, // 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)! // don't do that if the priority is higher then normal (so our own)!
if((Priority <= THREAD_PRIORITY_NORMAL) && ((HANDLE)Thread != GetCurrentThread())) { if(Priority <= THREAD_PRIORITY_NORMAL) {
SetThreadPriority(*nativeHandle, Priority); 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); RETURN(ret);
} }
XBSYSAPI EXPORTNUM(144) xbox::ulong_xt NTAPI xbox::KeSetDisableBoostThread XBSYSAPI EXPORTNUM(144) xbox::boolean_xt NTAPI xbox::KeSetDisableBoostThread
( (
IN PKTHREAD Thread, IN PKTHREAD Thread,
IN ulong_xt Disable IN boolean_xt Disable
) )
{ {
LOG_FUNC_BEGIN LOG_FUNC_BEGIN
@ -1667,9 +1692,17 @@ XBSYSAPI EXPORTNUM(144) xbox::ulong_xt NTAPI xbox::KeSetDisableBoostThread
KIRQL oldIRQL; KIRQL oldIRQL;
KiLockDispatcherDatabase(&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; Thread->DisableBoost = (CHAR)Disable;
BOOL bRet = SetThreadPriorityBoost(*nativeHandle, Disable);
if (!bRet) {
EmuLog(LOG_LEVEL::WARNING, "SetThreadPriorityBoost failed: %s", WinError2Str().c_str());
}
KiUnlockDispatcherDatabase(oldIRQL); KiUnlockDispatcherDatabase(oldIRQL);
RETURN(prevDisableBoost); RETURN(prevDisableBoost);