Condividi tramite


IRP_MN_QUERY_ALL_DATA

Tutti i driver che supportano WMI devono gestire questo IRP. Un driver può gestire i runtime di integrazione WMI chiamando WmiSystemControl o gestendo l'IRP stesso, come descritto in Gestione delle richieste WMI.

Se un driver chiama WmiSystemControl per gestire una richiesta di IRP_MN_QUERY_ALL_DATA, WMI chiama a sua volta la routine DpWmiQueryDataBlock del driver.

Codice principale

IRP_MJ_SYSTEM_CONTROL

Quando viene inviato

WMI invia questo IRP per eseguire una query per tutte le istanze di un determinato blocco di dati.

WMI invia questo IRP in IRQL = PASSIVE_LEVEL in un contesto di thread arbitrario.

Parametri di input

Parameters.WMI.ProviderId nella posizione dello stack I/O del driver in IRP punta all'oggetto dispositivo del driver che deve rispondere alla richiesta.

Parameters.WMI.DataPath punta a un GUID che identifica il blocco di dati.

Parameters.WMI.BufferSize indica le dimensioni massime del buffer non di paging in Parameters.WMI.Buffer, che riceve i dati di output dalla richiesta. Le dimensioni del buffer devono essere maggiori o uguali a sizeof(WNODE_ALL_DATA) più le dimensioni dei nomi di istanza e dei dati per tutte le istanze da restituire.

Parametri di output

Se il driver gestisce i runtime di integrazione WMI chiamando WmiSystemControl, WMI compila un WNODE_ALL_DATA chiamando la routine DpWmiQueryDataBlock del driver una volta per ogni blocco registrato dal driver.

In caso contrario, il driver compila una struttura WNODE_ALL_DATA in Parameters.WMI.Buffer come indicato di seguito:

  • Imposta WnodeHeader.BufferSize sul numero di byte dell'intero WNODE_ALL_DATA da restituire, imposta WnodeHeader.Timestamp sul valore restituito da KeQuerySystemTime e imposta WnodeHeader.Flags in base alle esigenze dei dati da restituire.

  • Imposta InstanceCount sul numero di istanze da restituire.

  • Se il blocco utilizza nomi di istanza dinamici, imposta OffsetInstanceNameOffsets sull'offset in byte dall'inizio della WNODE_ALL_DATA a dove inizia una matrice di offset ULONG. Ogni elemento di questa matrice è l'offset dal WNODE_ALL_DATA al percorso in cui è archiviato ogni nome di istanza dinamica. Ogni nome di istanza dinamica viene archiviato come stringa Unicode conteggiata in cui il conteggio è USHORT seguito dalla stringa Unicode. Il conteggio non include alcun carattere Null di terminazione che può far parte della stringa Unicode. Se la stringa Unicode include un carattere Null di terminazione, questo carattere Null deve comunque rientrare nelle dimensioni stabilite in WNodeHeader.BufferSize.

  • Se tutte le istanze hanno le stesse dimensioni:

    • Imposta WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags e imposta FixedInstanceSize su tale dimensione, in byte.
    • Scrive i dati dell'istanza a partire da DataBlockOffset, con spaziatura interna in modo che ogni istanza sia allineata a un limite di 8 byte. Ad esempio, se FixedInstanceSize è 6, il driver aggiunge 2 byte di spaziatura interna tra istanze.
  • Se le istanze variano in base alle dimensioni:

    • Cancella WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags e scrive una matrice di strutture InstanceCount OFFSETINSTANCEDATAANDLENGTH a partire da OffsetInstanceDataAndLength. Ogni struttura OFFSETINSTANCEDATAANDLENGTH specifica l'offset in byte dall'inizio della struttura WNODE_ALL_DATA all'inizio dei dati per ogni istanza e la lunghezza dei dati. DataBlockOffset non viene utilizzato.

    • Scrive i dati dell'istanza dopo l'ultimo elemento della matrice OffsetInstanceDataAndLength , oltre alla spaziatura interna in modo che ogni istanza sia allineata a un limite di 8 byte.

Se il buffer in Parameters.WMI.Buffer è troppo piccolo per ricevere tutti i dati, un driver compila le dimensioni necessarie in una struttura WNODE_TOO_SMALL in Parameters.WMI.Buffer. Se il buffer è minore di sizeof(WNODE_TOO_SMALL), il driver ha esito negativo e restituisce STATUS_BUFFER_TOO_SMALL.

Blocco di stato di I/O

Se il driver gestisce l'IRP chiamando WmiSystemControl, WMI imposta Irp-IoStatus.Status> e Irp-IoStatus.Information> nel blocco di stato I/O.

In caso contrario, il driver imposta Irp-IoStatus.Status> su STATUS_SUCCESS o su uno stato di errore appropriato, ad esempio il seguente:

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

In caso di esito positivo, un driver imposta Irp-IoStatus.Information> sul numero di byte scritti nel buffer in Parameters.WMI.Buffer.

Operazione

Un driver può gestire i runtime di integrazione WMI chiamando WmiSystemControl o gestendo l'IRP stesso, come descritto in Gestione delle richieste WMI.

Se un driver gestisce i runtime di integrazione WMI chiamando WmiSystemControl, tale routine chiama la routine DpWmiQueryDataBlock del driver.

Se un driver gestisce una richiesta di IRP_MN_QUERY_ALL_DATA , deve farlo solo se Parameters.WMI.ProviderId punta allo stesso oggetto dispositivo passato dal driver a IoWMIRegistrationControl. In caso contrario, il driver deve inoltrare la richiesta al driver inferiore successivo.

Prima di gestire la richiesta, il driver deve determinare se Parameters.WMI.DataPath punta a un GUID supportato dal driver. In caso contrario, il driver deve avere esito negativo sull'IRP e restituire STATUS_WMI_GUID_NOT_FOUND.

Se il driver supporta il blocco di dati, deve eseguire le operazioni seguenti:

  • Verificare che Parameters.WMI.BufferSize specifichi un buffer sufficientemente grande da ricevere tutti i dati restituiti dal driver.

  • Compilare una struttura WNODE_ALL_DATA in Parameters.WMI.Buffer con i dati per tutte le istanze del blocco di dati.

Requisiti

Intestazione

Wdm.h (include Wdm.h, Ntddk.h o Ntifs.h)

Vedi anche

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

WmiSystemControl

WNODE_ALL_DATA