Freigeben über


RtlQueryRegistryValues-Funktion (wdm.h)

Die RtlQueryRegistryValues Routine ermöglicht es dem Aufrufer, mehrere Werte aus der Registrierungsunterstruktur mit einem einzelnen Aufruf abzufragen.

Syntax

NTSYSAPI NTSTATUS RtlQueryRegistryValues(
  [in]           ULONG                     RelativeTo,
  [in]           PCWSTR                    Path,
  [in, out]      PRTL_QUERY_REGISTRY_TABLE QueryTable,
  [in, optional] PVOID                     Context,
  [in, optional] PVOID                     Environment
);

Parameter

[in] RelativeTo

Gibt an, ob Path ein absoluter Registrierungspfad ist oder relativ zu einem vordefinierten Pfad als einer der folgenden Pfade ist.

Wert Bedeutung
RTL_REGISTRY_ABSOLUTE Der Pfad ist ein absoluter Registrierungspfad.
RTL_REGISTRY_CONTROL Der Pfad ist relativ zu \Registry\Machine\System\CurrentControlSet\Control.
RTL_REGISTRY_DEVICEMAP Der Pfad ist relativ zu \Registry\Machine\Hardware\DeviceMap.
RTL_REGISTRY_SERVICES Der Pfad ist relativ zu \Registry\Machine\System\CurrentControlSet\Services.
RTL_REGISTRY_USER Der Pfad ist relativ zu \Registry\User\CurrentUser. (Bei einem Systemprozess ist dies \User\. Standard-.)
RTL_REGISTRY_WINDOWS_NT Der Pfad ist relativ zu \Registry\Machine\Software\Microsoft\Windows NT\CurrentVersion.

Der RelativeTo- Wert kann durch bitweises ORingen mit einem der folgenden Flags geändert werden.

Flagge Bedeutung
RTL_REGISTRY_OPTIONAL Gibt an, dass der Von diesem Parameter referenzierte Schlüssel und der Path Parameter optional sind.
RTL_REGISTRY_HANDLE Gibt an, dass der Path Parameter tatsächlich ein Registrierungshandle ist, das verwendet werden soll.

[in] Path

Zeigen Sie entweder auf einen absoluten Registrierungspfad oder einen Pfad relativ zu dem bekannten Speicherort, der durch den Parameter RelativeTo angegeben wird. Beachten Sie, dass die Namen von Schlüsseln in einem solchen Pfad dem Aufrufer bekannt sein müssen, einschließlich des letzten Schlüssels im Pfad. Wenn das RTL_REGISTRY_HANDLE Flag angegeben ist, ist dieser Parameter ein Registrierungshandle für einen bereits geöffneten Schlüssel, der direkt abgefragt werden kann.

[in, out] QueryTable

Zeigen Sie auf eine Tabelle mit mindestens einem Wertnamen und Unterschlüsselnamen, für die der Aufrufer interessiert ist. Jeder Tabelleneintrag enthält die Adresse eines vom Aufrufer bereitgestellten QueryRoutine--Funktion, die für jeden Wertnamen aufgerufen wird, der in der Registrierung vorhanden ist. Die Tabelle muss mit einem NULL- Tabelleneintrag beendet werden, bei dem es sich um einen Tabelleneintrag mit einem NULL-QueryRoutine Member und einem NULLName Member handelt. Die Struktur für Abfragetabelleneinträge ist wie folgt definiert:

typedef struct _RTL_QUERY_REGISTRY_TABLE {
    PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
    ULONG Flags;
    PWSTR Name;
    PVOID EntryContext;
    ULONG DefaultType;
    PVOID DefaultData;
    ULONG DefaultLength;
} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;

Wenn der Aufrufer Speicher für die Abfragetabelle zuweist, auf die der parameter QueryTable verweist, ist der Aufrufer dafür verantwortlich, diesen Speicher freizugeben, nachdem die RtlQueryRegistryValues Aufruf zurückgegeben wurde.

QueryRoutine

Die Adresse einer QueryRoutine--Funktion, die mit dem Namen, Typ, Daten und der Datenlänge eines Registrierungswerts aufgerufen wird. Wenn dieses Element und der Name Member beide NULL-sind, wird das Ende der Tabelle markiert.

Eine QueryRoutine--Funktion wird wie folgt deklariert:

NTSTATUS
QueryRoutine (
    IN PWSTR ValueName,
    IN ULONG ValueType,
    IN PVOID ValueData,
    IN ULONG ValueLength,
    IN PVOID Context,
    IN PVOID EntryContext
    );

Weitere Informationen finden Sie unter QueryRoutine.

Flaggen

Flags zum Steuern, wie die verbleibenden Member der RTL_QUERY_REGISTRY_TABLE Struktur interpretiert werden sollen. Die folgenden Flagbits werden für dieses Element definiert.

Wert Bedeutung
RTL_QUERY_REGISTRY_SUBKEY Der Name dieses Tabelleneintrags ist ein anderer Pfad zu einem Registrierungsschlüssel, und alle folgenden Tabelleneinträge gelten für diesen Schlüssel und nicht für den durch den Parameter Path angegebenen Schlüssel. Diese Änderung des Fokus dauert bis zum Ende der Tabelle oder bis ein anderer RTL_REGISTRY_SUBKEY oder RTL_QUERY_REGISTRY_TOPKEY Eintrag angezeigt wird. Jeder solcher Eintrag muss einen Pfad angeben, der relativ zum Path im Aufruf von RtlQueryRegistryValuesangegeben ist.
RTL_QUERY_REGISTRY_TOPKEY Setzt den aktuellen Registrierungsschlüsselhandle auf das ursprüngliche Handle zurück, das durch die Parameter RelativeTo und Path angegeben wurde. Dies ist nützlich, um zum ursprünglichen Knoten zurückzukehren, nachdem er in Unterschlüssel absteigend mit der RTL_QUERY_REGISTRY_SUBKEY-Kennzeichnung absteigend ist.
RTL_QUERY_REGISTRY_REQUIRED Gibt an, dass dieser Registrierungswert vorhanden sein muss, wenn DefaultType- = REG_NONE; andernfalls wird RtlQueryRegistryValues sofort mit einem Statuscode von STATUS_OBJECT_NAME_NOT_FOUND beendet. Dieser Exit tritt auf, wenn der Name Member NULL- ist und der aktuelle Schlüssel keine Unterschlüssel aufweist oder wenn Name einen nicht vorhandenen Unterschlüssel angibt. (Wenn dieses Flag nicht angegeben ist, verwendet die Routine das DefaultValue- Element als Wert, wenn keine Übereinstimmung für ein nichtNULL-Namegefunden wird. Wenn Name-NULL- ist und der aktuelle Schlüssel keine Unterschlüssel enthält, überspringt die Routine einfach diesen Tabelleneintrag.)
RTL_QUERY_REGISTRY_NOVALUE Gibt an, dass obwohl für diesen Tabelleneintrag kein Name vorhanden ist, der gesamte Aufrufer ein Rückruf ist, d. h. der Aufrufer möchte nicht alle Werte unter dem aktuellen Schlüssel aufzählen. QueryRoutine- wird mit NULL- für ValueData-, REG_NONE für ValueType-und Null für ValueLength-aufgerufen.
RTL_QUERY_REGISTRY_NOEXPAND Bei einem Registrierungswert vom Typ REG_EXPAND_SZ oder REG_MULTI_SZ überschreibt dieses Flag das Standardverhalten, das vor dem Aufrufen der QueryRoutine Routine vor der Verarbeitung des Registrierungswerts besteht. Standardmäßig erweitert RtlQueryRegistryValues Umgebungsvariablenverweise in REG_EXPAND_SZ Werten und listet jede null-beendete Zeichenfolge in einem REG_MULTI_SZ Wert in einem separaten QueryRoutine- Aufruf auf, sodass die Zeichenfolgen als REG_SZ Werte angezeigt werden, die dieselbe ValueNamehaben. Wenn dieses Flag festgelegt ist, empfängt QueryRoutine den rohen REG_EXPAND_SZ oder REG_MULTI_SZ Wert aus der Registrierung. Weitere Informationen zu den Datenformaten für diese Werte finden Sie unter KEY_VALUE_BASIC_INFORMATION.
RTL_QUERY_REGISTRY_DIRECT Das QueryRoutine Member wird nicht verwendet (und muss NULL-sein), und die EntryContext- verweist auf den Puffer, um den Wert zu speichern. Wenn der Aufrufer dieses Flag festlegt, sollte der Aufrufer zusätzlich das RTL_QUERY_REGISTRY_TYPECHECK Flag festlegen, um den Pufferüberlauf zu schützen. Weitere Informationen finden Sie im Abschnitt "Hinweise".
RTL_QUERY_REGISTRY_TYPECHECK Verwenden Sie dieses Flag mit der RTL_QUERY_REGISTRY_DIRECT-Kennzeichnung, um zu überprüfen, ob der REG_XXX- Typ des gespeicherten Registrierungswerts dem vom Aufrufer erwarteten Typ entspricht. Wenn die Typen nicht übereinstimmen, schlägt der Aufruf fehl. Weitere Informationen finden Sie im Abschnitt "Hinweise".
RTL_QUERY_REGISTRY_DELETE Dieses Kennzeichen wird verwendet, um Wertschlüssel zu löschen, nachdem sie abgefragt wurden.

Ab Windows 2000 wird die Posteingangsunterstützung für alle Flagbits in der vorherigen Tabelle bereitgestellt, mit Ausnahme von RTL_QUERY_REGISTRY_TYPECHECK. Die Posteingangsunterstützung für RTL_QUERY_REGISTRY_TYPECHECK ist ab Windows 8 verfügbar. Für frühere Versionen von Windows wird die Unterstützung für RTL_QUERY_REGISTRY_TYPECHECK über Windows Update bereitgestellt. Weitere Informationen finden Sie in den Hinweisen.

Name

Dies ist der Name eines Werts, den der Aufrufer abgefragt hat. Wenn NameNULL-ist, wird die für diesen Tabelleneintrag angegebene QueryRoutine- funktion für alle Werte aufgerufen, die dem aktuellen Registrierungsschlüssel zugeordnet sind. Wenn das RTL_QUERY_REGISTRY_DIRECT Flag festgelegt ist, muss ein nichtNULL- Wert für Name- angegeben werden.

EntryContext

Wenn das RTL_QUERY_REGISTRY_DIRECT Flag festgelegt ist, ist dies ein Zeiger auf den Puffer, um das Ergebnis des Abfragevorgangs für diesen Schlüssel zu speichern. Andernfalls wird dieser Wert als EntryContext Parameter von QueryRoutineübergeben.

DefaultType

Das am wenigsten signifikante Byte dieses Elements gibt den REG_XXX- Typ der zurückgegebenen Daten an, wenn kein übereinstimmenden Schlüssel gefunden wird und das RTL_QUERY_REGISTRY_REQUIRED Flag nicht angegeben wird. Geben Sie REG_NONE für keinen Standardtyp an. Wenn das RTL_QUERY_REGISTRY_TYPECHECK Flag festgelegt ist, gibt das wichtigste Byte dieses Elements den REG_XXX- Typ des gespeicherten Registrierungswerts an, den der Aufrufer erwartet. Bits 8 bis 23 dieses Mitglieds sind reserviert und sollten null sein.

DefaultData

Ein Zeiger auf den Standardwert, der zurückgegeben werden soll, wenn kein übereinstimmende Schlüssel gefunden wird und das RTL_QUERY_REGISTRY_REQUIRED Flag nicht angegeben ist. Dieses Element wird ignoriert, wenn DefaultType = REG_NONE. Andernfalls sollte der Datentyp, auf den DefaultData- verweist, dem Registrierungswerttyp entsprechen, der vom DefaultType Member angegeben wird. Weitere Informationen zu Registrierungswerttypen finden Sie in der Definition des parameters Type in KEY_VALUE_BASIC_INFORMATION.

DefaultLength

Gibt die Länge des DefaultData--Elements in Byte an. Wenn DefaultType- REG_SZ, REG_EXPAND_SZ oder REG_MULTI_SZ ist, können Aufrufer optional Null angeben, um anzugeben, RtlQueryRegistryValues die Länge basierend auf dem Standardwert berechnen soll. Wenn DefaultType = REG_NONE, wird dieses Element ignoriert.

[in, optional] Context

Gibt den Wert an, der bei jedem Aufruf als Context-Parameter einer QueryRoutine- Funktion übergeben wird.

[in, optional] Environment

Zeiger auf die Umgebung, die beim Erweitern von Variablenwerten in REG_EXPAND_SZ Registrierungswerten oder einem NULL- Zeiger (optional) verwendet wird.

Rückgabewert

RtlQueryRegistryValues gibt einen NTSTATUS-Code zurück. Zu den möglichen Rückgabewerten gehören:

Rückgabecode Beschreibung
STATUS_SUCCESS Die gesamte Abfragetabelle wurde erfolgreich verarbeitet.
STATUS_INVALID_PARAMETER Die Verarbeitung der Abfragetabelle wurde mit einem ungültigen Tabelleneintrag beendet. Ein Tabelleneintrag kann ungültig sein, wenn für die angegebenen Flags die QueryRoutine oder Name Member nichtNULL-erforderlich ist, aber ein NULL- Wert bereitgestellt wurde.
STATUS_OBJECT_NAME_NOT_FOUND Der Path Parameter stimmt nicht mit einem gültigen Schlüssel überein, oder die Verarbeitung der Abfragetabelle wurde mit einem Eintrag mit dem RTL_QUERY_REGISTRY_REQUIRED Flagsatz beendet, und es wird kein übereinstimmenden Schlüssel gefunden. Dies tritt auf, wenn der Name Member NULL- ist und der aktuelle Schlüssel keine Unterschlüssel aufweist, oder wenn Name einen nicht vorhandenen Unterschlüssel angibt.
STATUS_BUFFER_TOO_SMALL Das RTL_QUERY_REGISTRY_DIRECT Flag wird festgelegt, und der durch EntryContext- angegebene Puffer ist zu klein, um die Schlüsselwertdaten aufzunehmen.
STATUS_OBJECT_TYPE_MISMATCH Das flag RTL_QUERY_REGISTRY_TYPECHECK ist festgelegt, und der Typ des gespeicherten Registrierungswerts stimmt nicht mit dem typ überein, der vom Aufrufer erwartet wird.

RtlQueryRegistryValues beendet auch die Verarbeitung der Tabelle, wenn die QueryRoutine--Funktion für einen Tabelleneintrag einen NTSTATUS-Fehlercode zurückgibt und diesen Fehlercode als Ergebnis zurückgibt. (Mit einer Ausnahme: Wenn QueryRoutine STATUS_BUFFER_TOO_SMALL zurückgibt, wird der Fehlercode ignoriert.)

Bemerkungen

Der Aufrufer gibt einen anfänglichen Schlüsselpfad und eine Tabelle an. Die Tabelle enthält mindestens einen Eintrag, der die Schlüsselwerte und Unterschlüsselnamen beschreibt, an denen der Aufrufer interessiert ist. Die Tabelle wird durch einen Eintrag mit einem NULL-QueryRoutine Member und einem NULLName Member beendet. Die Tabelle muss aus nicht seitengebundenen Pools zugewiesen werden.

Kernelmodustreiber müssen das RTL_QUERY_REGISTRY_NOEXPAND Flag angeben, um die Aufrufumgebungsvariablen-Routinen zu verhindern. Diese Routinen sind unsicher, sodass Kernelmodustreiber sie nicht verwenden sollten.

Vorsicht

Wenn Sie das RTL_QUERY_REGISTRY_DIRECT-Flag verwenden, kann eine nicht vertrauenswürdige Benutzermodusanwendung möglicherweise einen Pufferüberlauf verursachen. Ein Pufferüberlauf kann auftreten, wenn ein Treiber dieses Flag verwendet, um einen Registrierungswert zu lesen, dem der falsche Typ zugewiesen ist. In allen Fällen sollte ein Treiber, der das RTL_QUERY_REGISTRY_DIRECT Flag verwendet, zusätzlich das RTL_QUERY_REGISTRY_TYPECHECK Flag verwenden, um solche Überläufe zu verhindern.

Wenn das RTL_QUERY_REGISTRY_TYPECHECK Flag in einem Tabelleneintrag festgelegt ist, muss der Aufrufer den erwarteten REG_XXX- Typ in den 8 wichtigsten Bits (MSBs) des 32-Bit-DefaultType Member des Tabelleneintrags angeben. Wie im folgenden Codebeispiel gezeigt, kann die RTL_QUERY_REGISTRY_TYPECHECK_SHIFT Konstanten, die als 24 definiert ist, als schichtanzahl verwendet werden, die erforderlich ist, um den erwarteten REG_XXX Typ in den 8 MSBs des DefaultType Member zu platzieren.

RTL_QUERY_REGISTRY_TABLE QueryRegTable[2];    
...
QueryRegTable[0].DefaultType = (REG_SZ << RTL_QUERY_REGISTRY_TYPECHECK_SHIFT) | REG_NONE;
...
QueryRegTable[1].DefaultType = (REG_DWORD << RTL_QUERY_REGISTRY_TYPECHECK_SHIFT) | REG_NONE;
...

Ab Windows 8 greift ein RtlQueryRegistryValues- Anruf auf eine nicht vertrauenswürdige Struktur zu, und der Aufrufer legt das RTL_QUERY_REGISTRY_DIRECT Flag für diesen Anruf fest, muss der Aufrufer zusätzlich das RTL_QUERY_REGISTRY_TYPECHECK Flag festlegen. Ein Verstoß gegen diese Regel durch einen Aufruf aus dem Benutzermodus verursacht eine Ausnahme. Ein Verstoß gegen diese Regel durch einen Aufruf aus dem Kernelmodus führt zu einer 0x139 Fehlerüberprüfung (KERNEL_SECURITY_CHECK_FAILURE).

Nur Systemstrukturen sind vertrauenswürdig. Ein RtlQueryRegistryValues- Aufruf, der auf eine Systemstruktur zugreift, verursacht keine Ausnahme oder eine Fehlerüberprüfung, ob das RTL_QUERY_REGISTRY_DIRECT Flag festgelegt ist und das RTL_QUERY_REGISTRY_TYPECHECK Flag nicht festgelegt ist. Als bewährte Methode sollte jedoch immer das RTL_QUERY_REGISTRY_TYPECHECK-Flag festgelegt werden, wenn das RTL_QUERY_REGISTRY_DIRECT Flag festgelegt ist.

Ebenso sollte in Windows-Versionen vor Windows 8 als bewährte Methode ein RtlQueryRegistryValues- Aufruf, der das RTL_QUERY_REGISTRY_DIRECT Flag festlegt, zusätzlich das RTL_QUERY_REGISTRY_TYPECHECK Flag festlegen. Wenn Diese Empfehlung nicht befolgt wird, führt dies jedoch nicht zu einer Ausnahme oder zu einer Fehlerüberprüfung.

Es folgt eine Liste der Systemstrukturen:

  • \REGISTRY\MACHINE\HARDWARE

  • \REGISTRY\MACHINE\SOFTWARE

  • \REGISTRY\MACHINE\SYSTEM

  • \REGISTRY\MACHINE\SECURITY

  • \REGISTRY\MACHINE\SAM

Die Unterstützung für die RTL_QUERY_REGISTRY_TYPECHECK-Kennzeichnung ist über Windows Update für Windows 7, Windows Vista, Windows Server 2003 und Windows XP verfügbar. Weitere Informationen zu diesem Update finden Sie unter Sicherheitsanfälligkeiten in Windows Kernel Could Allow Elevation of Privilege (2393802). In Versionen dieser Betriebssysteme, die nicht über dieses Update verfügen, kann der Aufrufer das RTL_QUERY_REGISTRY_TYPECHECK Flag verwenden. Diese Kennzeichnung wird jedoch von der RtlQueryRegistryValues Routine ignoriert.

Ab Windows Driver Kit (WDK) 8 wird das RTL_QUERY_REGISTRY_TYPECHECK Flag in der Wdm.h-Headerdatei wie folgt definiert:

#define RTL_QUERY_REGISTRY_TYPECHECK 0x00000100

Wenn ein Eintrag das RTL_QUERY_REGISTRY_DIRECT-Flag nicht angibt, verwendet RtlQueryRegistryValues die angegebene QueryRoutine- funktion, um den Wertnamen, typ, daten und die Datenlänge an den Aufrufer zu melden. Wenn der Name Mitglied des Eintrags NULL-ist, meldet RtlQueryRegistryValues jeden direkten Unterschlüssel des Schlüssels. Wenn der Schlüsseltyp REG_MULTI_SZ und das RTL_QUERY_REGISTRY_NOEXPAND Flag nicht angegeben ist, ruft die Routine QueryRoutine separat für jede einzelne Zeichenfolge auf; andernfalls meldet die Routine sie als einzelner Wert. Wenn ein Eintrag das RTL_QUERY_REGISTRY_DIRECT-Flag angibt, speichert RtlQueryRegistryValues den Wert des Schlüssels im Puffer, auf den durch das EntryContext Member des Eintrags verwiesen wird. Das Format der zurückgegebenen Daten lautet wie folgt.

Schlüsseldatentyp Gibt an, wie Daten zurückgegeben werden
Eine mit Null beendete Unicode-Zeichenfolge (z. B. REG_SZ, REG_EXPAND_SZ). EntryContext- muss auf eine initialisierte UNICODE_STRING Struktur verweisen. Wenn das Buffer Member von UNICODE_STRINGNULL-ist, weist die Routine Speicher für die Zeichenfolgendaten zu. Andernfalls werden die Zeichenfolgendaten im Puffer gespeichert, auf die Buffer verweist.
REG_MULTI_SZ Sie müssen das kennzeichen RTL_QUERY_REGISTRY_NOEXPAND für diesen Schlüsseldatentyp angeben. EntryContext verweist auf eine initialisierte UNICODE_STRING Struktur. Die Routine speichert den Schlüsselwert als einzelnen Zeichenfolgenwert. Jede einzelne Komponente innerhalb der Zeichenfolge wird durch eine Null beendet. Wenn das Buffer Member von UNICODE_STRINGNULL-ist, weist die Routine Speicher für die Zeichenfolgendaten zu. Andernfalls werden die Zeichenfolgendaten im Puffer gespeichert, auf die Buffer verweist.
Daten ohne Zeichenfolge mit Größe in Bytes <= Größe des(ULONG) Der Wert wird an dem durch EntryContextangegebenen Speicherspeicherort gespeichert.
Nichtzeichenfolgendaten mit Größe in Byte >Größe von(ULONG) Der Puffer, auf den EntryContext verweist muss mit einem signierten LONG-Wert beginnen. Die Größe des Werts muss die Größe des Puffers in Bytes angeben. Wenn das Vorzeichen des Werts negativ ist, speichert RtlQueryRegistryValues nur die Daten des Schlüsselwerts. Andernfalls wird der erste ULONG-Wert im Puffer verwendet, um die Wertlänge in Bytes, die zweite ULONG zum Aufzeichnen des Werttyps und den rest des Puffers zum Speichern der Wertdaten zu verwenden.

Wenn ein Fehler in einer Phase der Verarbeitung der Abfragetabelle auftritt, RtlQueryRegistryValues beendet die Verarbeitung der Tabelle und gibt den Fehlerstatus zurück.

Eine Beschreibung der möglichen REG_XXX- finden Sie unter ZwSetValueKey-.

Anforderungen

Anforderung Wert
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library Ntoskrnl.lib
DLL- Ntoskrnl.exe
IRQL- PASSIVE_LEVEL

Siehe auch

QueryRoutine-

RtlZeroMemory

UNICODE_STRING

ZwEnumerateKey

ZwEnumerateValueKey

ZwSetValueKey-