Функция KeQueryActiveProcessors (ntddk.h)
Подпрограмма KeQueryActiveProcessors возвращает битовую маску текущих активных процессоров.
Синтаксис
KAFFINITY KeQueryActiveProcessors();
Возвращаемое значение
KeQueryActiveProcessors возвращает значение KAFFINITY , представляющее набор активных в настоящее время процессоров.
Комментарии
Вызывающие операторы не могут предполагать, что KeQueryActiveProcessors сопоставляет процессоры с битами последовательно или что подпрограмма постоянно использует одно и то же сопоставление при каждом вызове. Единственным допустимым способом использования возвращаемого значения является определение количества активных процессоров путем подсчета количества заданных битов.
Вызывающие также должны знать, что значение, возвращаемое KeQueryActiveProcessors , может измениться во время выполнения в версиях Windows, поддерживающих функцию горячего добавления ЦП.
Windows 7 и более поздние версии Windows поддерживают группы процессоров. Драйверы, предназначенные для обработки сведений о группах процессоров, должны использовать подпрограмму KeQueryGroupAffinity , которая задает группу процессоров, а не KeQueryActiveProcessors, которая не использует. Однако реализация KeQueryActiveProcessors в Windows 7 и более поздних версиях Windows обеспечивает совместимость драйверов, написанных для более ранних версий Windows, которые не поддерживают группы процессоров. В этой реализации KeQueryActiveProcessors возвращает маску сходства, указывающую набор активных логических процессоров в группе 0.
В Windows Vista и более поздних версиях Windows эту подпрограмму можно вызвать в любом IRQL. Однако в Windows Server 2003 и более ранних версиях Windows эта подпрограмма должна вызываться по адресу IRQL <= APC_LEVEL.
Переменная ядра KeNumberProcessors устарела в Windows Vista с пакетом обновления 1 (SP1), Windows Server 2008 и более поздних версий Windows. KeNumberProcessors не отображается в заголовках WDK для выпусков WDK, начиная с Windows Vista с пакетом обновления 1 (SP1); однако переменная по-прежнему экспортируется из ядра, поэтому драйверы, созданные для более ранних платформ, не будут работать
Windows Server 2008 включает поддержку динамического аппаратного секционирования (DHP) в Windows Datacenter и выпуск Enterprise SKU. В рамках DHP Windows Server 2008 поддерживает горячее добавление ЦП во время выполнения. В среде ЦП с горячим добавлением количество процессоров может не оставаться постоянным во время выполнения.
Соответственно, в Windows Server 2008 код, который может определить количество процессоров, должен использовать KeQueryActiveProcessors вместо прямых ссылок на переменную ядра KeNumberProcessors.
Просмотрите любой код, который в настоящее время ссылается на KeNumberProcessors , чтобы убедиться, что он учитывает изменения в количестве ЦП в средах с горячим добавлением.
Средство PNPCPU можно использовать для имитации горячего добавления ЦП в целях тестирования.
#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. |
Целевая платформа | Универсальное |
Верхняя часть | ntddk.h (включая Wdm.h, Ntddk.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | См. раздел "Примечания". |
Правила соответствия DDI | HwStorPortProhibitedDIs(storport), IrqlKeApcLte1(wdm) |