1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include "common.h"
#include "timezone.h"
TimeList timezone_list(10), geo_timezone_list(10, LS_TZREG::compare);
int LS_TZREG::compare(const LS_TZREG *p1, const LS_TZREG *p2) {
//return Index < other.Index;
return p1->TZI.Bias - p2->TZI.Bias;
}
bool build_timezone_list() {
HKEY HKlmtz;
HKEY KKtz;
DWORD dwIndex = 0;
CHAR tcName[MAX_SIZE];
DWORD dwcbName = MAX_SIZE;
DWORD dwcbValue;
DWORD dwcbSTD;
DWORD dwcbDLT;
LS_TZREG Temp;
FILETIME ftLastWrite;
bool win9x = false;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TZREG, 0, KEY_ENUMERATE_SUB_KEYS, &HKlmtz) != ERROR_SUCCESS) {
win9x = true;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TZREG_9X, 0, KEY_ENUMERATE_SUB_KEYS, &HKlmtz) != ERROR_SUCCESS)
return false;
}
while(RegEnumKeyEx(HKlmtz, dwIndex, tcName, &dwcbName, NULL, NULL, NULL, &ftLastWrite) != ERROR_NO_MORE_ITEMS) {
if(RegOpenKeyEx(HKlmtz, tcName, 0,KEY_QUERY_VALUE, &KKtz) != ERROR_SUCCESS) {
RegCloseKey(HKlmtz);
return false;
}
strncpy(Temp.tcName, tcName, MAX_SIZE);
dwcbValue = MAX_SIZE;
RegQueryValueEx(KKtz,"Display",NULL,NULL,(BYTE*)Temp.tcDisp,&dwcbValue);
dwcbDLT = MAX_SIZE;
RegQueryValueEx(KKtz,"Dlt",NULL,NULL,(BYTE*)Temp.tcDLT,&dwcbDLT);
dwcbSTD = MAX_SIZE;
RegQueryValueEx(KKtz,"Std",NULL,NULL,(BYTE*)Temp.tcSTD,&dwcbSTD);
dwcbValue = MAX_SIZE;
RegQueryValueEx(KKtz,"MapID",NULL,NULL,(BYTE*)Temp.MapID,&dwcbValue);
if(!win9x) {
dwcbValue = sizeof(DWORD);
RegQueryValueEx(KKtz,"Index",NULL,NULL,(BYTE*)&Temp.Index,&dwcbValue);
}
dwcbValue = sizeof(Temp.TZI);
RegQueryValueEx(KKtz,"TZI",NULL,NULL,(BYTE*)&Temp.TZI,&dwcbValue);
RegCloseKey(KKtz);
Temp.list_index = dwIndex;
timezone_list.insert(new LS_TZREG(Temp));
geo_timezone_list.insert(new LS_TZREG(Temp));
dwcbName = MAX_SIZE;
dwIndex++;
}
RegCloseKey(HKlmtz);
return true;
}
|