From daab4ca81854a3b9de47e53751223023e6b1d5ad Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Thu, 23 Feb 2017 19:43:58 -0500 Subject: [PATCH] Use GetSystemTimePreciseAsFileTime if available in DateTime.UtcNow (dotnet/coreclr#9736) Commit migrated from https://github.com/dotnet/coreclr/commit/5ec5c2f859f8ff1dc99a2bb95b640b82d2937cc8 --- src/coreclr/src/classlibnative/bcltype/system.cpp | 27 +++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/coreclr/src/classlibnative/bcltype/system.cpp b/src/coreclr/src/classlibnative/bcltype/system.cpp index 78775f2..2767d1e 100644 --- a/src/coreclr/src/classlibnative/bcltype/system.cpp +++ b/src/coreclr/src/classlibnative/bcltype/system.cpp @@ -41,14 +41,37 @@ typedef BOOL (*pfnGetPhoneVersion)(LPOSVERSIONINFO lpVersionInformation); pfnGetPhoneVersion g_pfnGetPhoneVersion = NULL; #endif +typedef void(WINAPI *pfnGetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime); +extern pfnGetSystemTimeAsFileTime g_pfnGetSystemTimeAsFileTime; + +void WINAPI InitializeGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) +{ + pfnGetSystemTimeAsFileTime func = NULL; + +#ifndef FEATURE_PAL + HMODULE hKernel32 = WszLoadLibrary(W("kernel32.dll")); + if (hKernel32 != NULL) + { + func = (pfnGetSystemTimeAsFileTime)GetProcAddress(hKernel32, "GetSystemTimePreciseAsFileTime"); + } + if (func == NULL) +#endif + { + func = &::GetSystemTimeAsFileTime; + } + + g_pfnGetSystemTimeAsFileTime = func; + func(lpSystemTimeAsFileTime); +} + +pfnGetSystemTimeAsFileTime g_pfnGetSystemTimeAsFileTime = &InitializeGetSystemTimeAsFileTime; FCIMPL0(INT64, SystemNative::__GetSystemTimeAsFileTime) { FCALL_CONTRACT; INT64 timestamp; - - ::GetSystemTimeAsFileTime((FILETIME*)×tamp); + g_pfnGetSystemTimeAsFileTime((FILETIME*)×tamp); #if BIGENDIAN timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32)); -- 2.7.4