WmiSystemControl 関数 (wmilib.h)
WmiSystemControl ルーチンは、WMI ライブラリサポート ルーチンを使用して WMI IRP を処理するドライバーのディスパッチ ルーチンです。
構文
NTSTATUS WmiSystemControl(
[in] PWMILIB_CONTEXT WmiLibInfo,
[in] PDEVICE_OBJECT DeviceObject,
[in, out] PIRP Irp,
[out] PSYSCTL_IRP_DISPOSITION IrpDisposition
);
パラメーター
[in] WmiLibInfo
ドライバーのデータ ブロックとイベント ブロックの登録情報を格納し、ドライバーの WMI ライブラリ コールバック ルーチンのエントリ ポイントを定義する WMILIB_CONTEXT構造体への ポインター。
[in] DeviceObject
ドライバーの DEVICE_OBJECTへのポインター。
[in, out] Irp
IRP へのポインター。
[out] IrpDisposition
IRP の処理方法を示す SYSCTL_IRP_DISPOSITION 型の列挙値へのポインター。 WmiSystemControl は 、成功しない NTSTATUS コードを返す場合でも、常にこの値を設定します。
SYSCTL_IRP_DISPOSITION は Wmilib.h の列挙であり、次の値が含まれています。
IrpProcessed
IRP が処理され、完了した可能性があります。 WmiSystemControl によって呼び出されたドライバーの DpWmiXxx ルーチンが IRP を完了しなかった場合、ドライバーは WmiCompleteRequest を呼び出して、WmiSystemControl が返された後に IRP を完了する必要があります。
IrpNotCompleted
WMI がエラーを検出し、適切なエラー コードで IRP を設定したか、 IRP_MN_REGINFOまたはIRP_MN_REGINFO_EX 要求を処理したため、IRP は処理されましたが 、 完了していません。 ドライバーは 、IoCompleteRequest を呼び出して IRP を完了する必要があります。
IrpNotWmi
IRP は WMI 要求ではありません (つまり、WMI は IRP のマイナー コードを認識しません)。 ドライバーは、このIRP_MN_XXX でIRP_MJ_SYSTEM_CONTROL要求を処理する場合は、IRP を処理する必要があります。それ以外の場合、ドライバーは IRP を次の下位ドライバーに転送する必要があります。 ドライバーが最下位レベルのドライバーである場合は、IRP を完了する必要があります。
IrpForward
IRP は別のデバイス オブジェクトを対象としています (つまり、IRP の Parameters.WMI.ProviderId にあるデバイス オブジェクト ポインターが、 IoWMIRegistrationControl の呼び出しでドライバーによって渡されたポインターと一致しません)。 ドライバーは、次の下位ドライバーに IRP を転送する必要があります。 ドライバーが最下位レベルのドライバーである場合は、IRP を完了する必要があります。
戻り値
WmiSystemControl は 、STATUS_SUCCESSまたは次のいずれかのエラー コードを返します。
注釈
ドライバーは、WMI IRP マイナー コードを使用してIRP_MJ_SYSTEM_CONTROL要求を受信すると、ドライバーのWMILIB_CONTEXT構造体へのポインター、そのデバイス オブジェクトへのポインター、および IRP へのポインターを使用して WmiSystemControl を呼び出します。 WMILIB_CONTEXT構造体には、ドライバーのデータ ブロックとイベント ブロックの登録情報が含まれており、WMI ライブラリ コールバック ルーチンのエントリ ポイントを定義します。
WmiSystemControl は、IRP が WMI 要求であることを確認し、要求で指定されたブロックがドライバーに対して有効かどうかを判断します。 その場合は、ドライバーのWMILIB_CONTEXT構造で適切な DpWmiXxx エントリ ポイントを呼び出すことによって IRP を処理します。 WMI は、ドライバーの DpWmiXxx ルーチンを呼び出すときに、IRQL PASSIVE_LEVELで実行されています。
ドライバーは、次の下位ドライバーにIRP_MJ_SYSTEM_CONTROL要求を転送するときに、IRQL PASSIVE_LEVEL で実行されている必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降のバージョンの Windows で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | wmilib.h (Wmilib.h を含む) |
Library | Wmilib.lib |
IRQL | PASSIVE_LEVEL (「解説」セクションを参照) |
DDI コンプライアンス規則 | WmiComplete(wdm) |