1
0
Fork 0
mirror of https://github.com/reactos/reactos.git synced 2025-06-08 19:00:42 +00:00

- 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
reactos
dll/win32/kernel32/misc
ntoskrnl/ke
subsystems/win32/win32k
ntuser
stubs

View file

@ -578,7 +578,8 @@ DWORD
WINAPI WINAPI
GetTickCount(VOID) GetTickCount(VOID)
{ {
return (DWORD)((ULONGLONG)SharedUserData->TickCountLowDeprecated * SharedUserData->TickCountMultiplier / 16777216); /* Call the 64-bit version */
return (DWORD)GetTickCount64();
} }
@ -589,7 +590,25 @@ ULONGLONG
WINAPI WINAPI
GetTickCount64(VOID) 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], ecx
mov ds:[USER_SHARED_DATA+USER_SHARED_DATA_TICK_COUNT+4], edx 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 */ /* Get hand index and entry into the table */
and eax, TIMER_TABLE_SIZE - 1 and eax, TIMER_TABLE_SIZE - 1
shl eax, 4 shl eax, 4

View file

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

View file

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

View file

@ -2893,7 +2893,16 @@ ULONGLONG
APIENTRY APIENTRY
EngGetTickCount(VOID) 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 BOOLEAN