IopRemoveLegacyDeviceNode
VOID __stdcall IopRemoveLegacyDeviceNode(_DEVICE_OBJECT *DeviceObject, _DEVICE_NODE *LegacyDeviceNode){
_DEVICE_NODE *Child;
_DEVICE_NODE *NextResourceDeviceNode;
_DEVICE_OBJECT *PhysicalDeviceObject;
union {_DEVICE_NODE *NextResourceDeviceNode;} *p_OverUsed2;
if( DeviceObject )
{
if( (DeviceObject->Flags & 0x1000) != 0 )
return;
}
else
{
if( !LegacyDeviceNode->DuplicatePDO )
return;
LegacyDeviceNode->DuplicatePDO = 0i64;
Child = LegacyDeviceNode->Child;
if( Child )
Child->Sibling = LegacyDeviceNode->Sibling;
if( LegacyDeviceNode->Sibling )
LegacyDeviceNode->Sibling->Child = LegacyDeviceNode->Child;
if( (_DEVICE_NODE *)*(&PnpReplaceEvent + 720) == LegacyDeviceNode )
*(&PnpReplaceEvent + 720) = LegacyDeviceNode->Sibling;
}
NextResourceDeviceNode = LegacyDeviceNode->OverUsed1.LegacyDeviceNode;
while( NextResourceDeviceNode )
{
p_OverUsed2 = &NextResourceDeviceNode->OverUsed2;
NextResourceDeviceNode = NextResourceDeviceNode->OverUsed2.NextResourceDeviceNode;
if( NextResourceDeviceNode == LegacyDeviceNode )
{
p_OverUsed2->NextResourceDeviceNode = (_DEVICE_NODE *)LegacyDeviceNode->OverUsed2;
break;
}
}
LegacyDeviceNode->LastChild = 0i64;
LegacyDeviceNode->Child = 0i64;
LegacyDeviceNode->Sibling = 0i64;
LegacyDeviceNode->Parent = 0i64;
PhysicalDeviceObject = LegacyDeviceNode->PhysicalDeviceObject;
PipClearDevNodeFlags(LegacyDeviceNode, 0x20000ui64);
IopDestroyDeviceNode(LegacyDeviceNode);
if( !DeviceObject )
{
PhysicalDeviceObject->DriverObject = (_DRIVER_OBJECT *)*(&PnpReplaceEvent + 823);
IoDeleteDevice(PhysicalDeviceObject);
}
}Referenced by:
IopLegacyResourceAllocation