次の方法で共有


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

DpWmiQueryDataBlock ルーチンは、1 つのインスタンスまたはデータ ブロックのすべてのインスタンスを返します。 このルーチンは必須です。

構文

WMI_QUERY_DATABLOCK_CALLBACK WmiQueryDatablockCallback;

NTSTATUS WmiQueryDatablockCallback(
  [in]      PDEVICE_OBJECT DeviceObject,
  [in]      PIRP Irp,
  [in]      ULONG GuidIndex,
  [in]      ULONG InstanceIndex,
  [in]      ULONG InstanceCount,
  [in, out] PULONG InstanceLengthArray,
  [in]      ULONG BufferAvail,
  [out]     PUCHAR Buffer
)
{...}

パラメーター

[in] DeviceObject

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

[in] Irp

IRP へのポインター。

[in] GuidIndex

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

[in] InstanceIndex

IRP_MN_QUERY_SINGLE_INSTANCE 要求 応答して DpWmiQueryDataBlock が呼び出された場合、InstanceIndex は、クエリ対象の指定されたデータ ブロックのインスタンスを示す 0 から始まるインデックスを指定します。 IRP_MN_QUERY_ALL_DATA 要求 応答して DpWmiQueryDataBlock が呼び出された場合、InstanceIndex は 0 になります。

[in] InstanceCount

IRP_MN_QUERY_SINGLE_INSTANCE 要求 応答して DpWmiQueryDataBlock が呼び出された場合、InstanceCount は 1 になります。 IRP_MN_QUERY_ALL_DATA 要求 応答して DpWmiQueryDataBlock が呼び出された場合、InstanceCount は返されるインスタンスの数です。

[in, out] InstanceLengthArray

呼び出し元が指定した、InstanceCountULONG 要素のサイズの配列へのポインター。 ドライバーは、返された各インスタンスの長さを示すために、各配列要素を入力します。 BufferAvail 0 の場合、InstanceLengthArray は NULL

[in] BufferAvail

バッファー でバッファー内のデータを受信できる最大バイト数指定します。 この値が 0 の場合、呼び出し元は、WmiCompleteRequest への呼び出しで必要なバッファー サイズドライバーが指定するように要求します。 詳細については、「解説」セクションを参照してください。

[out] Buffer

インスタンス データを受信するバッファーへのポインター。 バッファーがすべてのデータを受信するのに十分な大きさの場合、ドライバーは、各インスタンスが 8 バイトの境界に配置された状態で、インスタンス データをバッファーに書き込みます。 バッファーが小さすぎてすべてのデータを受信できない場合、ドライバーは BufferUsed 必要なサイズに設定された WmiCompleteRequest 呼び出します。

戻り値

DpWmiQueryDataBlock は、STATUS_SUCCESSまたは次のようなエラー状態を返します。

ドライバーが要求をすぐに完了できない場合は、STATUS_PENDINGを返すことができます。

備考

WMI は、ドライバーが IRP_MN_QUERY_SINGLE_INSTANCE または IRP_MN_QUERY_ALL_DATA 要求に応答して WmiSystemControl 呼び出した後、ドライバーの DpWmiQueryDataBlock ルーチンを呼び出します。 ドライバーは、WmiSystemControlに渡す WMILIB_CONTEXT 構造体に、DpWmiQueryDataBlock ルーチンのアドレスを配置する必要があります。

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

  • WMILIB_CONTEXT 構造体の GuidCount メンバーに基づいて、GuidIndex 値が 0 から GuidCount-1 の間にあることを確認します。
  • ドライバーが、指定されたデータ ブロックに削除のフラグが設定されていないことを確認します。 WMILIB_CONTEXT 構造体に含まれる WMIGUIDREGINFO 構造体で、ドライバーが最近WMIREG_FLAG_REMOVE_GUID フラグを指定した場合、削除が発生する前にクエリが到着する可能性があります。
  • InstanceIndexInstanceCount の値を一緒に確認し、データ ブロックのドライバーでサポートされている範囲内にあるデータ ブロック インスタンスの数を指定します。 InstanceIndex が 0 以外の場合、InstanceCount は 1 である必要があります。 InstanceIndex が 0 の場合、InstanceCount は、サポートされているインスタンスの数を超えてはなりません。
  • BufferBufferAvail で記述されているバッファーが、データ ブロックのすべての要求されたインスタンスを保持するのに十分な大きさであることを確認します。 各インスタンスは 8 バイト境界で開始する必要があり、各インスタンス内のデータ項目間に追加のパディングが存在する可能性があります。
バッファーにインスタンス データを書き込んだ後、ドライバーは WmiCompleteRequest 呼び出して要求を完了します。 Buffer および BufferAvail で記述されたバッファーが 0 であるか、要求されたすべてのデータを受信するには小さすぎる場合、WmiCompleteRequest 呼び出しでは、Status パラメーターのSTATUS_BUFFER_TOO_SMALLと、BufferUsed パラメーターに必要なバッファー サイズを指定する必要があります。

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

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

必要条件

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

関連項目

IRP_MN_QUERY_ALL_DATA

IRP_MN_QUERY_SINGLE_INSTANCE

WMILIB_CONTEXT

WmiCompleteRequest

WmiSystemControl