次の方法で共有


ドライバーでの WMI のデータ ブロックとイベントのサポート

[KMDF にのみ適用]

フレームワーク ベースのドライバーは、イベント コールバック関数を提供することで WMI データ ブロックをサポートします。 ドライバーは、WMI クライアントにイベントを送信するオブジェクト メソッドを呼び出すことによって WMI イベントをサポートします。

WMI データ ブロックの読み取り/書き込みのサポート

WMI データ ブロック内の情報が WMI クライアントで読み取りおよび書き込み可能な場合、ドライバーは、クライアントの読み取り要求を処理する EvtWmiInstanceQueryInstance コールバック関数に加えて、クライアントの書き込み要求を処理する EvtWmiInstanceSetInstance または EvtWmiInstanceSetItem コールバック関数 (またはその両方) を提供する必要があります。

データ ブロックに、ドライバーがクライアントの要求で実行するメソッドが含まれている場合、ドライバーは EvtWmiInstanceExecuteMethod コールバック関数も提供する必要があります。

WMI データ ブロックが書き込み専用の場合 (つまり、WMI クライアントはデータ ブロックに情報を書き込むことができますが、データ ブロックを読み取ることができません)、ドライバーは EvtWmiInstanceQueryInstance コールバック関数を提供しません。

読み取り専用 WMI データ ブロックのサポート

WMI データ ブロック内の情報を WMI クライアントで変更できない場合、ドライバーは EvtWmiInstanceSetInstance または EvtWmiInstanceSetItem コールバック関数を提供しません。 WMI クライアントからのデータ ブロックの情報の要求をサポートするために、ドライバーは次のいずれかを実行できます。

ドライバーが UseContextForQueryTRUE に設定した場合、WMI クライアントがインスタンスの情報を要求すると、フレームワークは、WMI が提供するバッファーにインスタンス オブジェクトのコンテキスト領域をコピーします。 ドライバーがオブジェクト コンテキスト領域から読み取り専用の固定長データを提供する単一の WMI インスタンスしかない場合は、EvtWmiInstanceXxx コールバックは必要ありません。

読み取り専用のデータ ブロックに、ドライバーがクライアントの要求で実行するメソッドが含まれている場合、ドライバーは EvtWmiInstanceExecuteMethod コールバック関数も提供できます。

高コストの WMI データ ブロックのサポート

ドライバーが WMI データ ブロックのいずれかをサポートするために比較的大量の動的データを収集する場合、ドライバーは次の操作を行う必要があります。

  • WMI プロバイダー オブジェクトの WDF_WMI_PROVIDER_CONFIG 構造体のフラグ メンバーに WdfWmiProviderExpensive フラグを設定して、データ ブロックが "高コスト" であることを宣言します。

  • データ ブロックのデータ コレクションを有効または無効にする EvtWmiProviderFunctionControl コールバック関数を提供するか、ドライバーでデータ コレクションを有効または無効にするかどうかを判断するために WdfWmiProviderIsEnabled を呼び出します。

ドライバーが WdfWmiProviderExpensive フラグを設定する場合、WMI クライアントがデータ ブロックにアクセスするために登録するときに、フレームワークは EvtWmiProviderFunctionControl コールバック関数を呼び出します。 コールバック関数は、ドライバーのデータ コレクション機能を有効にする必要があります。 すべての WMI クライアントがデータ ブロックの登録を削除した場合、ドライバーがデータの収集を停止できるように、フレームワークは EvtWmiProviderFunctionControl コールバック関数をもう一度呼び出します。

WMI イベントのサポート

ドライバーは、WMI イベントを使用して、例外的な条件を WMI クライアントに通知できます。 (エラーのログ記録の代わりに WMI イベントを使用しないでください。) データ項目と同様に、WMI イベントは、マネージド オブジェクト形式 (.mof) ファイル内の WMI データ ブロックで定義されます。

WMI クライアントは、WMI イベントの通知に登録します。 登録されている WMI クライアントにイベントを送信するには、ドライバーは WdfWmiInstanceFireEvent メソッドを呼び出します。 このメソッドを使用すると、ドライバーは必要に応じてイベント固有のデータをクライアントに送信できます。

イベントを定義する WMI データ ブロックにも WMI データ項目またはメソッド項目が含まれている場合、ドライバーは適切な WMI コールバック関数を提供します。 データ ブロックでイベントが定義されているが、データ項目またはメソッド項目が含まれている場合、ドライバーは WMI プロバイダー オブジェクトの WDF_WMI_PROVIDER_CONFIG 構造体のフラグ メンバーで WdfWmiProviderEventOnly フラグを設定する必要があります。

ドライバーは、WMI クライアントがイベント通知に登録されている場合にのみ、WdfWmiInstanceFireEvent を呼び出す必要があります。 ドライバーは、EvtWmiProviderFunctionControl コールバック関数を提供するか、WdfWmiProviderIsEnabled を呼び出すことによって、WdfWmiInstanceFireEvent を呼び出す必要があるかどうかを判断できます。

WMI イベント トレースのサポート

トレース イベントは、他の WMI イベントと同じ方法で .mof ファイルで定義されます。 ドライバーは、トレース イベントの WMI プロバイダー オブジェクトを作成するときに、プロバイダー オブジェクトのWDF_WMI_PROVIDER_CONFIG 構造体のフラグ メンバーで WdfWmiProviderTracing フラグを設定する必要があります。

プロバイダー インスタンスが登録されると、ドライバーは WdfWmiProviderGetTracingHandle を呼び出してトレース ハンドルを取得できます。 ドライバーは、WmiTraceMessage ルーチンへの入力としてトレース ハンドルを使用できます。

詳細については、「イベント トレーシング」を参照してください。