- GetTickCount/GetTickCount64/EngGetTickCount: Use the correct SharedUserData fields, and fix the calculations
- KeUpdateSystemTime: Don't update TickCountLowDeprecated now that it truly is deprecated
- Thanks to Fireball and KJK!
svn path=/trunk/; revision=38616
WINAPI
GetTickCount(VOID)
{
- return (DWORD)((ULONGLONG)SharedUserData->TickCountLowDeprecated * SharedUserData->TickCountMultiplier / 16777216);
+ /* Call the 64-bit version */
+ return (DWORD)GetTickCount64();
}
WINAPI
GetTickCount64(VOID)
{
- return (ULONGLONG)SharedUserData->TickCountLowDeprecated * (ULONGLONG)SharedUserData->TickCountMultiplier / 16777216;
+ ULONG Multiplier;
+ LARGE_INTEGER TickCount;
+
+ /* Loop until we get a perfect match */
+ for (;;)
+ {
+ /* Read the tick count value */
+ TickCount.HighPart = SharedUserData->TickCount.High1Time;
+ TickCount.LowPart = SharedUserData->TickCount.LowPart;
+ if (TickCount.HighPart == SharedUserData->TickCount.High2Time) break;
+ YieldProcessor();
+ }
+
+ /* Get the multiplier */
+ Multiplier = SharedUserData->TickCountMultiplier;
+
+ /* Convert to milliseconds and return */
+ return (Int64ShrlMod32(UInt32x32To64(Multiplier, TickCount.LowPart), 24) +
+ (Multiplier * (TickCount.HighPart << 8)));
}
mov ds:[USER_SHARED_DATA+USER_SHARED_DATA_TICK_COUNT], ecx
mov ds:[USER_SHARED_DATA+USER_SHARED_DATA_TICK_COUNT+4], edx
- /* FIXME: HACK */
- mov ds:[USER_SHARED_DATA], ecx
-
/* Get hand index and entry into the table */
and eax, TIMER_TABLE_SIZE - 1
shl eax, 4
SharedUserData->TickCount.LowPart = Time.LowPart;\r
SharedUserData->TickCount.High1Time = Time.HighPart;\r
\r
- /* Update tick count in shared user data as well */\r
- SharedUserData->TickCountLowDeprecated++;\r
-\r
/* Queue a DPC that will expire timers */\r
KeInsertQueueDpc(&KiExpireTimerDpc, 0, 0);\r
}\r
return STATUS_SUCCESS; /* no event to wait on */
}
- StartTime = ((ULONGLONG)SharedUserData->TickCountLowDeprecated *
- SharedUserData->TickCountMultiplier / 16777216);
+ StartTime = EngGetTickCount();
Run = dwMilliseconds;
if (dwMilliseconds != INFINITE)
{
- Elapsed = ((ULONGLONG)SharedUserData->TickCountLowDeprecated *
- SharedUserData->TickCountMultiplier / 16777216)
- - StartTime;
+ Elapsed = EngGetTickCount() - StartTime;
if (Elapsed > Run)
Status = STATUS_TIMEOUT;
UNIMPLEMENTED;
return FALSE;
}
-
+
ULONGLONG
APIENTRY
EngGetTickCount(VOID)
{
- return ((ULONGLONG)SharedUserData->TickCountLowDeprecated * SharedUserData->TickCountMultiplier / 16777216);
+ ULONG Multiplier;
+ LARGE_INTEGER TickCount;
+
+ /* Get the multiplier and current tick count */
+ KeQueryTickCount(&TickCount);
+ Multiplier = SharedUserData->TickCountMultiplier;
+
+ /* Convert to milliseconds and return */
+ return (Int64ShrlMod32(UInt32x32To64(Multiplier, TickCount.LowPart), 24) +
+ (Multiplier * (TickCount.HighPart << 8)));
}
BOOLEAN