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