Copy msimg32
[reactos.git] / reactos / ntoskrnl / ex / time.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ex/time.c
6 * PURPOSE: Time
7 * PROGRAMMER: David Welch (welch@mcmail.com)
8 * UPDATE HISTORY:
9 * Created 22/05/98
10 */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ntoskrnl.h>
15 #define NDEBUG
16 #include <internal/debug.h>
17
18
19 #define TICKSPERMINUTE 600000000
20
21 /* GLOBALS ******************************************************************/
22
23 /* Note: Bias[minutes] = UTC - local time */
24 TIME_ZONE_INFORMATION ExpTimeZoneInfo;
25 LARGE_INTEGER ExpTimeZoneBias;
26 ULONG ExpTimeZoneId;
27
28
29 /* FUNCTIONS ****************************************************************/
30
31 VOID INIT_FUNCTION
32 ExpInitTimeZoneInfo(VOID)
33 {
34 LARGE_INTEGER CurrentTime;
35 NTSTATUS Status;
36
37 /* Read time zone information from the registry */
38 Status = RtlQueryTimeZoneInformation(&ExpTimeZoneInfo);
39 if (!NT_SUCCESS(Status))
40 {
41 memset(&ExpTimeZoneInfo, 0, sizeof(TIME_ZONE_INFORMATION));
42
43 ExpTimeZoneBias.QuadPart = (LONGLONG)0;
44 ExpTimeZoneId = TIME_ZONE_ID_UNKNOWN;
45 }
46 else
47 {
48 /* FIXME: Calculate transition dates */
49
50 ExpTimeZoneBias.QuadPart =
51 ((LONGLONG)(ExpTimeZoneInfo.Bias + ExpTimeZoneInfo.StandardBias)) * TICKSPERMINUTE;
52 ExpTimeZoneId = TIME_ZONE_ID_STANDARD;
53 }
54
55 SharedUserData->TimeZoneBias.High1Time = ExpTimeZoneBias.u.HighPart;
56 SharedUserData->TimeZoneBias.High2Time = ExpTimeZoneBias.u.HighPart;
57 SharedUserData->TimeZoneBias.LowPart = ExpTimeZoneBias.u.LowPart;
58 SharedUserData->TimeZoneId = ExpTimeZoneId;
59
60 /* Convert boot time from local time to UTC */
61 SystemBootTime.QuadPart += ExpTimeZoneBias.QuadPart;
62
63 /* Convert sytem time from local time to UTC */
64 do
65 {
66 CurrentTime.u.HighPart = SharedUserData->SystemTime.High1Time;
67 CurrentTime.u.LowPart = SharedUserData->SystemTime.LowPart;
68 }
69 while (CurrentTime.u.HighPart != SharedUserData->SystemTime.High2Time);
70
71 CurrentTime.QuadPart += ExpTimeZoneBias.QuadPart;
72
73 SharedUserData->SystemTime.LowPart = CurrentTime.u.LowPart;
74 SharedUserData->SystemTime.High1Time = CurrentTime.u.HighPart;
75 SharedUserData->SystemTime.High2Time = CurrentTime.u.HighPart;
76 }
77
78
79 NTSTATUS
80 ExpSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation)
81 {
82 LARGE_INTEGER LocalTime;
83 LARGE_INTEGER SystemTime;
84 TIME_FIELDS TimeFields;
85
86 DPRINT("ExpSetTimeZoneInformation() called\n");
87
88 DPRINT("Old time zone bias: %d minutes\n",
89 ExpTimeZoneInfo.Bias);
90 DPRINT("Old time zone standard bias: %d minutes\n",
91 ExpTimeZoneInfo.StandardBias);
92
93 DPRINT("New time zone bias: %d minutes\n",
94 TimeZoneInformation->Bias);
95 DPRINT("New time zone standard bias: %d minutes\n",
96 TimeZoneInformation->StandardBias);
97
98 /* Get the local time */
99 HalQueryRealTimeClock(&TimeFields);
100 RtlTimeFieldsToTime(&TimeFields,
101 &LocalTime);
102
103 /* FIXME: Calculate transition dates */
104
105 ExpTimeZoneBias.QuadPart =
106 ((LONGLONG)(TimeZoneInformation->Bias + TimeZoneInformation->StandardBias)) * TICKSPERMINUTE;
107 ExpTimeZoneId = TIME_ZONE_ID_STANDARD;
108
109 memcpy(&ExpTimeZoneInfo,
110 TimeZoneInformation,
111 sizeof(TIME_ZONE_INFORMATION));
112
113 /* Set the new time zone information */
114 SharedUserData->TimeZoneBias.High1Time = ExpTimeZoneBias.u.HighPart;
115 SharedUserData->TimeZoneBias.High2Time = ExpTimeZoneBias.u.HighPart;
116 SharedUserData->TimeZoneBias.LowPart = ExpTimeZoneBias.u.LowPart;
117 SharedUserData->TimeZoneId = ExpTimeZoneId;
118
119 DPRINT("New time zone bias: %I64d minutes\n",
120 ExpTimeZoneBias.QuadPart / TICKSPERMINUTE);
121
122 /* Calculate the new system time */
123 ExLocalTimeToSystemTime(&LocalTime,
124 &SystemTime);
125
126 /* Set the new system time */
127 KiSetSystemTime(&SystemTime);
128
129 DPRINT("ExpSetTimeZoneInformation() done\n");
130
131 return STATUS_SUCCESS;
132 }
133
134
135 /*
136 * FUNCTION: Sets the system time.
137 * PARAMETERS:
138 * NewTime - Points to a variable that specified the new time
139 * of day in the standard time format.
140 * OldTime - Optionally points to a variable that receives the
141 * old time of day in the standard time format.
142 * RETURNS: Status
143 */
144 NTSTATUS STDCALL
145 NtSetSystemTime(IN PLARGE_INTEGER UnsafeNewSystemTime,
146 OUT PLARGE_INTEGER UnsafeOldSystemTime OPTIONAL)
147 {
148 LARGE_INTEGER OldSystemTime;
149 LARGE_INTEGER NewSystemTime;
150 LARGE_INTEGER LocalTime;
151 TIME_FIELDS TimeFields;
152 NTSTATUS Status;
153
154 /* FIXME: Check for SeSystemTimePrivilege */
155
156 Status = MmCopyFromCaller(&NewSystemTime, UnsafeNewSystemTime,
157 sizeof(NewSystemTime));
158 if (!NT_SUCCESS(Status))
159 {
160 return Status;
161 }
162
163 if (UnsafeOldSystemTime != NULL)
164 {
165 KeQuerySystemTime(&OldSystemTime);
166 }
167 ExSystemTimeToLocalTime(&NewSystemTime,
168 &LocalTime);
169 RtlTimeToTimeFields(&LocalTime,
170 &TimeFields);
171 HalSetRealTimeClock(&TimeFields);
172
173 /* Set system time */
174 KiSetSystemTime(&NewSystemTime);
175
176 if (UnsafeOldSystemTime != NULL)
177 {
178 Status = MmCopyToCaller(UnsafeOldSystemTime, &OldSystemTime,
179 sizeof(OldSystemTime));
180 if (!NT_SUCCESS(Status))
181 {
182 return Status;
183 }
184 }
185
186 return STATUS_SUCCESS;
187 }
188
189
190 /*
191 * FUNCTION: Retrieves the system time.
192 * PARAMETERS:
193 * CurrentTime - Points to a variable that receives the current
194 * time of day in the standard time format.
195 */
196 NTSTATUS STDCALL
197 NtQuerySystemTime(OUT PLARGE_INTEGER UnsafeCurrentTime)
198 {
199 LARGE_INTEGER CurrentTime;
200 NTSTATUS Status;
201
202 KeQuerySystemTime(&CurrentTime);
203 Status = MmCopyToCaller(UnsafeCurrentTime, &CurrentTime,
204 sizeof(CurrentTime));
205 if (!NT_SUCCESS(Status))
206 {
207 return(Status);
208 }
209 return STATUS_SUCCESS;
210 }
211
212
213 /*
214 * @implemented
215 */
216 VOID
217 STDCALL
218 ExLocalTimeToSystemTime (
219 PLARGE_INTEGER LocalTime,
220 PLARGE_INTEGER SystemTime
221 )
222 {
223 SystemTime->QuadPart =
224 LocalTime->QuadPart + ExpTimeZoneBias.QuadPart;
225 }
226
227
228 /*
229 * @unimplemented
230 */
231 ULONG
232 STDCALL
233 ExSetTimerResolution (
234 IN ULONG DesiredTime,
235 IN BOOLEAN SetResolution
236 )
237 {
238 UNIMPLEMENTED;
239 }
240
241
242 /*
243 * @implemented
244 */
245 VOID
246 STDCALL
247 ExSystemTimeToLocalTime (
248 PLARGE_INTEGER SystemTime,
249 PLARGE_INTEGER LocalTime
250 )
251 {
252 LocalTime->QuadPart =
253 SystemTime->QuadPart - ExpTimeZoneBias.QuadPart;
254 }
255
256 /* EOF */