diff --git a/import/OpenXDK/include/xboxkrnl/rtl.h b/import/OpenXDK/include/xboxkrnl/rtl.h index ea9f30706..3ec2640d6 100644 --- a/import/OpenXDK/include/xboxkrnl/rtl.h +++ b/import/OpenXDK/include/xboxkrnl/rtl.h @@ -209,7 +209,16 @@ XBSYSAPI EXPORTNUM(282) LARGE_INTEGER NTAPI RtlExtendedLargeIntegerDivide IN PULONG Remainder // OUT? OPTIONAL? ); -XBSYSAPI VOID *RtlExtendedMagicDivide; +// ****************************************************************** +// * 0x011B - RtlExtendedMagicDivide() +// ****************************************************************** +XBSYSAPI EXPORTNUM(283) LARGE_INTEGER NTAPI RtlExtendedMagicDivide +( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER MagicDivisor, + IN CCHAR ShiftCount +); + XBSYSAPI VOID *RtlFillMemory; XBSYSAPI VOID *RtlFillMemoryUlong; diff --git a/src/CxbxKrnl/EmuKrnlRtl.cpp b/src/CxbxKrnl/EmuKrnlRtl.cpp index 0393250d5..467510366 100644 --- a/src/CxbxKrnl/EmuKrnlRtl.cpp +++ b/src/CxbxKrnl/EmuKrnlRtl.cpp @@ -532,6 +532,38 @@ XBSYSAPI EXPORTNUM(282) xboxkrnl::LARGE_INTEGER NTAPI xboxkrnl::RtlExtendedLarge RETURN(ret); } +// ****************************************************************** +// * 0x011B - RtlExtendedMagicDivide() +// ****************************************************************** +XBSYSAPI EXPORTNUM(283) xboxkrnl::LARGE_INTEGER NTAPI xboxkrnl::RtlExtendedMagicDivide +( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER MagicDivisor, + IN CCHAR ShiftCount +) +{ + LOG_FUNC_BEGIN + LOG_FUNC_ARG(Dividend) + LOG_FUNC_ARG(MagicDivisor) + LOG_FUNC_ARG(ShiftCount) + LOG_FUNC_END; + + LARGE_INTEGER ret; + + // As long as there are no type casts for NtDll::LARGE_INTEGER to xboxkrnl::LARGE_INTEGER + // and back, just copy the only member manually : + // TODO : Simplify this by adding typecasts between NtDll and xboxkrnl versions of LARGE_INTEGER + NtDll::LARGE_INTEGER NtDividend; + NtDividend.QuadPart = Dividend.QuadPart; + + NtDll::LARGE_INTEGER NtMagicDivisor; + NtMagicDivisor.QuadPart = MagicDivisor.QuadPart; + + ret.QuadPart = NtDll::RtlExtendedMagicDivide(NtDividend, NtMagicDivisor, (NtDll::CCHAR)ShiftCount).QuadPart; + + RETURN(ret); +} + // ****************************************************************** // * 0x011E - RtlFreeAnsiString() // ****************************************************************** diff --git a/src/CxbxKrnl/EmuNtDll.cpp b/src/CxbxKrnl/EmuNtDll.cpp index c84efb43d..557567252 100644 --- a/src/CxbxKrnl/EmuNtDll.cpp +++ b/src/CxbxKrnl/EmuNtDll.cpp @@ -125,6 +125,7 @@ IMPORT(RtlEqualString); IMPORT(RtlEqualUnicodeString); IMPORT(RtlExtendedIntegerMultiply); IMPORT(RtlExtendedLargeIntegerDivide); +IMPORT(RtlExtendedMagicDivide); IMPORT(RtlFreeAnsiString); IMPORT(RtlFreeHeap); IMPORT(RtlInitAnsiString); diff --git a/src/CxbxKrnl/EmuNtDll.h b/src/CxbxKrnl/EmuNtDll.h index 7e6ae6790..a72c77961 100644 --- a/src/CxbxKrnl/EmuNtDll.h +++ b/src/CxbxKrnl/EmuNtDll.h @@ -1091,6 +1091,16 @@ typedef LARGE_INTEGER (NTAPI *FPTR_RtlExtendedLargeIntegerDivide) OUT PULONG Remainder ); +// ****************************************************************** +// * RtlExtendedMagicDivide +// ****************************************************************** +typedef LARGE_INTEGER (NTAPI *FPTR_RtlExtendedMagicDivide) +( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER MagicDivisor, + IN CCHAR ShiftCount +); + // ****************************************************************** // * NtDelayExecution // ****************************************************************** @@ -1743,6 +1753,7 @@ EXTERN(RtlEqualString); EXTERN(RtlEqualUnicodeString); EXTERN(RtlExtendedIntegerMultiply); EXTERN(RtlExtendedLargeIntegerDivide); +EXTERN(RtlExtendedMagicDivide); EXTERN(RtlFreeAnsiString); EXTERN(RtlFreeHeap); EXTERN(RtlInitAnsiString); diff --git a/src/CxbxKrnl/KernelThunk.cpp b/src/CxbxKrnl/KernelThunk.cpp index 597a8ef4e..d0eb93548 100644 --- a/src/CxbxKrnl/KernelThunk.cpp +++ b/src/CxbxKrnl/KernelThunk.cpp @@ -348,7 +348,7 @@ extern "C" CXBXKRNL_API uint32 CxbxKrnl_KernelThunkTable[379] = (uint32)FUNC(&xboxkrnl::RtlEqualUnicodeString), // 0x0118 (280) (uint32)FUNC(&xboxkrnl::RtlExtendedIntegerMultiply), // 0x0119 (281) (uint32)FUNC(&xboxkrnl::RtlExtendedLargeIntegerDivide), // 0x011A (282) - (uint32)PANIC(0x011B), // 0x011B (283) RtlExtendedMagicDivide + (uint32)FUNC(&xboxkrnl::RtlExtendedMagicDivide), // 0x011B (283) (uint32)PANIC(0x011C), // 0x011C (284) RtlFillMemory (uint32)PANIC(0x011D), // 0x011D (285) RtlFillMemoryUlong (uint32)FUNC(&xboxkrnl::RtlFreeAnsiString), // 0x011E (286)