Implement CriticalSections + KeWait + KeEvents* without host forwarding

This commit is contained in:
Luke Usher 2018-08-20 18:57:04 +01:00
parent 0620b1a983
commit 69527e5f8c
3 changed files with 21 additions and 19 deletions

View File

@ -1737,7 +1737,7 @@ PS_STATISTICS, *PPS_STATISTICS;
// ******************************************************************
typedef struct _RTL_CRITICAL_SECTION
{
DWORD Unknown[4]; // 0x00
DISPATCHER_HEADER Event; // 0x00
LONG LockCount; // 0x10
LONG RecursionCount; // 0x14
HANDLE OwningThread; // 0x18

View File

@ -130,14 +130,14 @@ xboxkrnl::ULONGLONG LARGE_INTEGER2ULONGLONG(xboxkrnl::LARGE_INTEGER value)
void FASTCALL KiWaitSatisfyAll
(
IN xboxkrnl::PRKWAIT_BLOCK WaitBlock
IN xboxkrnl::PKWAIT_BLOCK WaitBlock
)
{
using namespace xboxkrnl;
PKMUTANT Object;
PRKTHREAD Thread;
PRKWAIT_BLOCK WaitBlock1;
PKWAIT_BLOCK WaitBlock1;
WaitBlock1 = WaitBlock;
Thread = WaitBlock1->Thread;
@ -1611,7 +1611,7 @@ XBSYSAPI EXPORTNUM(145) xboxkrnl::LONG NTAPI xboxkrnl::KeSetEvent
if (IsListEmpty(&Event->Header.WaitListHead) != FALSE) {
Event->Header.SignalState = 1;
} else {
PRKWAIT_BLOCK WaitBlock = CONTAINING_RECORD(Event->Header.WaitListHead.Flink, KWAIT_BLOCK, WaitListEntry);
PKWAIT_BLOCK WaitBlock = CONTAINING_RECORD(Event->Header.WaitListHead.Flink, KWAIT_BLOCK, WaitListEntry);
if ((Event->Header.Type == NotificationEvent) ||
(WaitBlock->WaitType != WaitAny)) {
if (OldState == 0) {
@ -2025,7 +2025,7 @@ XBSYSAPI EXPORTNUM(158) xboxkrnl::NTSTATUS NTAPI xboxkrnl::KeWaitForMultipleObje
}
// Setup a timer for the thread
PRKTIMER Timer = &Thread->Timer;
PKTIMER Timer = &Thread->Timer;
PKWAIT_BLOCK WaitTimer = &Thread->TimerWaitBlock;
WaitBlock->NextWaitBlock = WaitTimer;
Timer->Header.WaitListHead.Flink = &WaitTimer->WaitListEntry;
@ -2204,7 +2204,7 @@ XBSYSAPI EXPORTNUM(159) xboxkrnl::NTSTATUS NTAPI xboxkrnl::KeWaitForSingleObject
}
// Setup a timer for the thread
PRKTIMER Timer = &Thread->Timer;
PKTIMER Timer = &Thread->Timer;
PKWAIT_BLOCK WaitTimer = &Thread->TimerWaitBlock;
WaitBlock->NextWaitBlock = WaitTimer;
Timer->Header.WaitListHead.Flink = &WaitTimer->WaitListEntry;

View File

@ -654,19 +654,21 @@ XBSYSAPI EXPORTNUM(277) xboxkrnl::VOID NTAPI xboxkrnl::RtlEnterCriticalSection
CriticalSection->RecursionCount = 1;
}
else {
if(CriticalSection->OwningThread != thread) {
NTSTATUS result;
result = KeWaitForSingleObject(
(PVOID)CriticalSection,
(KWAIT_REASON)0,
(KPROCESSOR_MODE)0,
(BOOLEAN)0,
(PLARGE_INTEGER)0
);
if(!NT_SUCCESS(result))
{
CxbxKrnlCleanup(LOG_PREFIX, "Waiting for event of a critical section returned %lx.", result);
};
if(CriticalSection->OwningThread != thread) {
if (CriticalSection->OwningThread != nullptr) {
NTSTATUS result;
result = KeWaitForSingleObject(
(PVOID)CriticalSection,
(KWAIT_REASON)0,
(KPROCESSOR_MODE)0,
(BOOLEAN)0,
(PLARGE_INTEGER)0
);
if (!NT_SUCCESS(result))
{
CxbxKrnlCleanup(LOG_PREFIX, "Waiting for event of a critical section returned %lx.", result);
};
}
CriticalSection->OwningThread = thread;
CriticalSection->RecursionCount = 1;
}