PiSwCloseDevice

void __fastcall PiSwCloseDevice(CHAR *a1){
  DEVICE_OBJECT *v1; 
  struct _DMA_ADAPTER *v2; 
  CHAR *Buffer; 
  Buffer = a1;
  if( *((_QWORD *)a1 + 11) )
  {
    PiSwQueuedCreateInfoFree(*((PVOID *)a1 + 11));
    *((_QWORD *)Buffer + 11) = 0i64;
    a1 = Buffer;
  }
  if( *((_QWORD *)a1 + 15) )
  {
    *((_DWORD *)a1 + 1) |= 2u;
    v1 = (DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(*((_QWORD *)Buffer + 14), 0x746C6644ui64);
    v2 = (struct _DMA_ADAPTER *)v1;
    if( v1 )
    {
      IoInvalidateDeviceRelations(v1, SingleBusRelations);
      HalPutDmaAdapter(v2);
    }
  }
  else
  {
    if( *((_QWORD *)a1 + 14) )
      PiSwBusRelationRemove(a1);
    RtlDeleteElementGenericTableAvl(&PiSwDeviceInstanceTable, &Buffer);
    PiSwDeviceDereference(Buffer);
  }
}

Referenced by:

PiSwCloseDescendants
PiSwIrpCleanup
PiSwStopDestroy