KeQueryLogicalProcessorRelationship-Funktion (wdm.h)
Die KeQueryLogicalProcessorRelationship Routine ruft Informationen über die Beziehungen eines oder mehrerer Prozessoren zu den anderen Prozessoren in einem Multiprozessorsystem ab.
Syntax
NTSTATUS KeQueryLogicalProcessorRelationship(
[in, optional] PPROCESSOR_NUMBER ProcessorNumber,
[in] LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
[out, optional] PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information,
[in, out] PULONG Length
);
Parameter
[in, optional] ProcessorNumber
Ein Zeiger auf eine PROCESSOR_NUMBER-Struktur, die den logischen Prozessor identifiziert, für den der Aufrufer Beziehungsinformationen anfordert. Um Informationen zu allen logischen Prozessoren im System anzufordern, legen Sie diesen Parameter auf NULL-fest.
[in] RelationshipType
Gibt den Typ der Beziehungsinformationen an, die vom Aufrufer angefordert werden. Legen Sie diesen Parameter auf einen der folgenden LOGICAL_PROCESSOR_RELATIONSHIP Enumerationswerte fest:
RelationProcessorCore-
RelationNumaNode
Ab Windows Server 2022 wird jedem NUMA-Knoten eine primäre Gruppe zugewiesen. Anforderungen für RelationNumaNode- geben RelationNumaNode Strukturen zurück, die nur eine einzelne Gruppenaffinität enthalten, die der primären Gruppe des Knotens, wenn keine Prozessornummer angegeben ist, die der Gruppe, die den angegebenen Prozessor enthält, wenn eine Prozessornummer angegeben wird (GroupCount == 1, Die Strukturgröße ist unverändert). Weitere Informationen finden Sie unter KeQueryNodeActiveAffinity und NUMA Support.
RelationCache-
RelationProcessorPackage-
RelationGroup-
RelationProcessorDie
RelationNumaNodeEx
RelationAll-
Ab Windows Server 2022 geben Anforderungen für RelationNumaNodeEx oder RelationAll-RelationNumaNode Strukturen zurück, die ein Array von Affinitäten für den Knoten über alle Gruppen enthalten (GroupCount meldet Anzahl der Affinitäten, Die Strukturgröße ist variabel). Weitere Informationen finden Sie unter NUMA Support.
[out, optional] Information
Ein Zeiger auf einen vom Aufrufer zugewiesenen Puffer, in den die Routine ein Array einer oder mehrerer SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Strukturen schreibt, die die vom Aufrufer angeforderten Informationen enthalten. Wenn die Funktion fehlschlägt, sind die Inhalte dieses Puffers nicht definiert. Legen Sie Information = NULL- fest, um die erforderliche Pufferlänge abzurufen, bevor Sie den Puffer zuordnen. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".
[in, out] Length
Ein Zeiger auf eine Position, die die Größe des Puffers in Byte enthält, auf den Informationverweist. Beim Eintrag enthält *Length die Größe des vom Aufrufer zugewiesenen Puffers, auf den Informationverweist. Während des Aufrufs überschreibt die Routine den Wert, auf den durch Length verwiesen wird, mit der Puffergröße, die erforderlich ist, um die angeforderten Beziehungsinformationen enthalten zu können.
Rückgabewert
KeQueryLogicalProcessorRelationship gibt STATUS_SUCCESS zurück, wenn der Aufruf erfolgreich ist. Mögliche Fehlerrückgabewerte sind:
Rückgabecode | Beschreibung |
---|---|
STATUS_INVALID_PARAMETER | Der parameter ProcessorNumber verweist auf eine PROCESSOR_NUMBER Struktur, die ungültige Informationen enthält. |
STATUS_INFO_LENGTH_MISMATCH | Der vom Aufrufer zugewiesene Puffer, auf den der parameter Information verweist, ist nicht groß genug, um die angeforderten Beziehungsinformationen zu enthalten. |
Bemerkungen
Um die zuzuordnende Puffergröße zu bestimmen, rufen Sie zunächst KeQueryLogicalProcessorRelationship mit Information = NULL- und Length = 0 auf. Als Reaktion schreibt die Routine die erforderliche Puffergröße auf**Length und gibt STATUS_INFO_LENGTH_MISMATCH zurück. Weisen Sie als Nächstes einen Puffer der erforderlichen Größe zu, und rufen Sie KeQueryLogicalProcessorRelationship ein zweites Mal auf. Legen Sie in diesem zweiten Aufruf Information auf die Pufferadresse und *Length auf die Puffergröße fest. Wenn der zweite Aufruf erfolgreich verläuft, schreibt die Routine die angeforderten Beziehungsinformationen in den Puffer und gibt STATUS_SUCCESS zurück.
Beispiele
Das folgende Codebeispiel ruft Prozessorbeziehungsinformationen für alle logischen Prozessoren in einem Multiprozessorsystem ab:
//
// 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);
}
Das NT_ASSERT Makro wird in der Wdm.h-Headerdatei definiert. Das NT_SUCCESS-Makro wird in der Ntdef.h-Headerdatei definiert.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Verfügbar in Windows 7 und höheren Versionen von Windows. |
Zielplattform- | Universal |
Header- | wdm.h (include Ntddk.h, Wdm.h, Ntddk.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | <= DISPATCH_LEVEL |