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