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 typedef struct _RTL_CRITICAL_SECTION
{ {
DWORD Unknown[4]; // 0x00 DISPATCHER_HEADER Event; // 0x00
LONG LockCount; // 0x10 LONG LockCount; // 0x10
LONG RecursionCount; // 0x14 LONG RecursionCount; // 0x14
HANDLE OwningThread; // 0x18 HANDLE OwningThread; // 0x18

View File

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

View File

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