Condividi tramite


Elaborazione di IRP WMI in una routine DispatchSystemControl

Un driver che gestisce i runtime 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, non 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_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD Il driver deve controllare 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 è deselezionata 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 fino a un USHORT che indica la lunghezza della stringa del nome dell'istanza in byte (non in caratteri), incluso il terminatore NULL, se presente, seguito dalla stringa stessa in Unicode.

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

Per una richiesta di IRP_MN_EXECUTE_METHOD , controllare MethodID nella WNODE_METHOD_ITEM di input e, se il metodo non è valido per tale blocco di dati, non eseguire l'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 completare con successo l'IRP e scrivere una struttura WNODE_TOO_SMALL nel buffer a 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 output, il driver scrive l'output del metodo nel formato determinato dal driver, seguendo 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.