=?UTF-8?Q?Michael=20M=C3=BCller=20?=: ntdll: Add support for Dynamic DST ( daylight saving time) information in registry.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Apr 28 09:10:39 CDT 2015
Module: wine
Branch: master
Commit: 7567db85be228f6a88de070d8ce4fa802581cd67
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7567db85be228f6a88de070d8ce4fa802581cd67
Author: Michael Müller <michael at fds-team.de>
Date: Thu Jul 24 01:27:16 2014 +0200
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 69bd736..65bd2b6 100644
--- a/dlls/ntdll/time.c
+++ b/dlls/ntdll/time.c
@@ -592,11 +592,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;
@@ -622,7 +634,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;
@@ -654,7 +668,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
More information about the wine-cvs
mailing list