KeQueryActiveProcessors 函数 (wdm.h)
KeQueryActiveProcessors 例程返回当前活动处理器的位掩码。
语法
KAFFINITY KeQueryActiveProcessors();
返回值
KeQueryActiveProcessors 返回表示当前活动处理器集的 KAFFINITY 值。
言论
调用方不能假定 KeQueryActiveProcessors 连续将处理器映射到位,或者每次调用例程时一直使用相同的映射。 返回值的唯一有效用途是通过计算设置的位数来确定活动处理器的数量。
调用方还必须注意,KeQueryActiveProcessors 返回的值 可以在支持热添加 CPU 功能的 Windows 版本运行时期间更改。
Windows 7 及更高版本的 Windows 支持处理器组。 旨在处理有关处理器组信息的驱动程序应使用 KeQueryGroupAffinity 例程,该例程指定处理器组,而不是 KeQueryActiveProcessors,而不是不。 但是,在 Windows 7 和更高版本中实现 KeQueryActiveProcessors 为早期版本的 Windows(不支持处理器组)编写的驱动程序提供兼容性。 在此实现中,KeQueryActiveProcessors 返回一个关联掩码,该掩码指定组 0 中的活动逻辑处理器集。
在 Windows Vista 和更高版本的 Windows 中,可以在任何 IRQL 中调用此例程。 但是,在 Windows Server 2003 和早期版本的 Windows 中,必须在 IRQL <= APC_LEVEL调用此例程。
KeNumberProcessors 内核变量在 Windows Vista 中已过时,其中包含 Service Pack 1(SP1)、Windows Server 2008 和更高版本的 Windows。 从 Windows Vista SP1 开始的 WDK 版本的 WDK 标头中不会显示 keNumberProcessors;但是,该变量仍从内核导出,因此为早期平台生成的驱动程序不会中断
Windows Server 2008 包括对 Windows Datacenter 和 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) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 请参阅“备注”部分。 |
DDI 符合性规则 | HwStorPortProhibitedDIS(storport),IrqlKeApcLte1(wdm) |