Función KeQueryLogicalProcessorRelationship (wdm.h)

La rutina KeQueryLogicalProcessorRelationship obtiene información sobre las relaciones de uno o varios procesadores con los demás procesadores de un sistema multiprocesador.

Sintaxis

NTSTATUS KeQueryLogicalProcessorRelationship(
  [in, optional]  PPROCESSOR_NUMBER                        ProcessorNumber,
  [in]            LOGICAL_PROCESSOR_RELATIONSHIP           RelationshipType,
  [out, optional] PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information,
  [in, out]       PULONG                                   Length
);

Parámetros

[in, optional] ProcessorNumber

Puntero a una estructura PROCESSOR_NUMBER que identifica el procesador lógico para el que el autor de la llamada solicita información de relación. Para solicitar información sobre todos los procesadores lógicos del sistema, establezca este parámetro en NULL.

[in] RelationshipType

Especifica el tipo de información de relación solicitada por el autor de la llamada. Establezca este parámetro en uno de los siguientes valores de enumeración LOGICAL_PROCESSOR_RELATIONSHIP:

  • RelationProcessorCore

  • RelationNumaNode

    A partir de Windows Server 2022, a cada nodo NUMA se le asigna un grupo principal. Las solicitudes de RelationNumaNode devolverán estructuras RelationNumaNode que contengan solo una afinidad de grupo, la del grupo principal del nodo si no se especifica un número de procesador, el del grupo que contiene el procesador especificado si se especifica un número de procesador (GroupCount == 1, el tamaño de la estructura no cambia). Para obtener más información, consulta KeQueryNodeActiveAffinity y Compatibilidad con NUMA.

  • RelationCache

  • RelationProcessorPackage

  • RelationGroup

  • RelationProcessorDie

  • RelationNumaNodeEx

  • RelationAll

    A partir de Windows Server 2022, las solicitudes de RelationNumaNodeEx o RelationAll devolverán estructuras RelationNumaNode que contienen una matriz de afinidades para el nodo en todos los grupos (GroupCount notifica el número de afinidades, el tamaño de la estructura es variable). Para obtener más información, consulta Compatibilidad con NUMA.

[out, optional] Information

Puntero a un búfer asignado por el autor de la llamada en el que la rutina escribe una matriz de una o varias estructuras SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX que contienen la información solicitada por el autor de la llamada. Si se produce un error en la función, el contenido de este búfer no está definido. Establezca Information = NULL para obtener la longitud de búfer necesaria antes de asignar el búfer. Para obtener más información, vea la sección Comentarios que se muestra más adelante.

[in, out] Length

Puntero a una ubicación que contiene el tamaño, en bytes, del búfer al que apunta Information. En la entrada, *Length contiene el tamaño del búfer asignado por el autor de la llamada al que apunta Information. Durante la llamada, la rutina sobrescribe el valor al que apunta Length con el tamaño del búfer necesario para contener la información de relación solicitada.

Valor devuelto

KeQueryLogicalProcessorRelationship devuelve STATUS_SUCCESS si la llamada es correcta. Entre los valores devueltos de error posibles se incluyen los siguientes:

Código devuelto Descripción
STATUS_INVALID_PARAMETER El parámetro ProcessorNumber apunta a una estructura de PROCESSOR_NUMBER que contiene información no válida.
STATUS_INFO_LENGTH_MISMATCH El búfer asignado por el autor de la llamada al que apunta el parámetro Information no es lo suficientemente grande como para contener la información de relación solicitada.

Comentarios

Para determinar el tamaño del búfer que se va a asignar, llame inicialmente a KeQueryLogicalProcessorRelationship con Information = NULL y Length = 0. En respuesta, la rutina escribe el tamaño de búfer necesario en**Length y devuelve STATUS_INFO_LENGTH_MISMATCH. A continuación, asigne un búfer del tamaño necesario y llame a KeQueryLogicalProcessorRelationship una segunda vez. En esta segunda llamada, establezca Información en la dirección del búfer y *Longitud en el tamaño del búfer. Si la segunda llamada se realiza correctamente, la rutina escribe la información de relación solicitada en el búfer y devuelve STATUS_SUCCESS.

Ejemplos

En el ejemplo de código siguiente se obtiene información de relación del procesador para todos los procesadores lógicos de un sistema multiprocesador:

//
// 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);
}

La macro NT_ASSERT se define en el archivo de encabezado Wdm.h. La macro NT_SUCCESS se define en el archivo de encabezado Ntdef.h.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible en Windows 7 y versiones posteriores de Windows.
Plataforma de destino Universal
Encabezado wdm.h (incluya Ntddk.h, Wdm.h, Ntddk.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

Consulte también

LOGICAL_PROCESSOR_RELATIONSHIP

PROCESSOR_NUMBER

SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX