From: Sebastian Lackner Subject: [1/2] ntdll: Add support for Dynamic DST (daylight saving time) information in registry. Message-Id: <53D80CB8.9040108@fds-team.de> Date: Tue, 29 Jul 2014 23:06:00 +0200 From: Michael Müller --- dlls/ntdll/time.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) From b72d6c2bb191c98187193ea00ccce6eed0486a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Thu, 24 Jul 2014 01:27:16 +0200 Subject: ntdll: Add support for Dynamic DST (daylight saving time) information in registry. --- dlls/ntdll/time.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/dlls/ntdll/time.c b/dlls/ntdll/time.c index 5ec5a1c..df3bedd 100644 --- a/dlls/ntdll/time.c +++ b/dlls/ntdll/time.c @@ -598,11 +598,23 @@ static void find_reg_tz_info(RTL_TIME_ZONE_INFORMATION *tzi) 'W','i','n','d','o','w','s',' ','N','T','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'T','i','m','e',' ','Z','o','n','e','s',0 }; + static const WCHAR Dynamic_DstW[] = { 'D','y','n','a','m','i','c',' ','D','S','T',0 }; + static const WCHAR fmtW[] = { '%','d',0 }; HANDLE hkey; ULONG idx; - OBJECT_ATTRIBUTES attr; - UNICODE_STRING nameW; - WCHAR buf[128]; + OBJECT_ATTRIBUTES attr, attrDynamic; + UNICODE_STRING nameW, nameDynamicW; + WCHAR buf[128], yearW[16]; + + sprintfW(yearW, fmtW, tzi->DaylightDate.wYear); + + attrDynamic.Length = sizeof(attrDynamic); + attrDynamic.RootDirectory = 0; /* will be replaced later */ + attrDynamic.ObjectName = &nameDynamicW; + attrDynamic.Attributes = 0; + attrDynamic.SecurityDescriptor = NULL; + attrDynamic.SecurityQualityOfService = NULL; + RtlInitUnicodeString(&nameDynamicW, Dynamic_DstW); attr.Length = sizeof(attr); attr.RootDirectory = 0; @@ -628,7 +640,9 @@ static void find_reg_tz_info(RTL_TIME_ZONE_INFORMATION *tzi) static const WCHAR dltW[] = { 'D','l','t',0 }; static const WCHAR tziW[] = { 'T','Z','I',0 }; RTL_TIME_ZONE_INFORMATION reg_tzi; - HANDLE hSubkey; + HANDLE hSubkey, hSubkeyDynamicDST; + BOOL is_dynamic = FALSE; + struct tz_reg_data { LONG bias; @@ -660,7 +674,17 @@ static void find_reg_tz_info(RTL_TIME_ZONE_INFORMATION *tzi) get_value(hSubkey, stdW, REG_SZ, reg_tzi.StandardName, sizeof(reg_tzi.StandardName)); get_value(hSubkey, dltW, REG_SZ, reg_tzi.DaylightName, sizeof(reg_tzi.DaylightName)); - get_value(hSubkey, tziW, REG_BINARY, &tz_data, sizeof(tz_data)); + + /* Check for Dynamic DST entry first */ + attrDynamic.RootDirectory = hSubkey; + if (!NtOpenKey(&hSubkeyDynamicDST, KEY_READ, &attrDynamic)) + { + is_dynamic = reg_query_value(hSubkeyDynamicDST, yearW, REG_BINARY, &tz_data, sizeof(tz_data)); + NtClose(hSubkeyDynamicDST); + } + + if (!is_dynamic) + get_value(hSubkey, tziW, REG_BINARY, &tz_data, sizeof(tz_data)); #undef get_value -- 1.7.9.5