IRP_MN_REGINFO_EX
WMI は、ドライバーが IoWMIRegistrationControl を呼び出した後に、ドライバーの登録情報のクエリを実行したり更新を行ったりするためにこの IRP を送信します。 ドライバーは、「WMI 要求の処理」で説明されているように、WmiSystemControl を呼び出すか、ドライバー自身で IRP を処理することによって、WMI IRP を処理できます。
ドライバーが IRP_MN_REGINFO_EX 要求を処理するために WmiSystemControl を呼び出すと、WMI はそのドライバーの DpWmiQueryReginfo ルーチンを呼び出します。
Microsoft Windows XP 以降のオペレーティング システムでは、WMI をサポートするドライバーはこの IRP を処理する必要があります。 Microsoft Windows 98 および Windows 2000 をサポートするドライバーも、IRP_MN_REGINFO を処理する必要があります。
主要なコード
送信時
Windows XP 以降では、WMI は、ドライバーは、IoWMIRegistrationControl を呼び出した後に、ドライバーの登録情報のクエリを実行したり更新を行ったりするためにこの IRP を送信します。 Windows 98 と Windows 2000 では、WMI は代わりに IRP_MN_REGINFO 要求を送信します。
WMI は、システム スレッドのコンテキストで IRQL = PASSIVE_LEVEL でこの IRP を送信します。
入力パラメーター
Parameters.WMI.ProviderId は、要求に応答する必要があるドライバーのデバイス オブジェクトを指します。 このポインターは、IRP のドライバーの I/O スタックの場所にあります。
Parameters.WMI.DataPath を WMIREGISTER に設定すると登録情報のクエリを実行し、WMIUPDATE に設定すると登録情報を更新します。
Parameters.WMI.BufferSize は、Parameters.WMI.Buffer の非ページ バッファーの最大サイズを示します。 このサイズは、(sizeof(WMIREGINFO) + (GuidCount * sizeof(WMIREGGUID)) の合計以上である必要があります。GuidCount は、ドライバーによって登録されているデータ ブロックとイベント ブロックの数、および静的インスタンス名用のスペース (存在する場合) です。
出力パラメーター
ドライバーが WmiSystemControl を呼び出して WMI IRP を処理する場合、WMI は DpWmiQueryReginfo ルーチンを呼び出すことによって、ドライバーのデータ ブロックの登録情報を取得します。
それ以外の場合は、ドライバーは Parameters.WMI.Buffer の WMIREGINFO 構造体を次のように入力します。
BufferSize を、WMIREGINFO 構造体および関連付けられた登録データのサイズ (バイト単位) に設定します。
ドライバーが別のドライバーの代わりに WMI 要求を処理する場合は、NextWmiRegInfo を、この WMIREGINFO の先頭から他のドライバーからの登録情報を含む別の WMIREGINFO 構造体の先頭までのオフセット (バイト単位) に設定します。
ドライバーの DriverEntry ルーチンに渡されたレジストリ パスに RegistryPath を設定します。
Parameters.WMI.Datapath が WMIREGISTER に設定されている場合は、MofResourceName を、この WMIREGINFO の先頭からイメージ ファイル内のドライバーの MOF リソースの名前を含むカウントされた Unicode 文字列までの、オフセットに設定します。
GuidCount を、登録または更新するデータ ブロックとイベント ブロックの数に設定します。
WMIRegGuid で、ドライバーによって公開されるデータ ブロックまたはイベント ブロックごとに 1 つずつ、WMIREGGUID 構造体の配列を書き込みます。
ドライバーは、各 WMIREGGUID 構造体を次のように入力します。
Guid をブロックを識別する GUID に設定します。
ブロックのインスタンス名とその他の特性に関する情報を提供するフラグを設定します。 たとえば、ブロックが静的インスタンス名で登録されている場合、ドライバーは適切な WMIREG_FLAG_INSTANCE_XXX フラグを使用してフラグを設定します。
ブロックが静的インスタンス名で登録されている場合、ドライバーは次を行います。
InstanceCount をインスタンスの数に設定します。
次のいずれかのメンバーを、ブロックの静的インスタンス名データへのオフセット (バイト単位) に設定します。
ドライバーが、WMIREG_FLAG_INSTANCE_LIST でフラグを設定する場合は、静的インスタンス名の文字列のリストへのオフセットに InstanceNameList を設定します。 WMI は、後続の要求のインスタンスをこの一覧へのインデックスによって指定します。
ドライバーが、WMIREG_FLAG_INSTANCE_BASENAME でフラグを設定している場合は、ベース名の文字列へのオフセットに BaseNameOffset を設定します。 WMI はこの文字列を使用して、ブロックの静的インスタンス名を生成します。
ドライバーが、WMIREG_FLAG_INSTANCE_PDO でフラグを設定している場合は、ドライバーの AddDevice ルーチンに渡される PDO を指すポインターへのオフセットに、Pdo を設定します。 WMI は PDO のデバイス インスタンス パスを使用して、ブロックの静的インスタンス名を生成します。 ドライバーは、Pdo で渡された物理デバイス オブジェクトで ObReferenceObject を呼び出す必要があります。 システムは、自動的に ObDereferenceObject を呼び出してオブジェクトを逆参照します。ドライバーがこれを行ってはいけません。 (IRP を処理するために WmiSystemControl を使用するドライバーは、ObReferenceObject を呼び出す必要はありません。WMI が、ドライバーの DpWmiQueryReginfo ルーチンを呼び出す前に自動的にこれを行います)。
インスタンス名文字列、ベース名文字列、または PDO へのポインターを、それぞれ InstanceNameList、BaseName、または Pdo で示されるオフセットに書き込みます。
ドライバーが別のドライバー (ミニクラスやミニポート ドライバーなど) の代わりに WMI 登録を処理する場合は、別の WMIREGINFO 構造体に他のドライバーの登録情報を入力し、前の構造体の NextWmiRegInfo にこれを書き込みます。
Parameters.WMI.Buffer のバッファーが小さすぎてすべてのデータを受信できない場合、ドライバーは必要なサイズ (バイト単位) を ULONG として Parameters.WMI.Buffer に書き込み、IRP に失敗して STATUS_BUFFER_TOO_SMALL を返します。
I/O 状態ブロック
ドライバーが WmiSystemControl を呼び出して IRP を処理する場合、WMI は I/O 状態ブロックで Irp->IoStatus.Status と Irp->IoStatus.Information を設定します。
それ以外の場合、ドライバーは Irp->IoStatus.Status を STATUS_SUCCESS または次のような適切なエラー状態に設定します。
STATUS_BUFFER_TOO_SMALL
成功した場合、ドライバーは Irp->IoStatus.Information を Parameters.WMI.Buffer でバッファーに書き込まれたバイト数に設定します。
操作
ドライバー自身が IRP_MN_REGINFO_EX 要求を処理する場合は、Parameters.WMI.ProviderId が、ドライバーが IoWMIRegistrationControl に渡したポインターと同じデバイス オブジェクトを指している場合にのみ、ドライバー自身がこの処理を行う必要があります。 それ以外の場合、ドライバーは、次の下位ドライバーに要求を転送する必要があります。
要求を処理する前に、ドライバーは Parameters.WMI.DataPath をチェックして、WMI が登録情報 (WMIREGISTER) に対するクエリを実行しているのか、更新 (WMIUPDATE) の要求を行っているのかを判断する必要があります。
ドライバーが IoWMIRegistrationControl を WMIREG_ACTION_REGISTER または WMIREG_ACTION_REREGISTER で呼び出した後、WMI はこの IRP を WMIREGISTER で送信します。 これに応答して、ドライバーは Parameters.WMI.Buffer のバッファーに以下を入力する必要があります。
ドライバーの レジストリ パス、MOF リソースの名前、登録するブロックの数を示す WMIREGINFO 構造体。
登録するブロックごとに 1 つのWMIREGGUID 構造体。 ブロックを静的インスタンス名で登録する場合は、ドライバーは、そのブロックの WMIREGGUID 構造体に適切な WMIREG_FLAG_INSTANCE_XXX フラグを設定します。
すべての文字列 WMI は、静的インスタンス名を生成する必要があります。
WMI は、ドライバーが IoWmiRegistrationControl を WMIREG_ACTION_UPDATE_GUIDS で呼び出した後、WMIUPDATE でこの IRP を送信します。 これに応答して、ドライバーは Parameters.WMI.Buffer のバッファーに、WMIREGINFO 構造体で次のように入力する必要があります。
ブロックを削除するために、ドライバーは WMIREGGUID 構造体に WMIREG_FLAG_REMOVE_GUID を設定します。
ブロックを追加または更新するために (たとえば、静的インスタンス名を変更するために)、ドライバーは、WMIREG_FLAG_REMOVE_GUID をクリアして、ブロックの新規の、または更新された登録値を入力します。
新規または既存のブロックを静的インスタンス名に登録するために、ドライバーは、適切な WMIREG_FLAG_INSTANCE_XXX を設定し、WMI が静的インスタンス名を生成するために必要な文字列を入力します。
ドライバーは、最初にすべてのブロックを登録するために使用したのと同じ WMIREGINFO 構造体を使用してブロックを削除、追加、または更新し、更新するブロックのフラグとデータのみを変更できます。 このような WMIREGINFO 構造体の WMIREGGUID が、そのブロックを最初に登録したときにドライバーによって渡された WMIREGGUID と正確に一致する場合、WMI はブロックの更新に関連する処理をスキップします。
ドライバーが WMIREG_ACTION_DEREGISTER で IoWMIRegistrationControl を呼び出した後、WMI は、ドライバーからそれ以上の情報を必要としないため、IRP_MN_REGINFO_EX 要求を送信しません。 ドライバーは通常、IRP_MN_REMOVE_DEVICE 要求に応答してブロックの登録を解除します。
要件
ヘッダー |
Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |