From 9f7b29ad62c759356045dce75758575908f7ac98 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Tue, 29 Nov 2016 14:38:19 +0000 Subject: [PATCH] Add implementation for NtWaitForSingleObject & stub for KeSetPriorityThread --- src/CxbxKrnl/EmuKrnlKe.cpp | 18 ++++++++++++++++++ src/CxbxKrnl/EmuKrnlNt.cpp | 35 +++++++++++++++++++++++++++++++++++ src/CxbxKrnl/KernelThunk.cpp | 4 ++-- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/CxbxKrnl/EmuKrnlKe.cpp b/src/CxbxKrnl/EmuKrnlKe.cpp index 86311ec16..e1fa37cfd 100644 --- a/src/CxbxKrnl/EmuKrnlKe.cpp +++ b/src/CxbxKrnl/EmuKrnlKe.cpp @@ -340,6 +340,24 @@ XBSYSAPI EXPORTNUM(143) xboxkrnl::LONG NTAPI xboxkrnl::KeSetBasePriorityThread RETURN(1); } +// ****************************************************************** +// * 0x0096 - KeSetPriorityThread +// ****************************************************************** +XBSYSAPI EXPORTNUM(148) xboxkrnl::BOOLEAN NTAPI xboxkrnl::KeSetPriorityThread +( + IN PKTHREAD Thread, + IN PVOID Priority +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG_OUT(Thread) + LOG_FUNC_ARG_OUT(Priority) + LOG_FUNC_END; + + LOG_UNIMPLEMENTED(); + + RETURN(1); +} // ****************************************************************** // * 0x0095 - KeSetTimer diff --git a/src/CxbxKrnl/EmuKrnlNt.cpp b/src/CxbxKrnl/EmuKrnlNt.cpp index c6e5e1934..ded7188ac 100644 --- a/src/CxbxKrnl/EmuKrnlNt.cpp +++ b/src/CxbxKrnl/EmuKrnlNt.cpp @@ -2255,6 +2255,41 @@ XBSYSAPI EXPORTNUM(232) VOID NTAPI xboxkrnl::NtUserIoApcDispatcher DbgPrintf("EmuKrnl (0x%X): NtUserIoApcDispatcher Completed\n", GetCurrentThreadId()); } +// ****************************************************************** +// * 0x00E9 - NtWaitForSingleObject +// ****************************************************************** +XBSYSAPI EXPORTNUM(233) xboxkrnl::NTSTATUS NTAPI xboxkrnl::NtWaitForSingleObject +( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PVOID Timeout +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Handle) + LOG_FUNC_ARG(Alertable) + LOG_FUNC_ARG(Timeout) + LOG_FUNC_END; + + NTSTATUS ret; + + if (IsEmuHandle(Handle)) + { + ret = WAIT_FAILED; + EmuWarning("WaitFor EmuHandle not supported!"); + } + else + { + ret = NtDll::NtWaitForSingleObject(Handle, Alertable, (NtDll::PLARGE_INTEGER)Timeout); + DbgPrintf("Finished waiting for 0x%.08X\n", Handle); + } + + if (ret == WAIT_FAILED) + EmuWarning("NtWaitForSingleObject failed! (%s)", NtStatusToString(ret)); + + RETURN(ret); +} + // ****************************************************************** // * 0x00EA - NtWaitForSingleObjectEx // ****************************************************************** diff --git a/src/CxbxKrnl/KernelThunk.cpp b/src/CxbxKrnl/KernelThunk.cpp index e7ad23750..74cd04ae3 100644 --- a/src/CxbxKrnl/KernelThunk.cpp +++ b/src/CxbxKrnl/KernelThunk.cpp @@ -212,7 +212,7 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[379] = (uint32)PANIC(0x0091), // 0x0091 (145) KeSetEvent (uint32)PANIC(0x0092), // 0x0092 (146) KeSetEventBoostPriority (uint32)PANIC(0x0093), // 0x0093 (147) KeSetPriorityProcess - (uint32)PANIC(0x0094), // 0x0094 (148) KeSetPriorityThread + (uint32)FUNC(&xboxkrnl::KeSetPriorityThread), // 0x0094 (148) (uint32)FUNC(&xboxkrnl::KeSetTimer), // 0x0095 (149) (uint32)FUNC(&xboxkrnl::KeSetTimerEx), // 0x0096 (150) (uint32)PANIC(0x0097), // 0x0097 (151) KeStallExecutionProcessor @@ -297,7 +297,7 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[379] = (uint32)PANIC(0x00E6), // 0x00E6 (230) NtSignalAndWaitForSingleObjectEx (uint32)FUNC(&xboxkrnl::NtSuspendThread), // 0x00E7 (231) (uint32)FUNC(&xboxkrnl::NtUserIoApcDispatcher), // 0x00E8 (232) - (uint32)PANIC(0x00E9), // 0x00E9 (233) NtWaitForSingleObject + (uint32)FUNC(&xboxkrnl::NtWaitForSingleObject), // 0x00E9 (233) (uint32)FUNC(&xboxkrnl::NtWaitForSingleObjectEx), // 0x00EA (234) (uint32)FUNC(&xboxkrnl::NtWaitForMultipleObjectsEx), // 0x00EB (235) (uint32)FUNC(&xboxkrnl::NtWriteFile), // 0x00EC (236)