[PATCH v2 2/8] ntdll: Implement RtlGetSystemTimePrecise().

Huw Davies huw at codeweavers.com
Tue May 14 03:53:42 CDT 2019


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 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 292b0f6a9f..aeb9735ba1 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 443d8b26be..ec0a187da4 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 2b3fb947b9..e7f89b0059 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);
-- 
2.17.1




More information about the wine-devel mailing list