- Make TIME_ZONE_ID_XXX constants available from kernel mode.
[reactos.git] / reactos / ntoskrnl / ex / time.c
1 /* $Id: time.c,v 1.24 2004/11/06 16:04:58 ekohl Exp $
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 #include <internal/debug.h>
16
17
18 #define TICKSPERMINUTE 600000000
19
20 /* GLOBALS ******************************************************************/
21
22 /* Note: Bias[minutes] = UTC - local time */
23 TIME_ZONE_INFORMATION ExpTimeZoneInfo;
24 LARGE_INTEGER ExpTimeZoneBias;
25 ULONG ExpTimeZoneId;
26
27
28 /* FUNCTIONS ****************************************************************/
29
30 VOID INIT_FUNCTION
31 ExpInitTimeZoneInfo(VOID)
32 {
33 NTSTATUS Status;
34
35 /* Read time zone information from the registry */
36 Status = RtlQueryTimeZoneInformation(&ExpTimeZoneInfo);
37 if (!NT_SUCCESS(Status))
38 {
39 memset(&ExpTimeZoneInfo, 0, sizeof(TIME_ZONE_INFORMATION));
40
41 ExpTimeZoneBias.QuadPart = (LONGLONG)0;
42 ExpTimeZoneId = TIME_ZONE_ID_UNKNOWN;
43 }
44 else
45 {
46 /* FIXME: Calculate transition dates */
47
48 ExpTimeZoneBias.QuadPart =
49 ((LONGLONG)(ExpTimeZoneInfo.Bias + ExpTimeZoneInfo.StandardBias)) * TICKSPERMINUTE;
50 ExpTimeZoneId = TIME_ZONE_ID_STANDARD;
51 }
52
53 SharedUserData->TimeZoneBias.High1Time = ExpTimeZoneBias.u.HighPart;
54 SharedUserData->TimeZoneBias.High2Time = ExpTimeZoneBias.u.HighPart;
55 SharedUserData->TimeZoneBias.LowPart = ExpTimeZoneBias.u.LowPart;
56 SharedUserData->TimeZoneId = ExpTimeZoneId;
57 }
58
59
60 /*
61 * FUNCTION: Sets the system time.
62 * PARAMETERS:
63 * NewTime - Points to a variable that specified the new time
64 * of day in the standard time format.
65 * OldTime - Optionally points to a variable that receives the
66 * old time of day in the standard time format.
67 * RETURNS: Status
68 */
69 NTSTATUS STDCALL
70 NtSetSystemTime(IN PLARGE_INTEGER UnsafeNewSystemTime,
71 OUT PLARGE_INTEGER UnsafeOldSystemTime OPTIONAL)
72 {
73 NTSTATUS Status;
74 LARGE_INTEGER OldSystemTime;
75 LARGE_INTEGER NewSystemTime;
76 LARGE_INTEGER LocalTime;
77 TIME_FIELDS TimeFields;
78
79 /* FIXME: Check for SeSystemTimePrivilege */
80
81 if (UnsafeNewSystemTime == NULL)
82 {
83 /* FIXME: update time zone settings */
84
85 return STATUS_SUCCESS;
86 }
87
88 Status = MmCopyFromCaller(&NewSystemTime, UnsafeNewSystemTime,
89 sizeof(NewSystemTime));
90 if (!NT_SUCCESS(Status))
91 {
92 return(Status);
93 }
94
95 if (UnsafeOldSystemTime != NULL)
96 {
97 KeQuerySystemTime(&OldSystemTime);
98 }
99 ExSystemTimeToLocalTime(&NewSystemTime,
100 &LocalTime);
101 RtlTimeToTimeFields(&LocalTime,
102 &TimeFields);
103 HalSetRealTimeClock(&TimeFields);
104
105 /* FIXME: set system time */
106 #if 0
107 KeSetSystemTime();
108 #endif
109
110 if (UnsafeOldSystemTime != NULL)
111 {
112 Status = MmCopyToCaller(UnsafeOldSystemTime, &OldSystemTime,
113 sizeof(OldSystemTime));
114 if (!NT_SUCCESS(Status))
115 {
116 return(Status);
117 }
118 }
119 return(STATUS_SUCCESS);
120 }
121
122
123 /*
124 * FUNCTION: Retrieves the system time.
125 * PARAMETERS:
126 * CurrentTime - Points to a variable that receives the current
127 * time of day in the standard time format.
128 */
129 NTSTATUS STDCALL
130 NtQuerySystemTime(OUT PLARGE_INTEGER UnsafeCurrentTime)
131 {
132 LARGE_INTEGER CurrentTime;
133 NTSTATUS Status;
134
135 KeQuerySystemTime(&CurrentTime);
136 Status = MmCopyToCaller(UnsafeCurrentTime, &CurrentTime,
137 sizeof(CurrentTime));
138 if (!NT_SUCCESS(Status))
139 {
140 return(Status);
141 }
142 return STATUS_SUCCESS;
143 }
144
145
146 /*
147 * @implemented
148 */
149 VOID
150 STDCALL
151 ExLocalTimeToSystemTime (
152 PLARGE_INTEGER LocalTime,
153 PLARGE_INTEGER SystemTime
154 )
155 {
156 SystemTime->QuadPart =
157 LocalTime->QuadPart;
158 #if 0
159 LocalTime->QuadPart + ExpTimeZoneBias.QuadPart;
160 #endif
161 }
162
163
164 /*
165 * @unimplemented
166 */
167 VOID
168 STDCALL
169 ExSetTimerResolution (
170 IN ULONG DesiredTime,
171 IN BOOLEAN SetResolution
172 )
173 {
174 UNIMPLEMENTED;
175 }
176
177
178 /*
179 * @implemented
180 */
181 VOID
182 STDCALL
183 ExSystemTimeToLocalTime (
184 PLARGE_INTEGER SystemTime,
185 PLARGE_INTEGER LocalTime
186 )
187 {
188 LocalTime->QuadPart =
189 SystemTime->QuadPart;
190 #if 0
191 SystemTime->QuadPart - ExpTimeZoneBias.QuadPart;
192 #endif
193 }
194
195 /* EOF */