Add implementations for KeWaitForMultipleObjects & KeWaitforSingleObject

Add additional nullptr checks within Critical Section emulation
This commit is contained in:
Luke Usher 2016-10-23 20:07:27 +01:00
parent 3d23b9aef0
commit 72c8acbaf9
4 changed files with 96 additions and 14 deletions

View File

@ -201,8 +201,27 @@ XBSYSAPI VOID *KeTestAlertThread;
XBSYSAPI EXPORTNUM(156) volatile DWORD KeTickCount; XBSYSAPI EXPORTNUM(156) volatile DWORD KeTickCount;
XBSYSAPI VOID *KeTimeIncrement; 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 #endif

View File

@ -67,7 +67,7 @@ XBSYSAPI VOID *KdDebuggerNotPresent;
// ****************************************************************** // ******************************************************************
// * KfRaiseIrql // * KfRaiseIrql
// ****************************************************************** // ******************************************************************
XBSYSAPI EXPORTNUM(160) UCHAR NTAPI KfRaiseIrql XBSYSAPI EXPORTNUM(160) UCHAR* NTAPI KfRaiseIrql
( (
IN UCHAR NewIrql IN UCHAR NewIrql
); );
@ -75,7 +75,7 @@ XBSYSAPI EXPORTNUM(160) UCHAR NTAPI KfRaiseIrql
// ****************************************************************** // ******************************************************************
// * KfLowerIrql // * KfLowerIrql
// ****************************************************************** // ******************************************************************
XBSYSAPI EXPORTNUM(161) UCHAR NTAPI KfLowerIrql XBSYSAPI EXPORTNUM(161) VOID NTAPI KfLowerIrql
( (
IN UCHAR NewIrql IN UCHAR NewIrql
); );

View File

@ -2360,15 +2360,72 @@ LAUNCH_DATA_PAGE xLaunchDataPage =
// TODO: Verify this is the correct amount // TODO: Verify this is the correct amount
xboxkrnl::ULONG xboxkrnl::HalDiskCachePartitionCount = 3; 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 // * 0x00A0 - KfRaiseIrql
// ****************************************************************** // ******************************************************************
XBSYSAPI EXPORTNUM(160) xboxkrnl::UCHAR NTAPI xboxkrnl::KfRaiseIrql XBSYSAPI EXPORTNUM(160) xboxkrnl::UCHAR* NTAPI xboxkrnl::KfRaiseIrql
( (
IN UCHAR NewIrql IN UCHAR NewIrql
) )
{ {
// HACK: Not thread safe!
static xboxkrnl::UCHAR previousIrqlValue = 0;
DbgPrintf("EmuKrnl (0x%X): KfRaiseIrql\n" DbgPrintf("EmuKrnl (0x%X): KfRaiseIrql\n"
"(\n" "(\n"
@ -2377,14 +2434,14 @@ XBSYSAPI EXPORTNUM(160) xboxkrnl::UCHAR NTAPI xboxkrnl::KfRaiseIrql
GetCurrentThreadId(), NewIrql); GetCurrentThreadId(), NewIrql);
// Return addr where old irq level should be stored
return 0; return &previousIrqlValue;
} }
// ****************************************************************** // ******************************************************************
// * 0x00A1 - KfLowerIrql // * 0x00A1 - KfLowerIrql
// ****************************************************************** // ******************************************************************
XBSYSAPI EXPORTNUM(161) xboxkrnl::UCHAR NTAPI xboxkrnl::KfLowerIrql XBSYSAPI EXPORTNUM(161) VOID NTAPI xboxkrnl::KfLowerIrql
( (
IN UCHAR NewIrql 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 IN PRTL_CRITICAL_SECTION CriticalSection
) )
{ {
if (CriticalSection == nullptr) {
return;
}
/* /*
DbgPrintf("EmuKrnl (0x%X): RtlInitializeCriticalSection\n" DbgPrintf("EmuKrnl (0x%X): RtlInitializeCriticalSection\n"
@ -4708,7 +4766,9 @@ XBSYSAPI EXPORTNUM(294) VOID NTAPI xboxkrnl::RtlLeaveCriticalSection
IN PRTL_CRITICAL_SECTION CriticalSection IN PRTL_CRITICAL_SECTION CriticalSection
) )
{ {
if (CriticalSection == nullptr) {
return;
}
int iSection = FindCriticalSection(CriticalSection); 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" DbgPrintf("EmuKrnl (0x%X): RtlTryEnterCriticalSection\n"
"(\n" "(\n"

View File

@ -215,8 +215,8 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[367] =
(uint32)PANIC(0x009B), // 0x009B (155) KeTestAlertThread (uint32)PANIC(0x009B), // 0x009B (155) KeTestAlertThread
(uint32)&xboxkrnl::KeTickCount, // 0x009C (156) (uint32)&xboxkrnl::KeTickCount, // 0x009C (156)
(uint32)PANIC(0x009D), // 0x009D (157) KeTimeIncrement (uint32)PANIC(0x009D), // 0x009D (157) KeTimeIncrement
(uint32)PANIC(0x009E), // 0x009E (158) KeWaitForMultipleObjects (uint32)&xboxkrnl::KeWaitForMultipleObjects, // 0x009E (158) KeWaitForMultipleObjects
(uint32)PANIC(0x009F), // 0x009F (159) KeWaitForSingleObject (uint32)&xboxkrnl::KeWaitForSingleObject, // 0x009F (159) KeWaitForSingleObject
(uint32)&xboxkrnl::KfRaiseIrql, // 0x00A0 (160) (uint32)&xboxkrnl::KfRaiseIrql, // 0x00A0 (160)
(uint32)&xboxkrnl::KfLowerIrql, // 0x00A1 (161) (uint32)&xboxkrnl::KfLowerIrql, // 0x00A1 (161)
(uint32)PANIC(0x00A2), // 0x00A2 (162) KiBugCheckData (uint32)PANIC(0x00A2), // 0x00A2 (162) KiBugCheckData