From 4323e401d8c330c0187019d40e30a931a71c2633 Mon Sep 17 00:00:00 2001 From: Silent Date: Mon, 26 Oct 2020 20:51:19 +0100 Subject: [PATCH 1/2] Thread safety fixes for RtlCriticalSection --- src/core/kernel/exports/EmuKrnlRtl.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/core/kernel/exports/EmuKrnlRtl.cpp b/src/core/kernel/exports/EmuKrnlRtl.cpp index df5f8ba5e..8f90196ac 100644 --- a/src/core/kernel/exports/EmuKrnlRtl.cpp +++ b/src/core/kernel/exports/EmuKrnlRtl.cpp @@ -684,8 +684,7 @@ XBSYSAPI EXPORTNUM(277) xbox::void_xt NTAPI xbox::RtlEnterCriticalSection HANDLE thread = (HANDLE)KeGetCurrentThread(); - CriticalSection->LockCount++; - if(CriticalSection->LockCount == 0) { + if(InterlockedIncrement(reinterpret_cast(&CriticalSection->LockCount)) == 0) { CriticalSection->OwningThread = thread; CriticalSection->RecursionCount = 1; } @@ -1228,10 +1227,10 @@ XBSYSAPI EXPORTNUM(294) xbox::void_xt NTAPI xbox::RtlLeaveCriticalSection LOG_FUNC_ONE_ARG(CriticalSection); CriticalSection->RecursionCount--; - CriticalSection->LockCount--; + LONG count = InterlockedDecrement(reinterpret_cast(&CriticalSection->LockCount)); if(CriticalSection->RecursionCount == 0) { CriticalSection->OwningThread = 0; - if(CriticalSection->LockCount >= 0) { + if(count >= 0) { KeSetEvent((PRKEVENT)CriticalSection, (KPRIORITY)1, (boolean_xt)0); } } @@ -1647,14 +1646,14 @@ XBSYSAPI EXPORTNUM(306) xbox::boolean_xt NTAPI xbox::RtlTryEnterCriticalSection BOOLEAN ret = false; HANDLE thread = (HANDLE)KeGetCurrentThread(); - if(InterlockedCompareExchange((::PLONG)(&CriticalSection->LockCount), 0, -1) == -1) { + if(InterlockedCompareExchange(reinterpret_cast(&CriticalSection->LockCount), 0, -1) == -1) { CriticalSection->OwningThread = thread; CriticalSection->RecursionCount = 1; ret = true; } else { if(CriticalSection->OwningThread == thread) { - CriticalSection->LockCount++; + InterlockedIncrement(reinterpret_cast(&CriticalSection->LockCount)); CriticalSection->RecursionCount++; ret = true; } From dd0e331528c664233f466faef80be4713726fd71 Mon Sep 17 00:00:00 2001 From: Silent Date: Mon, 26 Oct 2020 20:55:24 +0100 Subject: [PATCH 2/2] Thread safety fixes for ERWLOCK --- src/core/kernel/exports/EmuKrnlEx.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/core/kernel/exports/EmuKrnlEx.cpp b/src/core/kernel/exports/EmuKrnlEx.cpp index 93aacc396..526d36e0c 100644 --- a/src/core/kernel/exports/EmuKrnlEx.cpp +++ b/src/core/kernel/exports/EmuKrnlEx.cpp @@ -148,8 +148,7 @@ XBSYSAPI EXPORTNUM(12) xbox::void_xt NTAPI xbox::ExAcquireReadWriteLockExclusive LOG_FUNC_ONE_ARG(ReadWriteLock); bool interrupt_mode = DisableInterrupts(); - ReadWriteLock->LockCount++; - if (ReadWriteLock->LockCount != 0) { + if (InterlockedIncrement(reinterpret_cast(&ReadWriteLock->LockCount)) != 0) { ReadWriteLock->WritersWaitingCount++; RestoreInterruptMode(interrupt_mode); KeWaitForSingleObject( @@ -180,8 +179,7 @@ XBSYSAPI EXPORTNUM(13) xbox::void_xt NTAPI xbox::ExAcquireReadWriteLockShared bool must_wait_on_active_write = ReadWriteLock->ReadersEntryCount == 0; bool must_wait_on_queued_write = (ReadWriteLock->ReadersEntryCount != 0) && (ReadWriteLock->WritersWaitingCount != 0); bool must_wait = must_wait_on_active_write || must_wait_on_queued_write; - ReadWriteLock->LockCount++; - if ((ReadWriteLock->LockCount != 0) && must_wait) { + if (InterlockedIncrement(reinterpret_cast(&ReadWriteLock->LockCount)) != 0 && must_wait) { ReadWriteLock->ReadersWaitingCount++; RestoreInterruptMode(interrupt_mode); #if 0 //FIXME - Enable once KeReleaseSempahore is implemented (used in ExFreeReadWriteLock for Sharedlocks). @@ -587,8 +585,7 @@ XBSYSAPI EXPORTNUM(28) xbox::void_xt NTAPI xbox::ExReleaseReadWriteLock LOG_FUNC_ONE_ARG(ReadWriteLock); bool interrupt_mode = DisableInterrupts(); - ReadWriteLock->LockCount--; - if (ReadWriteLock->LockCount == -1) { + if (InterlockedDecrement(reinterpret_cast(&ReadWriteLock->LockCount)) == -1) { ReadWriteLock->ReadersEntryCount = 0; RestoreInterruptMode(interrupt_mode); return;