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 所指向的值,其中包含请求的关系信息所需的缓冲区大小。
返回值
如果调用成功,则 KeQueryLogicalProcessorRelationship 返回STATUS_SUCCESS。 可能的错误返回值包括:
返回代码 | 描述 |
---|---|
STATUS_INVALID_PARAMETER | ProcessorNumber 参数指向包含无效信息的PROCESSOR_NUMBER结构。 |
STATUS_INFO_LENGTH_MISMATCH | Information 参数指向的调用方分配的缓冲区不够大,无法包含请求的关系信息。 |
言论
若要确定要分配的缓冲区大小,请首先调用 KeQueryLogicalProcessorRelationship,Information = NULL,Length = 0。作为响应,例程将所需的缓冲区大小写入到**长度,并返回STATUS_INFO_LENGTH_MISMATCH。 接下来,分配所需大小的缓冲区,并再次调用 KeQueryLogicalProcessorRelationship。 在此第二次调用中,将 信息 设置为缓冲区地址,并将 *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 |