次の方法で共有


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 コールバック ルーチンを実装する場合があります。

ドライバーの DpWmiXxx ルーチンは、ドライバー ライターによって選択された任意の名前を持つことができます。

WmiSystemControl を呼び出す前に、ドライバーは DpWmiXxx ルーチンへのエントリ ポイントとそのデータ ブロックとイベント ブロックに関する情報を使用して、WMILIB_CONTEXT構造体を初期化する必要があります。

ドライバーが WMI 要求を受け取ったとき:

  1. ドライバーは、初期化された WMILIB_CONTEXT 構造体へのポインター、そのデバイス オブジェクトへのポインター、および IRP へのポインターを使用して WmiSystemControl を呼び出します。

  2. WMI は IRP パラメーターを検証し、要求を処理するドライバーの DpWmiXxx ルーチンを呼び出します。 ドライバーが省略可能な DpWmiXxx ルーチンの WMILIB_CONTEXT にエントリ ポイントを設定しない場合、WMI は、既定値と状態で IRP を完了します。

  3. DpWmiXxx ルーチンでは、ドライバーは要求を処理し、呼び出し元が指定したバッファーに出力を書き込みます。 たとえば、ドライバーの DpWmiQueryDataBlock ルーチンは、バッファーに指定されたブロックの要求されたインスタンスを書き込みます。

  4. DpWmiQueryReginfo を除くすべての DpWmiXxx ルーチンでは、ドライバーは WmiCompleteRequest を呼び出して要求を完了するか、IRP と同様に完了を延期するためにSTATUS_PENDINGを返します。

  5. WMI は必要な後処理を実行し、出力を適切な WNODE_XXX 構造体にパッケージ化し、出力と状態をデータ コンシューマーに渡します。