PiProcessQueryDeviceState

NTSTATUS __stdcall PiProcessQueryDeviceState(_DEVICE_OBJECT *DeviceObject){
  _DEVICE_NODE *DeviceNode; 
  UINT64 v3; 
  __int16 v4; 
  int v5; 
  NTSTATUS updated; 
  HPNPOPCTX *v7; 
  int v9; 
  unsigned int DeviceState; 
  HPNPOPCTX *hPnpOpCtx; 

  DeviceState = 0;
  hPnpOpCtx = 0i64;
  DeviceNode = (_DEVICE_NODE *)DeviceObject->DeviceObjectExtension->DeviceNode;
  PiPnpRtlBeginOperation(&hPnpOpCtx);
  PoFxActivateDevice(DeviceNode->PhysicalDeviceObject);
  DeviceNode->StateFlags |= 0x100u;
  if( IopQueryDeviceState(DeviceObject, &DeviceState, v3) < 0 )
  {
    updated = 0;
    goto LABEL_16;
  }
  v4 = DeviceState;
  if( (DeviceState & 2) != 0 )
    PipSetDevNodeUserFlags(DeviceNode, 2ui64);
  else
    PipClearDevNodeUserFlags(DeviceNode, 2ui64);
  if( (v4 & 0x40) != 0 )
    PipSetDevNodeUserFlags(DeviceNode, 0x40ui64);
  else
    PipClearDevNodeUserFlags(DeviceNode, 0x40ui64);
  v5 = DeviceNode->UserFlags & 8;
  if( (v4 & 0x20) != 0 )
  {
    if( !v5 )
    {
      PipSetDevNodeUserFlags(DeviceNode, 8ui64);
      IopIncDisableableDepends(DeviceNode);
    }
  }
  else if( v5 )
  {
    IopDecDisableableDepends(DeviceNode);
    PipClearDevNodeUserFlags(DeviceNode, 8ui64);
  }
  updated = PiUpdateGuestAssignedState(DeviceNode, HIBYTE(v4) & 1);
  if( ((v4 & 9) != 0 || (v4 & 4) != 0 && (v4 & 0x10) == 0) && PnpCheckForActiveDependencies(DeviceNode, 3ui64) )
  {
    v9 = 51;
LABEL_30:
    PnpRequestDeviceRemoval((__int64)DeviceNode, 0, v9, 0);
    updated = -1073741823;
    goto LABEL_16;
  }
  if( (v4 & 9) != 0 )
  {
    v9 = (v4 & 1) != 0 ? 29 : 24;
    goto LABEL_30;
  }
  if( (v4 & 0x10) != 0 )
  {
    IopResourceRequirementsChanged(DeviceObject, (v4 & 4) != 0);
    goto LABEL_16;
  }
  if( (v4 & 4) != 0 )
  {
    v9 = 43;
    goto LABEL_30;
  }
  if( (v4 & 0x80u) != 0 )
    updated = PiUpdateDeviceResourceLists(DeviceNode);
LABEL_16:
  PoFxIdleDevice(DeviceNode->PhysicalDeviceObject);
  v7 = hPnpOpCtx;
  DeviceNode->StateFlags &= ~0x100u;
  if( v7 )
    PiPnpRtlEndOperation(v7);
  return updated;
}

Referenced by:

PiProcessRequeryDeviceState
PipProcessStartPhase3