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