IopRemoveLegacyDeviceNode

VOID __stdcall IopRemoveLegacyDeviceNode(_DEVICE_OBJECT *DeviceObject, _DEVICE_NODE *LegacyDeviceNode){
  _QWORD *v4; 
  __int64 v5; 
  __int64 v6; 
  _QWORD *v7; 
  if( DeviceObject )
  {
    if( (*((_DWORD *)DeviceObject + 12) & 0x1000) != 0 )
      return;
  }
  else
  {
    if( !*((_QWORD *)LegacyDeviceNode + 54) )
      return;
    *((_QWORD *)LegacyDeviceNode + 54) = 0i64;
    v4 = (_QWORD *)*((_QWORD *)LegacyDeviceNode + 1);
    if( v4 )
      *v4 = *(_QWORD *)LegacyDeviceNode;
    if( *(_QWORD *)LegacyDeviceNode )
      *(_QWORD *)(*(_QWORD *)LegacyDeviceNode + 8i64) = *((_QWORD *)LegacyDeviceNode + 1);
    if( (_DEVICE_NODE *)IopLegacyDeviceNode == LegacyDeviceNode )
      IopLegacyDeviceNode = *(_QWORD *)LegacyDeviceNode;
  }
  v5 = *((_QWORD *)LegacyDeviceNode + 66);
  while( v5 )
  {
    v7 = (_QWORD *)(v5 + 536);
    v5 = *(_QWORD *)(v5 + 536);
    if( (_DEVICE_NODE *)v5 == LegacyDeviceNode )
    {
      *v7 = *((_QWORD *)LegacyDeviceNode + 67);
      break;
    }
  }
  *((_QWORD *)LegacyDeviceNode + 3) = 0i64;
  *((_QWORD *)LegacyDeviceNode + 1) = 0i64;
  *(_QWORD *)LegacyDeviceNode = 0i64;
  *((_QWORD *)LegacyDeviceNode + 2) = 0i64;
  v6 = *((_QWORD *)LegacyDeviceNode + 4);
  PipClearDevNodeFlags(LegacyDeviceNode, 0x20000ui64);
  IopDestroyDeviceNode(LegacyDeviceNode);
  if( !DeviceObject )
  {
    *(_QWORD *)(v6 + 8) = PnpDriverObject;
    IoDeleteDevice((_DEVICE_OBJECT *)v6);
  }
}

Referenced by:

IopLegacyResourceAllocation