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,驱动程序必须调用 WmiCompleteRequest,以在 WmiSystemControl 返回后完成 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。 WMI 在 IRQL PASSIVE_LEVEL调用驱动程序的 DpWmiXxx 例程时运行。
将 IRP_MJ_SYSTEM_CONTROL 请求转发到下一个较低的驱动程序时,驱动程序必须在 IRQL PASSIVE_LEVEL 上运行。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows 2000 及更高版本的 Windows 中可用。 |
目标平台 | 普遍 |
标头 | wmilib.h (包括 Wmilib.h) |
库 | Wmilib.lib |
IRQL | PASSIVE_LEVEL(请参阅“备注”部分) |
DDI 符合性规则 | WmiComplete(wdm) |