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