次の方法で共有


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

DpWmiSetDataItem ルーチンは、データ ブロックのインスタンス内の 1 つのデータ項目を変更します。 このルーチンは省略可能です。

構文

WMI_SET_DATAITEM_CALLBACK WmiSetDataitemCallback;

NTSTATUS WmiSetDataitemCallback(
  [in] PDEVICE_OBJECT DeviceObject,
  [in] PIRP Irp,
  [in] ULONG GuidIndex,
  [in] ULONG InstanceIndex,
  [in] ULONG DataItemId,
  [in] ULONG BufferSize,
  [in] PUCHAR Buffer
)
{...}

パラメーター

[in] DeviceObject

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

[in] Irp

IRP へのポインター。

[in] GuidIndex

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

[in] InstanceIndex

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

[in] DataItemId

設定するデータ項目の ID を指定します。

[in] BufferSize

Buffer のバッファーのサイズをバイト単位で指定 します

[in] Buffer

データ項目の新しい値を含むバッファーへのポインター。

戻り値

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

注釈

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

システム提供のユーザー モード コンポーネントでこの機能が確実に必要である場合を除き、 DpWmiSetDataItem を実装しないでください。 DpWmiSetDataItem ルーチンを実装する場合、ドライバーは、WmiSystemControl に渡すWMILIB_CONTEXT構造体の SetWmiDataItem メンバーにルーチンのアドレスを配置する必要があります。 DpWmiSetDataItem ルーチンを実装しない場合、ドライバーは SetWmiDataItemNULL に設定する必要があります。 後者の場合、WMI は呼び出し元にSTATUS_READ_ONLYを返します。

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

  • GuidIndex の値が、WMILIB_CONTEXT構造体の GuidCount メンバーに基づいて、0 から GuidCount-1 の間にあることを確認します。
  • ドライバーで、指定されたデータ ブロックに削除のフラグが設定されていないことを確認します。 ドライバーが、WMILIB_CONTEXT構造体に含まれている WMIGUIDREGINFO 構造体でWMIREG_FLAG_REMOVE_GUID フラグを最近指定した場合、削除が発生する前にセット要求が到着する可能性があります。
  • InstanceIndex 値が、データ ブロックのドライバーでサポートされているインスタンス インデックスの範囲内にあることを確認します。
  • DataItemId 値が、データ ブロックのドライバーによってサポートされているデータ項目識別子の範囲内にあることを確認します。
  • BufferBufferSize で有効なサイズのデータ項目が記述されていること、およびバッファーの内容がデータ項目に対して有効であることを確認します。
  • 指定したデータ項目が、ドライバーが呼び出し元によって開始された変更を許可するデータ項目であることを確認します。 つまり、ドライバーは、読み取り専用にすることを意図したデータ項目に対する変更を許可しないようにする必要があります。
スレッド コンテキストが開始ユーザー モード アプリケーションのコンテキストであると想定しないでください。上位レベルのドライバーによって変更された可能性があります。

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

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

要件

要件
対象プラットフォーム デスクトップ
Header wmilib.h (Wmilib.h を含む)
IRQL PASSIVE_LEVELで呼び出されます。

こちらもご覧ください

IRP_MN_CHANGE_SINGLE_ITEM

WMILIB_CONTEXT

WmiSystemControl