From aa4570feddabc7ca5b82c52cceb40dc83220eace Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Tue, 14 May 2019 09:53:42 +0100 Subject: [PATCH] ntdll: Implement RtlGetSystemTimePrecise(). Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/ntdll/ntdll.spec | 1 + dlls/ntdll/time.c | 33 +++++++++++++++++++++++++++++++++ include/winternl.h | 1 + 3 files changed, 35 insertions(+) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 292b0f6a9f1..aeb9735ba10 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -680,6 +680,7 @@ @ stdcall RtlGetSaclSecurityDescriptor(ptr ptr ptr ptr) # @ stub RtlGetSecurityDescriptorRMControl # @ stub RtlGetSetBootStatusData +@ stdcall -ret64 RtlGetSystemTimePrecise() @ stdcall RtlGetThreadErrorMode() @ stdcall RtlGetUnloadEventTrace() @ stdcall RtlGetUnloadEventTraceEx(ptr ptr ptr) diff --git a/dlls/ntdll/time.c b/dlls/ntdll/time.c index 443d8b26be8..ec0a187da45 100644 --- a/dlls/ntdll/time.c +++ b/dlls/ntdll/time.c @@ -474,6 +474,39 @@ NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER Time ) return STATUS_SUCCESS; } +/*********************************************************************** + * RtlGetSystemTimePrecise [NTDLL.@] + * + * Get a more accurate current system time. + * + * RETURNS + * The current system time. + */ +LONGLONG WINAPI RtlGetSystemTimePrecise( void ) +{ + LONGLONG time; + +#ifdef HAVE_CLOCK_GETTIME + struct timespec ts; + + if (!clock_gettime( CLOCK_REALTIME, &ts )) + { + time = ts.tv_sec * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970; + time += (ts.tv_nsec + 50) / 100; + } + else +#endif + { + struct timeval now; + + gettimeofday( &now, 0 ); + time = now.tv_sec * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970; + time += now.tv_usec * 10; + } + + return time; +} + /****************************************************************************** * NtQueryPerformanceCounter [NTDLL.@] */ diff --git a/include/winternl.h b/include/winternl.h index 2b3fb947b9b..e7f89b00592 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2710,6 +2710,7 @@ NTSYSAPI NTSTATUS WINAPI RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR,PSI NTSYSAPI ULONG WINAPI RtlGetProcessHeaps(ULONG,HANDLE*); NTSYSAPI DWORD WINAPI RtlGetThreadErrorMode(void); NTSYSAPI NTSTATUS WINAPI RtlGetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR,PBOOLEAN,PACL *,PBOOLEAN); +NTSYSAPI LONGLONG WINAPI RtlGetSystemTimePrecise(void); NTSYSAPI NTSTATUS WINAPI RtlGetVersion(RTL_OSVERSIONINFOEXW*); NTSYSAPI NTSTATUS WINAPI RtlGUIDFromString(PUNICODE_STRING,GUID*); NTSYSAPI PSID_IDENTIFIER_AUTHORITY WINAPI RtlIdentifierAuthoritySid(PSID);