diff --git a/import/OpenXDK/include/xboxkrnl/ex.h b/import/OpenXDK/include/xboxkrnl/ex.h index 2be00ad40..ec4bd3dc3 100644 --- a/import/OpenXDK/include/xboxkrnl/ex.h +++ b/import/OpenXDK/include/xboxkrnl/ex.h @@ -12,7 +12,7 @@ #ifndef XBOXKRNL_EX_H #define XBOXKRNL_EX_H -XBSYSAPI EXPORTNUM(12) NTSTATUS NTAPI ExAcquireReadWriteLockExclusive +XBSYSAPI EXPORTNUM(12) VOID NTAPI ExAcquireReadWriteLockExclusive ( IN PERWLOCK ReadWriteLock ); diff --git a/src/core/kernel/exports/EmuKrnlEx.cpp b/src/core/kernel/exports/EmuKrnlEx.cpp index 46315a2bf..ed6092efe 100644 --- a/src/core/kernel/exports/EmuKrnlEx.cpp +++ b/src/core/kernel/exports/EmuKrnlEx.cpp @@ -144,17 +144,29 @@ static bool eeprom_data_is_valid(xboxkrnl::XC_VALUE_INDEX index) // * 0x000C - ExAcquireReadWriteLockExclusive() // ****************************************************************** // Source:APILogger - Uncertain -XBSYSAPI EXPORTNUM(12) xboxkrnl::NTSTATUS NTAPI xboxkrnl::ExAcquireReadWriteLockExclusive +XBSYSAPI EXPORTNUM(12) xboxkrnl::VOID NTAPI xboxkrnl::ExAcquireReadWriteLockExclusive ( IN PERWLOCK ReadWriteLock ) { LOG_FUNC_ONE_ARG(ReadWriteLock); - // KeWaitForSingleObject - LOG_UNIMPLEMENTED(); - - RETURN(S_OK); + bool interrupt_mode = DisableInterrupts(); + ReadWriteLock->LockCount++; + if (ReadWriteLock->LockCount != 0) { + ReadWriteLock->WritersWaitingCount++; + RestoreInterruptMode(interrupt_mode); + KeWaitForSingleObject( + &ReadWriteLock->WriterEvent, + Executive, + 0, + 0, + 0 + ); + } + else { + RestoreInterruptMode(interrupt_mode); + } } // ******************************************************************