Index: dll/cpl/timedate/timezone.c =================================================================== --- dll/cpl/timedate/timezone.c (revision 71347) +++ dll/cpl/timedate/timezone.c (working copy) @@ -24,11 +24,10 @@ { struct _TIMEZONE_ENTRY *Prev; struct _TIMEZONE_ENTRY *Next; - WCHAR Description[64]; /* 'Display' */ + WCHAR Description[128]; /* 'Display' */ WCHAR StandardName[33]; /* 'Std' */ WCHAR DaylightName[33]; /* 'Dlt' */ TZ_INFO TimezoneInfo; /* 'TZI' */ - ULONG Index; /* 'Index ' */ } TIMEZONE_ENTRY, *PTIMEZONE_ENTRY; @@ -39,7 +38,7 @@ PTIMEZONE_ENTRY TimeZoneListTail = NULL; static PTIMEZONE_ENTRY -GetLargerTimeZoneEntry(DWORD Index) +GetLargerTimeZoneEntry(LONG Index, LPWSTR lpDescription) { PTIMEZONE_ENTRY Entry; @@ -46,8 +45,15 @@ Entry = TimeZoneListHead; while (Entry != NULL) { - if (Entry->Index >= Index) + if (Entry->TimezoneInfo.Bias > Index) + { return Entry; + } else + if (Entry->TimezoneInfo.Bias == Index) + { + if (wcsicmp(Entry->Description, lpDescription) > 0) + return Entry; + } Entry = Entry->Next; } @@ -56,6 +62,25 @@ } +static LONG +RegLocalQuery(HKEY hKey, LPCWSTR lpKeyName, void *lpData, DWORD dwSize) +{ + LONG lError; + + lError = RegQueryValueExW(hKey, + lpKeyName, + NULL, + NULL, + (LPBYTE)lpData, + &dwSize); + if (lError != ERROR_SUCCESS) + { + RegCloseKey(hKey); + } + + return lError; +} + static VOID CreateTimeZoneList(VOID) { @@ -62,7 +87,6 @@ WCHAR szKeyName[256]; DWORD dwIndex; DWORD dwNameSize; - DWORD dwValueSize; LONG lError; HKEY hZonesKey; HKEY hZoneKey; @@ -70,6 +94,8 @@ PTIMEZONE_ENTRY Entry; PTIMEZONE_ENTRY Current; + TIMEZONE_ENTRY Temp; + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones", 0, @@ -78,9 +104,10 @@ return; dwIndex = 0; - while (TRUE) + + for (;;) { - dwNameSize = 256 * sizeof(WCHAR); + dwNameSize = sizeof(szKeyName); lError = RegEnumKeyExW(hZonesKey, dwIndex, szKeyName, @@ -92,7 +119,9 @@ if (lError == ERROR_NO_MORE_ITEMS) break; - if (RegOpenKeyEx (hZonesKey, + dwIndex++; + + if (RegOpenKeyExW(hZonesKey, szKeyName, 0, KEY_QUERY_VALUE, @@ -99,77 +128,46 @@ &hZoneKey)) break; - Entry = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TIMEZONE_ENTRY)); - if (Entry == NULL) + if (RegLocalQuery(hZoneKey, + L"Display", + Temp.Description, + sizeof(Temp.Description))) { - RegCloseKey(hZoneKey); - break; - } - - dwValueSize = 64 * sizeof(WCHAR); - lError = RegQueryValueExW(hZoneKey, - L"Display", - NULL, - NULL, - (LPBYTE)&Entry->Description, - &dwValueSize); - if (lError != ERROR_SUCCESS) - { - RegCloseKey(hZoneKey); - dwIndex++; - HeapFree(GetProcessHeap(), 0, Entry); continue; } - dwValueSize = 33 * sizeof(WCHAR); - if (RegQueryValueExW(hZoneKey, - L"Std", - NULL, - NULL, - (LPBYTE)&Entry->StandardName, - &dwValueSize)) + if (RegLocalQuery(hZoneKey, + L"Std", + Temp.StandardName, + sizeof(Temp.StandardName))) { - RegCloseKey(hZoneKey); break; } - dwValueSize = 33 * sizeof(WCHAR); - if (RegQueryValueExW(hZoneKey, - L"Dlt", - NULL, - NULL, - (LPBYTE)&Entry->DaylightName, - &dwValueSize)) + if (RegLocalQuery(hZoneKey, + L"Dlt", + Temp.DaylightName, + sizeof(Temp.DaylightName))) { - RegCloseKey(hZoneKey); break; } - dwValueSize = sizeof(DWORD); - if (RegQueryValueExW(hZoneKey, - L"Index", - NULL, - NULL, - (LPBYTE)&Entry->Index, - &dwValueSize)) + if (RegLocalQuery(hZoneKey, + L"TZI", + &Temp.TimezoneInfo, + sizeof(TZ_INFO))) { - RegCloseKey(hZoneKey); break; } - dwValueSize = sizeof(TZ_INFO); - if (RegQueryValueExW(hZoneKey, - L"TZI", - NULL, - NULL, - (LPBYTE)&Entry->TimezoneInfo, - &dwValueSize)) - { - RegCloseKey(hZoneKey); + RegCloseKey(hZoneKey); + + Entry = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TIMEZONE_ENTRY)); + if (Entry == NULL) break; - } - RegCloseKey(hZoneKey); + // Copy data read from registry in the allocated entry + *Entry = Temp; if (TimeZoneListHead == NULL && TimeZoneListTail == NULL) @@ -181,7 +179,7 @@ } else { - Current = GetLargerTimeZoneEntry(Entry->Index); + Current = GetLargerTimeZoneEntry(Entry->TimezoneInfo.Bias, Entry->Description); if (Current != NULL) { if (Current == TimeZoneListHead) @@ -210,8 +208,6 @@ TimeZoneListTail = Entry; } } - - dwIndex++; } RegCloseKey(hZonesKey);