PoFxStartDevicePowerManagement

VOID __stdcall PoFxStartDevicePowerManagement(POHANDLE *Handle){
  POHANDLE v1; 
  POHANDLE v3; 
  ULONG_PTR v4; 
  unsigned __int8 v5; 
  unsigned int v6; 
  unsigned __int64 v7; 
  unsigned int v8; 
  __int64 v9; 
  unsigned int i; 
  _ETHREAD *CurrentThread; 
  char v12; 
  _DEVICE_OBJECT *v13; 
  POHANDLE v14; 

  v1 = Handle[6];
  PopPepDeviceStarted((_POP_PEP_DEVICE *)Handle[7]);
  v3 = Handle[8];
  v4 = 0;
  if( v3 )
  {
    v14 = Handle[9];
    (*((void(__fastcall **)(__int64, POHANDLE *))v3 + 12))(18i64, &v14);
  }
  if( v1 )
  {
    v5 = ExAcquireSpinLockExclusive((INT64 *)v1 + 11);
    v6 = *((_DWORD *)v1 + 30);
    v7 = v5;
    if( ((_DWORD)Handle[103] & 1) != 0 )
    {
      if( !v6 )
      {
LABEL_10:
        _InterlockedOr((volatile signed __int32 *)v1 + 74, 4u);
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v1 + 11);
        __writecr8(v7);
        PopDiagTraceFxDeviceStartPowerManagement(v1);
        goto LABEL_11;
      }
      v6 = 0;
      *((_DWORD *)v1 + 30) = 0;
    }
    if( v6 )
    {
      v8 = *((_DWORD *)Handle + 207);
      v9 = v6;
      do
      {
        for( i = 0; i < v8; ++i )
        {
          PoFxActivateComponent(Handle, i, 2ui64);
          v8 = *((_DWORD *)Handle + 207);
        }
        --v9;
      }
      while( v9 );
    }
    goto LABEL_10;
  }
LABEL_11:
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C23628 + 489, 0i64);
  v12 = *(&stru_140CF2E80 + 7784);
  if( _InterlockedCompareExchange64((_QWORD *)&stru_140C23628 + 489, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((_EX_PUSH_LOCK *)&stru_140C23628 + 489);
  KeAbPostRelease((char *)&stru_140C23628 + 3912);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( v12 )
  {
    v13 = (_DEVICE_OBJECT *)*((_QWORD *)v1 + 4);
    PopFxActivateDevice(v13, 0);
    PopFxIncrementDeviceSleepCount(v13);
  }
  if( *((_DWORD *)Handle + 207) )
  {
    do
      PoFxIdleComponent((ULONG_PTR)Handle, v4++, 1ui64);
    while( v4 < *((_DWORD *)Handle + 207) );
  }
}

Referenced by:

HalpDmaInitPowerManagement
HalpInterruptInitPowerManagement
HalpTimerInitPowerManagement
PoFxEnableDStateReporting
PoFxRegisterDebugger