diff --git a/import/OpenXDK/include/xboxkrnl/kernel.h b/import/OpenXDK/include/xboxkrnl/kernel.h index 8628433ff..4cf1614ed 100644 --- a/import/OpenXDK/include/xboxkrnl/kernel.h +++ b/import/OpenXDK/include/xboxkrnl/kernel.h @@ -201,8 +201,27 @@ XBSYSAPI VOID *KeTestAlertThread; XBSYSAPI EXPORTNUM(156) volatile DWORD KeTickCount; XBSYSAPI VOID *KeTimeIncrement; -XBSYSAPI VOID *KeWaitForMultipleObjects; -XBSYSAPI VOID *KeWaitForSingleObject; + +XBSYSAPI EXPORTNUM(158) NTSTATUS KeWaitForMultipleObjects +( + IN ULONG Count, + IN PVOID Object[], + IN WAIT_TYPE WaitType, + IN int WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN VOID* WaitBlockArray +); + +XBSYSAPI EXPORTNUM(159) NTSTATUS KeWaitForSingleObject +( + IN PVOID Object, + IN int WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL +); #endif diff --git a/import/OpenXDK/include/xboxkrnl/xbox.h b/import/OpenXDK/include/xboxkrnl/xbox.h index edf3057f1..de881dcca 100644 --- a/import/OpenXDK/include/xboxkrnl/xbox.h +++ b/import/OpenXDK/include/xboxkrnl/xbox.h @@ -67,7 +67,7 @@ XBSYSAPI VOID *KdDebuggerNotPresent; // ****************************************************************** // * KfRaiseIrql // ****************************************************************** -XBSYSAPI EXPORTNUM(160) UCHAR NTAPI KfRaiseIrql +XBSYSAPI EXPORTNUM(160) UCHAR* NTAPI KfRaiseIrql ( IN UCHAR NewIrql ); @@ -75,7 +75,7 @@ XBSYSAPI EXPORTNUM(160) UCHAR NTAPI KfRaiseIrql // ****************************************************************** // * KfLowerIrql // ****************************************************************** -XBSYSAPI EXPORTNUM(161) UCHAR NTAPI KfLowerIrql +XBSYSAPI EXPORTNUM(161) VOID NTAPI KfLowerIrql ( IN UCHAR NewIrql ); diff --git a/src/CxbxKrnl/EmuKrnl.cpp b/src/CxbxKrnl/EmuKrnl.cpp index 56e203ecd..12585c8a3 100644 --- a/src/CxbxKrnl/EmuKrnl.cpp +++ b/src/CxbxKrnl/EmuKrnl.cpp @@ -2360,15 +2360,72 @@ LAUNCH_DATA_PAGE xLaunchDataPage = // TODO: Verify this is the correct amount xboxkrnl::ULONG xboxkrnl::HalDiskCachePartitionCount = 3; +// ****************************************************************** +// * 0x009E - KeWaitForMultipleObjects +// ****************************************************************** +XBSYSAPI EXPORTNUM(158) xboxkrnl::NTSTATUS xboxkrnl::KeWaitForMultipleObjects +( + IN ULONG Count, + IN PVOID Object[], + IN WAIT_TYPE WaitType, + IN int WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN VOID* WaitBlockArray +) { + DbgPrintf("EmuKrnl (0x%X): KeWaitForMultipleObjects\n" + "(\n" + " Count : 0x%.08X\n" + " Object : 0x%.08X\n" + " WaitType : 0x%.08X\n" + " WaitReason : 0x%.08X\n" + " WaitMode : 0x%.08X\n" + " Alertable : 0x%.08X\n" + " Timeout : 0x%.08X\n" + " WaitBlockArray : 0x%.08X\n" + ");\n", + GetCurrentThreadId(), Count, Object, WaitType, WaitReason, WaitMode, Alertable, Timeout, WaitBlockArray); + + EmuWarning("EmuKrnl: Redirecting KeWaitForMultipleObjects to NtWaitForMultipleObjectsEx"); + return NtWaitForMultipleObjectsEx(Count, Object, WaitType, WaitMode, Alertable, Timeout); +} + +// ****************************************************************** +// * 0x009F - KeWaitForSingleObject +// ****************************************************************** +XBSYSAPI EXPORTNUM(159) xboxkrnl::NTSTATUS xboxkrnl::KeWaitForSingleObject +( + IN PVOID Object, + IN int WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL +) { + DbgPrintf("EmuKrnl (0x%X): KeWaitForSingleObject\n" + "(\n" + " Object : 0x%.08X\n" + " WaitReason : 0x%.08X\n" + " WaitMode : 0x%.08X\n" + " Alertable : 0x%.08X\n" + " Timeout : 0x%.08X\n" + ");\n", + GetCurrentThreadId(), Object, WaitReason, WaitMode, Alertable, Timeout); + + EmuWarning("EmuKrnl: Redirecting KeWaitForSingleObject to NtWaitForSingleObjectEx"); + return NtWaitForSingleObjectEx(Object, WaitMode, Alertable, Timeout); +} + // ****************************************************************** // * 0x00A0 - KfRaiseIrql // ****************************************************************** -XBSYSAPI EXPORTNUM(160) xboxkrnl::UCHAR NTAPI xboxkrnl::KfRaiseIrql +XBSYSAPI EXPORTNUM(160) xboxkrnl::UCHAR* NTAPI xboxkrnl::KfRaiseIrql ( IN UCHAR NewIrql ) { - + // HACK: Not thread safe! + static xboxkrnl::UCHAR previousIrqlValue = 0; DbgPrintf("EmuKrnl (0x%X): KfRaiseIrql\n" "(\n" @@ -2377,14 +2434,14 @@ XBSYSAPI EXPORTNUM(160) xboxkrnl::UCHAR NTAPI xboxkrnl::KfRaiseIrql GetCurrentThreadId(), NewIrql); - - return 0; + // Return addr where old irq level should be stored + return &previousIrqlValue; } // ****************************************************************** // * 0x00A1 - KfLowerIrql // ****************************************************************** -XBSYSAPI EXPORTNUM(161) xboxkrnl::UCHAR NTAPI xboxkrnl::KfLowerIrql +XBSYSAPI EXPORTNUM(161) VOID NTAPI xboxkrnl::KfLowerIrql ( IN UCHAR NewIrql ) @@ -2399,7 +2456,6 @@ XBSYSAPI EXPORTNUM(161) xboxkrnl::UCHAR NTAPI xboxkrnl::KfLowerIrql - return 0; } // ****************************************************************** @@ -4673,7 +4729,9 @@ XBSYSAPI EXPORTNUM(291) VOID NTAPI xboxkrnl::RtlInitializeCriticalSection IN PRTL_CRITICAL_SECTION CriticalSection ) { - + if (CriticalSection == nullptr) { + return; + } /* DbgPrintf("EmuKrnl (0x%X): RtlInitializeCriticalSection\n" @@ -4708,7 +4766,9 @@ XBSYSAPI EXPORTNUM(294) VOID NTAPI xboxkrnl::RtlLeaveCriticalSection IN PRTL_CRITICAL_SECTION CriticalSection ) { - + if (CriticalSection == nullptr) { + return; + } int iSection = FindCriticalSection(CriticalSection); @@ -4835,6 +4895,9 @@ XBSYSAPI EXPORTNUM(306) xboxkrnl::BOOLEAN NTAPI xboxkrnl::RtlTryEnterCriticalSec ) { + if (CriticalSection == nullptr) { + return; + } DbgPrintf("EmuKrnl (0x%X): RtlTryEnterCriticalSection\n" "(\n" diff --git a/src/CxbxKrnl/KernelThunk.cpp b/src/CxbxKrnl/KernelThunk.cpp index da5476762..ef18e4855 100644 --- a/src/CxbxKrnl/KernelThunk.cpp +++ b/src/CxbxKrnl/KernelThunk.cpp @@ -215,8 +215,8 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[367] = (uint32)PANIC(0x009B), // 0x009B (155) KeTestAlertThread (uint32)&xboxkrnl::KeTickCount, // 0x009C (156) (uint32)PANIC(0x009D), // 0x009D (157) KeTimeIncrement - (uint32)PANIC(0x009E), // 0x009E (158) KeWaitForMultipleObjects - (uint32)PANIC(0x009F), // 0x009F (159) KeWaitForSingleObject + (uint32)&xboxkrnl::KeWaitForMultipleObjects, // 0x009E (158) KeWaitForMultipleObjects + (uint32)&xboxkrnl::KeWaitForSingleObject, // 0x009F (159) KeWaitForSingleObject (uint32)&xboxkrnl::KfRaiseIrql, // 0x00A0 (160) (uint32)&xboxkrnl::KfLowerIrql, // 0x00A1 (161) (uint32)PANIC(0x00A2), // 0x00A2 (162) KiBugCheckData