PipSetDevNodeState

VOID __stdcall PipSetDevNodeState(_DEVICE_NODE *DeviceNode, _PNP_DEVNODE_STATE State, _PNP_DEVNODE_STATE *OldState){
  BOOL v5; 
  int v6; 
  char v7; 
  unsigned int v8; 
  unsigned __int8 v9; 
  unsigned __int64 v10; 
  int IsDevNodeDNStarted; 
  __int64 v12; 
  int v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  v5 = 0;
  v6 = 0;
  v7 = 0;
  KeAcquireSpinLockRaiseToDpc(&PnpSpinLock, *(UINT64 *)&State);
  v8 = *((_DWORD *)DeviceNode + 75);
  v10 = v9;
  if( v8 != State )
  {
    v5 = PipAreDriversLoadedWorker(v8, *((unsigned int *)DeviceNode + 76));
    IsDevNodeDNStarted = PipIsDevNodeDNStarted(DeviceNode);
    v12 = *((unsigned int *)DeviceNode + 97);
    v6 = IsDevNodeDNStarted;
    *((_DWORD *)DeviceNode + 76) = v13;
    *((_DWORD *)DeviceNode + 75) = State;
    v7 = 1;
    *((_DWORD *)DeviceNode + v12 + 77) = v13;
    *((_DWORD *)DeviceNode + 97) = (*((_DWORD *)DeviceNode + 97) + 1) % 0x14u;
  }
  KxReleaseSpinLock(&PnpSpinLock);
  __writecr8(v10);
  if( v7
    && *((_QWORD *)DeviceNode + 6)
    && (PipAreDriversLoadedWorker(*((unsigned int *)DeviceNode + 75), *((unsigned int *)DeviceNode + 76)) != v5
     || (unsigned int)PipIsDevNodeDNStarted(DeviceNode) != v6) )
  {
    PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v14, v15, 11);
    if( (unsigned int)PipIsDevNodeDNStarted(DeviceNode) != v6 )
      PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v16, *((_QWORD *)DeviceNode + 6), 26);
  }
  if( State == DeviceNodeDeleted )
    PnpRemoveDeviceActionRequests(*((DEVICE_OBJECT **)DeviceNode + 4));
}

Referenced by:

IoReportDetectedDevice
IopInitializeDeviceInstanceKey
IopInitializePlugPlayServices
IopLegacyResourceAllocation
PiInitializeDevice
PiProcessNewDeviceNode
PipCallDriverAddDevice
PipCallDriverAddDeviceQueryRoutine
PipEnumerateCompleted
PipEnumerateDevice
PipProcessRestartPhase2
PipProcessStartPhase2
PipProcessStartPhase3
PnpDeviceCompletionProcessCompletedRequest
PnpDriverLoadingFailed
PnpProcessAssignResources
PnpQueryRemoveLockedDeviceNode
PnpQueryStopDeviceNode
PnpRemoveLockedDeviceNode
PnpRequestDeviceRemovalWorker
PnpRestartDeviceNode
PnpStartDeviceNode
PnpStopDeviceSubtree
PnpSurpriseRemoveLockedDeviceNode