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 结构的数组。 如果函数失败,则此缓冲区的内容未定义。 将 “信息 = ”设置为 NULL 以获取所需的缓冲区长度,然后再分配缓冲区。 有关更多信息,请参见下面的“备注”部分。
[in, out] Length
指向包含 信息所指向的缓冲区的大小(以字节为单位)的位置的指针。 在输入时,*Length 包含 信息指向的调用方分配的缓冲区的大小。 在调用期间,例程使用包含请求的关系信息所需的缓冲区大小覆盖 Length 指向的值。
返回值
如果调用成功,KeQueryLogicalProcessorRelationship 将返回STATUS_SUCCESS。 可能的错误返回值包括以下内容:
返回代码 | 说明 |
---|---|
STATUS_INVALID_PARAMETER | ProcessorNumber 参数指向包含无效信息的PROCESSOR_NUMBER结构。 |
STATUS_INFO_LENGTH_MISMATCH | Information 参数指向的调用方分配的缓冲区不够大,无法包含请求的关系信息。 |
注解
若要确定要分配的缓冲区大小,请首先调用信息 = 为 NULL 且 Length = 0 的 KeQueryLogicalProcessorRelationship 。作为响应,例程将所需的缓冲区大小写入到**Length,并返回STATUS_INFO_LENGTH_MISMATCH。 接下来,分配所需大小的缓冲区,并再次调用 KeQueryLogicalProcessorRelationship 。 在此第二次调用中,将 “信息” 设置为缓冲区地址,将“长度 ”设置为缓冲区大小。 如果第二次调用成功,例程会将请求的关系信息写入缓冲区,并返回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) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |