Read time zone information from registry at startup.
[reactos.git] / reactos / ntoskrnl / ex / time.c
1 /* $Id: time.c,v 1.23 2004/11/05 17:42:20 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
25
26 /* FUNCTIONS ****************************************************************/
27
28 VOID INIT_FUNCTION
29 ExpInitTimeZoneInfo(VOID)
30 {
31 NTSTATUS Status;
32
33 /* Read time zone information from the registry */
34 Status = RtlQueryTimeZoneInformation(&ExpTimeZoneInfo);
35 if (!NT_SUCCESS(Status))
36 {
37 memset(&ExpTimeZoneInfo, 0, sizeof(TIME_ZONE_INFORMATION));
38
39 }
40 }
41
42
43 /*
44 * FUNCTION: Sets the system time.
45 * PARAMETERS:
46 * NewTime - Points to a variable that specified the new time
47 * of day in the standard time format.
48 * OldTime - Optionally points to a variable that receives the
49 * old time of day in the standard time format.
50 * RETURNS: Status
51 */
52 NTSTATUS STDCALL
53 NtSetSystemTime(IN PLARGE_INTEGER UnsafeNewSystemTime,
54 OUT PLARGE_INTEGER UnsafeOldSystemTime OPTIONAL)
55 {
56 NTSTATUS Status;
57 LARGE_INTEGER OldSystemTime;
58 LARGE_INTEGER NewSystemTime;
59 TIME_FIELDS TimeFields;
60
61 /* FIXME: Check for SeSystemTimePrivilege */
62
63 if (UnsafeNewSystemTime == NULL)
64 {
65 /* FIXME: update time zone settings */
66
67 return STATUS_SUCCESS;
68 }
69
70 Status = MmCopyFromCaller(&NewSystemTime, UnsafeNewSystemTime,
71 sizeof(NewSystemTime));
72 if (!NT_SUCCESS(Status))
73 {
74 return(Status);
75 }
76
77 if (UnsafeOldSystemTime != NULL)
78 {
79 KeQuerySystemTime(&OldSystemTime);
80 }
81 RtlTimeToTimeFields (&NewSystemTime, &TimeFields);
82 HalSetRealTimeClock (&TimeFields);
83
84 if (UnsafeOldSystemTime != NULL)
85 {
86 Status = MmCopyToCaller(UnsafeOldSystemTime, &OldSystemTime,
87 sizeof(OldSystemTime));
88 if (!NT_SUCCESS(Status))
89 {
90 return(Status);
91 }
92 }
93 return(STATUS_SUCCESS);
94 }
95
96
97 /*
98 * FUNCTION: Retrieves the system time.
99 * PARAMETERS:
100 * CurrentTime - Points to a variable that receives the current
101 * time of day in the standard time format.
102 */
103 NTSTATUS STDCALL
104 NtQuerySystemTime(OUT PLARGE_INTEGER UnsafeCurrentTime)
105 {
106 LARGE_INTEGER CurrentTime;
107 NTSTATUS Status;
108
109 KeQuerySystemTime(&CurrentTime);
110 Status = MmCopyToCaller(UnsafeCurrentTime, &CurrentTime,
111 sizeof(CurrentTime));
112 if (!NT_SUCCESS(Status))
113 {
114 return(Status);
115 }
116 return STATUS_SUCCESS;
117 }
118
119
120 /*
121 * @implemented
122 */
123 VOID
124 STDCALL
125 ExLocalTimeToSystemTime (
126 PLARGE_INTEGER LocalTime,
127 PLARGE_INTEGER SystemTime
128 )
129 {
130 SystemTime->QuadPart = LocalTime->QuadPart;
131 #if 0
132 +
133 ExpTimeZoneInfo.Bias * TICKSPERMINUTE;
134 #endif
135 }
136
137
138 /*
139 * @unimplemented
140 */
141 VOID
142 STDCALL
143 ExSetTimerResolution (
144 IN ULONG DesiredTime,
145 IN BOOLEAN SetResolution
146 )
147 {
148 UNIMPLEMENTED;
149 }
150
151
152 /*
153 * @implemented
154 */
155 VOID
156 STDCALL
157 ExSystemTimeToLocalTime (
158 PLARGE_INTEGER SystemTime,
159 PLARGE_INTEGER LocalTime
160 )
161 {
162 LocalTime->QuadPart = SystemTime->QuadPart;
163 #if 0
164 -
165 ExpTimeZoneInfo.Bias * TICKSPERMINUTE;
166 #endif
167 }
168
169 /* EOF */