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