KeQueryActiveProcessors 函数 (wdm.h)
KeQueryActiveProcessors 例程返回当前活动处理器的位掩码。
语法
KAFFINITY KeQueryActiveProcessors();
返回值
KeQueryActiveProcessors 返回一个 KAFFINITY 值,该值代表当前处于活动状态的处理器集。
注解
调用方不能假定 KeQueryActiveProcessors 将处理器连续映射到位,或者每次调用例程时始终使用相同的映射。 返回值的唯一有效用途是通过对设置的位数进行计数来确定活动处理器的数量。
调用方还必须知道,在支持热添加 CPU 功能的 Windows 版本中, KeQueryActiveProcessors 返回的值在运行时可能会更改。
Windows 7 及更高版本的 Windows 支持处理器组。 旨在处理处理器组相关信息的驱动程序应使用 KeQueryGroupAffinity 例程,该例程指定处理器组,而不是 KeQueryActiveProcessors,后者不指定。 但是,Windows 7 及更高版本中 KeQueryActiveProcessors 的实现为不支持处理器组的早期版本 Windows 编写的驱动程序提供了兼容性。 在此实现中, KeQueryActiveProcessors 返回一个关联掩码,该掩码指定组 0 中的活动逻辑处理器集。
在 Windows Vista 和更高版本的 Windows 中,可以在任何 IRQL 中调用此例程。 但是,在 Windows Server 2003 和早期版本的 Windows 中,必须在 IRQL <= APC_LEVEL 调用此例程。
KeNumberProcessors 内核变量在 Service Pack 1 (SP1) 、Windows Server 2008 及更高版本的 Windows 中已过时。 对于从 Windows Vista SP1 开始的 WDK 版本,KeNumberProcessors 不出现在 WDK 标头中;但是,变量仍从内核导出,因此为早期平台生成的驱动程序不会中断
Windows Server 2008 支持 Windows 数据中心和 Enterprise Edition SKU 中的动态硬件分区 (DHP) 。 作为 DHP 的一部分,Windows Server 2008 支持在运行时热添加 CPU。 在热添加 CPU 环境中,处理器数在运行时可能不会保持不变。
因此,在 Windows Server 2008 中,可以确定处理器数的代码必须使用 KeQueryActiveProcessors ,而不是直接引用内核变量 KeNumberProcessors。
查看当前引用 KeNumberProcessors 的任何代码,以确保它适应热添加 CPU 环境中的 CPU 计数更改。
可以使用 PNPCPU 工具模拟热添加 CPU 以进行测试。
#if (NTDDI_VERSION >= NTDDI_VISTA)
extern NTSYSAPI volatile CCHAR KeNumberProcessors;
#else
#if (NTDDI_VERSION >= NTDDI_WINXP)
extern NTSYSAPI CCHAR KeNumberProcessors;
#else
extern PCCHAR KeNumberProcessors;
#endif
#endif
从 Windows XP 开始, KeNumberProcessors 是一个 8 位整数值,指示平台中的处理器数。 在早期版本的 Windows 中, KeNumberProcessors 是指向指示平台中处理器数的 8 位整数值的指针。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 通用 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 请参见“备注”部分。 |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) , IrqlKeApcLte1 (wdm) |