fix thread calls issue from GetNativeHandle to keep special handle return
This commit is contained in:
parent
7e5f9a7cb7
commit
e208c73586
|
@ -1225,7 +1225,7 @@ XBSYSAPI EXPORTNUM(124) xbox::long_xt NTAPI xbox::KeQueryBasePriorityThread
|
||||||
KiLockDispatcherDatabase(&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(PspGetCurrentThread()->UniqueThread);
|
const auto& nativeHandle = GetNativeHandle<true>(PspGetCurrentThread()->UniqueThread);
|
||||||
long_xt ret = GetThreadPriority(*nativeHandle);
|
long_xt ret = GetThreadPriority(*nativeHandle);
|
||||||
|
|
||||||
KiUnlockDispatcherDatabase(OldIrql);
|
KiUnlockDispatcherDatabase(OldIrql);
|
||||||
|
@ -1652,7 +1652,7 @@ XBSYSAPI EXPORTNUM(143) xbox::long_xt NTAPI xbox::KeSetBasePriorityThread
|
||||||
KiLockDispatcherDatabase(&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(PspGetCurrentThread()->UniqueThread);
|
const auto &nativeHandle = GetNativeHandle<true>(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,
|
||||||
|
@ -1693,7 +1693,7 @@ XBSYSAPI EXPORTNUM(144) xbox::boolean_xt NTAPI xbox::KeSetDisableBoostThread
|
||||||
KiLockDispatcherDatabase(&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(PspGetCurrentThread()->UniqueThread);
|
const auto &nativeHandle = GetNativeHandle<true>(PspGetCurrentThread()->UniqueThread);
|
||||||
|
|
||||||
boolean_xt prevDisableBoost = Thread->DisableBoost;
|
boolean_xt prevDisableBoost = Thread->DisableBoost;
|
||||||
Thread->DisableBoost = (CHAR)Disable;
|
Thread->DisableBoost = (CHAR)Disable;
|
||||||
|
|
|
@ -51,12 +51,27 @@ void RemoveXboxHandle(xbox::HANDLE xhandle)
|
||||||
assert(ret == 1);
|
assert(ret == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<bool NoConversion>
|
||||||
std::optional<HANDLE> GetNativeHandle(xbox::HANDLE xhandle)
|
std::optional<HANDLE> GetNativeHandle(xbox::HANDLE xhandle)
|
||||||
{
|
{
|
||||||
// If SourceHandle is -2 = NtCurrentThread, then we are searching the handle of this thread
|
// If SourceHandle is -2 = NtCurrentThread, then we are searching the handle of this thread
|
||||||
// Test case: Metal Slug 3
|
// Test case: Metal Slug 3
|
||||||
if (xhandle == NtCurrentThread()) {
|
if (xhandle == NtCurrentThread()) {
|
||||||
xhandle = xbox::PspGetCurrentThread()->UniqueThread;
|
// Only used for threads as Windows doesn't allow non-special handle for same thread.
|
||||||
|
if (NoConversion) {
|
||||||
|
return xhandle;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
xhandle = xbox::PspGetCurrentThread()->UniqueThread;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If xhandle is not special handle, check if it's the same as current thread.
|
||||||
|
// Only used for threads as Windows doesn't allow non-special handle for same thread.
|
||||||
|
// This will only triggered within kernel functions i.e. KeSetDisableBoostThread and KeSetBasePriorityThread.
|
||||||
|
else if (NoConversion) {
|
||||||
|
if (xhandle == xbox::PspGetCurrentThread()->UniqueThread) {
|
||||||
|
return NtCurrentThread();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_lock<std::shared_mutex> lck(g_MapMtx);
|
std::shared_lock<std::shared_mutex> lck(g_MapMtx);
|
||||||
|
@ -68,3 +83,5 @@ std::optional<HANDLE> GetNativeHandle(xbox::HANDLE xhandle)
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
template std::optional<HANDLE> GetNativeHandle<true>(xbox::HANDLE xhandle);
|
||||||
|
template std::optional<HANDLE> GetNativeHandle<false>(xbox::HANDLE xhandle);
|
||||||
|
|
|
@ -31,4 +31,4 @@
|
||||||
|
|
||||||
void RegisterXboxHandle(xbox::HANDLE xhandle, HANDLE nhandle);
|
void RegisterXboxHandle(xbox::HANDLE xhandle, HANDLE nhandle);
|
||||||
void RemoveXboxHandle(xbox::HANDLE xhandle);
|
void RemoveXboxHandle(xbox::HANDLE xhandle);
|
||||||
std::optional<HANDLE> GetNativeHandle(xbox::HANDLE xhandle);
|
template<bool NoConversion = false> std::optional<HANDLE> GetNativeHandle(xbox::HANDLE xhandle);
|
||||||
|
|
Loading…
Reference in New Issue