Implement CriticalSections + KeWait + KeEvents* without host forwarding
This commit is contained in:
parent
0620b1a983
commit
69527e5f8c
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue