diff --git a/src/time/windows/SDL_systime.c b/src/time/windows/SDL_systime.c index 433b97ea5..7c0d7ef38 100644 --- a/src/time/windows/SDL_systime.c +++ b/src/time/windows/SDL_systime.c @@ -32,6 +32,8 @@ #define WINDOWS_TICK 10000000ULL #define UNIX_EPOCH_OFFSET_SEC 11644473600ULL +typedef void(WINAPI *pfnGetSystemTimePreciseAsFileTime)(FILETIME *); + void SDL_GetSystemTimeLocalePreferences(SDL_DATE_FORMAT *df, SDL_TIME_FORMAT *tf) { WCHAR str[80]; /* Per the docs, the time and short date format strings can be a max of 80 characters. */ @@ -77,14 +79,29 @@ found_date: int SDL_GetCurrentTime(SDL_Time *ticks) { + static pfnGetSystemTimePreciseAsFileTime pGetSystemTimePreciseAsFileTime = NULL; + static SDL_bool load_attempted = SDL_FALSE; FILETIME ft; if (!ticks) { return SDL_InvalidParamError("ticks"); } + /* Only available in Win8/Server 2012 or higher. */ + if (!pGetSystemTimePreciseAsFileTime && !load_attempted) { + HANDLE kernel32 = GetModuleHandle(TEXT("kernel32.dll")); + if (kernel32) { + pGetSystemTimePreciseAsFileTime = (pfnGetSystemTimePreciseAsFileTime)GetProcAddress(kernel32, "GetSystemTimePreciseAsFileTime"); + } + load_attempted = SDL_TRUE; + } + SDL_zero(ft); - GetSystemTimePreciseAsFileTime(&ft); + if (pGetSystemTimePreciseAsFileTime) { + pGetSystemTimePreciseAsFileTime(&ft); + } else { + GetSystemTimeAsFileTime(&ft); + } *ticks = SDL_TimeFromWindows(ft.dwLowDateTime, ft.dwHighDateTime); return 0;