diff --git a/reactos/ntoskrnl/ex/time.c b/reactos/ntoskrnl/ex/time.c index 355d7a83871..202b428358e 100644 --- a/reactos/ntoskrnl/ex/time.c +++ b/reactos/ntoskrnl/ex/time.c @@ -14,7 +14,14 @@ #include -/* FUNCTIONS *****************************************************************/ + +#define TICKSPERMINUTE 600000000 + +/* GLOBALS ******************************************************************/ + +static LONG lTimeZoneBias = 0; /* bias[minutes] = UTC - local time */ + +/* FUNCTIONS ****************************************************************/ NTSTATUS STDCALL NtSetSystemTime(IN PLARGE_INTEGER SystemTime, IN PLARGE_INTEGER NewSystemTime OPTIONAL) @@ -35,17 +42,21 @@ NTSTATUS STDCALL NtQuerySystemTime (OUT TIME *CurrentTime) NTSTATUS STDCALL ZwQuerySystemTime (OUT TIME *CurrentTime) { - UNIMPLEMENTED; + KeQuerySystemTime((PLARGE_INTEGER)CurrentTime); + return STATUS_SUCCESS; +// UNIMPLEMENTED; } VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime, PLARGE_INTEGER SystemTime) { - UNIMPLEMENTED; + SystemTime->QuadPart = LocalTime->QuadPart + + lTimeZoneBias * TICKSPERMINUTE; } VOID ExSystemTimeToLocalTime(PLARGE_INTEGER SystemTime, PLARGE_INTEGER LocalTime) { - UNIMPLEMENTED; + LocalTime->QuadPart = SystemTime->QuadPart - + lTimeZoneBias * TICKSPERMINUTE; } diff --git a/reactos/ntoskrnl/hal/x86/time.c b/reactos/ntoskrnl/hal/x86/time.c index 0789826c27e..ea478d75abf 100644 --- a/reactos/ntoskrnl/hal/x86/time.c +++ b/reactos/ntoskrnl/hal/x86/time.c @@ -49,6 +49,10 @@ void HalQueryRealTimeClock(PTIME_FIELDS pTime) pTime->Year=BCD_INT(inb_p(0x71)); if(pTime->Year>80) pTime->Year +=1900; else pTime->Year +=2000; -//FIXME pTime->MilliSeconds= + pTime->Milliseconds=0; +} + + +void HalSetRealTimeClock(PTIME_FIELDS pTime) +{ } - diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index a44a901b52b..16b4e517e40 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -50,6 +50,7 @@ extern inline unsigned int linear_to_physical(unsigned int x) /* * Current time */ +static unsigned long long boot_time = 0; static unsigned long long system_time = 0; /* @@ -571,10 +572,24 @@ VOID KeInitializeTimerImpl(VOID) * NOTE: This is only called once from main() */ { + TIME_FIELDS TimeFields; + LARGE_INTEGER SystemBootTime; + InitializeListHead(&timer_list_head); KeInitializeSpinLock(&timer_list_lock); /* * Calculate the starting time for the system clock */ + HalQueryRealTimeClock(&TimeFields); + DbgPrint("Date: %d.%d.%d\nTime: %d:%d:%d\n", + TimeFields.Day, + TimeFields.Month, + TimeFields.Year, + TimeFields.Hour, + TimeFields.Minute, + TimeFields.Second); + RtlTimeFieldsToTime(&TimeFields, &SystemBootTime); + boot_time=SystemBootTime.QuadPart; + system_time=boot_time; }