PipEnumerateDevice

INT64 __stdcall PipEnumerateDevice(_DEVICE_NODE *DeviceNode, UINT64 Synchronous, UINT64 OperationsPending){
  int v3; 
  CHAR *v5; 
  _PNP_DEVNODE_STATE *v6; 
  __int64 v7; 
  _DEVICE_OBJECT *v8; 
  NTSTATUS v9; 
  LIST_ENTRY *v10; 
  unsigned int v11; 
  _PNP_DEVICE_COMPLETION_QUEUE *v13; 
  _DEVICE_OBJECT *v14; 
  NTSTATUS DeviceRelations; 
  _PNP_DEVNODE_STATE *v16; 
  v3 = OperationsPending;
  if( (_DWORD)Synchronous
    || (PnpAsyncOptions & 2) == 0
    || (*((_DWORD *)DeviceNode + 99) & 0x800000) != 0
    || InitSafeBootMode
    || (v5 = PnpDeviceCompletionRequestCreate((INT64)DeviceNode, 781i64)) == 0i64 )
  {
    if( v3 && (*((_DWORD *)DeviceNode + 99) & 0x800000) != 0 )
      return(unsigned int)-1073741267;
    PnpDiagnosticTraceObject(&KMPnPEvt_DeviceEnum_Start, (_UNICODE_STRING *)((char *)DeviceNode + 40));
    PipClearDevNodeFlags(DeviceNode, 8ui64);
    PoFxActivateDevice(*((DEVICE_OBJECT **)DeviceNode + 4));
    v14 = (_DEVICE_OBJECT *)*((_QWORD *)DeviceNode + 4);
    *((_DWORD *)DeviceNode + 176) |= 0x80u;
    DeviceRelations = PnpQueryDeviceRelations(v14, BusRelations, 0i64, (char *)DeviceNode + 528);
    PoFxIdleDevice(*((DEVICE_OBJECT **)DeviceNode + 4));
    *((_DWORD *)DeviceNode + 176) &= ~0x80u;
    *((_DWORD *)DeviceNode + 98) = DeviceRelations;
    PipSetDevNodeState(DeviceNode, DeviceNodeEnumerateCompletion, v16);
    PnpDiagnosticTraceObject(&KMPnPEvt_DeviceEnum_Stop, (_UNICODE_STRING *)((char *)DeviceNode + 40));
  }
  else
  {
    PipSetDevNodeState(DeviceNode, DeviceNodeEnumeratePending, v6);
    *((_DWORD *)DeviceNode + 98) = 259;
    PnpDeviceCompletionQueueAddDispatchedRequest(v7, v5);
    PnpDiagnosticTraceObject(&KMPnPEvt_DeviceEnum_Start, (_UNICODE_STRING *)((char *)DeviceNode + 40));
    PipClearDevNodeFlags(DeviceNode, 8ui64);
    PoFxActivateDevice(*((DEVICE_OBJECT **)DeviceNode + 4));
    v8 = (_DEVICE_OBJECT *)*((_QWORD *)DeviceNode + 4);
    *((_DWORD *)DeviceNode + 176) |= 0x80u;
    v9 = PnpQueryDeviceRelations(v8, BusRelations, (PIO_COMPLETION_ROUTINE)PnpDeviceCompletionRoutine, v5);
    v11 = v9;
    if( v9 == 259 )
    {
      PnpDiagnosticTraceObject(&KMPnPEvt_DeviceEnum_Pend, (_UNICODE_STRING *)((char *)DeviceNode + 40));
      return v11;
    }
    if( *((_DWORD *)v5 + 10) != v9 )
    {
      *((_DWORD *)v5 + 10) = v9;
      PnpDiagnosticTraceObject(&KMPnPEvt_DeviceEnum_Stop, (_UNICODE_STRING *)((char *)DeviceNode + 40));
      PnpDeviceCompletionQueueDispatchedEntryCompleted(v13, (_LIST_ENTRY *)v5);
    }
    PnpDeviceCompletionQueueRemoveCompletedRequest(v10, (LIST_ENTRY *)v5);
    PnpDeviceCompletionProcessCompletedRequest((INT64)v5);
  }
  return 0;
}

Referenced by:

PipProcessDevNodeTree