Share via


DispatchSystemControl ルーチンでの WMI IRP の処理

DispatchSystemControl ルーチンで WMI IRP を処理するドライバーは、Parameters.WMI.ProviderId のデバイス オブジェクト ポインターが、IoWMIRegistrationControl の呼び出しでドライバーによって渡されたポインターと一致する場合にのみ、このような IRP を処理する必要があります。 それ以外の場合、ドライバーは、次の下位ドライバーに IRP を転送する必要があります。

ドライバーが要求を処理する場合は、次の操作を実行する必要があります。

Parameters.WMI.DataPath の GUID を調べて、ドライバーでサポートされているデータ ブロックを表しているかどうかを判断し、それを表していない場合は、STATUS_WMI_GUID_NOT_FOUNDで IRP を失敗させます。

ドライバーは、次のいずれかの要求を処理するときに、インスタンス名の Parameters.WMI.Buffer の入力 WNODE_XXX 構造体をチェックする必要があります。

IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD ドライバーは、インスタンス名を次のようにチェックする必要があります。

  • WNODE_FLAG_STATIC_INSTANCE_NAMES が WnodeHeader.Flags で設定されている場合は、そのブロックの静的インスタンス名のドライバーのリストにインデックスとして InstanceIndex を使用します。

  • WNODE_FLAG_STATIC_INSTANCE_NAMES が WnodeHeader.Flags でクリアされている場合は、入力 WNODE_XXX 構造体のインスタンス名文字列へのオフセットとして OffsetInstanceName を使用します。 OffsetInstanceName は、この構造体の先頭から、(NUL ターミネータがある場合はそれを含めた) インスタンス名文字列の長さを (文字数ではなく) バイト単位で示す USHORT までのバイト単位のオフセットで、その後に Unicode の文字列自体が続きます。

ドライバーが InstanceIndex または OffsetInstanceName で指定されたインスタンスを見つけられない場合は、STATUS_WMI_INSTANCE_NOT_FOUND で IRP を失敗させる必要があります。

IRP_MN_EXECUTE_METHOD 要求の場合は、入力 WNODE_METHOD_ITEMMethodID を確認し、メソッドがそのデータ ブロックに対して有効でない場合は、STATUS_WMI_ITEMID_NOT_FOUND で IRP を失敗させます。

この要求が出力を生成する場合、ドライバーは、次のいずれかの要求を処理するときに Parameters.WMI.BufferSize でバッファーのサイズをチェックする必要があります。

IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD バッファーが小さすぎて出力を受信できない場合でも、sizeof(WNODE_TOO_SMALL) 以上であれば、ドライバーは IRP を成功させ、Parameters.WMI.Buffer のバッファーに WNODE_TOO_SMALL 構造体を書き込む必要があります。 このバッファーが sizeof(WNODE_TOO_SMALL) より小さい場合、ドライバーは STATUS_BUFFER_TOO_SMALL の NTSTATUS コードで IRP に失敗します。

この要求によって出力が生成され、バッファー サイズが十分である場合は、Parameters.WMI.Buffer のバッファーに次の出力を書き込みます。

  • IRP_MN_QUERY_ALL_DATA 要求の場合、ドライバーは、指定したデータ ブロックのすべてのインスタンスのデータを含む WNODE_ALL_DATA 構造体を書き込みます。
  • IRP_MN_QUERY_SINGLE_INSTANCE 要求の場合、ドライバーは、データ ブロックの指定されたインスタンスのデータを含む WNODE_SINGLE_INSTANCE 構造体を書き込みます。
  • IRP_MN_EXECUTE_METHOD の場合、このメソッドが出力を生成するのであれば、ドライバーはバッファー内の入力 WNODE_METHOD_ITEM の後にドライバーによって決定された形式でメソッドの出力を書き込みます (データが存在する場合は入力データを上書きします)。

Irp->IoStatus.InformationParameters.WMI.Buffer のバッファーに書き込まれたバイト数に設定し、Irp->IoStatus.Status を STATUS_SUCCESS に設定します。

IoCompleteRequest を呼び出して IRP を完了します。

詳細については、「WMI WNODE_XXX 構造体」を参照してください。