PopFxActivateDevice

VOID __stdcall PopFxActivateDevice(_DEVICE_OBJECT *Pdo, UINT8 SetSystemTransition){
  char v2; 
  char v3; 
  INT64 *DeviceNode; 
  INT64 *v6; 
  unsigned __int8 v7; 
  int v8; 
  unsigned __int64 v9; 
  signed __int32 v10; 
  signed __int32 v11; 
  INT64 v12; 
  signed __int32 v13; 
  signed __int32 v14; 
  unsigned int i; 
  __int64 j; 
  __int64 v17; 

  v3 = v2;
  if( Pdo )
    DeviceNode = (INT64 *)Pdo->DeviceObjectExtension->DeviceNode;
  else
    DeviceNode = 0i64;
  v6 = DeviceNode + 11;
  v7 = ExAcquireSpinLockExclusive(DeviceNode + 11);
  v8 = *((_DWORD *)DeviceNode + 30);
  v9 = v7;
  _m_prefetchw(DeviceNode + 37);
  v10 = *((_DWORD *)DeviceNode + 74);
  do
  {
    v11 = v10;
    v10 = _InterlockedCompareExchange((volatile signed __int32 *)DeviceNode + 74, v10, v10);
  }
  while( v11 != v10 );
  if( (v10 & 4) != 0 && (*(_DWORD *)(DeviceNode[10] + 824) & 1) != 0 )
  {
    ExReleaseSpinLockExclusiveFromDpcLevel(DeviceNode + 11);
    __writecr8(v9);
  }
  else
  {
    *((_DWORD *)DeviceNode + 30) = v8 + 1;
    v12 = 0i64;
    _m_prefetchw(DeviceNode + 37);
    v13 = *((_DWORD *)DeviceNode + 74);
    do
    {
      v14 = v13;
      v13 = _InterlockedCompareExchange((volatile signed __int32 *)DeviceNode + 74, v13, v13);
    }
    while( v14 != v13 );
    if( (v13 & 4) != 0 )
    {
      v12 = DeviceNode[10];
      PopFxAddRefDevice((POP_FX_DEVICE *)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(v17 + 104, 0, 0, 0, 0i64), *(int *)(v17 + 88) >= 0) )
        {
          PopFxBugCheck(0x608u, v17, v17 + 88, 0);
        }
        if( SetSystemTransition )
          _InterlockedOr((volatile signed __int32 *)(v12 + 32), 1u);
        if( *(&stru_140CF2E80 + 1836) || (*(_DWORD *)(v12 + 824) & 0x80u) != 0 )
        {
          if( v3 )
            _InterlockedOr((volatile signed __int32 *)(v12 + 32), 0x800u);
        }
      }
      KeWaitForSingleObject(v12 + 568, 0, 0, 0, 0i64);
      if( _InterlockedExchangeAdd((volatile signed __int32 *)(v12 + 244), 0xFFFFFFFF) == 1 )
        KeSetEvent((PRKEVENT)(v12 + 248), 0, 0);
    }
  }
}

Referenced by:

PoFxActivateDevice
PoFxActivateDeviceForSystemTransition
PoFxStartDevicePowerManagement
PopFxActivateDevicesForSx
PopFxClearDeviceConstraints
PopFxSetDeviceAccountingCsPlatformState
PopPepInitializeVetoMasks
PopPepResetDeviceAccountingLevel
PopPlActivateDeviceIterator