Qian Hong : kernel32: Init TimezoneInformation registry.
Module: wine Branch: master Commit: 4c2cc57c7f43237afd58bd747e0b2ec13a386702 URL: https://source.winehq.org/git/wine.git/?a=commit;h=4c2cc57c7f43237afd58bd747... Author: Qian Hong <qhong(a)codeweavers.com> Date: Wed Apr 18 07:44:29 2018 +0000 kernel32: Init TimezoneInformation registry. Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/kernel_main.c | 3 +++ dlls/kernel32/kernel_private.h | 3 +++ dlls/kernel32/time.c | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/dlls/kernel32/kernel_main.c b/dlls/kernel32/kernel_main.c index e24100b..d3420ec 100644 --- a/dlls/kernel32/kernel_main.c +++ b/dlls/kernel32/kernel_main.c @@ -88,6 +88,9 @@ static BOOL process_attach( HMODULE module ) /* Setup registry locale information */ LOCALE_InitRegistry(); + /* Setup registry timezone information */ + TIMEZONE_InitRegistry(); + /* Setup computer name */ COMPUTERNAME_Init(); diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h index 848ba95..9073e18 100644 --- a/dlls/kernel32/kernel_private.h +++ b/dlls/kernel32/kernel_private.h @@ -104,6 +104,9 @@ extern void COMPUTERNAME_Init(void) DECLSPEC_HIDDEN; extern void LOCALE_Init(void) DECLSPEC_HIDDEN; extern void LOCALE_InitRegistry(void) DECLSPEC_HIDDEN; +/* time.c */ +extern void TIMEZONE_InitRegistry(void) DECLSPEC_HIDDEN; + /* oldconfig.c */ extern void convert_old_config(void) DECLSPEC_HIDDEN; diff --git a/dlls/kernel32/time.c b/dlls/kernel32/time.c index b0b8669..91b2c00 100644 --- a/dlls/kernel32/time.c +++ b/dlls/kernel32/time.c @@ -778,6 +778,46 @@ static void TIME_ClockTimeToFileTime(clock_t unix_time, LPFILETIME filetime) filetime->dwHighDateTime = (DWORD)(secs >> 32); } +/*********************************************************************** + * TIMEZONE_InitRegistry + * + * Update registry contents on startup if the user timezone has changed. + * This simulates the action of the Windows control panel. + */ +void TIMEZONE_InitRegistry(void) +{ + static const WCHAR timezoneInformationW[] = { + 'M','a','c','h','i','n','e','\\','S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\', + 'T','i','m','e','Z','o','n','e','I','n','f','o','r','m','a','t','i','o','n','\0' + }; + static const WCHAR standardNameW[] = {'S','t','a','n','d','a','r','d','N','a','m','e','\0'}; + static const WCHAR timezoneKeyNameW[] = {'T','i','m','e','Z','o','n','e','K','e','y','N','a','m','e','\0'}; + DYNAMIC_TIME_ZONE_INFORMATION tzinfo; + UNICODE_STRING name; + OBJECT_ATTRIBUTES attr; + HANDLE hkey; + DWORD tzid; + + tzid = GetDynamicTimeZoneInformation(&tzinfo); + if (tzid == TIME_ZONE_ID_INVALID) return; + + RtlInitUnicodeString(&name, timezoneInformationW); + InitializeObjectAttributes(&attr, &name, 0, 0, NULL); + if (NtCreateKey(&hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL) != STATUS_SUCCESS) return; + + RtlInitUnicodeString(&name, standardNameW); + NtSetValueKey(hkey, &name, 0, REG_SZ, tzinfo.StandardName, + (strlenW(tzinfo.StandardName) + 1) * sizeof(WCHAR)); + + RtlInitUnicodeString(&name, timezoneKeyNameW); + NtSetValueKey(hkey, &name, 0, REG_SZ, tzinfo.TimeZoneKeyName, + (strlenW(tzinfo.TimeZoneKeyName) + 1) * sizeof(WCHAR)); + + NtClose( hkey ); +} + /********************************************************************* * GetProcessTimes (KERNEL32.@) *
participants (1)
-
Alexandre Julliard