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
指向 WMILIB_CONTEXT 结构的指针,该结构包含驱动程序的数据块和事件块的注册信息,并定义驱动程序的 WMI 库回调例程的入口点。
[in] DeviceObject
指向驱动程序 DEVICE_OBJECT的指针。
[in, out] Irp
指向 IRP 的指针。
[out] IrpDisposition
指向 类型为 SYSCTL_IRP_DISPOSITION 的枚举值的指针,该值指示如何处理 IRP。 WmiSystemControl 始终设置此值,即使它返回不成功的 NTSTATUS 代码也是如此。
SYSCTL_IRP_DISPOSITION 是 Wmilib.h 中的枚举,包含以下值:
IrpProcessed
IRP 已处理并可能完成。 如果 WmiSystemControl 调用的驱动程序的 DpWmiXxx 例程未完成 IRP,则驱动程序必须在 WmiSystemControl 返回后调用 WmiCompleteRequest 以完成 IRP。
IrpNotCompleted
IRP 已处理但未完成,原因是 WMI 检测到错误并使用适当的错误代码设置了 IRP,或者处理 了IRP_MN_REGINFO 或 IRP_MN_REGINFO_EX 请求。 驱动程序必须通过调用 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。 在调用驱动程序的 DpWmiXxx 例程时,WMI 在 IRQL PASSIVE_LEVEL运行。
当驱动程序将 IRP_MJ_SYSTEM_CONTROL 请求转发到下一个较低级别的驱动程序时,驱动程序必须在 IRQL PASSIVE_LEVEL 上运行。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 Windows 2000 和更高版本的 Windows 中可用。 |
目标平台 | 通用 |
标头 | wmilib.h (包括 Wmilib.h) |
Library | Wmilib.lib |
IRQL | PASSIVE_LEVEL (请参阅“备注”部分) |
DDI 符合性规则 | WmiComplete (wdm) |