HalpAcpiPostSleep
NTSTATUS __stdcall HalpAcpiPostSleep(_CONTEXT *uINT){
void *v1;
INT64 v2;
void *v3;
unsigned int v4;
__int16 v5;
__int64 v6;
NTSTATUS result;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
INT64 v11;
void *v12;
unsigned int v13;
unsigned int v14;
REGHANDLE v15;
__int16 Input[2];
__int16 Output[2];
int v18;
unsigned int v19;
unsigned int v20;
_EVENT_DATA_DESCRIPTOR UserData;
unsigned int *v22;
__int64 v23;
unsigned int *v24;
__int64 v25;
Input[0] = 0;
v4 = (unsigned int)uINT;
Output[0] = 0;
if( (HalpPlatformFlags & 1) != 0 )
{
HalpCheckFixedWakeSources((_LPCGUID)uINT, v1, v2, v3);
if( HalpAcpiPmRegisterAvailable(PM1A_EVT_REGISTER) >= 0 )
{
HalpAcpiPmRegisterRead(PM1A_EVT_REGISTER, Fadt.pm1_evt_len >> 1, Output, 2ui64, 0i64);
v5 = Output[0];
Input[0] = Output[0];
if( HalpAcpiPmRegisterAvailable(PM1B_EVT_REGISTER) >= 0 )
{
HalpAcpiPmRegisterRead(PM1B_EVT_REGISTER, Fadt.pm1_evt_len >> 1, Output, 2ui64, 0i64);
v5 = Output[0] | Input[0];
}
Input[0] = v5 & 0xFBFF;
HalpAcpiPmRegisterWrite(PM1A_EVT_REGISTER, Fadt.pm1_evt_len >> 1, Input, 2ui64, 0i64);
if( HalpAcpiPmRegisterAvailable(PM1B_EVT_REGISTER) >= 0 )
HalpAcpiPmRegisterWrite(PM1B_EVT_REGISTER, Fadt.pm1_evt_len >> 1, Input, 2ui64, 0i64);
}
}
v19 = -1;
v20 = 0;
v18 = 0;
if( (stru_140C49D5C.AsULONG & 0x20000) != 0 && !byte_140C49D29 )
{
v8 = 0i64;
v9 = (unsigned __int64)BaseAddress >> 12;
v10 = ((unsigned __int64)BaseAddress >> 12) + 1;
if( (BaseAddress & 0xFFF) == 0 )
v10 = (unsigned __int64)BaseAddress >> 12;
do
{
if( !_bittest(*(&CmpDummyThreadEvent + 735), v8)
&& !_bittest(*(&CmpDummyThreadEvent + 733), v8)
&& v8 != v9
&& v8 != v10 )
{
v11 = HalpMapPhysicalMemory64((_LARGE_INTEGER)(v8 << 12), MmCached, 0, 4);
if( v11 )
{
if( (unsigned __int8)HalpSimpleCheck(v11, (_DOUBLE)v1) != *((_BYTE *)&CmpDummyThreadEvent + v8 + 5472) )
{
v13 = v19;
v14 = v20;
if( v8 < v19 )
v13 = v8;
v19 = v13;
if( v8 > v20 )
v14 = v8;
++v18;
v20 = v14;
}
HalpUnmapVirtualAddress(v12, 1i64, 0);
}
}
++v8;
}
while( v8 < 0x100 );
}
if( (HalpPlatformFlags & 4) != 0 )
HalpSetClockAfterSleep((INT64)uINT, (INT64)v1, v2);
HalpTimerRestorePerformanceCounter();
HalpTimerSwitchStallSource(0i64);
*(&CmpDummyThreadEvent + 5761) = 0;
*(_DWORD *)qword_140C49D38 = 0;
HalpInterruptReinitialize((_CONTEXT *)v4);
if( !byte_140C49D29 )
{
((void(__fastcall *)(_QWORD))off_140C007C0)(((v4 >> 8) & 0xF) + 1);
if( byte_140C4A318 )
HalpHvNotifyDebugDeviceAvailable();
}
if( v18 )
{
if( byte_140C4A328 )
{
v15 = qword_140C4A320;
if( EtwEventEnabled(qword_140C4A320, &HAL_ETW_EVENT_FIRMWARE_SLEEP_CORRUPTION) )
{
*(_QWORD *)&UserData.Size = 4i64;
UserData.Ptr = (unsigned __int64)&v18;
v23 = 4i64;
v22 = &v19;
v25 = 4i64;
v24 = &v20;
EtwWrite(v15, &HAL_ETW_EVENT_FIRMWARE_SLEEP_CORRUPTION, 0, 3u, &UserData);
}
}
}
if( (stru_140C49D5C.bits._bf_0 & 0x4000) != 0 )
{
if( *(&stru_140CF2E80 + 927) )
KdInitialize(4i64, 0i64, 0i64);
HalpRestoreDmaControllerState();
}
HalpTimerInitializeVpptClockTimer();
HalpTimerEnableHypervisorTimer();
HalpPiix4Detect(0);
if( !byte_140C49D29 )
((void(__fastcall *)(_QWORD))off_140C006C0[0])(((v4 >> 8) & 0xF) + 1);
v6 = qword_140C507B0;
LOBYTE(v6) = 1;
(*(void(__fastcall **)(__int64))(qword_140C507B0 + 8))(v6);
HalpRestoreNvsArea();
HalpResetSBF();
LOBYTE(result) = 1;
return result;
}Referenced by:
HaliAcpiSleep