Функция 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

См. также раздел

LOGICAL_PROCESSOR_RELATIONSHIP

PROCESSOR_NUMBER

SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX