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