Функция KeQueryLogicalProcessorRelationship (wdm.h)
Подпрограмма KeQueryLogicalProcessorRelationship получает сведения о связях одного или нескольких процессоров с другими процессорами в многопроцессорной системе.
Синтаксис
NTSTATUS KeQueryLogicalProcessorRelationship(
[in, optional] PPROCESSOR_NUMBER ProcessorNumber,
[in] LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
[out, optional] PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information,
[in, out] PULONG Length
);
Параметры
[in, optional] ProcessorNumber
Указатель на структуру PROCESSOR_NUMBER , которая идентифицирует логический процессор, для которого вызывающий объект запрашивает сведения о связи. Чтобы запросить сведения обо всех логических процессорах в системе, задайте для этого параметра значение NULL.
[in] RelationshipType
Указывает тип сведений о связях, запрашиваемых вызывающим элементом. Задайте для этого параметра одно из следующих значений перечисления LOGICAL_PROCESSOR_RELATIONSHIP :
RelationProcessorCore
RelationNumaNode
Начиная с Windows Server 2022 каждому узлу NUMA назначается основная группа. Запросы Для RelationNumaNode возвращают структуры RelationNumaNode , содержащие только одно сходство группы, то есть основной группы узла, если номер процессора не указан, или группу, содержащую данный процессор, если указан номер процессора (GroupCount == 1, размер структуры не изменяется). Дополнительные сведения см. в разделе Поддержка KeQueryNodeActiveAffinity и NUMA.
RelationCache
RelationProcessorPackage
RelationGroup
RelationProcessorDie
RelationNumaNodeEx
RelationAll
Начиная с Windows Server 2022, запросы relationNumaNodeEx или RelationAll будут возвращать структуры RelationNumaNode , содержащие массив сходств для узла во всех группах (GroupCount сообщает количество сопоставлений, размер структуры является переменным). Дополнительные сведения см. в разделе Поддержка NUMA.
[out, optional] Information
Указатель на буфер, выделенный вызывающим объектом, в который подпрограмма записывает массив из одной или нескольких структур SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX , содержащих сведения, запрошенные вызывающим объектом. Если функция завершается сбоем, содержимое этого буфера не определено. Перед выделением буфера задайте information = NULL , чтобы получить необходимую длину буфера. Дополнительные сведения см. в разделе "Примечания".
[in, out] Length
Указатель на расположение, содержащее размер (в байтах) буфера, на который указывает информация. При входе значение *Длина содержит размер буфера, выделенного вызывающим объектом, на который указывает Информация. Во время вызова подпрограмма перезаписывает значение, на которое указывает Length , размером буфера, необходимым для хранения запрошенных сведений о связи.
Возвращаемое значение
KeQueryLogicalProcessorRelationship возвращает STATUS_SUCCESS, если вызов выполнен успешно. Возможные возвращаемые значения ошибок:
Код возврата | Описание |
---|---|
STATUS_INVALID_PARAMETER | Параметр ProcessorNumber указывает на структуру PROCESSOR_NUMBER, содержащую недопустимые сведения. |
STATUS_INFO_LENGTH_MISMATCH | Буфер, выделенный вызывающим объектом, на который указывает параметр Information , недостаточно велик, чтобы содержать запрошенные сведения о связи. |
Комментарии
Чтобы определить размер выделяемого буфера, сначала вызовите KeQueryLogicalProcessorRelationship с information = NULL и Length = 0. В ответ подпрограмма записывает требуемый размер буфера в значение **Длина и возвращает STATUS_INFO_LENGTH_MISMATCH. Затем выделите буфер требуемого размера и вызовите KeQueryLogicalProcessorRelationship во второй раз. Во втором вызове задайте для параметра Information адрес буфера, а для параметра *Length — размер буфера. Если второй вызов выполняется успешно, подпрограмма записывает запрошенные сведения о связи в буфер и возвращает STATUS_SUCCESS.
Примеры
Следующий пример кода получает сведения о связи между процессорами для всех логических процессоров в многопроцессорной системе:
//
// Get required buffer size.
//
NTSTATUS Status;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Info = NULL;
ULONG BufferSize = 0;
Status = KeQueryLogicalProcessorRelationship(NULL, RelationAll, NULL, &BufferSize);
NT_ASSERT(Status == STATUS_INFO_LENGTH_MISMATCH && BufferSize > 0);
//
// Allocate buffer (assume IRQL <= APC_LEVEL).
//
Info = ExAllocatePoolWithTag(PagedPool, BufferSize, ' gaT');
if (Info == NULL)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
}
//
// Get processor relationship information.
//
if (NT_SUCCESS(Status))
{
Status = KeQueryLogicalProcessorRelationship(NULL, RelationAll, Info, &BufferSize);
}
Макрос NT_ASSERT определен в файле заголовка Wdm.h. Макрос NT_SUCCESS определен в файле заголовка Ntdef.h.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно в Windows 7 и более поздних версиях Windows. |
Целевая платформа | Универсальное |
Верхняя часть | wdm.h (включая Ntddk.h, Wdm.h, Ntddk.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |