在驱动程序中支持 WMI 数据块和事件

[仅适用于 KMDF]

基于框架的驱动程序通过提供事件回调函数来支持 WMI 数据块。 驱动程序通过调用对象方法支持 WMI 事件,该方法将事件发送到 WMI 客户端。

支持读/写 WMI 数据块

如果 WMI 数据块中的信息可由 WMI 客户端读取和写入,则驱动程序必须提供为客户端的读取请求提供服务的 EvtWmiInstanceQueryInstance 回调函数,以及为客户端的写入请求提供服务的 EvtWmiInstanceSetInstanceEvtWmiInstanceSetItem 回调函数 (或两者兼) 有。

如果数据块包含驱动程序在客户端请求时执行的方法,则驱动程序还必须提供 EvtWmiInstanceExecuteMethod 回调函数。

如果 WMI 数据块是只写 (也就是说,WMI 客户端可以将信息写入数据块,但无法) 读取数据块,则驱动程序不提供 EvtWmiInstanceQueryInstance 回调函数。

支持 Read-Only WMI 数据块

如果 WMI 客户端无法修改 WMI 数据块中的信息,则驱动程序不提供 EvtWmiInstanceSetInstanceEvtWmiInstanceSetItem 回调函数。 若要支持从 WMI 客户端请求数据块的信息,驱动程序可以执行以下操作之一:

如果驱动程序将 UseContextForQuery 设置为 TRUE,则当 WMI 客户端请求实例的信息时,框架会将实例对象的上下文空间复制到 WMI 提供的缓冲区中。 如果驱动程序只有一个 WMI 实例,该实例从其对象上下文区域提供只读的固定长度数据,则不需要 EvtWmiInstanceXxx 回调。

如果只读数据块包含驱动程序在客户端请求时执行的方法,则驱动程序还可以提供 EvtWmiInstanceExecuteMethod 回调函数。

支持昂贵的 WMI 数据块

如果驱动程序收集相对大量的动态数据以支持其 WMI 数据块之一,则驱动程序应执行以下操作:

  • 通过在 WMI 提供程序对象的 WDF_WMI_PROVIDER_CONFIG 结构的 Flags 成员中设置 WdfWmiProviderExpensive 标志,将数据块声明为“昂贵”。

  • 提供 EvtWmiProviderFunctionControl 回调函数,用于为数据块启用和禁用数据收集,或调用 WdfWmiProviderIsEnabled 以确定驱动程序应启用或禁用数据收集。

如果驱动程序设置 WdfWmiProviderExpensive 标志,则当 WMI 客户端注册以访问数据块时,框架将调用 EvtWmiProviderFunctionControl 回调函数。 回调函数应启用驱动程序收集数据的能力。 如果所有 WMI 客户端都删除了数据块的注册,框架将再次调用 EvtWmiProviderFunctionControl 回调函数,以便驱动程序可以停止收集数据。

支持 WMI 事件

驱动程序可以使用 WMI 事件向 WMI 客户端通知异常情况。 (不应使用 WMI 事件作为记录错误的替代方法。) 与数据项一样,WMI 事件是在托管对象格式 (.mof) 文件中的 WMI 数据块中定义的。

WMI 客户端注册 WMI 事件通知。 若要将事件发送到已注册的 WMI 客户端,驱动程序会调用 WdfWmiInstanceFireEvent 方法。 此方法允许驱动程序选择性地将特定于事件的数据发送到客户端。

如果定义事件的 WMI 数据块也包含 WMI 数据项或方法项,则驱动程序会提供适当的 WMI 回调函数。 如果数据块定义事件但不包含任何数据或方法项,则驱动程序必须在 WMI 提供程序对象的 WDF_WMI_PROVIDER_CONFIG 结构的 Flags 成员中设置 WdfWmiProviderEventOnly 标志。

仅当 WMI 客户端已注册事件通知时,驱动程序才应调用 WdfWmiInstanceFireEvent 。 驱动程序可以通过提供 EvtWmiProviderFunctionControl 回调函数或调用 WdfWmiProviderIsEnabled 来确定它是否应调用 WdfWmiInstanceFireEvent

支持 WMI 事件跟踪

跟踪事件在 .mof 文件中定义,其方式与其他 WMI 事件相同。 当驱动程序为跟踪事件创建 WMI 提供程序对象时,它必须在提供程序对象的 WDF_WMI_PROVIDER_CONFIG 结构的 Flags 成员中设置 WdfWmiProviderTracing 标志。

注册提供程序实例后,驱动程序可以调用 WdfWmiProviderGetTracingHandle 以获取跟踪句柄。 驱动程序可以使用跟踪句柄作为 WmiTraceMessage 例程的输入。

有关事件跟踪的详细信息,请参阅: