time: Only call GetSystemTimePreciseAsFileTime if available

GetSystemTimePreciseAsFileTime is only available on Win8/Server 2012 or higher, so it must be dynamically loaded and only used if available.  Fixes compatability with Win7 and XP.
This commit is contained in:
Frank Praznik 2024-04-01 09:31:27 -04:00
parent c96bc8b1a2
commit c0bfd8bafd
1 changed files with 18 additions and 1 deletions

View File

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