- NtUserWaitForInputIdle: Call EngGetTickCount, removing duplicated code

- 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
This commit is contained in:
Stefan Ginsberg 2009-01-06 19:57:44 +00:00
parent c92aee8772
commit 09cde7e355
5 changed files with 34 additions and 15 deletions

View file

@ -578,7 +578,8 @@ DWORD
WINAPI
GetTickCount(VOID)
{
return (DWORD)((ULONGLONG)SharedUserData->TickCountLowDeprecated * SharedUserData->TickCountMultiplier / 16777216);
/* Call the 64-bit version */
return (DWORD)GetTickCount64();
}
@ -589,7 +590,25 @@ ULONGLONG
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)));
}

View file

@ -294,9 +294,6 @@ _KeUpdateSystemTime@0:
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

View file

@ -349,9 +349,6 @@ KeUpdateSystemTime(IN PKTRAP_FRAME TrapFrame,
SharedUserData->TickCount.LowPart = Time.LowPart;
SharedUserData->TickCount.High1Time = Time.HighPart;
/* Update tick count in shared user data as well */
SharedUserData->TickCountLowDeprecated++;
/* Queue a DPC that will expire timers */
KeInsertQueueDpc(&KiExpireTimerDpc, 0, 0);
}

View file

@ -2239,8 +2239,7 @@ NtUserWaitForInputIdle(
return STATUS_SUCCESS; /* no event to wait on */
}
StartTime = ((ULONGLONG)SharedUserData->TickCountLowDeprecated *
SharedUserData->TickCountMultiplier / 16777216);
StartTime = EngGetTickCount();
Run = dwMilliseconds;
@ -2294,9 +2293,7 @@ NtUserWaitForInputIdle(
if (dwMilliseconds != INFINITE)
{
Elapsed = ((ULONGLONG)SharedUserData->TickCountLowDeprecated *
SharedUserData->TickCountMultiplier / 16777216)
- StartTime;
Elapsed = EngGetTickCount() - StartTime;
if (Elapsed > Run)
Status = STATUS_TIMEOUT;

View file

@ -2888,12 +2888,21 @@ EngFreeSectionMem(IN PVOID SectionObject OPTIONAL,
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