HalpUtcTimeToAcpiRealTime
NTSTATUS __stdcall HalpUtcTimeToAcpiRealTime(LARGE_INTEGER *UtcTime, ACPI_REAL_TIME *AcpiRealTime){
__int64 TimeZone;
struct _TIME_FIELDS TimeFields;
union _LARGE_INTEGER LocalTime;
LocalTime.QuadPart = 0i64;
TimeFields = 0i64;
AcpiRealTime->TimeZone = 2047;
HalpQueryAcpiRealTimeClock(AcpiRealTime);
TimeZone = AcpiRealTime->TimeZone;
if( (unsigned __int64)(TimeZone + 1440) > 0xB40 )
{
if( ExRealTimeIsUniversal() )
{
AcpiRealTime->TimeZone = 0;
AcpiRealTime->DayLight = 0;
LocalTime = *UtcTime;
}
else
{
AcpiRealTime->TimeZone = SLOWORD(KUSER_SHARED_DATA.TimeZoneBias.LowPart) / 17920;
ExSystemTimeToLocalTime(UtcTime, &LocalTime);
if( KUSER_SHARED_DATA.TimeZoneId )
{
if( KUSER_SHARED_DATA.TimeZoneId == 1 )
{
AcpiRealTime->DayLight = 1;
}
else if( KUSER_SHARED_DATA.TimeZoneId == 2 )
{
AcpiRealTime->DayLight = 3;
}
}
else
{
AcpiRealTime->DayLight = 0;
}
}
}
else
{
LocalTime.QuadPart = UtcTime->QuadPart - 600000000 * TimeZone;
}
RtlTimeToTimeFields(&LocalTime, &TimeFields);
AcpiRealTime->Year = TimeFields.Year;
AcpiRealTime->Month = TimeFields.Month;
AcpiRealTime->Day = TimeFields.Day;
AcpiRealTime->Hour = TimeFields.Hour;
AcpiRealTime->Minute = TimeFields.Minute;
AcpiRealTime->Second = TimeFields.Second;
AcpiRealTime->Milliseconds = TimeFields.Milliseconds;
return 0;
}Referenced by:
HalSetRealTimeClock