次の方法で共有


WMI_EXECUTE_METHOD_CALLBACK コールバック関数 (wmilib.h)

DpWmiExecuteMethod ルーチンは、データ ブロックに関連付けられたメソッドを実行します。 このルーチンは省略可能です。

構文

WMI_EXECUTE_METHOD_CALLBACK WmiExecuteMethodCallback;

NTSTATUS WmiExecuteMethodCallback(
  [in]      PDEVICE_OBJECT DeviceObject,
  [in]      PIRP Irp,
  [in]      ULONG GuidIndex,
  [in]      ULONG InstanceIndex,
  [in]      ULONG MethodId,
  [in]      ULONG InBufferSize,
  [in]      ULONG OutBufferSize,
  [in, out] PUCHAR Buffer
)
{...}

パラメーター

[in] DeviceObject

ドライバーの WDM DEVICE_OBJECT 構造体へのポインター。

[in] Irp

IRP へのポインター。

[in] GuidIndex

WmiSystemControl に渡された WMILIB_CONTEXT 構造体でドライバーが指定した GUID の一覧に 0 から始まるインデックスを指定して、データ ブロック指定します。

[in] InstanceIndex

GuidIndex で指定されたブロックに複数のインスタンスがある場合、インスタンスを識別する 0 から始まるインデックス値 InstanceIndex で指定されます。

[in] MethodId

実行するメソッドの ID を指定します。 ドライバーは、データ ブロック内の項目としてメソッド ID を定義します。

[in] InBufferSize

入力データのサイズをバイト単位で示します。 入力データがない場合、inBufferSize は 0 です。

[in] OutBufferSize

出力データのバッファーで使用可能なバイト数を示します。

[in, out] Buffer

入力データ (ある場合) を保持し、メソッドの出力データ (ある場合) を受け取るバッファーへのポインター。 バッファーが小さすぎてすべての出力データを受信できない場合、ドライバーはSTATUS_BUFFER_TOO_SMALLを返し、必要なサイズ WmiCompleteRequest を呼び出します。

戻り値

DpWmiExecuteMethod は、STATUS_SUCCESSまたは次のような適切なエラー コードを返します。

備考

WMI は、ドライバーが IRP_MN_EXECUTE_METHOD 要求に応答して WmiSystemControl 呼び出した後、ドライバーの DpWmiExecuteMethod ルーチンを呼び出します。

ドライバーが DpWmiExecuteMethod ルーチンを実装する場合、ドライバーは、WmiSystemControlに渡す WMILIB_CONTEXT 構造体の ExecuteWmiMethod メンバーにルーチンのアドレスを配置する必要があります。 ドライバーが DpWmiExecuteMethod ルーチンを実装していない場合は、ExecuteWmiMethod NULL 設定する必要があります。 後者の場合、WMI は、IRP_MN_EXECUTE_METHOD 要求に応答して呼び出し元にSTATUS_INVALID_DEVICE_REQUESTを返します。

ドライバーは、すべての入力引数の検証を担当します。 具体的には、ドライバーは次の操作を行う必要があります。

  • WMILIB_CONTEXT 構造体の GuidCount メンバーに基づいて、GuidIndex 値が 0 から GuidCount-1 の間にあることを確認します。
  • ドライバーが、指定されたデータ ブロックに削除のフラグが設定されていないことを確認します。 ドライバーが最近、WMILIB_CONTEXT 構造体に含まれている WMIGUIDREGINFO 構造体でWMIREG_FLAG_REMOVE_GUID フラグを指定した場合、削除が発生する前に追加の要求が到着する可能性があります。
  • InstanceIndex 値が、データ ブロックのドライバーでサポートされているインスタンス インデックスの範囲内にあることを確認します。
  • MethodId によって指定されたメソッド識別子が、指定されたデータ ブロックの有効な識別子であり、呼び出し元がメソッドを実行することを許可されていることを確認します。
  • Buffer と inBufferSize 、必要に応じてパディングを含め、指定したメソッドの入力パラメーターを格納するのに十分な大きさのバッファーを記述し、入力パラメーターが有効であることを確認します。
  • Buffer と outBufferSize 、必要に応じてパディングを含め、指定したメソッドの出力データを受信するのに十分な大きさのバッファーが記述されていることを確認します。
スレッド コンテキストが開始ユーザー モード アプリケーションのコンテキストであると想定しないでください。上位レベルのドライバーによって変更された可能性があります。

指定したメソッドが、一連のカウンターの内容のフェッチやリセットなどのデータ損失を引き起こす操作を実行する場合、ドライバーは、操作を実行する前に出力バッファー サイズを検証する必要があります。 これにより、ドライバーはSTATUS_BUFFER_TOO_SMALLを返し、カウンターを途中でリセットすることなく、呼び出し元がより大きなバッファーで要求を再送信できるようにします。

メソッドを実行し、バッファーに出力データを書き込んだ後、ドライバーは WmiCompleteRequest 呼び出して要求を完了します。

このルーチンはページング可能です。

このルーチンの実装の詳細については、「 WmiSystemControl を呼び出して WMI IRPを処理する」を参照してください。

必要条件

要件 価値
ターゲット プラットフォーム デスクトップ
ヘッダー wmilib.h (Wmilib.h を含む)
IRQL PASSIVE_LEVELで呼び出されます。

関連項目

IRP_MN_EXECUTE_METHOD

WMILIB_CONTEXT

WmiCompleteRequest

WmiSystemControl