HalpCheckWakeupTimeAndAdjust

INT64 __stdcall HalpCheckWakeupTimeAndAdjust(){
  INT64 result; 
  char *v1; 
  unsigned int v2; 
  LARGE_INTEGER v3; 
  unsigned int v4; 
  __int64 *v5; 
  __int64 v6; 
  __int64 v7; 
  char *v8; 
  unsigned int v9; 
  LARGE_INTEGER v10; 
  INT64 *v11; 
  INT64 v12; 
  __int64 v13; 
  INT64 v14; 
  INT64 v15; 
  signed __int32 v16[8]; 
  INT64 v17; 
  TIME_FIELDS v18; 
  __int16 v19; 
  LARGE_INTEGER v20; 
  LARGE_INTEGER a2; 
  INT64 v22; 
  result = (unsigned int)HalpPlatformFlags;
  v20.QuadPart = 0i64;
  v17 = 0i64;
  v18 = 0i64;
  if( (HalpPlatformFlags & 4) != 0 )
  {
    if( HIBYTE(HalpWakeupState) )
    {
      LODWORD(result) = HalQueryRealTimeClock(&v18);
      if( (_BYTE)result )
      {
        v1 = (char *)ExLeapSecondData;
        a2.QuadPart = 0i64;
        if( !ExLeapSecondData || !*(_BYTE *)ExLeapSecondData )
        {
          RtlpTimeFieldsToTimeNoLeapSeconds(&v18.Year, &v20);
          goto LABEL_21;
        }
        v2 = *((_DWORD *)ExLeapSecondData + 1);
        _InterlockedOr(v16, 0);
        if( RtlpTimeFieldsToTimeNoLeapSeconds(&v18.Year, &a2) )
        {
          v3 = a2;
          v4 = 0;
          if( !v2 )
            goto LABEL_19;
          v5 = (__int64 *)(v1 + 8);
          while( 1 )
          {
            v6 = *v5;
            if( *v5 < 0 )
            {
              v7 = v6 & 0x7FFFFFFFFFFFFFFFi64;
              if( v3.QuadPart < v7 + 10000000 )
              {
                if( v3.QuadPart < v7 )
LABEL_19:
                  v20 = v3;
                break;
              }
              v3.QuadPart -= 10000000i64;
            }
            else if( v3.QuadPart < v6 + 10000000 )
            {
              if( v3.QuadPart < v6 )
                goto LABEL_19;
              v3.QuadPart = 2 * v3.QuadPart - v6;
            }
            else
            {
              v3.QuadPart += 10000000i64;
            }
            ++v4;
            a2 = v3;
            ++v5;
            if( v4 >= v2 )
              goto LABEL_19;
          }
        }
LABEL_21:
        v8 = (char *)ExLeapSecondData;
        v22 = 0i64;
        if( !ExLeapSecondData || !*(_BYTE *)ExLeapSecondData )
        {
          RtlpTimeFieldsToTimeNoLeapSeconds(&xmmword_140C490C2, &v17);
          goto LABEL_38;
        }
        v9 = *((_DWORD *)ExLeapSecondData + 1);
        _InterlockedOr(v16, 0);
        if( !RtlpTimeFieldsToTimeNoLeapSeconds(&xmmword_140C490C2, &v22) )
          goto LABEL_38;
        result = v22;
        v10.QuadPart = 0i64;
        if( v9 )
        {
          v11 = (INT64 *)(v8 + 8);
          do
          {
            v12 = *v11;
            if( *v11 < 0 )
            {
              v13 = v12 & 0x7FFFFFFFFFFFFFFFi64;
              if( result < v13 + 10000000 )
              {
                if( result < v13 )
                  break;
LABEL_38:
                result = v17;
                break;
              }
              result -= 10000000i64;
            }
            else if( result < v12 + 10000000 )
            {
              if( result < v12 )
                break;
              result = 2 * result - v12;
            }
            else
            {
              result += 10000000i64;
            }
            v10.QuadPart = v10.LowPart + 1;
            ++v11;
          }
          while( v10.LowPart < v9 );
        }
        if( result <= (unsigned __int64)(v20.QuadPart + 300000000) )
        {
          v20.QuadPart += 300000000i64;
          RtlpTimeToTimeFields(&v20, &v18, v10);
          *(TIME_FIELDS *)&xmmword_140C490C2 = v18;
          HalpSetWakeAlarm(v14, (UINT8 *)&v18, v15);
          result = 1024i64;
          v19 = 1024;
          if( PmRegisters[0] )
            result = HalpAcpiPmRegisterWrite(0, 0, (__int64)&v19, 2u, 0i64);
          if( byte_140C48E50 )
            return HalpAcpiPmRegisterWrite(3, 0, (__int64)&v19, 2u, 0i64);
        }
      }
    }
  }
  return result;
}

Referenced by:

HaliAcpiSleep