PiSwCloseDevice

VOID __stdcall PiSwCloseDevice(_PI_SWD_OBJECT *SwDeviceObject){
  _DEVICE_OBJECT *v1; 
  _ADAPTER_OBJECT *v2; 
  _PI_SWD_OBJECT *SwDeviceObjecta; 

  SwDeviceObjecta = SwDeviceObject;
  if( *((_QWORD *)SwDeviceObject + 11) )
  {
    PiSwQueuedCreateInfoFree(*((_PI_SWD_QUEUED_CREATE_INFO **)SwDeviceObject + 11));
    *((_QWORD *)SwDeviceObjecta + 11) = 0i64;
    SwDeviceObject = SwDeviceObjecta;
  }
  if( *((_QWORD *)SwDeviceObject + 15) )
  {
    SwDeviceObject[1] |= 2u;
    v1 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(*((_QWORD *)SwDeviceObjecta + 14), 0x746C6644u);
    v2 = (_ADAPTER_OBJECT *)v1;
    if( v1 )
    {
      IoInvalidateDeviceRelations(v1, SingleBusRelations);
      HalPutDmaAdapter(v2);
    }
  }
  else
  {
    if( *((_QWORD *)SwDeviceObject + 14) )
      PiSwBusRelationRemove(SwDeviceObject);
    RtlDeleteElementGenericTableAvl(&PiSwDeviceInstanceTable, &SwDeviceObjecta);
    PiSwDeviceDereference(SwDeviceObjecta);
  }
}

Referenced by:

PiSwCloseDescendants
PiSwIrpCleanup
PiSwStopDestroy