diff --git a/reactos/dll/ntdll/def/ntdll.spec b/reactos/dll/ntdll/def/ntdll.spec index e6f87994c59..c649d574d51 100644 --- a/reactos/dll/ntdll/def/ntdll.spec +++ b/reactos/dll/ntdll/def/ntdll.spec @@ -175,7 +175,7 @@ @ stdcall NtGetCurrentProcessorNumber() ; 5.2 and higher @ stdcall NtGetDevicePowerState(ptr ptr) @ stdcall NtGetPlugPlayEvent(long long ptr long) -@ stdcall -stub NtGetTickCount() +@ stdcall NtGetTickCount() RtlGetTickCount @ stdcall NtGetWriteWatch(long long ptr long ptr ptr ptr) @ stdcall NtImpersonateAnonymousToken(ptr) @ stdcall NtImpersonateClientOfPort(ptr ptr) @@ -1051,7 +1051,7 @@ @ stdcall ZwGetCurrentProcessorNumber() @ stdcall ZwGetDevicePowerState(ptr ptr) @ stdcall ZwGetPlugPlayEvent(long long ptr long) -;@ stdcall ZwGetTickCount() NtGetTickCount +@ stdcall ZwGetTickCount() RtlGetTickCount @ stdcall ZwGetWriteWatch(long long ptr long ptr ptr ptr) NtGetWriteWatch @ stdcall ZwImpersonateAnonymousToken(ptr) @ stdcall ZwImpersonateClientOfPort(ptr ptr) NtImpersonateClientOfPort diff --git a/reactos/dll/ntdll/rtl/libsupp.c b/reactos/dll/ntdll/rtl/libsupp.c index 9ceb2b0bda2..69d58f36f89 100644 --- a/reactos/dll/ntdll/rtl/libsupp.c +++ b/reactos/dll/ntdll/rtl/libsupp.c @@ -613,4 +613,32 @@ RtlpSafeCopyMemory( return STATUS_SUCCESS; } +/* FIXME: code duplication with kernel32/client/time.c */ +ULONG +NTAPI +RtlGetTickCount(VOID) +{ + ULARGE_INTEGER TickCount; + +#ifdef _WIN64 + TickCount.QuadPart = *((volatile ULONG64*)&SharedUserData->TickCount); +#else + while (TRUE) + { + TickCount.HighPart = (ULONG)SharedUserData->TickCount.High1Time; + TickCount.LowPart = SharedUserData->TickCount.LowPart; + + if (TickCount.HighPart == (ULONG)SharedUserData->TickCount.High2Time) + break; + + YieldProcessor(); + } +#endif + + return (ULONG)((UInt32x32To64(TickCount.LowPart, + SharedUserData->TickCountMultiplier) >> 24) + + UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF, + SharedUserData->TickCountMultiplier)); +} + /* EOF */ diff --git a/reactos/dll/win32/kernel32/client/time.c b/reactos/dll/win32/kernel32/client/time.c index aee6d8ab169..abba55b6a90 100644 --- a/reactos/dll/win32/kernel32/client/time.c +++ b/reactos/dll/win32/kernel32/client/time.c @@ -446,6 +446,9 @@ GetTickCount(VOID) { ULARGE_INTEGER TickCount; +#ifdef _WIN64 + TickCount.QuadPart = *((volatile ULONG64*)&SharedUserData->TickCount); +#else while (TRUE) { TickCount.HighPart = (ULONG)SharedUserData->TickCount.High1Time; @@ -456,6 +459,7 @@ GetTickCount(VOID) YieldProcessor(); } +#endif return (ULONG)((UInt32x32To64(TickCount.LowPart, SharedUserData->TickCountMultiplier) >> 24) + diff --git a/reactos/lib/rtl/rtlp.h b/reactos/lib/rtl/rtlp.h index 634357bf7f9..b9429af356f 100644 --- a/reactos/lib/rtl/rtlp.h +++ b/reactos/lib/rtl/rtlp.h @@ -125,6 +125,11 @@ RtlpHandleDpcStackException(IN PEXCEPTION_REGISTRATION_RECORD RegistrationFrame, #define RtlpAllocateStringMemory RtlpAllocateMemory #define RtlpFreeStringMemory RtlpFreeMemory +ULONG +NTAPI +RtlGetTickCount(VOID); +#define NtGetTickCount RtlGetTickCount + BOOLEAN NTAPI RtlpSetInDbgPrint(