diff --git a/dll/ntdll/rtl/libsupp.c b/dll/ntdll/rtl/libsupp.c index 5599c7f6501..7dc1abc1d59 100644 --- a/dll/ntdll/rtl/libsupp.c +++ b/dll/ntdll/rtl/libsupp.c @@ -1225,10 +1225,8 @@ RtlGetTickCount(VOID) TickCount = KiReadSystemTime(&SharedUserData->TickCount); - return (ULONG)((UInt32x32To64(TickCount.LowPart, - SharedUserData->TickCountMultiplier) >> 24) + - UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF, - SharedUserData->TickCountMultiplier)); + /* Convert to milliseconds */ + return KiTickCountToMs(TickCount); } /* EOF */ diff --git a/dll/win32/kernel32/client/time.c b/dll/win32/kernel32/client/time.c index f21d4c0cc20..4047720de5f 100644 --- a/dll/win32/kernel32/client/time.c +++ b/dll/win32/kernel32/client/time.c @@ -426,11 +426,8 @@ GetTickCount(VOID) TickCount = KiReadSystemTime(&SharedUserData->TickCount); - return (ULONG)((UInt32x32To64(TickCount.LowPart, - SharedUserData->TickCountMultiplier) >> 24) + - UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF, - SharedUserData->TickCountMultiplier)); - + /* Convert to milliseconds */ + return (DWORD)KiTickCountToMs(TickCount); } /* diff --git a/dll/win32/kernel32/kernel32_vista/GetTickCount64.c b/dll/win32/kernel32/kernel32_vista/GetTickCount64.c index bc185143721..8a8346e59fd 100644 --- a/dll/win32/kernel32/kernel32_vista/GetTickCount64.c +++ b/dll/win32/kernel32/kernel32_vista/GetTickCount64.c @@ -12,7 +12,6 @@ GetTickCount64(VOID) TickCount = KiReadSystemTime(&SharedUserData->TickCount); - ULONG TickCountMultiplier = SharedUserData->TickCountMultiplier; - return (UInt32x32To64(TickCount.LowPart, TickCountMultiplier) >> 24) + - (UInt32x32To64(TickCount.HighPart, TickCountMultiplier) << 8); + /* Convert to milliseconds */ + return KiTickCountToMs(TickCount); } diff --git a/sdk/include/ndk/kefuncs.h b/sdk/include/ndk/kefuncs.h index 30ed841d519..997415624a5 100644 --- a/sdk/include/ndk/kefuncs.h +++ b/sdk/include/ndk/kefuncs.h @@ -447,6 +447,22 @@ KiWriteSystemTime( } #endif // !NTOS_MODE_USER + +FORCEINLINE +ULONG64 +KiTickCountToMs(_In_ LARGE_INTEGER TickCount) +{ +#ifdef _WIN64 + /* Native math is optimal on 64 bit */ + return (TickCount.QuadPart * SharedUserData->TickCountMultiplier) >> 24; +#else + /* This is optimal on 32 bit (overflows after ~20,000 years) */ + ULONG Multiplier = SharedUserData->TickCountMultiplier; + return (UInt32x32To64(TickCount.LowPart, Multiplier) >> 24) + + UInt32x32To64(TickCount.HighPart << 8, Multiplier); +#endif +} + #endif // !NONAMELESSUNION // diff --git a/win32ss/gdi/eng/engmisc.c b/win32ss/gdi/eng/engmisc.c index 73ef8744af7..97be53b9bf4 100644 --- a/win32ss/gdi/eng/engmisc.c +++ b/win32ss/gdi/eng/engmisc.c @@ -287,16 +287,13 @@ ULONGLONG APIENTRY EngGetTickCount(VOID) { - ULONG Multiplier; LARGE_INTEGER TickCount; - /* Get the multiplier and current tick count */ + /* Get the current tick count */ KeQueryTickCount(&TickCount); - Multiplier = SharedUserData->TickCountMultiplier; - /* Convert to milliseconds and return */ - return (Int64ShrlMod32(UInt32x32To64(Multiplier, TickCount.LowPart), 24) + - (Multiplier * (TickCount.HighPart << 8))); + /* Convert to milliseconds */ + return KiTickCountToMs(TickCount); } /* EOF */