Index: libcxx/src/chrono.cpp =================================================================== --- libcxx/src/chrono.cpp +++ libcxx/src/chrono.cpp @@ -63,6 +63,19 @@ #if defined(_LIBCPP_WIN32API) +#if _WIN32_WINNT < _WIN32_WINNT_WIN8 + +typedef void(WINAPI* FP)(LPFILETIME); + +static FP init_system_clock() { + FP fp = (FP)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetSystemTimePreciseAsFileTime"); + if (nullptr == fp) + return GetSystemTimeAsFileTime; + return fp; +} + +#endif + static system_clock::time_point __libcpp_system_clock_now() { // FILETIME is in 100ns units using filetime_duration = @@ -74,10 +87,11 @@ static _LIBCPP_CONSTEXPR const seconds nt_to_unix_epoch{11644473600}; FILETIME ft; -#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 GetSystemTimePreciseAsFileTime(&ft); #else - GetSystemTimeAsFileTime(&ft); + static FP fp = init_system_clock(); + fp(&ft); #endif filetime_duration d{(static_cast<__int64>(ft.dwHighDateTime) << 32) |