Condividi tramite


IRP_MN_QUERY_ALL_DATA

Tutti i driver che supportano WMI devono gestire questo IRP. Un driver può gestire i provider 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 a sua volta chiama la routine DpWmiQueryDataBlock del driver.

Codice principale

IRP_MJ_SYSTEM_CONTROL

Data di invio

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 di 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 del WNODE_ALL_DATA a dove inizia una matrice di offset ULONG. Ogni elemento in questa matrice è l'offset dalla WNODE_ALL_DATA alla posizione in cui è archiviato ogni nome di istanza dinamica. Ogni nome di istanza dinamica viene archiviato come stringa Unicode con conteggio 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 a 8 byte. Ad esempio, se FixedInstanceSize è 6, il driver aggiunge 2 byte di spaziatura interna tra le istanze.
  • Se le istanze variano in base alle dimensioni:

    • Cancella WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags e scrive una matrice di strutture InstanceCountOFFSETINSTANCEDATAANDLENGTH 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 usato.

    • 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 a 8 byte.

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

Blocco dello stato 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:

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 provider 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