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 调用将硬件计数器配置设置为用于系统中所有处理器的线程分析,尽管每个处理器都使用自己的硬件计数器集。
为了避免资源冲突,使用计数器资源的所有驱动程序都应使用 HalAllocateHardwareCounters,HalFreeHardwareCounters 例程来协调这些资源的共享。
若要确定是否为给定线程启用了线程分析,请调用 QueryThreadProfiling 函数。
若要查询作系统中当前有效的硬件计数器配置线程分析,请调用 KeQueryHardwareCounterConfiguration 例程。
虚拟化软件通常不会虚拟化硬件性能计数器。 因此,硬件性能计数器不太可能在虚拟机中可用。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 7 开始可用。 |
目标平台 | 普遍 |
标头 | ntddk.h (包括 Ntddk.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |