使用内核模式性能计数器
内核模式组件使用适用于 Windows (PCW) API 的性能计数器提供性能计数器。
使用以下步骤开发新的计数器数据提供程序:
编写描述 提供程序及其计数器集的计数器清单。 计数器清单是一个 XML 格式的文件,用于定义性能计数器提供程序及其计数器集。
- 将
applicationIdentity
属性设置为将作为内核模式组件的一部分安装的二进制文件的名称,该二进制文件将包含性能数据使用者所需的字符串资源。 - 将
providerType
属性设置为kernelMode
。 - 使用 C/C++ 结构的名称在) 下
counterSet/structs
定义至少一struct
个 (元素,该结构将在将计数器值从组件传递到 PCW API 时使用。 - 在每个
counter
中,struct
定义 PCW 应从中读取计数器值的 和field
。
- 将
在组件的生成过程中,使用 CTRPP 工具 编译计数器清单。 (计数器预处理器 (CTRPP) 工具包含在 WDK 中,可通过键入
ctrpp
.) CTRPP 工具将生成.rc
文件和.h
文件。- CTRPP 生成的
.rc
文件必须由资源编译器 (RC.exe) 工具编译,并且生成的.res
文件必须链接到 属性中applicationIdentity
名为 的二进制文件。 可以直接编译 CTRPP 生成的.rc
文件,也可以#include
将 CTRPP 生成的.rc
文件编译到.rc
二进制文件中。 - CTRPP 生成的
.h
文件包含包装基础 PCW API 的帮助程序函数。 例如,CTRPP 生成的.h
文件将包含代表你调用PcwRegister
的 RegisterXxx 函数。 在大多数情况下,你将调用 CTRPP 生成的帮助程序函数,而不是直接调用任何 PCW API,但可以参考 PCW API 的文档来了解相应的 CTRPP 生成的函数正在执行的操作。 帮助程序函数管理将组件的计数器数据布局转换为PCW_DATA
PCW API 预期的布局。
- CTRPP 生成的
在组件初始化时,调用 CTRPP 生成的 RegisterXxx 函数,该函数调用 PcwRegister。 在组件关闭时,调用 CTRPP 生成的 UnregisterXxx 函数,该函数调用 PcwUnregister。
添加代码以提供计数器数据。 这是通过实现 PCW_CALLBACK 回调函数,或通过为每个实例维护具有计数器值的数据结构,并在创建和销毁实例时调用 CTRPP 生成的 CreateInstanceXxx 和 CloseInstanceXxx 函数来实现的。
在组件安装时,使用
lodctr /m:<CounterManifest> <InstallPath>
安装提供程序。 在组件卸载时,将 (与 或/g
) 参数一起使用unlodctr
/m
以卸载提供程序。 安装提供程序时,会将提供程序的计数器集添加到系统范围的可用计数器集存储库中,以便性能数据使用者(如 perfmon、typeperf 或 WMI)可以使用这些计数器集。 具体而言,安装提供程序会记录包含提供程序的字符串表的二进制 (DLL、SYS 或 EXE 文件) 的完整路径。 通过将清单的 属性与<CounterManifest>
命令行上使用lodctr
的applicationIdentity
和<InstallPath>
值相结合来确定二进制文件的完整路径,如下所示:applicationIdentity
如果该属性是完整路径,则将使用该属性。- 否则,如果该
<InstallationPath>
参数是完整路径,则将使用该参数。 - 否则,如果
<CounterManifest>
参数是完整路径,则 中的<CounterManifest>
目录将与 属性中的文件名applicationIdentity
组合在一起。 - 否则,当前工作目录将与 属性中的文件名
applicationIdentity
组合在一起。
有关内核模式 PCW 提供程序的示例,请参阅 GitHub 上的 Windows 驱动程序示例存储库中的内核计数器示例 (Kcs) 。