WMI WNODE_XXX 構造体
WMI は、 WNODE_XXX と呼ばれる一連の標準データ構造を使用して、ユーザー モードのデータ コンシューマーとドライバーなどのカーネル モード データ プロバイダーの間でデータを渡します。 ドライバーが WmiSystemControl を呼び出して WMI 要求を処理する場合、ドライバーは、 WNODE_XXX 構造体の読み取りまたは書き込みを行う必要はありません。 それ以外の場合、ドライバーは、入力 WNODE_XXX を Parameters.WMI.Buffer で解釈するか、または WNODE_XXX をその場所に書き込む必要があります。
次の表に、WMI IRP とそれに対応する WNODE_XXX 構造体を示します。
WMI IRP | 関連 WNODE_XXX 構造 |
---|---|
有効なイベントの通知を送信するために、2 つの追加の WNODE_XXX 構造体 ( WNODE_EVENT_ITEM と WNODE_EVENT_REFERENCE) が使用されます。 イベント ブロックを登録するドライバーは、イベントが有効になっていて、イベントが発生した場合は、 IoWMIWriteEvent を呼び出し、 WNODE_EVENT_XXX 構造体を渡すことによって、WMI にイベントの通知を送信します。 WMI イベントの送信の詳細については、 「WMI イベントの送信」を参照してください。
各 WNODE_XXX 構造体は、次で構成されます。
埋め込み WNODE_HEADER 構造体。バッファーのサイズ、データ ブロックを表す GUID、 WNODE_XXX 構造体の種類 (静的インスタンス名と動的インスタンス名のどちらを使用する場合も含みます)、およびブロックのその他の特性を示すフラグなど、すべての WNODE_XXX に共通する情報が含まれています。
インスタンス名とデータへのオフセットなど、特定の WNODE_XXX 構造体の固定メンバー。
IRP バッファーの WNODE_XXX 構造体 (Parameters.WMI.Buffer) の後には、通常、動的インスタンス名、静的インスタンス名文字列、メソッドの入力または出力、データ ブロックの 1 つ以上のインスタンスのデータなど、要求に関連する変数データが続きます。 したがって、バッファーのサイズは、関係する可変データの量によって sizeof(WNODE_XXX) を超える必要があります。
WMI は、ドライバーによって提供される変数データに対して種類チェックを実行しないことに注意してください。 ドライバーは、データ コンシューマーがデータを正しく解析できるように、出力バッファー内の適切な境界に出力データを配置する必要があります。 特に、各インスタンスは 8 バイト境界で開始する必要があり、その各項目は、ドライバーによって以前に登録されたデータ ブロック スキーマに従って自然な境界に配置する必要があります。 動的インスタンス名は、2 バイト境界に配置できます。
次の図は、 IRP_MN_QUERY_SINGLE_INSTANCE 要求に応答してドライバーが返す可能性がある WNODE_SINGLE_INSTANCE 構造体を含む IRP バッファーのブロック図を示しています。
前の図の先頭から:
WNODE_HEADER 構造体 ( WNODE_SINGLE_INSTANCE の先頭にある) は、 WnodeHeader メンバーに含まれています。 WMI は、要求を送信する前に、 WNODE_HEADER のすべてのメンバーを入力します。 WNODE_HEADERで次の手順を実行します。
- WnodeHeader.Buffersize は、構造体の固定メンバーに続くデータを含む、 WNODE_SINGLE_INSTANCEのサイズを示します。 ( WnodeHeader.Buffersize は通常、 Parameters.WMI.Buffersize 未満です。これは、ドライバーからの出力を受信するために WMI によって割り当てられたバッファーのサイズを示します)。
- WnodeHeader.Guid には、データ ブロックを識別する GUID が含まれています。
- この例では、 WnodeHeader.Flags は、この構造体が WNODE_SINGLE_INSTANCE であり、データ ブロックが静的インスタンス名を使用していることを示します。
データ ブロックは静的インスタンス名を使用するため、WMI は InstanceIndex を、ブロックの登録時にドライバーによって渡される静的インスタンス名のリスト内のインスタンスのインデックスに設定します。 OffsetInstanceNames は使用されません。
WMI は、バッファーの先頭からインスタンス データの最初のバイトまでのオフセットを示すように DataBlockOffset を設定します。 (ドライバーはこの値を変更しないでください) ここでも、データ ブロックは静的インスタンス名を使用するため、このオフセットは VariableData と同じ場所を示します。 データ ブロックで動的インスタンス名が使用されている場合、インスタンス名は VariableData で始まり、 DataBlockOffset はバッファーへのより大きなオフセットを指定します。
ドライバーは、返されるインスタンス データのバイト数に SizeDataBlock を設定します。
VariableData で(インスタンス名データが存在する場合)、ドライバーは、要求されたインスタンスのインスタンス データを出力バッファーに書き込みます。
ドライバーは、 WNODE_METHOD_ITEM と WNODE_SINGLE_ITEM 構造体の読み取りと書き込みを WNODE_SINGLE_INSTANCE とほぼ同じ方法で行います。 これらの構造体は、固定メンバー OffsetInstanceName、 InstanceIndex、 DataBlockOffset、 SizeDataBlock (または、 WNODE_SINGLE_ITEMの場合は SizeDataItem) と VariableDataを持つという点で、互いに似ています。 WNODE_METHOD_ITEM には MethodId が含まれ、 WNODE_SINGLE_ITEM には WNODE_SINGLE_INSTANCE に不足している ItemId が含まれています。
WNODE_ALL_DATA は、データ ブロックの複数のインスタンスを渡すために使用されるという点で、上記の構造体とは異なります。動的なインスタンス名を含んでいる場合やサイズが異なる場合があります。
次の図は、ドライバーがIRP_MN_QUERY_ALL_DATA要求に応答して返す可能性がある WNODE_ALL_DATA を含む IRP バッファーのブロック図を示しています。
前の図の先頭から:
前の図で説明したように、WNODE_ALL_DATAの先頭にある WNODE_HEADER 構造は WnodeHeader メンバーに含まれています。 WnodeHeader.Buffersize と WnodeHeader.Guid は、それぞれ WNODE_ALL_DATA のサイズとデータ ブロックの GUID を示します。
この例では、WMI は WnodeHeader.Flags を設定して、この構造体が WNODE_ALL_DATA であり、データ ブロックが動的インスタンス名に登録されたことを示します (つまり、WMI はWNODE_FLAG_STATIC_INSTANCE_NAMESとWNODE_FLAG_PDO_INSTANCE_NAMESをクリアします)。 出力時に、ドライバーは、すべてのインスタンスが同じサイズであることを示すWNODE_FLAG_FIXED_INSTANCE_SIZEを設定します。
WMI は、バッファーの先頭からインスタンス データの最初のバイトまでのオフセットを示すように DataBlockOffset を設定します。 (ドライバーはこの値を変更しないでください)。 この例では、インスタンス データは OffsetInstanceNameOffsets のインスタンス名に従います。
ドライバーは、返されるインスタンスの数を示すように InstanceCount を設定します。
動的インスタンス名を使用するデータ ブロックの WNODE_XXX には、常にインスタンス名文字列が含まれます。 この例では動的インスタンス名を使用するため、 OffsetInstanceNameOffsets はバッファーの先頭からバッファー内の動的インスタンス名へのオフセットの配列へのオフセットを示します。
FixedInstanceSize は、ドライバーによって返される各インスタンスのデータのバイト数を示します。 このデータ ブロックのインスタンスのサイズが異なる場合、ドライバーは WnodeHeader.Flags のWNODE_FLAG_FIXED_INSTANCE_SIZEをクリアし、 OffsetInstanceDataAndLength を OFFSETINSTANCEDATAANDLENGTH 構造体の配列に設定します。それぞれ、 FixedInstanceSize を設定する代わりに、1 つのインスタンスのデータへのオフセットと、そのインスタンスのバイト数を指定します。.
WNODE_XXX 構造体の詳細については、 「システム構造」を参照してください。