Chiamata di WmiSystemControl per gestire i runtime di integrazione WMI
Le routine della libreria WMI semplificano la gestione delle richieste WMI perché invece di elaborare ogni richiesta di questo tipo, un driver chiama WmiSystemControl. Nella chiamata WmiSystemControl il driver passa una struttura di WMILIB_CONTEXT inizializzata che contiene punti di ingresso alle routine di callback della libreria WMI del driver (routine DpWmiXxx ) e informazioni sui blocchi di dati e sugli eventi del driver.
Poiché la libreria WMI non fornisce alcun meccanismo per passare nomi di istanze dinamiche o un elenco di nomi di istanza statici, un driver può usare la libreria WMI per gestire le richieste che coinvolgono solo blocchi di dati con nomi di istanza statici basati su un PDO o una singola stringa di nome di base. Per altre informazioni sui nomi delle istanze statiche e dinamiche, vedere Definizione dei nomi di istanza WMI. Nothing impedisce a un driver di usare la libreria WMI per gestire le richieste per tali blocchi ed elaborando le richieste per altri blocchi nella routine DispatchSystemControl . Per altre informazioni, vedere Elaborazione di IRP WMI in una routine DispatchSystemControl.
Per gestire i runtime di integrazione WMI chiamando WmiSystemControl, un driver deve implementare determinate routine di callback DpWmiXxx necessarie e potrebbe implementare routine di callback DpWmiXxx facoltative aggiuntive:
DpWmiQueryReginfo: (Obbligatorio) Fornisce informazioni sui dati e i blocchi eventi registrati dal driver. WMI chiama la routine DpWmiQueryReginfo di un driver per elaborare una richiesta di IRP_MN_REGINFO o di IRP_MN_REGINFO_EX . Per altre informazioni, vedere Uso della libreria WMI per registrare i blocchi.
DpWmiQueryDataBlock: (Obbligatorio) Restituisce una singola istanza o tutte le istanze di un blocco di dati. WMI chiama la routine DpWmiQueryDataBlock di un driver per elaborare una richiesta di IRP_MN_QUERY_SINGLE_INSTANCE o di IRP_MN_QUERY_ALL_DATA .
DpWmiSetDataBlock: (facoltativo) Modifica tutti gli elementi di dati in una singola istanza di un blocco di dati. WMI chiama la routine DpWmiSetDataBlock di un driver per elaborare una richiesta di IRP_MN_CHANGE_SINGLE_INSTANCE .
DpWmiSetDataItem: (facoltativo) Modifica un singolo elemento di dati in un'istanza di un blocco di dati. WMI chiama la routine DpWmiSetDataItem di un driver per elaborare una richiesta di IRP_MN_CHANGE_SINGLE_ITEM .
DpWmiFunctionControl: (Facoltativo) Abilita e disabilita la notifica degli eventi e la raccolta dei dati per i blocchi registrati come costosi da raccogliere. WMI chiama la routine DpWmiFunctionControl di un driver per elaborare una richiesta di IRP_MN_ENABLE_COLLECTION, IRP_MN_DISABLE_COLLECTION, IRP_MN_ENABLE_EVENTS o IRP_MN_DISABLE_EVENTS .
DpWmiExecuteMethod-(Facoltativo) Esegue un metodo associato a un blocco di dati. WMI chiama la routine DpWmiExecuteMethod di un driver per elaborare una richiesta di IRP_MN_EXECUTE_METHOD .
Le routine DpWmiXxx di un driver possono avere qualsiasi nome scelto dal writer di driver.
Prima di chiamare WmiSystemControl, il driver deve inizializzare una struttura WMILIB_CONTEXT con punti di ingresso alle routine DpWmiXxx e informazioni sui blocchi di dati e sui blocchi eventi.
Quando il driver riceve una richiesta WMI:
Il driver chiama WmiSystemControl con un puntatore alla struttura WMILIB_CONTEXT inizializzata, un puntatore all'oggetto dispositivo e un puntatore all'IRP.
WMI convalida i parametri IRP e chiama la routine DpWmiXxx del driver che elabora la richiesta. Se il driver non imposta alcun punto di ingresso nella relativa WMILIB_CONTEXT per una routine DpWmiXxx facoltativa, WMI completa l'IRP con valori e stato predefiniti.
Nella routine DpWmiXxx il driver elabora la richiesta e scrive qualsiasi output nel buffer fornito dal chiamante. Ad esempio, la routine DpWmiQueryDataBlock di un driver scriverà le istanze richieste del blocco specificato nel buffer.
In tutte le routine DpWmiXxx ad eccezione di DpWmiQueryReginfo, il driver chiama WmiCompleteRequest per completare la richiesta o restituisce STATUS_PENDING per posticipare il completamento, come per qualsiasi IRP.
WMI esegue qualsiasi post-elaborazione necessaria, inserisce qualsiasi output in una struttura WNODE_XXX appropriata e passa l'output e lo stato al consumer di dati.