PiSwProcessRemove

VOID __stdcall PiSwProcessRemove(_DEVICE_OBJECT *DeviceObject, UINT8 KeepDeviceObjectActive){
  _PI_SWD_OBJECT **DeviceExtension; 
  int v5; 
  _PI_SWD_OBJECT *v6; 
  _PI_SWD_OBJECT *v7; 
  __int64 v8; 
  __int64 v9; 
  _PI_SWD_OBJECT *v10; 
  void *v11; 
  _PI_SWD_OBJECT *v12; 
  void *v13; 
  NTSTATUS v14; 
  _DEVICE_OBJECT *v15; 
  _ADAPTER_OBJECT *v16; 
  __int64 v17; 
  _PI_SWD_OBJECT *SwDeviceObject; 

  DeviceExtension = (_PI_SWD_OBJECT **)DeviceObject->DeviceExtension;
  SwDeviceObject = *DeviceExtension;
  v5 = *((_DWORD *)DeviceExtension + 2);
  if( (v5 & 0x20) == 0 )
  {
    if( (v5 & 1) != 0 )
    {
      *((_DWORD *)DeviceExtension + 2) = v5 & 0xFFFFFFFE;
      PiSwDeviceInterfacesUpdateState(SwDeviceObject, 0);
    }
    if( !KeepDeviceObjectActive )
    {
      PiSwMakePdoInactive(DeviceObject);
      if( ((_DWORD)DeviceExtension[1] & 8) == 0 )
        PiSwUnassociateDeviceObject(DeviceObject);
      if( (SwDeviceObject[1] & 2) != 0 )
      {
        PiSwBusRelationRemove(SwDeviceObject);
        v6 = SwDeviceObject;
        if( *((_QWORD *)SwDeviceObject + 11) )
        {
          SwDeviceObject[1] &= ~4u;
          PiSwPnPInfoFree(SwDeviceObject + 6);
          v7 = SwDeviceObject;
          v8 = *((_QWORD *)SwDeviceObject + 11);
          *(_OWORD *)(SwDeviceObject + 6) = *(_OWORD *)(v8 + 8);
          *(_OWORD *)(v7 + 10) = *(_OWORD *)(v8 + 24);
          *(_OWORD *)(v7 + 14) = *(_OWORD *)(v8 + 40);
          v9 = *((_QWORD *)SwDeviceObject + 11);
          *(_OWORD *)(v9 + 8) = 0i64;
          *(_OWORD *)(v9 + 24) = 0i64;
          *(_OWORD *)(v9 + 40) = 0i64;
          v10 = SwDeviceObject;
          v11 = (void *)*((_QWORD *)SwDeviceObject + 19);
          if( v11 )
          {
            ExFreePoolWithTag(v11, 0x57706E50u);
            v10 = SwDeviceObject;
          }
          v10[40] = *(_DWORD *)(*((_QWORD *)v10 + 11) + 64i64);
          *((_QWORD *)SwDeviceObject + 19) = *(_QWORD *)(*((_QWORD *)SwDeviceObject + 11) + 56i64);
          *(_DWORD *)(*((_QWORD *)SwDeviceObject + 11) + 64i64) = 0;
          *(_QWORD *)(*((_QWORD *)SwDeviceObject + 11) + 56i64) = 0i64;
          v12 = SwDeviceObject;
          v13 = (void *)*((_QWORD *)SwDeviceObject + 21);
          if( v13 )
          {
            PnpFreeDevPropertyArray(SwDeviceObject[44], v13, 0x57706E50u);
            v12 = SwDeviceObject;
          }
          v12[44] = *(_DWORD *)(*((_QWORD *)v12 + 11) + 80i64);
          *((_QWORD *)SwDeviceObject + 21) = *(_QWORD *)(*((_QWORD *)SwDeviceObject + 11) + 72i64);
          *(_DWORD *)(*((_QWORD *)SwDeviceObject + 11) + 80i64) = 0;
          *(_QWORD *)(*((_QWORD *)SwDeviceObject + 11) + 72i64) = 0i64;
          PiSwFreeInterfaceList((_LIST_ENTRY *)(SwDeviceObject + 46));
          v14 = PiSwBusRelationAdd(**((WCHAR ***)SwDeviceObject + 11), SwDeviceObject);
          if( v14 < 0 )
          {
            v17 = *((_QWORD *)SwDeviceObject + 18);
            if( v17 && _InterlockedExchange64((volatile __int64 *)(v17 + 104), 0i64) )
            {
              *(_QWORD *)(*((_QWORD *)SwDeviceObject + 18) + 56i64) = 0i64;
              *(_DWORD *)(*((_QWORD *)SwDeviceObject + 18) + 48i64) = v14;
              IofCompleteRequest(*((PIRP *)SwDeviceObject + 18), 0);
              *((_QWORD *)SwDeviceObject + 18) = 0i64;
            }
          }
          else
          {
            SwDeviceObject[1] &= ~2u;
            v15 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(
                                      *((_QWORD *)SwDeviceObject + 14),
                                      0x746C6644u);
            v16 = (_ADAPTER_OBJECT *)v15;
            if( v15 )
            {
              IoInvalidateDeviceRelations(v15, SingleBusRelations);
              HalPutDmaAdapter(v16);
            }
          }
          PiSwQueuedCreateInfoFree(*((_PI_SWD_QUEUED_CREATE_INFO **)SwDeviceObject + 11));
          *((_QWORD *)SwDeviceObject + 11) = 0i64;
          v6 = SwDeviceObject;
        }
        if( !*((_QWORD *)v6 + 14) )
        {
          RtlDeleteElementGenericTableAvl(&PiSwDeviceInstanceTable, &SwDeviceObject);
          PiSwDeviceDereference(SwDeviceObject);
        }
      }
    }
  }
}

Referenced by:

PiSwGetChildPdo
PiSwPdoPnPDispatch
PiSwProcessParentRemoveIrp