r5sdk/r5dev/tier0/threadtools.h

62 lines
2.6 KiB
C
Raw Normal View History

#ifndef THREADTOOLS_H
#define THREADTOOLS_H
//=============================================================================
class CThreadFastMutex;
inline CMemory p_MutexInternal_WaitForLock;
inline auto v_MutexInternal_WaitForLock = p_MutexInternal_WaitForLock.RCast<int (*)(CThreadFastMutex* mutex)>();
inline CMemory p_MutexInternal_ReleaseWaiter;
inline auto v_MutexInternal_ReleaseWaiter = p_MutexInternal_ReleaseWaiter.RCast<int (*)(CThreadFastMutex* mutex)>();
///////////////////////////////////////////////////////////////////////////////
class CThreadFastMutex
{
public:
int WaitForLock(void) {
return v_MutexInternal_WaitForLock(this);
}
int ReleaseWaiter(void) {
return v_MutexInternal_ReleaseWaiter(this);
}
2022-05-18 01:00:46 +02:00
inline uint32 GetOwnerId(void) const { return m_nOwnerID; }
inline int GetDepth(void) const { return m_nDepth; }
inline int GetAddend(void) const { return m_lAddend; }
inline HANDLE GetSemaphore(void) const { return m_hSemaphore; }
private:
2022-05-18 01:00:46 +02:00
volatile uint32_t m_nOwnerID;
2022-05-21 11:15:36 +02:00
int m_nDepth;
volatile int m_lAddend;
2022-05-21 11:15:36 +02:00
HANDLE m_hSemaphore;
};
///////////////////////////////////////////////////////////////////////////////
class VThreadTools : public IDetour
{
virtual void GetAdr(void) const
{
spdlog::debug("| FUN: CThreadFastMutex::WaitForLock : {:#18x} |\n", p_MutexInternal_WaitForLock.GetPtr());
spdlog::debug("| FUN: CThreadFastMutex::ReleaseWaiter : {:#18x} |\n", p_MutexInternal_ReleaseWaiter.GetPtr());
spdlog::debug("+----------------------------------------------------------------+\n");
}
virtual void GetFun(void) const
{
p_MutexInternal_WaitForLock = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x00\x48\x89\x74\x24\x00\x57\x48\x83\xEC\x20\x48\x8B\xD9\xFF\x15\x00\x00\x00\x00"), "xxxx?xxxx?xxxxxxxxxx????");
p_MutexInternal_ReleaseWaiter = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x40\x53\x48\x83\xEC\x20\x8B\x41\x04\x48\x8B\xD9\x83\xE8\x01"), "xxxxxxxxxxxxxxx");
v_MutexInternal_WaitForLock = p_MutexInternal_WaitForLock.RCast<int (*)(CThreadFastMutex*)>(); /*48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 48 8B D9 FF 15 ?? ?? ?? ??*/
v_MutexInternal_ReleaseWaiter = p_MutexInternal_ReleaseWaiter.RCast<int (*)(CThreadFastMutex*)>(); /*40 53 48 83 EC 20 8B 41 04 48 8B D9 83 E8 01*/
}
virtual void GetVar(void) const { }
virtual void GetCon(void) const { }
virtual void Attach(void) const { }
virtual void Detach(void) const { }
};
///////////////////////////////////////////////////////////////////////////////
REGISTER(VThreadTools);
#endif // THREADTOOLS_H