HalpCheckWakeupTimeAndAdjust
NTSTATUS __stdcall HalpCheckWakeupTimeAndAdjust(INT64 a1, INT64 a2, _LARGE_INTEGER a3){
signed __int64 v3;
__int64 v4;
unsigned int v5;
_LARGE_INTEGER v6;
unsigned int v7;
__int64 *v8;
__int64 v9;
__int64 v10;
__int64 v11;
unsigned int v12;
_LARGE_INTEGER v13;
__int64 *v14;
__int64 v15;
__int64 v16;
INT64 v17;
INT64 v18;
signed __int32 v20[8];
__int64 v21;
_TIME_FIELDS TimeFields;
__int16 Input;
_LARGE_INTEGER v24;
_LARGE_INTEGER v25;
__int64 v26;
LODWORD(v3) = HalpPlatformFlags;
v24.QuadPart = 0i64;
v21 = 0i64;
TimeFields = 0i64;
if( (HalpPlatformFlags & 4) != 0 )
{
if( *(&CmpDummyThreadEvent + 5761) )
{
LODWORD(v3) = HalQueryRealTimeClock(&TimeFields);
if( (_BYTE)v3 )
{
v4 = *(&ExBootDevicesRemovedEvent + 103);
v25.QuadPart = 0i64;
if( !*(&ExBootDevicesRemovedEvent + 103) || !**(&ExBootDevicesRemovedEvent + 103) )
{
RtlpTimeFieldsToTimeNoLeapSeconds(&TimeFields.Year, &v24);
goto LABEL_21;
}
v5 = *(_DWORD *)(*(&ExBootDevicesRemovedEvent + 103) + 4i64);
_InterlockedOr(v20, 0);
if( RtlpTimeFieldsToTimeNoLeapSeconds(&TimeFields.Year, &v25) )
{
v6 = v25;
v7 = 0;
if( !v5 )
goto LABEL_19;
v8 = (__int64 *)(v4 + 8);
while( 1 )
{
v9 = *v8;
if( *v8 < 0 )
{
v10 = v9 & 0x7FFFFFFFFFFFFFFFi64;
if( v6.QuadPart < v10 + 10000000 )
{
if( v6.QuadPart < v10 )
LABEL_19:
v24 = v6;
break;
}
v6.QuadPart -= 10000000i64;
}
else if( v6.QuadPart < v9 + 10000000 )
{
if( v6.QuadPart < v9 )
goto LABEL_19;
v6.QuadPart = 2 * v6.QuadPart - v9;
}
else
{
v6.QuadPart += 10000000i64;
}
++v7;
v25 = v6;
++v8;
if( v7 >= v5 )
goto LABEL_19;
}
}
LABEL_21:
v11 = *(&ExBootDevicesRemovedEvent + 103);
v26 = 0i64;
if( !*(&ExBootDevicesRemovedEvent + 103) || !**(&ExBootDevicesRemovedEvent + 103) )
{
RtlpTimeFieldsToTimeNoLeapSeconds((__int16 *)&CmpDummyThreadEvent + 2881, &v21);
goto LABEL_38;
}
v12 = *(_DWORD *)(*(&ExBootDevicesRemovedEvent + 103) + 4i64);
_InterlockedOr(v20, 0);
if( !RtlpTimeFieldsToTimeNoLeapSeconds((__int16 *)&CmpDummyThreadEvent + 2881, &v26) )
goto LABEL_38;
v3 = v26;
v13.QuadPart = 0i64;
if( v12 )
{
v14 = (__int64 *)(v11 + 8);
do
{
v15 = *v14;
if( *v14 < 0 )
{
v16 = v15 & 0x7FFFFFFFFFFFFFFFi64;
if( v3 < v16 + 10000000 )
{
if( v3 < v16 )
break;
LABEL_38:
v3 = v21;
break;
}
v3 -= 10000000i64;
}
else if( v3 < v15 + 10000000 )
{
if( v3 < v15 )
break;
v3 = 2 * v3 - v15;
}
else
{
v3 += 10000000i64;
}
v13.QuadPart = v13.anonymous_0.LowPart + 1;
++v14;
}
while( v13.anonymous_0.LowPart < v12 );
}
if( v3 <= (unsigned __int64)(v24.QuadPart + 300000000) )
{
v24.QuadPart += 300000000i64;
RtlpTimeToTimeFields(&v24, &TimeFields, v13);
*(_TIME_FIELDS *)((char *)&CmpDummyThreadEvent + 5762) = TimeFields;
HalpSetWakeAlarm(v17, (UINT8 *)&TimeFields, v18);
LODWORD(v3) = 1024;
Input = 1024;
if( *(&CmpDummyThreadEvent + 4992) )
LODWORD(v3) = HalpAcpiPmRegisterWrite(PM1A_EVT_REGISTER, 0i64, &Input, 2ui64, 0i64);
if( *(&CmpDummyThreadEvent + 5136) )
LODWORD(v3) = HalpAcpiPmRegisterWrite(PM1B_EVT_REGISTER, 0i64, &Input, 2ui64, 0i64);
}
}
}
}
return v3;
}Referenced by:
HaliAcpiSleep