IoDeleteDevice

VOID *__stdcall IoDeleteDevice(PDEVICE_OBJECT DeviceObject){
  unsigned int Flags; 
  unsigned __int16 *v2; 
  unsigned __int16 *v3; 
  _SECURITY_SUBJECT_CONTEXT *v5; 
  VOID *v6; 
  _IO_TIMER *Timer; 
  INT64 v8; 
  INT64 v9; 
  UINT8 v10; 
  VOID *result; 
  VOID **Pool_1; 
  UINT8 v13; 
  VOID *retaddr; 
  PULONG ReturnLength; 

  Flags = DeviceObject->Flags;
  v2 = 0i64;
  LODWORD(ReturnLength) = 0;
  v3 = 0i64;
  if( (Flags & 0x40) != 0 && ObQueryNameString(DeviceObject, 0i64, 0i64, (UINT64 *)&ReturnLength) == -1073741820 )
  {
    Pool_1 = IopVerifierExAllocatePool_1(1ui64, (unsigned int)ReturnLength);
    v3 = (unsigned __int16 *)Pool_1;
    if( Pool_1 )
    {
      if( ObQueryNameString(
             DeviceObject,
             (_OBJECT_NAME_INFORMATION *)Pool_1,
             (unsigned int)ReturnLength,
             (UINT64 *)&ReturnLength) >= 0 )
        v2 = v3;
    }
  }
  EtwTiLogDeviceObjectLoadUnload(0, &DeviceObject->DriverObject->DriverName.Length, v2);
  if( v3 )
    ExFreePoolWithTag(v3, 0);
  if( (MmVerifierData & 0x90) != 0 )
    IovDeleteDevice((_UNICODE_STRING *)DeviceObject, retaddr, v5, v6, v13);
  if( (DeviceObject->Flags & 0x800) != 0 )
    IoUnregisterShutdownNotification(DeviceObject);
  Timer = DeviceObject->Timer;
  if( Timer )
  {
    IopRemoveTimerFromTimerList(DeviceObject->Timer);
    ExFreePoolWithTag(Timer, 0);
  }
  if( (DeviceObject->Flags & 0x40) != 0 )
    ObMakeTemporaryObject(DeviceObject);
  PoRunDownDeviceObject(DeviceObject);
  PnpFreeInterruptInformation((__int64)DeviceObject);
  v10 = KeAcquireQueuedSpinLock(10i64, v8, v9);
  DeviceObject->DeviceObjectExtension->ExtensionFlags |= 2u;
  if( DeviceObject->ReferenceCount )
    KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v10);
  else
    IopCompleteUnloadOrDelete(DeviceObject, 0, v10);
  return result;
}

Referenced by:

HalpAddDevice
IoCreateDeviceSecure
IoReportDetectedDevice
IopCreateRootEnumeratedDeviceObject
IopInitializeDeviceInstanceKey
IopInitializePlugPlayServices
IopLegacyResourceAllocation
IopPnPDispatch
IopRemoveLegacyDeviceNode
PiInitializeDevice
PiSwDestroyDeviceObject
PiSwGetChildPdo
RawDeleteVcb
RawInitialize
RawMountVolume
RawShutdown
VfFilterAttach
ViDdiDriverEntry
ViFilterDispatchPnp
VrpRegistryUnload
WmipDriverEntry