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 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

View File

@ -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
);

View File

@ -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"

View File

@ -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