2024-07-01|閱讀時間 ‧ 約 3 分鐘

在Windows Driver層級的環境下取得時區差值與日光節約時間開啟與否

因為某種因素,小弟必須要在Windows Driver層級,透過EWDK或WDK的環境下取得時區差值與日光節約時間開啟與否。不過KUSER_SHARED_DATA (ntddk.h) - Windows drivers | Microsoft Learn裡面寫得不清不楚,實在很難讓人聯想到其實Time Zone ID就是GetTimeZoneInformation 函式 (timezoneapi.h) - Win32 apps | Microsoft Learn裡面的定義。小弟一開始還以為是Time Zone IDs (Compact 2013) | Microsoft Learn,想不到一點關係都沒有,白花了一點時間研究。

這就是標準的江湖一點訣,說破不值錢的例子,把一些研究結果記錄下來,以後可以少走一些冤枉路~


#include <ntddk.h>
#include <wdm.h>
#include <wdf.h>

#define TIME_ZONE_ID_UNKNOWN 0
#define TIME_ZONE_ID_STANDARD 1
#define TIME_ZONE_ID_DAYLIGHT 2

BOOLEAN IsDaylightSavingTimeEnabled()
{
// Read the time zone ID
ULONG timeZoneId = SharedUserData->TimeZoneId;

// Determine if daylight saving time is enabled
BOOLEAN isDaylightSavingTimeEnabled = (timeZoneId == (ULONG)TIME_ZONE_ID_DAYLIGHT);

return isDaylightSavingTimeEnabled;
}

LONG GetTimezoneOffset()
{
LARGE_INTEGER systemTime;
LARGE_INTEGER localTime;

// Get system time
KeQuerySystemTime(&systemTime);

// Convert to local time
ExSystemTimeToLocalTime(&systemTime, &localTime);

// Calculate the time zone offset (in minutes)
LONG timezoneOffset = (LONG)((systemTime.QuadPart - localTime.QuadPart) / 600000000);

return timezoneOffset;
}


也許可以參考這個登錄機碼設定值,是否更直觀地解決問題。


[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\TimeZoneInformation]
"RealTimeIsUniversal"=QWORD:00000001
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.