使用版本 2.0 提供计数器数据

新式性能数据提供程序使用清单来定义计数器数据,并使用性能计数器提供程序 API 来管理提供程序上下文中的数据。 使用清单和性能计数器提供程序 API 实现的提供程序通常称为 V2 提供程序。 Windows 在 Windows Vista 或更高版本上支持用户模式 V2 提供程序,在 Windows 7 或更高版本上支持内核模式 V2 提供程序。

本页介绍用户模式 V2 提供程序。 有关内核模式 V2 提供程序的信息,请参阅 内核模式性能监视

在运行时,V2 提供程序的工作方式如下:

  • 提供程序进程通过调用 PerfStartProvider 和 PerfSetCounterSetInfo 将自身注册到 Windows 性能计数器系统。 提供程序可以选择性地提供回调函数,该函数将收到有关使用者请求的通知。
  • 提供程序进程使用 PerfCreateInstance 和 PerfDeleteInstance 根据需要添加或删除实例。 使用 PerfSet*** API 更改计数器值时,提供程序会更新这些值。
  • 使用者从计数器集请求数据。 系统验证调用方是否有权收集数据。 然后,系统使用提供程序进程中运行的工作线程来处理请求,并在适当的情况下调用提供程序的回调函数。 工作线程将收集的数据复制到系统管理的缓冲区中,然后系统将数据返回给使用者。

创建提供程序的步骤

  1. 编写一个清单,用于定义提供程序将提供的计数器数据。 有关编写清单的详细信息,请参阅 性能计数器架构

  2. 使用 CTRPP 生成包含在提供程序中的模板代码。 模板代码包括定义计数器集、 CounterInitializeCounterCleanup 函数以及资源字符串的结构。

    提供程序必须调用 CounterInitializeCounterCleanup 函数。 CounterInitialize 调用 PerfStartProvider 函数来注册提供程序,并调用 PerfSetCounterSetInfo 函数来初始化计数器集。 CounterCleanup 调用 PerfStopProvider 函数来删除提供程序的注册。

  3. 在项目中包括上一步中的模板代码并完成提供程序。

    若要完成提供程序,需要为所提供的计数器集的每个实例调用 PerfCreateInstance 函数。

    若要设置计数器值,请调用以下函数之一:

    使用 PerfSetCounterRefValue 的好处是,无需调用函数来设置或更新计数器值,只需更新本地计数器变量 (引用指向的变量) ,性能计数器使用指针访问计数器值。

    如果不使用 PerfSetCounterRefValue,则可以使用以下函数递增或递减计数器值:

    在提供程序退出之前,它必须为它创建的每个计数器集实例调用 PerfDeleteInstance

    如果在清单中的提供程序元素中指定了回调属性,或者在调用 CTRPP 时使用了 -NotificationCallback 参数,则必须实现 ControlCallback 回调函数。 将回调函数传递给 CounterInitialize

    如果在调用 CTRPP 时使用了 -MemoryRoutines,则必须实现 AllocateMemoryFreeMemory 回调函数。 将回调函数传递给 CounterInitialize

  4. 安装提供程序时,请使用 LodCtr 工具将包含本地化资源字符串和资源 ID 的二进制文件的名称写入注册表。 有关使用 LodCtr 的详细信息,请参阅 性能计数器架构

  5. 卸载提供程序时,请使用 UnlodCtr 工具从注册表中删除提供程序的信息。