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