PipProcessEnumeratedChildDevice

VOID __stdcall PipProcessEnumeratedChildDevice(_DEVICE_NODE *DeviceNode, _DEVICE_OBJECT *ChildDeviceObject){
  _DEVOBJ_EXTENSION *DeviceObjectExtension; 
  _DEVICE_NODE *v5; 
  PROFILE_STATUS v6; 
  NTSTATUS v7; 
  _DEVICE_NODE *v8; 
  NTSTATUS v9; 
  _DRIVER_OBJECT *DriverObject; 
  _UNICODE_STRING *p_DriverName; 
  VOID **v12; 
  VOID **v13; 
  _DEVOBJ_EXTENSION *v14; 
  _WORD *v15; 
  __int64 v16; 
  _WORD *v17; 
  __int64 v18; 
  _DEVICE_NODE *DeviceNodea; 

  DeviceObjectExtension = ChildDeviceObject->DeviceObjectExtension;
  if( (DeviceObjectExtension->ExtensionFlags & 2) != 0 )
  {
    IoAddTriageDumpDataBlock(ChildDeviceObject, (_BYTE *)ChildDeviceObject->Size);
    DriverObject = ChildDeviceObject->DriverObject;
    if( DriverObject )
    {
      IoAddTriageDumpDataBlock(DriverObject, (_BYTE *)(unsigned int)DriverObject->Size);
      p_DriverName = &ChildDeviceObject->DriverObject->DriverName;
      if( p_DriverName->Length )
      {
        IoAddTriageDumpDataBlock(p_DriverName, (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          ChildDeviceObject->DriverObject->DriverName.Buffer,
          (_BYTE *)ChildDeviceObject->DriverObject->DriverName.Length);
      }
    }
    v12 = (VOID **)ChildDeviceObject->DeviceObjectExtension->DeviceNode;
    if( v12 )
    {
      v13 = v12 + 5;
      IoAddTriageDumpDataBlock(v12, (_BYTE *)0x310);
      if( *(_WORD *)v13 )
      {
        IoAddTriageDumpDataBlock(v13, (_BYTE *)2);
        IoAddTriageDumpDataBlock(v13[1], (_BYTE *)*(unsigned __int16 *)v13);
      }
      v14 = ChildDeviceObject->DeviceObjectExtension;
      v15 = (char *)v14->DeviceNode + 56;
      if( *v15 )
      {
        IoAddTriageDumpDataBlock(v15, (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          *((VOID **)ChildDeviceObject->DeviceObjectExtension->DeviceNode + 8),
          (_BYTE *)*((unsigned __int16 *)ChildDeviceObject->DeviceObjectExtension->DeviceNode + 28));
        v14 = ChildDeviceObject->DeviceObjectExtension;
      }
      v16 = *((_QWORD *)v14->DeviceNode + 2);
      if( v16 )
      {
        v17 = (_WORD *)(v16 + 56);
        if( *v17 )
        {
          IoAddTriageDumpDataBlock(v17, (_BYTE *)2);
          v18 = *((_QWORD *)ChildDeviceObject->DeviceObjectExtension->DeviceNode + 2);
          IoAddTriageDumpDataBlock(*(VOID **)(v18 + 64), (_BYTE *)*(unsigned __int16 *)(v18 + 56));
        }
      }
    }
    KeBugCheckEx(0xCAu, (PVOID)4, ChildDeviceObject, 0i64, 0i64);
  }
  v5 = (_DEVICE_NODE *)DeviceObjectExtension->DeviceNode;
  DeviceNodea = v5;
  if( v5 )
  {
    PipSetDevNodeFlags(v5, 0x10ui64);
    if( v5->DockInfo.DockStatus == DOCK_EJECTIRP_COMPLETED )
      PpProfileCancelTransitioningDock(v5, v6);
    goto LABEL_5;
  }
  v7 = PipAllocateDeviceNode(ChildDeviceObject, (PDEVICE_NODE *)&DeviceNodea);
  v8 = DeviceNodea;
  v9 = v7;
  if( !DeviceNodea )
  {
LABEL_5:
    HalPutDmaAdapter((PADAPTER_OBJECT)ChildDeviceObject);
    return;
  }
  PipSetDevNodeFlags(DeviceNodea, 0x10ui64);
  ChildDeviceObject->Flags |= 0x1000u;
  PpDevNodeInsertIntoTree(DeviceNode, v8);
  if( v9 == -1073740946 )
    PipSetDevNodeProblem(v8, 0x31ui64, -1073740946);
}

Referenced by:

PipEnumerateCompleted