From 5aba5817371b7c805bce6efb3f45fe2477215b60 Mon Sep 17 00:00:00 2001 From: Ryan Wendland Date: Thu, 8 Jun 2023 19:58:44 +0930 Subject: [PATCH] winapi: Implement GetLocalTime --- lib/winapi/sysinfo.c | 40 ++++++++++++++++++++++++++++++++++++++++ lib/winapi/sysinfoapi.h | 1 + 2 files changed, 41 insertions(+) diff --git a/lib/winapi/sysinfo.c b/lib/winapi/sysinfo.c index 35220fc39..adfc24fcf 100644 --- a/lib/winapi/sysinfo.c +++ b/lib/winapi/sysinfo.c @@ -2,8 +2,10 @@ // SPDX-FileCopyrightText: 2019 Stefan Schmidt // SPDX-FileCopyrightText: 2020 Samuel Cuella +// SPDX-FileCopyrightText: 2023 Ryan Wendland #include +#include #include #include @@ -50,3 +52,41 @@ void GetSystemInfo (LPSYSTEM_INFO lpSystemInfo) lpSystemInfo->dwNumberOfProcessors = 1; lpSystemInfo->dwAllocationGranularity = 4096; } + +void GetLocalTime (LPSYSTEMTIME lpSystemTime) +{ + assert(lpSystemTime != NULL); + + LARGE_INTEGER kTime; + TIME_FIELDS timeFields; + TIME_ZONE_INFORMATION tzInfo; + LONG bias; + + switch (GetTimeZoneInformation(&tzInfo)) { + case TIME_ZONE_ID_UNKNOWN: + bias = tzInfo.Bias; + break; + case TIME_ZONE_ID_STANDARD: + bias = tzInfo.Bias + tzInfo.StandardBias; + break; + case TIME_ZONE_ID_DAYLIGHT: + bias = tzInfo.Bias + tzInfo.DaylightBias; + break; + default: + bias = 0; + break; + } + + KeQuerySystemTime(&kTime); + kTime.QuadPart -= (bias * 60LL * 10000000LL); + + RtlTimeToTimeFields(&kTime, &timeFields); + lpSystemTime->wYear = timeFields.Year; + lpSystemTime->wMonth = timeFields.Month; + lpSystemTime->wDay = timeFields.Day; + lpSystemTime->wHour = timeFields.Hour; + lpSystemTime->wMinute = timeFields.Minute; + lpSystemTime->wSecond = timeFields.Second; + lpSystemTime->wMilliseconds = timeFields.Millisecond; + lpSystemTime->wDayOfWeek = timeFields.Weekday; +} diff --git a/lib/winapi/sysinfoapi.h b/lib/winapi/sysinfoapi.h index ca4138098..d2f004591 100644 --- a/lib/winapi/sysinfoapi.h +++ b/lib/winapi/sysinfoapi.h @@ -15,6 +15,7 @@ extern "C" { void GetSystemTime (LPSYSTEMTIME lpSystemTime); void GetSystemTimePreciseAsFileTime (LPFILETIME lpSystemTimeAsFileTime); DWORD GetTickCount (void); +void GetLocalTime (LPSYSTEMTIME lpSystemTime); // Unprovided fields are intentionally disabled to catch code trying to access them typedef struct _SYSTEM_INFO