Condividi tramite


Elaborazione di IRP WMI in una routine DispatchSystemControl

Un driver che gestisce i provider di integrazione WMI nella routine DispatchSystemControl deve gestire tale IRP solo se il puntatore all'oggetto del dispositivo in Parameters.WMI.ProviderId corrisponde al puntatore passato dal driver nella chiamata a IoWMIRegistrationControl. In caso contrario, il driver deve inoltrare l'IRP al driver inferiore successivo.

Se il driver gestisce la richiesta, deve:

Controllare il GUID in Parameters.WMI.DataPath per determinare se rappresenta un blocco di dati supportato dal driver e, in caso contrario, eseguire l'IRP con STATUS_WMI_GUID_NOT_FOUND.

Un driver deve controllare la struttura di input WNODE_XXX in Parameters.WMI.Buffer per il nome dell'istanza durante la gestione di una delle richieste seguenti:

IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCE IRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD Il driver deve verificare il nome dell'istanza come indicato di seguito:

  • Se WNODE_FLAG_STATIC_INSTANCE_NAMES è impostato in WnodeHeader.Flags, usare InstanceIndex come indice nell'elenco dei nomi di istanze statiche del driver per tale blocco.

  • Se WNODE_FLAG_STATIC_INSTANCE_NAMES è deselezionato in WnodeHeader.Flags, usare OffsetInstanceName come offset per la stringa del nome dell'istanza nella struttura di input WNODE_XXX . OffsetInstanceName è l'offset in byte dall'inizio della struttura a un oggetto USHORT che indica la lunghezza della stringa del nome dell'istanza in byte (non caratteri), incluso il carattere di terminazione NUL, se presente, seguito dalla stringa stessa in Unicode.

Se il driver non riesce a individuare l'istanza specificata da InstanceIndex o OffsetInstanceName, deve avere esito negativo con STATUS_WMI_INSTANCE_NOT_FOUND.

Per una richiesta di IRP_MN_EXECUTE_METHOD , controllare MethodID nel WNODE_METHOD_ITEM di input e, se il metodo non è valido per tale blocco di dati, eseguire l'errore IRP con STATUS_WMI_ITEMID_NOT_FOUND.

Se la richiesta genera l'output, un driver deve controllare le dimensioni del buffer in Parameters.WMI.BufferSize durante la gestione di una delle richieste seguenti:

IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD Se il buffer è troppo piccolo per ricevere l'output, ma almeno sizeof(WNODE_TOO_SMALL), il driver deve avere esito positivo su IRP e scrivere una struttura WNODE_TOO_SMALL nel buffer in Parameters.WMI.Buffer. Se il buffer è minore di sizeof(WNODE_TOO_SMALL), il driver ha esito negativo sull'IRP con un codice NTSTATUS di STATUS_BUFFER_TOO_SMALL.

Se la richiesta genera output e le dimensioni del buffer sono adeguate, scrivere l'output seguente nel buffer in Parameters.WMI.Buffer:

  • Per una richiesta di IRP_MN_QUERY_ALL_DATA , il driver scrive una struttura WNODE_ALL_DATA che contiene dati per tutte le istanze del blocco di dati specificato.
  • Per una richiesta di IRP_MN_QUERY_SINGLE_INSTANCE , il driver scrive una struttura WNODE_SINGLE_INSTANCE che contiene dati per l'istanza specificata di un blocco di dati.
  • Per un IRP_MN_EXECUTE_METHOD se il metodo genera l'output, il driver scrive l'output del metodo nel formato determinato dal driver dopo il WNODE_METHOD_ITEM di input nel buffer (sovrascrivendo i dati di input, se presenti).

Impostare Irp-IoStatus.Information> sul numero di byte scritti nel buffer in Parameters.WMI.Buffer e Irp-IoStatus.Status> su STATUS_SUCCESS.

Chiamare IoCompleteRequest per completare l'IRP.

Per altre informazioni, vedere Strutture WMI WNODE_XXX.