WMI IRP を処理するための WmiSystemControl の呼び出し
WMI ライブラリ ルーチンは、このような各要求を処理する代わりに WmiSystemControl を呼び出 すので、WMI 要求の処理を簡略化します。 WmiSystemControl 呼び出しでは、ドライバーは、ドライバーの WMI ライブラリ コールバック ルーチン (DpWmiXxx ルーチン) へのエントリ ポイントと、ドライバーのデータ ブロックとイベント ブロックに関する情報を含む初期化された WMILIB_CONTEXT 構造体を渡します。
WMI ライブラリには動的インスタンス名または静的インスタンス名リストを渡すためのメカニズムがないため、ドライバーは WMI ライブラリを使用して、PDO または単一のベース名文字列に基づく静的インスタンス名を持つデータ ブロックのみを含む要求を処理できます。 静的インスタンス名と動的インスタンス名の詳細については、「WMI インスタンス名の定義」を参照してください。 ドライバーが WMI ライブラリを使用してこのようなブロックの要求を処理し、DispatchSystemControl ルーチン内の他のブロックの要求を処理することを妨げるものはありません。 詳細については、「DispatchSystemControlルーチンでのWMI IRPの処理」を参照してください。
WmiSystemControl を呼び出して WMI IRP を処理するには、ドライバーが必要な DpWmiXxx コールバック ルーチンを実装する必要があり、追加のオプションの DpWmiXxx コールバック ルーチンを実装する場合があります。
DpWmiQueryReginfo—(必須) ドライバーによって登録されているデータとイベント ブロックに関する情報を提供します。 WMI は、ドライバーの DpWmiQueryReginfo ルーチンを呼び出して、IRP_MN_REGINFO または IRP_MN_REGINFO_EX 求を処理します。 詳細については、「WMI ライブラリを使用してブロックを登録する」を参照してください。
DpWmiQueryDataBlock —(必須) 1 つのインスタンスまたはデータ ブロックのすべてのインスタンスを返します。 WMI は、ドライバーの DpWmiQueryDataBlock ルーチンを呼び出して、IRP_MN_QUERY_SINGLE_INSTANCE または IRP_MN_QUERY_ALL_DATA 要求を処理します。
DpWmiSetDataBlock一インスタンス内のすべてのデータ項目を変更します。 WMI は、ドライバーの DpWmiSetDataBlock ルーチンを呼び出して、IRP_MN_CHANGE_SINGLE_INSTANCE 要求を処理します。
DpWmiSetDataItem—データ ブロックのインスタンス内の 1 つのデータ項目を変更します。 WMI は、ドライバーの DpWmiSetDataItem ルーチンを呼び出して、IRP_MN_CHANGE_SINGLE_ITEM 要求を処理します。
DpWmiFunctionControl—(省略可能) 収集コストが高いと登録されたブロックのイベント通知とデータ収集を有効および無効にします。 WMI は、ドライバーの DpWmiFunctionControl ルーチンを呼び出して、IRP_MN_ENABLE_COLLECTION、IRP_MN_DISABLE_COLLECTION、IRP_MN_ENABLE_EVENTS、または IRP_MN_DISABLE_EVENTS 要求を処理します。
DpWmiExecuteMethod—(省略可能) データ ブロックに関連付けられたメソッドを実行します。 WMI は、ドライバーの DpWmiExecuteMethod ルーチンを呼び出して、IRP_MN_EXECUTE_METHOD 要求を処理します。
ドライバーの DpWmiXxx ルーチンは、ドライバー ライターによって選択された任意の名前を持つことができます。
WmiSystemControl を呼び出す前に、ドライバーは DpWmiXxx ルーチンへのエントリ ポイントとそのデータ ブロックとイベント ブロックに関する情報を使用して、WMILIB_CONTEXT構造体を初期化する必要があります。
ドライバーが WMI 要求を受け取ったとき:
ドライバーは、初期化された WMILIB_CONTEXT 構造体へのポインター、そのデバイス オブジェクトへのポインター、および IRP へのポインターを使用して WmiSystemControl を呼び出します。
WMI は IRP パラメーターを検証し、要求を処理するドライバーの DpWmiXxx ルーチンを呼び出します。 ドライバーが省略可能な DpWmiXxx ルーチンの WMILIB_CONTEXT にエントリ ポイントを設定しない場合、WMI は、既定値と状態で IRP を完了します。
DpWmiXxx ルーチンでは、ドライバーは要求を処理し、呼び出し元が指定したバッファーに出力を書き込みます。 たとえば、ドライバーの DpWmiQueryDataBlock ルーチンは、バッファーに指定されたブロックの要求されたインスタンスを書き込みます。
DpWmiQueryReginfo を除くすべての DpWmiXxx ルーチンでは、ドライバーは WmiCompleteRequest を呼び出して要求を完了するか、IRP と同様に完了を延期するためにSTATUS_PENDINGを返します。
WMI は必要な後処理を実行し、出力を適切な WNODE_XXX 構造体にパッケージ化し、出力と状態をデータ コンシューマーに渡します。