[NDK][NTDLL][KERNEL32] Improve tick count to ms calculation

Use an inline function to do the calculation (optimized for 32/64 bit).
This commit is contained in:
Timo Kreuzer
2025-04-18 01:09:07 +03:00
parent 7debc3ef11
commit 9d1418fcb6
5 changed files with 25 additions and 18 deletions

View File

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

View File

@@ -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);
}
/*

View File

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

View File

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

View File

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