PpDevNodeRemoveFromTree
UINT8 __stdcall PpDevNodeRemoveFromTree(_DEVICE_NODE *DeviceNode){
UINT8 v2;
unsigned __int64 v3;
_DEVICE_NODE *Parent;
_DEVICE_NODE **p_Child;
_DEVICE_NODE *i;
_DEVICE_NODE *Sibling;
_DEVICE_NODE *v8;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
_DEVICE_NODE *v11;
_DEVICE_NODE *v12;
UINT8 result;
volatile unsigned int *p_Flags;
__int64 v15;
volatile unsigned int **v16;
__int64 v17;
volatile unsigned int **v18;
_DEVICE_NODE *v19;
_DEVICE_NODE *v20;
_DEVICE_NODE *Child;
_DEVICE_NODE *LastChild;
_DEVICE_OBJECT *PhysicalDeviceObject;
v2 = 0;
v3 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&PnpReplaceEvent + 50);
Parent = DeviceNode->Parent;
if( Parent )
{
p_Child = &Parent->Child;
for( i = *p_Child; i != DeviceNode; i = i->Sibling )
p_Child = &i->Sibling;
Sibling = DeviceNode->Sibling;
*p_Child = DeviceNode->Sibling;
v8 = DeviceNode->Parent;
if( v8->Child )
{
while( Sibling )
{
p_Child = &Sibling->Sibling;
Sibling = Sibling->Sibling;
}
}
else
{
p_Child = 0i64;
}
v8->LastChild = (_DEVICE_NODE *)p_Child;
KxReleaseSpinLock((UINT64 *)&PnpReplaceEvent + 50);
__writecr8(v3);
Flink = DeviceNode->LegacyBusListEntry.Flink;
Blink = DeviceNode->LegacyBusListEntry.Blink;
if( Flink->Blink != &DeviceNode->LegacyBusListEntry || Blink->Flink != &DeviceNode->LegacyBusListEntry )
LABEL_27:
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
PnpOrphanNotification((__int64)DeviceNode);
v2 = 1;
}
else
{
KxReleaseSpinLock((UINT64 *)&PnpReplaceEvent + 50);
__writecr8(v3);
}
v11 = (_DEVICE_NODE *)DeviceNode->Notify.PowerChildren.Flink;
while( v11 != (_DEVICE_NODE *)&DeviceNode->Notify.PowerChildren )
{
p_Flags = &v11[-1].DirectedDripsState.Flags;
v11 = v11->Sibling;
v15 = *(_QWORD *)p_Flags;
v16 = (volatile unsigned int **)*((_QWORD *)p_Flags + 1);
if( *(volatile unsigned int **)(*(_QWORD *)p_Flags + 8i64) != p_Flags )
goto LABEL_27;
if( *v16 != p_Flags )
goto LABEL_27;
*v16 = (volatile unsigned int *)v15;
*(_QWORD *)(v15 + 8) = v16;
v17 = *((_QWORD *)p_Flags + 3);
v18 = (volatile unsigned int **)*((_QWORD *)p_Flags + 4);
if( *(volatile unsigned int **)(v17 + 8) != p_Flags + 6 || *v18 != p_Flags + 6 )
goto LABEL_27;
*v18 = (volatile unsigned int *)v17;
*(_QWORD *)(v17 + 8) = v18;
ExFreePoolWithTag((PVOID)p_Flags, 0x72775044u);
}
v12 = (_DEVICE_NODE *)DeviceNode->Notify.PowerParents.Flink;
while( v12 != (_DEVICE_NODE *)&DeviceNode->Notify.PowerParents )
{
v19 = v12->Sibling;
v20 = v12;
v12 = v19;
Child = v20->Child;
if( v19->Child != v20 )
goto LABEL_27;
if( Child->Sibling != v20 )
goto LABEL_27;
Child->Sibling = v19;
v19->Child = Child;
LastChild = v20->LastChild;
PhysicalDeviceObject = v20->PhysicalDeviceObject;
if( LastChild->Child != (_DEVICE_NODE *)&v20->LastChild
|| *(_DEVICE_NODE **)&PhysicalDeviceObject->Type != (_DEVICE_NODE *)&v20->LastChild )
{
goto LABEL_27;
}
*(_QWORD *)&PhysicalDeviceObject->Type = LastChild;
LastChild->Child = (_DEVICE_NODE *)PhysicalDeviceObject;
ExFreePoolWithTag(v20, 0x72775044u);
}
DeviceNode->Parent = 0i64;
result = v2;
DeviceNode->Child = 0i64;
DeviceNode->Sibling = 0i64;
DeviceNode->LastChild = 0i64;
return result;
}Referenced by:
IoReportDetectedDevice
PnpUnlinkDeviceRemovalRelations