IoInvalidateDeviceRelations

VOID __stdcall IoInvalidateDeviceRelations(DEVICE_OBJECT *DeviceObject, DEVICE_RELATION_TYPE Type){
  __int64 v3; 
  int v4; 
  __int16 *v5; 
  _WORD *v6; 
  PVOID *v7; 
  PVOID *v8; 
  __int64 v9; 
  _WORD *v10; 
  __int64 v11; 
  _WORD *v12; 
  __int64 v13; 
  if( !DeviceObject )
    goto LABEL_26;
  v3 = *(_QWORD *)(*((_QWORD *)DeviceObject + 39) + 40i64);
  if( !v3 || (*(_DWORD *)(v3 + 396) & 0x20000) != 0 )
  {
    IoAddTriageDumpDataBlock(DeviceObject, *((unsigned __int16 *)DeviceObject + 1));
    v5 = (__int16 *)*((_QWORD *)DeviceObject + 1);
    if( v5 )
    {
      IoAddTriageDumpDataBlock(v5, (unsigned int)v5[1]);
      v6 = (_WORD *)(*((_QWORD *)DeviceObject + 1) + 56i64);
      if( *v6 )
      {
        IoAddTriageDumpDataBlock(v6, 2ui64);
        IoAddTriageDumpDataBlock(
          *(PVOID *)(*((_QWORD *)DeviceObject + 1) + 64i64),
          *(unsigned __int16 *)(*((_QWORD *)DeviceObject + 1) + 56i64));
      }
    }
    v7 = *(PVOID **)(*((_QWORD *)DeviceObject + 39) + 40i64);
    if( v7 )
    {
      v8 = v7 + 5;
      IoAddTriageDumpDataBlock(v7, 0x310ui64);
      if( *(_WORD *)v8 )
      {
        IoAddTriageDumpDataBlock(v8, 2ui64);
        IoAddTriageDumpDataBlock(v8[1], *(unsigned __int16 *)v8);
      }
      v9 = *((_QWORD *)DeviceObject + 39);
      v10 = (_WORD *)(*(_QWORD *)(v9 + 40) + 56i64);
      if( *v10 )
      {
        IoAddTriageDumpDataBlock(v10, 2ui64);
        IoAddTriageDumpDataBlock(
          *(PVOID *)(*(_QWORD *)(*((_QWORD *)DeviceObject + 39) + 40i64) + 64i64),
          *(unsigned __int16 *)(*(_QWORD *)(*((_QWORD *)DeviceObject + 39) + 40i64) + 56i64));
        v9 = *((_QWORD *)DeviceObject + 39);
      }
      v11 = *(_QWORD *)(*(_QWORD *)(v9 + 40) + 16i64);
      if( v11 )
      {
        v12 = (_WORD *)(v11 + 56);
        if( *v12 )
        {
          IoAddTriageDumpDataBlock(v12, 2ui64);
          v13 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)DeviceObject + 39) + 40i64) + 16i64);
          IoAddTriageDumpDataBlock(*(PVOID *)(v13 + 64), *(unsigned __int16 *)(v13 + 56));
        }
      }
    }
LABEL_26:
    KeBugCheckEx(0xCAu, 2ui64, (ULONG_PTR)DeviceObject, 0i64, 0i64);
  }
  switch( Type )
  {
    case BusRelations:
      goto LABEL_8;
    case EjectionRelations:
      v4 = 20;
      goto LABEL_9;
    case PowerRelations:
      v4 = 5;
      goto LABEL_9;
    case SingleBusRelations:
LABEL_8:
      v4 = 9 - (Type != BusRelations);
LABEL_9:
      PnpRequestDeviceAction(DeviceObject, (_PNP_DEVICE_ACTION_REQUEST)v4, 0, 0i64, 0i64, 0i64);
      return;
    case TransportRelations:
      v4 = 19;
      goto LABEL_9;
  }
}

Referenced by:

IopPnPDispatch
PiProfileUpdateDeviceTreeCallback
PiSwCloseDevice
PiSwGetChildPdo
PiSwIrpStartCreateWorker
PiSwProcessParentStartIrp
PiSwProcessRemove