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