update for HEAD-2003091401
[reactos.git] / ntoskrnl / rtl / timezone.c
1 /* $Id$
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 <ddk/ntddk.h>
15 #include <internal/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 */