branch update for HEAD-2003021201
[reactos.git] / 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 <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
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 TIME* 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 VOID
115 STDCALL
116 ExLocalTimeToSystemTime (
117         PLARGE_INTEGER  LocalTime, 
118         PLARGE_INTEGER  SystemTime
119         )
120 {
121    SystemTime->QuadPart = LocalTime->QuadPart +
122                           _SystemTimeZoneInfo.Bias * TICKSPERMINUTE;
123 }
124
125
126 VOID
127 STDCALL
128 ExSystemTimeToLocalTime (
129         PLARGE_INTEGER  SystemTime,
130         PLARGE_INTEGER  LocalTime
131         )
132 {
133    LocalTime->QuadPart = SystemTime->QuadPart -
134                          _SystemTimeZoneInfo.Bias * TICKSPERMINUTE;
135 }
136
137 /* EOF */