PiSwBusRelationRemove

VOID __stdcall PiSwBusRelationRemove(_PI_SWD_OBJECT *SwDeviceObject){
  _PI_SWD_OBJECT *v1; 
  __int64 v3; 
  _PI_SWD_OBJECT **v4; 
  _QWORD *v5; 
  void *v6; 

  v1 = SwDeviceObject + 24;
  v3 = *((_QWORD *)SwDeviceObject + 12);
  if( *(_PI_SWD_OBJECT **)(v3 + 8) != SwDeviceObject + 24
    || (v4 = (_PI_SWD_OBJECT **)*((_QWORD *)SwDeviceObject + 13), *v4 != v1) )
  {
    __fastfail(3u);
  }
  *v4 = (_PI_SWD_OBJECT *)v3;
  *(_QWORD *)(v3 + 8) = v4;
  v5 = (_QWORD *)*((_QWORD *)SwDeviceObject + 14);
  if( (_QWORD *)v5[2] == v5 + 2 )
  {
    v6 = (void *)v5[1];
    RtlDeleteElementGenericTableAvl(&PiSwBusRelationsTable, v5);
    if( v6 )
      ExFreePoolWithTag(v6, 0x57706E50u);
  }
  *((_QWORD *)SwDeviceObject + 14) = 0i64;
  PiSwDeviceDereference(SwDeviceObject);
}

Referenced by:

PiSwCloseDevice
PiSwIrpStartCreateWorker
PiSwProcessRemove