使用内核模式性能计数器

内核模式组件使用适用于 Windows (PCW) API 的性能计数器提供性能计数器。

使用以下步骤开发新的计数器数据提供程序:

  1. 编写描述 提供程序及其计数器集的计数器清单。 计数器清单是一个 XML 格式的文件,用于定义性能计数器提供程序及其计数器集。

    • applicationIdentity 属性设置为将作为内核模式组件的一部分安装的二进制文件的名称,该二进制文件将包含性能数据使用者所需的字符串资源。
    • providerType 属性设置为 kernelMode
    • 使用 C/C++ 结构的名称在) 下counterSet/structs定义至少一struct个 (元素,该结构将在将计数器值从组件传递到 PCW API 时使用。
    • 在每个 counter中, struct 定义 PCW 应从中读取计数器值的 和 field
  2. 在组件的生成过程中,使用 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文件将包含代表你调用PcwRegisterRegisterXxx 函数。 在大多数情况下,你将调用 CTRPP 生成的帮助程序函数,而不是直接调用任何 PCW API,但可以参考 PCW API 的文档来了解相应的 CTRPP 生成的函数正在执行的操作。 帮助程序函数管理将组件的计数器数据布局转换为 PCW_DATA PCW API 预期的布局。
  3. 在组件初始化时,调用 CTRPP 生成的 RegisterXxx 函数,该函数调用 PcwRegister。 在组件关闭时,调用 CTRPP 生成的 UnregisterXxx 函数,该函数调用 PcwUnregister

  4. 添加代码以提供计数器数据。 这是通过实现 PCW_CALLBACK 回调函数,或通过为每个实例维护具有计数器值的数据结构,并在创建和销毁实例时调用 CTRPP 生成的 CreateInstanceXxxCloseInstanceXxx 函数来实现的。

  5. 在组件安装时,使用 lodctr /m:<CounterManifest> <InstallPath> 安装提供程序。 在组件卸载时,将 (与 或 /g) 参数一起使用unlodctr/m以卸载提供程序。 安装提供程序时,会将提供程序的计数器集添加到系统范围的可用计数器集存储库中,以便性能数据使用者(如 perfmon、typeperf 或 WMI)可以使用这些计数器集。 具体而言,安装提供程序会记录包含提供程序的字符串表的二进制 (DLL、SYS 或 EXE 文件) 的完整路径。 通过将清单的 属性与<CounterManifest>命令行上使用lodctrapplicationIdentity<InstallPath> 值相结合来确定二进制文件的完整路径,如下所示:

    • applicationIdentity如果该属性是完整路径,则将使用该属性。
    • 否则,如果该 <InstallationPath> 参数是完整路径,则将使用该参数。
    • 否则,如果 <CounterManifest> 参数是完整路径,则 中的 <CounterManifest> 目录将与 属性中的文件名 applicationIdentity 组合在一起。
    • 否则,当前工作目录将与 属性中的文件名 applicationIdentity 组合在一起。

有关内核模式 PCW 提供程序的示例,请参阅 GitHub 上的 Windows 驱动程序示例存储库中的内核计数器示例 (Kcs)

另请参阅

内核模式性能监视

PcwRegister

PCW_CALLBACK

性能计数器架构

CTRPP 工具