HalQueryRealTimeClock
NTSTATUS __stdcall HalQueryRealTimeClock(TIME_FIELDS *TimeFields){
INT64 v2;
INT64 v3;
unsigned int v4;
char *v5;
unsigned int v6;
LARGE_INTEGER v7;
LARGE_INTEGER v8;
__int64 *v9;
__int64 v10;
__int64 v11;
int v12;
NTSTATUS AcpiRealTimeClock;
unsigned __int8 CurrentIrql;
int Time;
LARGE_INTEGER v16;
int v18[8];
UINT8 RtcValid[8];
LARGE_INTEGER UtcTime;
LARGE_INTEGER a2;
INT16 a1[8];
__int128 v23;
union _LARGE_INTEGER Timeout[2];
UtcTime.QuadPart = 0i64;
RtcValid[0] = 0;
*(_OWORD *)&Timeout[0].LowPart = 0i64;
*(_OWORD *)a1 = 0i64;
HalpSetVirtualRtc(0i64);
v4 = ((unsigned int)HalpPlatformFlags >> 2) & 1;
if( v4 )
HalpReadCmosTime(a1, v2, v3);
a2.QuadPart = 0i64;
v5 = (char *)ExLeapSecondData;
v23 = 0i64;
if( !ExLeapSecondData || !*(_BYTE *)ExLeapSecondData )
{
LOBYTE(v7.LowPart) = RtlpTimeFieldsToTimeNoLeapSeconds(a1, &UtcTime);
goto LABEL_22;
}
v6 = *((_DWORD *)ExLeapSecondData + 1);
_InterlockedOr(v18, 0);
if( !RtlpTimeFieldsToTimeNoLeapSeconds(a1, &a2) )
goto LABEL_6;
v7 = a2;
v8.QuadPart = 0i64;
if( !v6 )
goto LABEL_20;
v9 = (__int64 *)(v5 + 8);
while( 1 )
{
v10 = *v9;
if( *v9 >= 0 )
{
if( v7.QuadPart < v10 + 10000000 )
{
if( v7.QuadPart < v10 )
goto LABEL_20;
v7.QuadPart = 2 * v7.QuadPart - v10;
}
else
{
v7.QuadPart += 10000000i64;
}
goto LABEL_16;
}
v11 = v10 & 0x7FFFFFFFFFFFFFFFi64;
if( v7.QuadPart < v11 + 10000000 )
break;
v7.QuadPart -= 10000000i64;
LABEL_16:
v8.QuadPart = v8.LowPart + 1;
a2 = v7;
++v9;
if( v8.LowPart >= v6 )
goto LABEL_20;
}
if( v7.QuadPart < v11 || v7.QuadPart >= v11 + 10000000 )
{
LABEL_20:
UtcTime = v7;
LOBYTE(v7.LowPart) = 1;
goto LABEL_22;
}
LABEL_6:
LOBYTE(v7.LowPart) = 0;
LABEL_22:
if( (_BYTE)v4 && LOBYTE(v7.LowPart) )
{
if( !ExpRealTimeIsUniversal )
{
v7 = *(LARGE_INTEGER *)(PsGetCurrentServerSiloGlobals()[133] + 440);
UtcTime.QuadPart += v7.QuadPart;
}
goto LABEL_44;
}
v12 = SystemPowerPhase;
if( KeGetCurrentIrql() < 2u && !SystemPowerPhase )
{
AcpiRealTimeClock = HalpQueryAcpiRealTimeClock((ACPI_REAL_TIME *)Timeout);
if( AcpiRealTimeClock < 0 )
{
if( AcpiRealTimeClock != -1073741822 )
_InterlockedOr(&HalpTimerRtcErrorCode, 2u);
}
else if( HalpAcpiRealTimeToUtcTime((ACPI_REAL_TIME *)Timeout, &UtcTime) >= 0 )
{
goto LABEL_30;
}
}
if( HalFirmwareTypeEfi && v12 && (HalpPlatformFlags & 8) == 0 )
{
if( KeGetCurrentIrql() >= 2u )
{
Time = HalEfiGetTime(&UtcTime);
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
Time = HalEfiGetTime(&UtcTime);
__writecr8(CurrentIrql);
}
if( Time < 0 )
{
if( Time != -1073741822 )
_InterlockedOr(&HalpTimerRtcErrorCode, 4u);
goto LABEL_42;
}
LABEL_30:
LOBYTE(v4) = 1;
LABEL_45:
v16 = UtcTime;
if( *(__int64 *)&KUSER_SHARED_DATA.SystemTime.LowPart > UtcTime.QuadPart + 864000000000i64 )
{
UtcTime = *(LARGE_INTEGER *)&KUSER_SHARED_DATA.SystemTime.LowPart;
_InterlockedOr(&HalpTimerRtcErrorCode, 1u);
v16 = *(LARGE_INTEGER *)&KUSER_SHARED_DATA.SystemTime.LowPart;
}
if( !ExpRealTimeIsUniversal )
UtcTime.QuadPart = v16.QuadPart - *(_QWORD *)(PsGetCurrentServerSiloGlobals()[133] + 440);
LOWORD(v7.LowPart) = RtlpTimeToTimeFields(&UtcTime, TimeFields, v8);
}
else
{
LABEL_42:
v7.LowPart = HalpQueryVirtualRtc(&UtcTime, RtcValid);
LOBYTE(v4) = v7.LowPart;
if( !RtcValid[0] )
_InterlockedOr(&HalpTimerRtcErrorCode, 8u);
LABEL_44:
if( (_BYTE)v4 )
goto LABEL_45;
_InterlockedOr(&HalpTimerRtcErrorCode, 0x10u);
}
LOBYTE(v7.LowPart) = v4;
return v7.LowPart;
}Referenced by:
ExUpdateSystemTimeFromCmos
ExpRefreshSystemTime
GetBootSystemTime
HaliSetWakeAlarm
HalpCheckWakeupTimeAndAdjust
NtSetSystemTime