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
|
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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue