3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ex/time.c
7 * PROGRAMMER: David Welch (welch@mcmail.com)
12 /* INCLUDES *****************************************************************/
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>
20 #include <internal/debug.h>
23 #define TICKSPERMINUTE 600000000
25 /* GLOBALS ******************************************************************/
27 /* Note: Bias[minutes] = UTC - local time */
28 TIME_ZONE_INFORMATION _SystemTimeZoneInfo;
31 /* FUNCTIONS ****************************************************************/
34 ExInitTimeZoneInfo (VOID)
36 /* Initialize system time zone information */
37 memset (& _SystemTimeZoneInfo, 0, sizeof(TIME_ZONE_INFORMATION));
39 /* FIXME: Read time zone information from the registry */
45 NtSetSystemTime (IN PLARGE_INTEGER UnsafeNewSystemTime,
46 OUT PLARGE_INTEGER UnsafeOldSystemTime OPTIONAL)
48 * FUNCTION: Sets the system time.
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.
58 LARGE_INTEGER OldSystemTime;
59 LARGE_INTEGER NewSystemTime;
60 TIME_FIELDS TimeFields;
62 /* FIXME: Check for SeSystemTimePrivilege */
64 Status = MmCopyFromCaller(&NewSystemTime, UnsafeNewSystemTime,
65 sizeof(NewSystemTime));
66 if (!NT_SUCCESS(Status))
71 if (UnsafeOldSystemTime != NULL)
73 KeQuerySystemTime(&OldSystemTime);
75 RtlTimeToTimeFields (&NewSystemTime, &TimeFields);
76 HalSetRealTimeClock (&TimeFields);
78 if (UnsafeOldSystemTime != NULL)
80 Status = MmCopyToCaller(UnsafeOldSystemTime, &OldSystemTime,
81 sizeof(OldSystemTime));
82 if (!NT_SUCCESS(Status))
87 return(STATUS_SUCCESS);
92 NtQuerySystemTime (OUT TIME* UnsafeCurrentTime)
94 * FUNCTION: Retrieves the system time.
96 * CurrentTime - Points to a variable that receives the current
97 * time of day in the standard time format.
100 LARGE_INTEGER CurrentTime;
103 KeQuerySystemTime(&CurrentTime);
104 Status = MmCopyToCaller(UnsafeCurrentTime, &CurrentTime,
105 sizeof(CurrentTime));
106 if (!NT_SUCCESS(Status))
110 return STATUS_SUCCESS;
116 ExLocalTimeToSystemTime (
117 PLARGE_INTEGER LocalTime,
118 PLARGE_INTEGER SystemTime
121 SystemTime->QuadPart = LocalTime->QuadPart +
122 _SystemTimeZoneInfo.Bias * TICKSPERMINUTE;
128 ExSystemTimeToLocalTime (
129 PLARGE_INTEGER SystemTime,
130 PLARGE_INTEGER LocalTime
133 LocalTime->QuadPart = SystemTime->QuadPart -
134 _SystemTimeZoneInfo.Bias * TICKSPERMINUTE;