PipEnumerateCompleted

__int64 __fastcall PipEnumerateCompleted(__int64 a1){
  _DEVICE_NODE *v2; 
  _DWORD *v3; 
  __int64 i; 
  LIST_ENTRY *Children; 
  LIST_ENTRY *v6; 
  _PNP_DEVNODE_STATE *v7; 
  __int64 v8; 
  char v9; 
  unsigned int v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v14; 
  LIST_ENTRY *j; 
  DEVICE_OBJECT *ChildPdo; 
  PVOID P; 
  P = 0i64;
  v2 = *(_DEVICE_NODE **)(a1 + 8);
  if( *(_QWORD *)(a1 + 528) )
  {
    while( v2 )
    {
      PipClearDevNodeFlags(v2, 0x10ui64);
      v2 = *(_DEVICE_NODE **)v2;
    }
  }
  else
  {
    while( v2 )
    {
      if( *(PDRIVER_OBJECT *)(*((_QWORD *)v2 + 4) + 8i64) == PiSwDeviceDriverObject )
        PipClearDevNodeFlags(v2, 0x10ui64);
      v2 = *(_DEVICE_NODE **)v2;
    }
  }
  v3 = *(_DWORD **)(a1 + 528);
  if( v3 )
  {
    for( i = 0i64; (unsigned int)i < *v3; i = (unsigned int)(i + 1) )
    {
      PipProcessEnumeratedChildDevice(a1, *(_QWORD *)(*(_QWORD *)(a1 + 528) + 8 * i + 8));
      v3 = *(_DWORD **)(a1 + 528);
    }
    ExFreePoolWithTag(v3, 0);
    *(_QWORD *)(a1 + 528) = 0i64;
  }
  PiSwLock();
  Children = PiSwFindChildren((UNICODE_STRING *)(a1 + 40));
  v6 = Children;
  if( Children )
  {
    for( j = Children->Flink; j != v6; j = j->Flink )
    {
      ChildPdo = PiSwGetChildPdo(*(DEVICE_OBJECT **)(a1 + 32), j);
      if( ChildPdo )
        PipProcessEnumeratedChildDevice(a1, (ULONG_PTR)ChildPdo);
    }
  }
  PiSwUnlock();
  v8 = *(_QWORD *)(a1 + 8);
  v9 = 0;
  if( v8 )
  {
    do
    {
      v14 = *(_QWORD *)v8;
      if( (*(_DWORD *)(v8 + 396) & 0x10010) == 0 )
      {
        PipSetDevNodeFlags(v8, 0x10000);
        PnpRequestDeviceRemoval(v8, 1, 24, 0);
        v9 = 1;
      }
      v8 = v14;
    }
    while( v14 );
  }
  PipSetDevNodeState((_DEVICE_NODE *)a1, DeviceNodeStarted, v7);
  if( !v9 || (PVOID)a1 == IopRootDeviceNode )
    v10 = 0;
  else
    v10 = -1073741106;
  PiPnpRtlBeginOperation((__int64 **)&P);
  PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v11, *((_QWORD *)IopRootDeviceNode + 6), 15);
  PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v12, *((_QWORD *)IopRootDeviceNode + 6), 20);
  if( P )
    PiPnpRtlEndOperation(P);
  return v10;
}

Referenced by:

PipProcessDevNodeTree