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