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