WMI_SET_DATABLOCK_CALLBACK コールバック関数 (wmilib.h)
DpWmiSetDataBlock ルーチンは、データ ブロックの 1 つのインスタンス内のすべてのデータ項目を変更します。 このルーチンは省略可能です。
構文
WMI_SET_DATABLOCK_CALLBACK WmiSetDatablockCallback;
NTSTATUS WmiSetDatablockCallback(
[in] PDEVICE_OBJECT DeviceObject,
[in] PIRP Irp,
[in] ULONG GuidIndex,
[in] ULONG InstanceIndex,
[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 はインスタンスを指定します。
[in] BufferSize
バッファー のバッファーのサイズバイト単位で指定します。
[in] Buffer
インスタンスの新しい値を含むバッファーへのポインター。
戻り値
DpWmiSetDataBlock は、STATUS_SUCCESSまたは次のような適切なエラー状態を返します。
ドライバーが要求をすぐに完了できない場合は、STATUS_PENDINGを返すことができます。
備考
WMI は、ドライバーが IRP_MN_CHANGE_SINGLE_INSTANCE 要求に応答して WmiSystemControl 呼び出した後、ドライバーの DpWmiSetDataBlock ルーチンを呼び出します。
ドライバーは、すべての入力引数の検証を担当します。 具体的には、ドライバーは次の操作を行う必要があります。
- WMILIB_CONTEXT 構造体の GuidCount メンバーに基づいて、GuidIndex 値が 0 から GuidCount-1 の間にあることを確認します。
- ドライバーが、指定されたデータ ブロックに削除のフラグが設定されていないことを確認します。 WMILIB_CONTEXT 構造体に含まれる WMIGUIDREGINFO 構造体でドライバーが最近WMIREG_FLAG_REMOVE_GUID フラグを指定した場合、削除が発生する前にセット要求が到着する可能性があります。
- InstanceIndex 値が、データ ブロックのドライバーでサポートされているインスタンス インデックスの範囲内にあることを確認します。
- Buffer と BufferSize、データ項目間に存在するパディングを含む有効なサイズのデータ ブロックが記述されていること、およびバッファーの内容がデータ ブロックに対して有効であることを確認します。
- 指定したデータ ブロックが、ドライバーが呼び出し元によって開始された変更を許可するデータ ブロックであることを確認します。 つまり、ドライバーは、読み取り専用にすることを意図したデータ ブロックへの変更を許可しないようにする必要があります。
ドライバーが DpWmiSetDataBlock ルーチンを実装する場合、ドライバーは、WmiSystemControlに渡す WMILIB_CONTEXT 構造体の SetWmiDataBlock メンバーにルーチンのアドレスを配置する必要があります。 ドライバーが DpWmiSetDataBlock ルーチンを実装していない場合は、SetWmiDataBlock NULL 設定する必要があります。 後者の場合、WMI は呼び出し元にSTATUS_READ_ONLYを返します。
このルーチンはページング可能です。
このルーチンの実装の詳細については、「 WmiSystemControl を呼び出して WMI IRPを処理する」を参照してください。
必要条件
要件 | 価値 |
---|---|
ターゲット プラットフォーム の | デスクトップ |
ヘッダー | wmilib.h (Wmilib.h を含む) |
IRQL | PASSIVE_LEVELで呼び出されます。 |
関連項目
WmiSystemControl の