VfIoDeleteDevice

VOID __stdcall VfIoDeleteDevice(DEVICE_OBJECT *DeviceObject, PVOID CallerAddress){
  const VOID *v2; 
  _LIST_ENTRY *v3; 
  __int64 v4; 
  _LIST_ENTRY *v5; 
  UINT64 v6; 
  INT64 v7; 
  void *LowerDeviceObjectWithTag; 
  v2 = CallerAddress;
  v3 = (_LIST_ENTRY *)DeviceObject;
  if( ViVerifyDma )
  {
    v4 = *((_QWORD *)DeviceObject + 39);
    if( !v4 )
      goto LABEL_17;
    do
    {
      CallerAddress = *(PVOID *)(v4 + 48);
      if( !CallerAddress )
        break;
      v4 = *((_QWORD *)CallerAddress + 39);
      DeviceObject = (DEVICE_OBJECT *)CallerAddress;
    }
    while( v4 );
    if( DeviceObject == (DEVICE_OBJECT *)v3 )
    {
LABEL_17:
      while( 1 )
      {
        v5 = VF_FIND_DEVICE_INFORMATION_AND_REMOVE(v3, (UINT64)CallerAddress);
        if( !v5 )
          break;
        ViReleaseDmaAdapter((__int64)v5, v6);
      }
    }
    else
    {
      VF_MARK_FOR_DEFERRED_REMOVE(DeviceObject);
    }
  }
  if( !VfIoDisabled )
  {
    ViDevObjRemove((_DEVICE_OBJECT *)v3);
    if( (unsigned int)IovUtilIsDeviceObjectMarked((__int64)v3, 0) )
      VfErrorReport9(576i64, v2);
    IovUtilMarkDeviceObject((__int64)v3, 0);
    LowerDeviceObjectWithTag = IovUtilGetLowerDeviceObjectWithTag(v7);
    if( LowerDeviceObjectWithTag )
    {
      VfErrorReport9(513i64, v2);
      ObfDereferenceObjectWithTag(LowerDeviceObjectWithTag, 0x49667256ui64);
    }
    VfIrpLogDeleteDeviceLogs((_DEVICE_OBJECT *)v3);
  }
}

Referenced by:

IovDeleteDevice