PopFxActivateDevice

VOID __stdcall PopFxActivateDevice(DEVICE_OBJECT *Pdo, UINT8 SetSystemTransition){
  char v2; 
  char v3; 
  __int64 v5; 
  INT64 *v6; 
  KIRQL v7; 
  int v8; 
  unsigned __int64 v9; 
  signed __int32 v10; 
  signed __int32 v11; 
  ULONG_PTR v12; 
  signed __int32 v13; 
  signed __int32 v14; 
  unsigned int i; 
  __int64 j; 
  UINT64 v17; 
  v3 = v2;
  if( Pdo )
    v5 = *(_QWORD *)(*((_QWORD *)Pdo + 39) + 40i64);
  else
    v5 = 0i64;
  v6 = (INT64 *)(v5 + 88);
  v7 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v5 + 88));
  v8 = *(_DWORD *)(v5 + 120);
  v9 = v7;
  _m_prefetchw((const void *)(v5 + 296));
  v10 = *(_DWORD *)(v5 + 296);
  do
  {
    v11 = v10;
    v10 = _InterlockedCompareExchange((volatile signed __int32 *)(v5 + 296), v10, v10);
  }
  while( v11 != v10 );
  if( (v10 & 4) != 0 && (*(_DWORD *)(*(_QWORD *)(v5 + 80) + 824i64) & 1) != 0 )
  {
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v5 + 88));
    __writecr8(v9);
  }
  else
  {
    *(_DWORD *)(v5 + 120) = v8 + 1;
    v12 = 0i64;
    _m_prefetchw((const void *)(v5 + 296));
    v13 = *(_DWORD *)(v5 + 296);
    do
    {
      v14 = v13;
      v13 = _InterlockedCompareExchange((volatile signed __int32 *)(v5 + 296), v13, v13);
    }
    while( v14 != v13 );
    if( (v13 & 4) != 0 )
    {
      v12 = *(_QWORD *)(v5 + 80);
      PopFxAddRefDevice(v12);
      for( i = 0; i < *(_DWORD *)(v12 + 828); ++i )
        PoFxActivateComponent((POHANDLE *)v12, i, 2ui64);
    }
    ExReleaseSpinLockExclusiveFromDpcLevel(v6);
    __writecr8(v9);
    if( v12 )
    {
      for( j = 0i64; (unsigned int)j < *(_DWORD *)(v12 + 828); j = (unsigned int)(j + 1) )
      {
        v17 = *(_QWORD *)(*(_QWORD *)(v12 + 832) + 8 * j);
        if( (*(_DWORD *)(v17 + 88) & 0x3FFFFFFF) == 0
          || (KeWaitForSingleObject((PVOID)(v17 + 104), Executive, 0, 0, 0i64), *(int *)(v17 + 88) >= 0) )
        {
          PopFxBugCheck(0x608ui64, v17, v17 + 88, 0i64);
        }
        if( SetSystemTransition )
          _InterlockedOr((volatile signed __int32 *)(v12 + 32), 1u);
        if( PopPoFxSystemIrpWaitForReportDevicePoweredReg || (*(_DWORD *)(v12 + 824) & 0x80u) != 0 )
        {
          if( v3 )
            _InterlockedOr((volatile signed __int32 *)(v12 + 32), 0x800u);
        }
      }
      KeWaitForSingleObject((PVOID)(v12 + 568), Executive, 0, 0, 0i64);
      if( _InterlockedExchangeAdd((volatile signed __int32 *)(v12 + 244), 0xFFFFFFFF) == 1 )
        KeSetEvent((PRKEVENT)(v12 + 248), 0);
    }
  }
}

Referenced by:

PoFxActivateDevice
PoFxActivateDeviceForSystemTransition
PoFxStartDevicePowerManagement
PopFxActivateDevicesForSx
PopFxClearDeviceConstraints
PopFxSetDeviceAccountingCsPlatformState
PopPepInitializeVetoMasks
PopPepResetDeviceAccountingLevel
PopPlActivateDeviceIterator