unpatch SetThreadPriority, GetThreadPriority, SetThreadPriorityBoost
This commit is contained in:
parent
a791b7609c
commit
b39801df11
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue