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);