使用版本 2.0 提供计数器数据
新式性能数据提供程序使用清单来定义计数器数据,并使用性能计数器提供程序 API 来管理提供程序上下文中的数据。 使用清单和性能计数器提供程序 API 实现的提供程序通常称为 V2 提供程序。 Windows 在 Windows Vista 或更高版本上支持用户模式 V2 提供程序,在 Windows 7 或更高版本上支持内核模式 V2 提供程序。
本页介绍用户模式 V2 提供程序。 有关内核模式 V2 提供程序的信息,请参阅 内核模式性能监视。
在运行时,V2 提供程序的工作方式如下:
- 提供程序进程通过调用 PerfStartProvider 和 PerfSetCounterSetInfo 将自身注册到 Windows 性能计数器系统。 提供程序可以选择性地提供回调函数,该函数将收到有关使用者请求的通知。
- 提供程序进程使用 PerfCreateInstance 和 PerfDeleteInstance 根据需要添加或删除实例。 使用 PerfSet*** API 更改计数器值时,提供程序会更新这些值。
- 使用者从计数器集请求数据。 系统验证调用方是否有权收集数据。 然后,系统使用提供程序进程中运行的工作线程来处理请求,并在适当的情况下调用提供程序的回调函数。 工作线程将收集的数据复制到系统管理的缓冲区中,然后系统将数据返回给使用者。
创建提供程序的步骤
编写一个清单,用于定义提供程序将提供的计数器数据。 有关编写清单的详细信息,请参阅 性能计数器架构。
使用 CTRPP 生成包含在提供程序中的模板代码。 模板代码包括定义计数器集、 CounterInitialize 和 CounterCleanup 函数以及资源字符串的结构。
提供程序必须调用 CounterInitialize 和 CounterCleanup 函数。 CounterInitialize 调用 PerfStartProvider 函数来注册提供程序,并调用 PerfSetCounterSetInfo 函数来初始化计数器集。 CounterCleanup 调用 PerfStopProvider 函数来删除提供程序的注册。
在项目中包括上一步中的模板代码并完成提供程序。
若要完成提供程序,需要为所提供的计数器集的每个实例调用 PerfCreateInstance 函数。
若要设置计数器值,请调用以下函数之一:
使用 PerfSetCounterRefValue 的好处是,无需调用函数来设置或更新计数器值,只需更新本地计数器变量 (引用指向的变量) ,性能计数器使用指针访问计数器值。
如果不使用 PerfSetCounterRefValue,则可以使用以下函数递增或递减计数器值:
- PerfDecrementULongCounterValue
- PerfDecrementULongLongCounterValue
- PerfIncrementULongCounterValue
- PerfIncrementULongLongCounterValue
在提供程序退出之前,它必须为它创建的每个计数器集实例调用 PerfDeleteInstance 。
如果在清单中的提供程序元素中指定了回调属性,或者在调用 CTRPP 时使用了 -NotificationCallback 参数,则必须实现 ControlCallback 回调函数。 将回调函数传递给 CounterInitialize。
如果在调用 CTRPP 时使用了 -MemoryRoutines,则必须实现 AllocateMemory 和 FreeMemory 回调函数。 将回调函数传递给 CounterInitialize。
安装提供程序时,请使用 LodCtr 工具将包含本地化资源字符串和资源 ID 的二进制文件的名称写入注册表。 有关使用 LodCtr 的详细信息,请参阅 性能计数器架构。
卸载提供程序时,请使用 UnlodCtr 工具从注册表中删除提供程序的信息。