IopDestroyDeviceNode

VOID __stdcall IopDestroyDeviceNode(_DEVICE_NODE *DeviceNode){
  __int64 v2; 
  struct _DMA_ADAPTER *v3; 
  void *v4; 
  void **v5; 
  void *v6; 
  void *v7; 
  PVOID *v8; 
  __int64 v9; 
  PVOID *v10; 
  __int64 v11; 
  void **v12; 
  if( DeviceNode )
  {
    if( *((_QWORD *)DeviceNode + 90) )
    {
      v8 = (PVOID *)((char *)DeviceNode + 40);
      IoAddTriageDumpDataBlock(DeviceNode, 0x310ui64);
      if( *(_WORD *)v8 )
      {
        IoAddTriageDumpDataBlock(v8, 2ui64);
        IoAddTriageDumpDataBlock(v8[1], *(unsigned __int16 *)v8);
      }
      if( *((_WORD *)DeviceNode + 28) )
      {
        IoAddTriageDumpDataBlock((char *)DeviceNode + 56, 2ui64);
        IoAddTriageDumpDataBlock(*((PVOID *)DeviceNode + 8), *((unsigned __int16 *)DeviceNode + 28));
      }
      v9 = *((_QWORD *)DeviceNode + 2);
      if( v9 && *(_WORD *)(v9 + 56) )
      {
        IoAddTriageDumpDataBlock((PVOID)(v9 + 56), 2ui64);
        IoAddTriageDumpDataBlock(
          *(PVOID *)(*((_QWORD *)DeviceNode + 2) + 64i64),
          *(unsigned __int16 *)(*((_QWORD *)DeviceNode + 2) + 56i64));
      }
      KeBugCheckEx(0xCAu, 5ui64, *((_QWORD *)DeviceNode + 4), *((_QWORD *)DeviceNode + 90), 0x11ui64);
    }
    v2 = *((_QWORD *)DeviceNode + 4);
    if( (*(_DWORD *)(v2 + 48) & 0x1000) != 0 && *((_QWORD *)DeviceNode + 2) )
    {
      v10 = (PVOID *)((char *)DeviceNode + 40);
      IoAddTriageDumpDataBlock(DeviceNode, 0x310ui64);
      if( *(_WORD *)v10 )
      {
        IoAddTriageDumpDataBlock(v10, 2ui64);
        IoAddTriageDumpDataBlock(v10[1], *(unsigned __int16 *)v10);
      }
      if( *((_WORD *)DeviceNode + 28) )
      {
        IoAddTriageDumpDataBlock((char *)DeviceNode + 56, 2ui64);
        IoAddTriageDumpDataBlock(*((PVOID *)DeviceNode + 8), *((unsigned __int16 *)DeviceNode + 28));
      }
      v11 = *((_QWORD *)DeviceNode + 2);
      if( v11 && *(_WORD *)(v11 + 56) )
      {
        IoAddTriageDumpDataBlock((PVOID)(v11 + 56), 2ui64);
        IoAddTriageDumpDataBlock(
          *(PVOID *)(*((_QWORD *)DeviceNode + 2) + 64i64),
          *(unsigned __int16 *)(*((_QWORD *)DeviceNode + 2) + 56i64));
      }
      KeBugCheckEx(0xCAu, 5ui64, *((_QWORD *)DeviceNode + 4), 0i64, 0i64);
    }
    if( (*((_DWORD *)DeviceNode + 99) & 0x20000) != 0 )
    {
      IopLegacyResourceAllocation(ArbiterRequestUndefined, PnpDriverObject, (DEVICE_OBJECT *)v2, 0i64, 0i64);
    }
    else
    {
      v3 = (struct _DMA_ADAPTER *)*((_QWORD *)DeviceNode + 54);
      if( v3 )
        HalPutDmaAdapter(v3);
      if( *((_WORD *)DeviceNode + 28) )
        ExFreePoolWithTag(*((PVOID *)DeviceNode + 8), 0);
      PnpFreeDeviceInstancePath((__int64)DeviceNode);
      ExAcquireFastMutex(&PiResourceListLock);
      v4 = (void *)*((_QWORD *)DeviceNode + 55);
      if( v4 )
        ExFreePoolWithTag(v4, 0);
      KeReleaseGuardedMutex(&PiResourceListLock);
      IopUncacheInterfaceInformation(*((_DEVICE_OBJECT **)DeviceNode + 4), 0i64);
      v5 = (void **)((char *)DeviceNode + 608);
      while( 1 )
      {
        v6 = *v5;
        if( *v5 == v5 )
          break;
        if( *((void ***)v6 + 1) != v5 || (v12 = *(void ***)v6, *(void **)(*(_QWORD *)v6 + 8i64) != v6) )
          __fastfail(3u);
        *v5 = v12;
        v12[1] = v5;
        ExFreePoolWithTag(*((PVOID *)v6 + 3), 0);
        ExFreePoolWithTag(v6, 0);
      }
      v7 = (void *)*((_QWORD *)DeviceNode + 89);
      if( v7 )
        ExFreePoolWithTag(v7, 0x62655250u);
      *(_QWORD *)(*(_QWORD *)(*((_QWORD *)DeviceNode + 4) + 312i64) + 40i64) = 0i64;
      ExFreePoolWithTag(DeviceNode, 0);
      _InterlockedDecrement(&IopNumberDeviceNodes);
    }
  }
}

Referenced by:

IopDeleteDevice
IopLegacyResourceAllocation
IopRemoveLegacyDeviceNode