KeSetHardwareCounterConfiguration 函数 (ntddk.h)

KeSetHardwareCounterConfiguration 例程指定用于线程分析的硬件计数器列表。

语法

NTSTATUS KeSetHardwareCounterConfiguration(
  [in] PHARDWARE_COUNTER CounterArray,
  [in] ULONG             Count
);

参数

[in] CounterArray

指向 HARDWARE_COUNTER 数组的指针,该数组描述用于线程分析的硬件计数器配置。 每个数组元素都是描述硬件计数器的结构。 在例程返回之前,它将此数组的内容复制到其内部数据结构中。

[in] Count

指定 CounterArray 参数指向的数组中的元素数。

返回值

KeSetHardwareCounterConfiguration 如果调用成功,则返回STATUS_SUCCESS。 可能的错误返回值包括:

返回代码 描述
STATUS_INVALID_PARAMETER Count 参数的值超过了由 ntddk.h 头文件中定义的MAX_HW_COUNTERS常量指定的计数器的最大数目。
STATUS_WMI_ALREADY_ENABLED CounterArray 数组中指定的一个或多个计数器已经启用。
STATUS_NOT_IMPLEMENTED 对于调用方正在运行的处理器体系结构,不实现此例程。

言论

在 Windows 7 中,此例程仅适用于基于 x86 的 x64 和基于 Itanium 的体系结构。 如果调用方在不支持的处理器体系结构上运行,则例程将返回STATUS_NOT_IMPLEMENTED。

此例程告知作系统要用于线程分析的硬件计数器。 仅在禁用线程分析时调用此例程。 如果 CounterArray 数组指定当前正在使用的任何硬件计数器,则例程会失败并返回STATUS_WMI_ALREADY_ENABLED。

应用程序线程可以启用线程分析,从本地处理器的性能监视单元(PMU)中的硬件计数器获取一组性能度量。 作系统一次仅支持一个分析应用程序。 不支持线程分析应用程序的并发实例。 线程可以自行启用线程分析,但不能为其他线程启用线程分析。

启用线程分析后,作系统将使用上一次调用中指定的硬件计数器 KeSetHardwareCounterConfiguration。 每次成功 KeSetHardwareCounterConfiguration 调用都会替换先前 KeSetHardwareCounterConfiguration 调用中可能设置的任何硬件计数器配置。

设置 计数 = 0 以指定空的硬件计数器配置。 此配置有效地阻止使用硬件计数器进行线程分析。 在系统启动之后和初始 KeSetHardwareCounterConfiguration 调用之前存在的默认硬件计数器配置为空配置。

成功 KeSetHardwareCounterConfiguration 调用的效果是全局性的。 如果分析任何进程中的线程,探查器将使用最后一次调用 keSetHardwareCounterConfiguration 设置的硬件计数器配置。 在多处理器系统中,KeSetHardwareCounterConfiguration 调用将硬件计数器配置设置为用于系统中所有处理器的线程分析,尽管每个处理器都使用自己的硬件计数器集。

为了避免资源冲突,使用计数器资源的所有驱动程序都应使用 HalAllocateHardwareCountersHalFreeHardwareCounters 例程来协调这些资源的共享。

若要确定是否为给定线程启用了线程分析,请调用 QueryThreadProfiling 函数。

若要查询作系统中当前有效的硬件计数器配置线程分析,请调用 KeQueryHardwareCounterConfiguration 例程。

虚拟化软件通常不会虚拟化硬件性能计数器。 因此,硬件性能计数器不太可能在虚拟机中可用。

要求

要求 价值
最低支持的客户端 从 Windows 7 开始可用。
目标平台 普遍
标头 ntddk.h (包括 Ntddk.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

另请参阅

硬件计数器分析参考

HARDWARE_COUNTER

HalAllocateHardwareCounters

HalFreeHardwareCounters

KeQueryHardwareCounterConfiguration