PiProcessQueryDeviceState

INT64 __stdcall PiProcessQueryDeviceState(PDEVICE_OBJECT DeviceObject){
  __int64 v2; 
  __int16 v3; 
  int v4; 
  unsigned int updated; 
  PVOID v6; 
  int v8; 
  UINT64 DeviceState; 
  PVOID P; 
  LODWORD(DeviceState) = 0;
  P = 0i64;
  v2 = *(_QWORD *)(*((_QWORD *)DeviceObject + 39) + 40i64);
  PiPnpRtlBeginOperation((__int64 **)&P);
  PoFxActivateDevice(*(DEVICE_OBJECT **)(v2 + 32));
  *(_DWORD *)(v2 + 704) |= 0x100u;
  if( IopQueryDeviceState(DeviceObject, &DeviceState) < 0 )
  {
    updated = 0;
    goto LABEL_16;
  }
  v3 = DeviceState;
  if( (DeviceState & 2) != 0 )
    PipSetDevNodeUserFlags(v2, 2);
  else
    PipClearDevNodeUserFlags(v2, 2);
  if( (v3 & 0x40) != 0 )
    PipSetDevNodeUserFlags(v2, 64);
  else
    PipClearDevNodeUserFlags(v2, 64);
  v4 = *(_DWORD *)(v2 + 400) & 8;
  if( (v3 & 0x20) != 0 )
  {
    if( !v4 )
    {
      PipSetDevNodeUserFlags(v2, 8);
      IopIncDisableableDepends(v2);
    }
  }
  else if( v4 )
  {
    IopDecDisableableDepends((_DEVICE_NODE *)v2);
    PipClearDevNodeUserFlags(v2, 8);
  }
  updated = PiUpdateGuestAssignedState(v2, HIBYTE(v3) & 1);
  if( ((v3 & 9) != 0 || (v3 & 4) != 0 && (v3 & 0x10) == 0) && PnpCheckForActiveDependencies(v2, 3u) )
  {
    v8 = 51;
LABEL_30:
    PnpRequestDeviceRemoval(v2, 0, v8, 0);
    updated = -1073741823;
    goto LABEL_16;
  }
  if( (v3 & 9) != 0 )
  {
    v8 = (v3 & 1) != 0 ? 29 : 24;
    goto LABEL_30;
  }
  if( (v3 & 0x10) != 0 )
  {
    IopResourceRequirementsChanged(DeviceObject, (v3 & 4) != 0);
    goto LABEL_16;
  }
  if( (v3 & 4) != 0 )
  {
    v8 = 43;
    goto LABEL_30;
  }
  if( (v3 & 0x80u) != 0 )
    updated = PiUpdateDeviceResourceLists((_QWORD *)v2);
LABEL_16:
  PoFxIdleDevice(*(DEVICE_OBJECT **)(v2 + 32));
  v6 = P;
  *(_DWORD *)(v2 + 704) &= ~0x100u;
  if( v6 )
    PiPnpRtlEndOperation(v6);
  return updated;
}

Referenced by:

PiProcessRequeryDeviceState
PipProcessStartPhase3