Функция 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 возвращают структуры RelationNumaN ode, содержащие только одно сходство групп, что основной группы узла, если номер процессора не указан, то группа, содержащая заданный процессор, если задан номер процессора (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
Указатель на расположение, содержащее размер буфера в байтах, на который указывает Information. При записи *Длина содержит размер выделенного вызывающего буфера, на который указывает Information. Во время вызова подпрограмма перезаписывает значение, на которое указывает длина с размером буфера, который требуется для хранения запрошенных сведений о связи.
Возвращаемое значение
KeQueryLogicalProcessorRelationship возвращает STATUS_SUCCESS, если вызов выполнен успешно. Возможные значения возвращаемых ошибок включают следующие значения:
Возвращаемый код | Описание |
---|---|
STATUS_INVALID_PARAMETER | Параметр ProcessorNumber указывает на структуру PROCESSOR_NUMBER, содержащую недопустимые сведения. |
STATUS_INFO_LENGTH_MISMATCH | Выделенный вызывающим буфером, на который указывает параметр Information, недостаточно велик, чтобы содержать запрошенные сведения о связи. |
Замечания
Чтобы определить размер выделенного буфера, сначала вызовите KeQueryLogicalProcessorRelationship с Information = NULL и Length = 0. В ответ подпрограмма записывает требуемый размер буфера в **Length и возвращает STATUS_INFO_LENGTH_MISMATCH. Затем выделите буфер требуемого размера и вызовите KeQueryLogicalProcessorRelationship второй раз. В этом втором вызове задайте information адрес буфера и *длина размер буфера. Если второй вызов выполнен успешно, подпрограмма записывает запрошенные сведения о связи в буфер и возвращает 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 (include Ntddk.h, Wdm.h, Ntddk.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |