PoFxPrepareDevice

VOID __stdcall PoFxPrepareDevice(_DEVICE_NODE *DevNode, UINT8 StartDevice){
  signed __int32 PowerFlags; 
  signed __int32 v5; 
  _ETHREAD *CurrentThread; 
  _POP_FX_PLUGIN *v7; 
  _POP_FX_PLUGIN *v8; 
  _POP_FX_DEVICE *v9; 
  _POP_FX_DEVICE *FoundFxDevice; 

  FoundFxDevice = 0i64;
  _m_prefetchw((const void *)&DevNode->PowerFlags);
  if( (_InterlockedOr(&DevNode->PowerFlags, 0) & 1) != 0 )
    return;
  _m_prefetchw((const void *)&DevNode->PowerFlags);
  PowerFlags = DevNode->PowerFlags;
  do
  {
    v5 = PowerFlags;
    PowerFlags = _InterlockedCompareExchange(&DevNode->PowerFlags, PowerFlags, PowerFlags);
  }
  while( v5 != PowerFlags );
  if( (PowerFlags & 2) != 0 )
    goto LABEL_7;
  if( PopFxFindDeviceAndAllocateUniqueId(DevNode, (VOID ***)&FoundFxDevice) != -1073741738 )
  {
    _InterlockedOr(&DevNode->PowerFlags, 2u);
LABEL_7:
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C23628 + 497, 0i64);
    v7 = (_POP_FX_PLUGIN *)*(&stru_140C23628 + 493);
    v8 = 0i64;
    while( v7 != (_POP_FX_PLUGIN *)((char *)&stru_140C23628 + 3944) )
    {
      if( PopPluginPrepareDevice(v7, (_UNICODE_STRING *)DevNode) )
      {
        PopDiagTraceFxDevicePreparation(DevNode, v7, &DevNode->UniqueId, 1u);
        v8 = v7;
        if( v7 )
          goto LABEL_14;
        break;
      }
      v7 = *(_POP_FX_PLUGIN **)v7;
    }
    if( !StartDevice )
      goto LABEL_15;
LABEL_14:
    DevNode->Plugin = v8;
    _InterlockedOr(&DevNode->PowerFlags, 1u);
    *(_WORD *)&DevNode->gap5C[4] = 0;
    *(_QWORD *)&DevNode->gap5C[20] = &DevNode->gap5C[12];
    *(_QWORD *)&DevNode->gap5C[12] = &DevNode->gap5C[12];
    DevNode->gap5C[6] = 6;
    *(_DWORD *)&DevNode->gap5C[8] = 0;
LABEL_15:
    if( _InterlockedCompareExchange64((_QWORD *)&stru_140C23628 + 497, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((_EX_PUSH_LOCK *)&stru_140C23628 + 497);
    KeAbPostRelease((char *)&stru_140C23628 + 3976);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  v9 = FoundFxDevice;
  if( FoundFxDevice )
  {
    if( _InterlockedExchangeAdd((volatile signed __int32 *)FoundFxDevice + 69, 0xFFFFFFFF) == 1 )
      KeSetEvent((PRKEVENT)((char *)v9 + 280), 0, 0);
  }
}

Referenced by:

PiProcessAddBootDevices
PipProcessDevNodeTree
PnpStartDevice