[RTL]
[reactos.git] / reactos / lib / rtl / timezone.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * PURPOSE: Timezone functions
5 * FILE: lib/rtl/timezone.c
6 * PROGRAMER: Eric Kohl
7 */
8
9 /* INCLUDES *****************************************************************/
10
11 #include <rtl.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /* FUNCTIONS ***************************************************************/
17
18 /*
19 * @implemented
20 */
21 NTSTATUS NTAPI
22 RtlQueryTimeZoneInformation(PRTL_TIME_ZONE_INFORMATION TimeZoneInformation)
23 {
24 RTL_QUERY_REGISTRY_TABLE QueryTable[8];
25 UNICODE_STRING StandardName;
26 UNICODE_STRING DaylightName;
27 NTSTATUS Status;
28
29 DPRINT("RtlQueryTimeZoneInformation()\n");
30
31 PAGED_CODE_RTL();
32
33 RtlZeroMemory(QueryTable,
34 sizeof(QueryTable));
35
36 StandardName.Length = 0;
37 StandardName.MaximumLength = 32 * sizeof(WCHAR);
38 StandardName.Buffer = TimeZoneInformation->StandardName;
39
40 DaylightName.Length = 0;
41 DaylightName.MaximumLength = 32 * sizeof(WCHAR);
42 DaylightName.Buffer = TimeZoneInformation->DaylightName;
43
44 QueryTable[0].Name = L"Bias";
45 QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
46 QueryTable[0].EntryContext = &TimeZoneInformation->Bias;
47
48 QueryTable[1].Name = L"Standard Name";
49 QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
50 QueryTable[1].EntryContext = &StandardName;
51
52 QueryTable[2].Name = L"Standard Bias";
53 QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT;
54 QueryTable[2].EntryContext = &TimeZoneInformation->StandardBias;
55
56 QueryTable[3].Name = L"Standard Start";
57 QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT;
58 QueryTable[3].EntryContext = &TimeZoneInformation->StandardDate;
59
60 QueryTable[4].Name = L"Daylight Name";
61 QueryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT;
62 QueryTable[4].EntryContext = &DaylightName;
63
64 QueryTable[5].Name = L"Daylight Bias";
65 QueryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT;
66 QueryTable[5].EntryContext = &TimeZoneInformation->DaylightBias;
67
68 QueryTable[6].Name = L"Daylight Start";
69 QueryTable[6].Flags = RTL_QUERY_REGISTRY_DIRECT;
70 QueryTable[6].EntryContext = &TimeZoneInformation->DaylightDate;
71
72 Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL,
73 L"TimeZoneInformation",
74 QueryTable,
75 NULL,
76 NULL);
77
78 return Status;
79 }
80
81
82 /*
83 * @implemented
84 */
85 NTSTATUS NTAPI
86 RtlSetTimeZoneInformation(PRTL_TIME_ZONE_INFORMATION TimeZoneInformation)
87 {
88 SIZE_T Length;
89 NTSTATUS Status;
90
91 DPRINT("RtlSetTimeZoneInformation()\n");
92
93 PAGED_CODE_RTL();
94
95 Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
96 L"TimeZoneInformation",
97 L"Bias",
98 REG_DWORD,
99 &TimeZoneInformation->Bias,
100 sizeof(LONG));
101 if (!NT_SUCCESS(Status))
102 {
103 return Status;
104 }
105
106 Length = (wcslen(TimeZoneInformation->StandardName) + 1) * sizeof(WCHAR);
107 Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
108 L"TimeZoneInformation",
109 L"Standard Name",
110 REG_SZ,
111 TimeZoneInformation->StandardName,
112 (ULONG)Length);
113 if (!NT_SUCCESS(Status))
114 {
115 return Status;
116 }
117
118 Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
119 L"TimeZoneInformation",
120 L"Standard Bias",
121 REG_DWORD,
122 &TimeZoneInformation->StandardBias,
123 sizeof(LONG));
124 if (!NT_SUCCESS(Status))
125 {
126 return Status;
127 }
128
129 Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
130 L"TimeZoneInformation",
131 L"Standard Start",
132 REG_BINARY,
133 &TimeZoneInformation->StandardDate,
134 sizeof(SYSTEMTIME));
135 if (!NT_SUCCESS(Status))
136 {
137 return Status;
138 }
139
140 Length = (wcslen(TimeZoneInformation->DaylightName) + 1) * sizeof(WCHAR);
141 Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
142 L"TimeZoneInformation",
143 L"Daylight Name",
144 REG_SZ,
145 TimeZoneInformation->DaylightName,
146 (ULONG)Length);
147 if (!NT_SUCCESS(Status))
148 {
149 return Status;
150 }
151
152 Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
153 L"TimeZoneInformation",
154 L"Daylight Bias",
155 REG_DWORD,
156 &TimeZoneInformation->DaylightBias,
157 sizeof(LONG));
158 if (!NT_SUCCESS(Status))
159 {
160 return Status;
161 }
162
163 Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
164 L"TimeZoneInformation",
165 L"Daylight Start",
166 REG_BINARY,
167 &TimeZoneInformation->DaylightDate,
168 sizeof(SYSTEMTIME));
169
170 return Status;
171 }
172
173 /* EOF */