PiSwProcessRemove

VOID __stdcall PiSwProcessRemove(DEVICE_OBJECT *DeviceObject, UINT8 KeepDeviceObjectActive){
  __int64 v2; 
  int v5; 
  CHAR *v6; 
  CHAR *v7; 
  __int64 v8; 
  __int64 v9; 
  CHAR *v10; 
  void *v11; 
  CHAR *v12; 
  DEVPROPERTY *v13; 
  int v14; 
  DEVICE_OBJECT *v15; 
  struct _DMA_ADAPTER *v16; 
  __int64 v17; 
  CHAR *Buffer; 
  v2 = *((_QWORD *)DeviceObject + 8);
  Buffer = *(CHAR **)v2;
  v5 = *(_DWORD *)(v2 + 8);
  if( (v5 & 0x20) == 0 )
  {
    if( (v5 & 1) != 0 )
    {
      *(_DWORD *)(v2 + 8) = v5 & 0xFFFFFFFE;
      PiSwDeviceInterfacesUpdateState((INT64)Buffer, 0);
    }
    if( !KeepDeviceObjectActive )
    {
      PiSwMakePdoInactive(DeviceObject);
      if( (*(_DWORD *)(v2 + 8) & 8) == 0 )
        PiSwUnassociateDeviceObject(DeviceObject);
      if( (*((_DWORD *)Buffer + 1) & 2) != 0 )
      {
        PiSwBusRelationRemove(Buffer);
        v6 = Buffer;
        if( *((_QWORD *)Buffer + 11) )
        {
          *((_DWORD *)Buffer + 1) &= ~4u;
          PiSwPnPInfoFree((__int64)(Buffer + 24));
          v7 = Buffer;
          v8 = *((_QWORD *)Buffer + 11);
          *(_OWORD *)(Buffer + 24) = *(_OWORD *)(v8 + 8);
          *(_OWORD *)(v7 + 40) = *(_OWORD *)(v8 + 24);
          *(_OWORD *)(v7 + 56) = *(_OWORD *)(v8 + 40);
          v9 = *((_QWORD *)Buffer + 11);
          *(_OWORD *)(v9 + 8) = 0i64;
          *(_OWORD *)(v9 + 24) = 0i64;
          *(_OWORD *)(v9 + 40) = 0i64;
          v10 = Buffer;
          v11 = (void *)*((_QWORD *)Buffer + 19);
          if( v11 )
          {
            ExFreePoolWithTag(v11, 0x57706E50u);
            v10 = Buffer;
          }
          *((_DWORD *)v10 + 40) = *(_DWORD *)(*((_QWORD *)v10 + 11) + 64i64);
          *((_QWORD *)Buffer + 19) = *(_QWORD *)(*((_QWORD *)Buffer + 11) + 56i64);
          *(_DWORD *)(*((_QWORD *)Buffer + 11) + 64i64) = 0;
          *(_QWORD *)(*((_QWORD *)Buffer + 11) + 56i64) = 0i64;
          v12 = Buffer;
          v13 = (DEVPROPERTY *)*((_QWORD *)Buffer + 21);
          if( v13 )
          {
            PnpFreeDevPropertyArray(*((unsigned int *)Buffer + 44), v13, 0x57706E50ui64);
            v12 = Buffer;
          }
          *((_DWORD *)v12 + 44) = *(_DWORD *)(*((_QWORD *)v12 + 11) + 80i64);
          *((_QWORD *)Buffer + 21) = *(_QWORD *)(*((_QWORD *)Buffer + 11) + 72i64);
          *(_DWORD *)(*((_QWORD *)Buffer + 11) + 80i64) = 0;
          *(_QWORD *)(*((_QWORD *)Buffer + 11) + 72i64) = 0i64;
          PiSwFreeInterfaceList((_LIST_ENTRY *)(Buffer + 184));
          v14 = PiSwBusRelationAdd(**((const WCHAR ***)Buffer + 11), (INT64)Buffer);
          if( v14 < 0 )
          {
            v17 = *((_QWORD *)Buffer + 18);
            if( v17 && _InterlockedExchange64((volatile __int64 *)(v17 + 104), 0i64) )
            {
              *(_QWORD *)(*((_QWORD *)Buffer + 18) + 56i64) = 0i64;
              *(_DWORD *)(*((_QWORD *)Buffer + 18) + 48i64) = v14;
              IofCompleteRequest(*((_IRP **)Buffer + 18), 0);
              *((_QWORD *)Buffer + 18) = 0i64;
            }
          }
          else
          {
            *((_DWORD *)Buffer + 1) &= ~2u;
            v15 = (DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(*((_QWORD *)Buffer + 14), 0x746C6644ui64);
            v16 = (struct _DMA_ADAPTER *)v15;
            if( v15 )
            {
              IoInvalidateDeviceRelations(v15, SingleBusRelations);
              HalPutDmaAdapter(v16);
            }
          }
          PiSwQueuedCreateInfoFree(*((PVOID *)Buffer + 11));
          *((_QWORD *)Buffer + 11) = 0i64;
          v6 = Buffer;
        }
        if( !*((_QWORD *)v6 + 14) )
        {
          RtlDeleteElementGenericTableAvl(&PiSwDeviceInstanceTable, &Buffer);
          PiSwDeviceDereference(Buffer);
        }
      }
    }
  }
}

Referenced by:

PiSwGetChildPdo
PiSwPdoPnPDispatch
PiSwProcessParentRemoveIrp