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