PipProcessEnumeratedChildDevice

void __fastcall PipProcessEnumeratedChildDevice(__int64 a1, ULONG_PTR a2){
  __int64 v2; 
  _DWORD *v5; 
  int v6; 
  int DeviceNode; 
  __int64 v8; 
  int v9; 
  __int16 *v10; 
  _WORD *v11; 
  PVOID *v12; 
  PVOID *v13; 
  __int64 v14; 
  _WORD *v15; 
  __int64 v16; 
  _WORD *v17; 
  __int64 v18; 
  __int64 v19; 
  v2 = *(_QWORD *)(a2 + 312);
  if( (*(_DWORD *)(v2 + 32) & 2) != 0 )
  {
    IoAddTriageDumpDataBlock((PVOID)a2, *(unsigned __int16 *)(a2 + 2));
    v10 = *(__int16 **)(a2 + 8);
    if( v10 )
    {
      IoAddTriageDumpDataBlock(v10, (unsigned int)v10[1]);
      v11 = (_WORD *)(*(_QWORD *)(a2 + 8) + 56i64);
      if( *v11 )
      {
        IoAddTriageDumpDataBlock(v11, 2ui64);
        IoAddTriageDumpDataBlock(
          *(PVOID *)(*(_QWORD *)(a2 + 8) + 64i64),
          *(unsigned __int16 *)(*(_QWORD *)(a2 + 8) + 56i64));
      }
    }
    v12 = *(PVOID **)(*(_QWORD *)(a2 + 312) + 40i64);
    if( v12 )
    {
      v13 = v12 + 5;
      IoAddTriageDumpDataBlock(v12, 0x310ui64);
      if( *(_WORD *)v13 )
      {
        IoAddTriageDumpDataBlock(v13, 2ui64);
        IoAddTriageDumpDataBlock(v13[1], *(unsigned __int16 *)v13);
      }
      v14 = *(_QWORD *)(a2 + 312);
      v15 = (_WORD *)(*(_QWORD *)(v14 + 40) + 56i64);
      if( *v15 )
      {
        IoAddTriageDumpDataBlock(v15, 2ui64);
        IoAddTriageDumpDataBlock(
          *(PVOID *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 64i64),
          *(unsigned __int16 *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 56i64));
        v14 = *(_QWORD *)(a2 + 312);
      }
      v16 = *(_QWORD *)(*(_QWORD *)(v14 + 40) + 16i64);
      if( v16 )
      {
        v17 = (_WORD *)(v16 + 56);
        if( *v17 )
        {
          IoAddTriageDumpDataBlock(v17, 2ui64);
          v18 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 16i64);
          IoAddTriageDumpDataBlock(*(PVOID *)(v18 + 64), *(unsigned __int16 *)(v18 + 56));
        }
      }
    }
    KeBugCheckEx(0xCAu, 4ui64, a2, 0i64, 0i64);
  }
  v5 = *(_DWORD **)(v2 + 40);
  v19 = (__int64)v5;
  if( v5 )
  {
    PipSetDevNodeFlags((__int64)v5, 16);
    if( v5[142] == 4 )
      PpProfileCancelTransitioningDock((__int64)v5, v6);
    goto LABEL_5;
  }
  DeviceNode = PipAllocateDeviceNode(a2, (void **)&v19);
  v8 = v19;
  v9 = DeviceNode;
  if( !v19 )
  {
LABEL_5:
    HalPutDmaAdapter((PADAPTER_OBJECT)a2);
    return;
  }
  PipSetDevNodeFlags(v19, 16);
  *(_DWORD *)(a2 + 48) |= 0x1000u;
  PpDevNodeInsertIntoTree(a1, v8);
  if( v9 == -1073740946 )
    PipSetDevNodeProblem(v8, 49, -1073740946);
}

Referenced by:

PipEnumerateCompleted