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