56587d762077723850907872743358efde234633
[reactos.git] / reactos / lib / ntdll / rtl / timezone.c
1 /* $Id: timezone.c,v 1.5 2003/07/11 13:50:23 royce Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Timezone functions
6 * FILE: lib/ntdll/rtl/timezone.c
7 * PROGRAMER: Eric Kohl
8 * REVISION HISTORY:
9 * 29/05/2001: Created
10 */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <ntos/registry.h>
16 #include <ntos/time.h>
17
18 #define NDEBUG
19 #include <ntdll/ntdll.h>
20
21
22 /* FUNCTIONS *****************************************************************/
23
24 /*
25 * @implemented
26 */
27 NTSTATUS STDCALL
28 RtlQueryTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation)
29 {
30 HANDLE KeyHandle;
31 RTL_QUERY_REGISTRY_TABLE QueryTable[8];
32 UNICODE_STRING StandardName;
33 UNICODE_STRING DaylightName;
34 NTSTATUS Status;
35
36 DPRINT("RtlQueryTimeZoneInformation()\n");
37
38 Status = RtlpGetRegistryHandle(RTL_REGISTRY_CONTROL,
39 L"TimeZoneInformation",
40 TRUE,
41 &KeyHandle);
42 if (!NT_SUCCESS(Status))
43 {
44 DPRINT("RtlpGetRegistryHandle failed (Status %x)\n", Status);
45 return Status;
46 }
47
48 RtlZeroMemory(QueryTable,
49 sizeof(QueryTable));
50
51 StandardName.Length = 0;
52 StandardName.MaximumLength = 32 * sizeof(WCHAR);
53 StandardName.Buffer = TimeZoneInformation->StandardName;
54
55 DaylightName.Length = 0;
56 DaylightName.MaximumLength = 32 * sizeof(WCHAR);
57 DaylightName.Buffer = TimeZoneInformation->DaylightName;
58
59 QueryTable[0].Name = L"Bias";
60 QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
61 QueryTable[0].EntryContext = &TimeZoneInformation->Bias;
62
63 QueryTable[1].Name = L"Standard Name";
64 QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
65 QueryTable[1].EntryContext = &StandardName;
66
67 QueryTable[2].Name = L"Standard Bias";
68 QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT;
69 QueryTable[2].EntryContext = &TimeZoneInformation->StandardBias;
70
71 QueryTable[3].Name = L"Standard Start";
72 QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT;
73 QueryTable[3].EntryContext = &TimeZoneInformation->StandardDate;
74
75 QueryTable[4].Name = L"Daylight Name";
76 QueryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT;
77 QueryTable[4].EntryContext = &DaylightName;
78
79 QueryTable[5].Name = L"Daylight Bias";
80 QueryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT;
81 QueryTable[5].EntryContext = &TimeZoneInformation->DaylightBias;
82
83 QueryTable[6].Name = L"Daylight Start";
84 QueryTable[6].Flags = RTL_QUERY_REGISTRY_DIRECT;
85 QueryTable[6].EntryContext = &TimeZoneInformation->DaylightDate;
86
87 Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
88 (PWSTR)KeyHandle,
89 QueryTable,
90 NULL,
91 NULL);
92 NtClose(KeyHandle);
93
94 return Status;
95 }
96
97
98 /*
99 * @implemented
100 */
101 NTSTATUS STDCALL
102 RtlSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation)
103 {
104 HANDLE KeyHandle;
105 ULONG Length;
106 NTSTATUS Status;
107
108 DPRINT("RtlSetTimeZoneInformation()\n");
109
110 Status = RtlpGetRegistryHandle(RTL_REGISTRY_CONTROL,
111 L"TimeZoneInformation",
112 TRUE,
113 &KeyHandle);
114 if (!NT_SUCCESS(Status))
115 {
116 DPRINT("RtlpGetRegistryHandle failed (Status %x)\n", Status);
117 return Status;
118 }
119
120 Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
121 (PWSTR)KeyHandle,
122 L"Bias",
123 REG_DWORD,
124 &TimeZoneInformation->Bias,
125 sizeof(LONG));
126 if (!NT_SUCCESS(Status))
127 {
128 NtClose(KeyHandle);
129 return Status;
130 }
131
132 Length = (wcslen(TimeZoneInformation->StandardName) + 1) * sizeof(WCHAR);
133 Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
134 (PWSTR)KeyHandle,
135 L"Standard Name",
136 REG_SZ,
137 TimeZoneInformation->StandardName,
138 Length);
139 if (!NT_SUCCESS(Status))
140 {
141 NtClose(KeyHandle);
142 return Status;
143 }
144
145 Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
146 (PWSTR)KeyHandle,
147 L"Standard Bias",
148 REG_DWORD,
149 &TimeZoneInformation->StandardBias,
150 sizeof(LONG));
151 if (!NT_SUCCESS(Status))
152 {
153 NtClose(KeyHandle);
154 return Status;
155 }
156
157 Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
158 (PWSTR)KeyHandle,
159 L"Standard Start",
160 REG_BINARY,
161 &TimeZoneInformation->StandardDate,
162 sizeof(SYSTEMTIME));
163 if (!NT_SUCCESS(Status))
164 {
165 NtClose(KeyHandle);
166 return Status;
167 }
168
169 Length = (wcslen(TimeZoneInformation->DaylightName) + 1) * sizeof(WCHAR);
170 Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
171 (PWSTR)KeyHandle,
172 L"Daylight Name",
173 REG_SZ,
174 TimeZoneInformation->DaylightName,
175 Length);
176 if (!NT_SUCCESS(Status))
177 {
178 NtClose(KeyHandle);
179 return Status;
180 }
181
182 Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
183 (PWSTR)KeyHandle,
184 L"Daylight Bias",
185 REG_DWORD,
186 &TimeZoneInformation->DaylightBias,
187 sizeof(LONG));
188 if (!NT_SUCCESS(Status))
189 {
190 NtClose(KeyHandle);
191 return Status;
192 }
193
194 Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
195 (PWSTR)KeyHandle,
196 L"Daylight Start",
197 REG_BINARY,
198 &TimeZoneInformation->DaylightDate,
199 sizeof(SYSTEMTIME));
200
201 NtClose(KeyHandle);
202
203 return Status;
204 }
205
206 /* EOF */