Freigeben über


NtQueryDirectoryFileEx-Funktion (ntifs.h)

Die NtQueryDirectoryFileEx Routine gibt verschiedene Arten von Informationen zu Dateien im verzeichnis zurück, das durch ein bestimmtes Dateihandle angegeben wird.

Syntax

__kernel_entry NTSYSCALLAPI NTSTATUS NtQueryDirectoryFileEx(
  [in]           HANDLE                 FileHandle,
  [in, optional] HANDLE                 Event,
  [in, optional] PIO_APC_ROUTINE        ApcRoutine,
  [in, optional] PVOID                  ApcContext,
  [out]          PIO_STATUS_BLOCK       IoStatusBlock,
  [out]          PVOID                  FileInformation,
  [in]           ULONG                  Length,
                 FILE_INFORMATION_CLASS FileInformationClass,
  [in]           ULONG                  QueryFlags,
  [in, optional] PUNICODE_STRING        FileName
);

Parameter

[in] FileHandle

Ein Handle, das von NtCreateFile oder NtOpenFile- für das Dateiobjekt zurückgegeben wird, das das Verzeichnis darstellt, für das Informationen angefordert werden. Das Dateiobjekt muss für asynchrone E/A geöffnet worden sein, wenn der Aufrufer einen Wert ungleich NULL für Event oder ApcRoutine-angibt.

[in, optional] Event

Ein optionales Handle für ein vom Aufrufer erstelltes Ereignis. Wenn dieser Parameter angegeben wird, wird der Aufrufer in einen Wartezustand versetzt, bis der angeforderte Vorgang abgeschlossen ist und das angegebene Ereignis auf den Status "Signaled" festgelegt ist. Dieser Parameter ist optional und kann NULL sein. Er muss NULL sein, wenn der Aufrufer auf die FileHandle- auf den Signalstatus festgelegt wird.

[in, optional] ApcRoutine

Eine Adresse einer optionalen, vom Aufrufer bereitgestellten APC-Routine, die aufgerufen werden soll, wenn der angeforderte Vorgang abgeschlossen ist. Dieser Parameter ist optional und kann NULL sein. Wenn dem Dateiobjekt ein E/A-Vervollständigungsobjekt zugeordnet ist, muss dieser Parameter NULL sein.

[in, optional] ApcContext

Ein optionaler Zeiger auf einen vom Aufrufer bestimmten Kontextbereich, wenn der Aufrufer ein APC bereitstellt oder ein E/A-Vervollständigungsobjekt dem Dateiobjekt zugeordnet ist. Wenn der Vorgang abgeschlossen ist, wird dieser Kontext an das APC übergeben, wenn eins angegeben wurde, oder als Teil der Abschlussmeldung enthalten ist, die der E/A-Manager an das zugeordnete E/A-Abschlussobjekt sendet.

Dieser Parameter ist optional und kann NULL sein. Es muss NULL sein, wenn ApcRoutine- NULL ist und dem Dateiobjekt kein E/A-Vervollständigungsobjekt zugeordnet ist.

[out] IoStatusBlock

Ein Zeiger auf eine IO_STATUS_BLOCK Struktur, die den endgültigen Abschlussstatus und Informationen zum Vorgang empfängt. Bei erfolgreichen Aufrufen, die Daten zurückgeben, wird die Anzahl der In den FileInformation Puffer geschriebenen Bytes im Information Member der Struktur zurückgegeben.

[out] FileInformation

Ein Zeiger auf einen Ausgabepuffer, der die gewünschten Informationen zur Datei empfängt. Die Struktur der im Puffer zurückgegebenen Informationen wird durch den parameter FileInformationClass definiert.

[in] Length

Die Größe des Puffers in Byte, auf den FileInformationverweist. Der Aufrufer sollte diesen Parameter gemäß der angegebenen FileInformationClassfestlegen.

FileInformationClass

Der Informationstyp, der über Dateien im Verzeichnis zurückgegeben werden soll. Typ der Informationen, die über Dateien im Verzeichnis zurückgegeben werden sollen. FileInformationClass- kann einer der folgenden FILE_INFORMATION_CLASS Werte sein.

Wert Bedeutung
FileDirectoryInformation (1) Gibt eine FILE_DIRECTORY_INFORMATION Struktur für jede Datei zurück.
FileFullDirectoryInformation (2) Gibt eine FILE_FULL_DIR_INFORMATION Struktur für jede Datei zurück.
FileBothDirectoryInformation (3) Gibt eine FILE_BOTH_DIR_INFORMATION Struktur für jede Datei zurück.
FileNamesInformation- (12) Gibt eine FILE_NAMES_INFORMATION Struktur für jede Datei zurück.
FileObjectIdInformation- (29) Gibt eine FILE_OBJECTID_INFORMATION Struktur für jede Datei zurück, die über eine Objekt-ID auf dem Volume verfügt. Diese Informationsklasse ist nur für das spezielle Verzeichnis "\$Extend\$ObjId:$O:$INDEX_ALLOCATION" auf NTFS-Volumes gültig.
FileQuotaInformation- (32) Gibt eine einzelne FILE_QUOTA_INFORMATION Struktur für jeden Benutzer auf dem Volume zurück, auf das Kontingente angewendet wurden. Diese Informationsklasse ist nur für das spezielle Verzeichnis "\$Extend\$Quota:$Q:$INDEX_ALLOCATION" auf NTFS-Volumes gültig.
FileReparsePointInformation (33) Gibt eine einzelne FILE_REPARSE_POINT_INFORMATION Struktur für jede Datei zurück, die einen Analysepunkt auf dem Volume enthält. Diese Informationsklasse ist nur für das spezielle Verzeichnis "\$Extend\$Reparse:$R:$INDEX_ALLOCATION" auf NTFS- und ReFS-Volumes gültig.
FileIdBothDirectoryInformation (37) Gibt eine FILE_ID_BOTH_DIR_INFORMATION Struktur für jede Datei zurück.
FileIdFullDirectoryInformation (38) Gibt eine FILE_ID_FULL_DIR_INFORMATION Struktur für jede Datei zurück.
FileIdGlobalTxDirectoryInformation (50) Gibt eine FILE_ID_GLOBAL_TX_DIR_INFORMATION Struktur für jede Datei zurück.
FileIdExtdDirectoryInformation (60) Gibt eine FILE_ID_EXTD_DIR_INFORMATION Struktur für jede Datei zurück.
FileIdExtdBothDirectoryInformation (63) Gibt eine FILE_ID_EXTD_BOTH_DIR_INFORMATION Struktur für jede Datei zurück.

[in] QueryFlags

Mindestens eine der Flags, die in SL_QUERY_DIRECTORY_MASK enthalten sind. Mögliche Werte werden in der folgenden Tabelle angegeben.

Wert Bedeutung
SL_RESTART_SCAN (0x00000001) Die Überprüfung beginnt beim ersten Eintrag im Verzeichnis. Wenn diese Kennzeichnung nicht festgelegt ist, wird die Überprüfung von dem Ort fortgesetzt, an dem die letzte Abfrage beendet wurde.
SL_RETURN_SINGLE_ENTRY (0x00000002) Normalerweise ist der Rückgabepuffer mit so vielen übereinstimmenden Verzeichniseinträgen verpackt, die passen. Wenn dieses Flag festgelegt ist, gibt das Dateisystem jeweils nur einen Verzeichniseintrag zurück. Dadurch wird der Vorgang weniger effizient.
SL_INDEX_SPECIFIED (0x00000004) Der Scan sollte an einer angegebenen indizierten Position im Verzeichnis beginnen. Diese Kennzeichnung kann nur festgelegt werden, wenn Sie eigene IRP_MJ_DIRECTORY_CONTROL IRP generieren; der Index wird im IRP angegeben. Die Angabe der Position variiert von Dateisystem zu Dateisystem.
SL_RETURN_ON_DISK_ENTRIES_ONLY (0x00000008) Alle Dateisystemfilter, die die Verzeichnisvirtualisierung oder just-in-time-Erweiterung durchführen, sollten einfach die Anforderung an das Dateisystem übergeben und Einträge zurückgeben, die sich derzeit auf dem Datenträger befinden. Nicht alle Dateisysteme unterstützen dieses Flag.
SL_NO_CURSOR_UPDATE_QUERY (0x00000010) Dateisysteme verwalten Informationen zum Verzeichniscursor pro FileObject. Wenn mehrere Threads Abfragen mit demselben FileObject ausführen, wird der Zugriff auf die Struktur pro FileObject einzelner Thread ausgeführt, um Beschädigungen des Cursorzustands zu verhindern. Dieses Flag weist das Dateisystem an, die Cursorstatusinformationen pro FileObject nicht zu aktualisieren, sodass mehrere Threads parallel mit demselben Handle abgefragt werden können. Es verhält sich so, als ob SL_RESTART_SCAN für jeden Anruf angegeben wird. Wenn beim nächsten Aufruf ein Wildcardmuster angegeben wird, wird der Vorgang nicht an der Stelle aufgenommen, an der die letzte Abfrage beendet wurde. Dies ermöglicht die asynchrone Unterstützung von Verzeichnisabfragen. Wenn dieses Flag in einer TxF-Transaktion verwendet wird, schlägt der Vorgang fehl. Nicht alle Dateisysteme unterstützen dieses Flag.

[in, optional] FileName

Ein optionaler Zeiger auf eine vom Aufrufer zugewiesene Unicode-Zeichenfolge mit dem Namen einer Datei (oder mehrerer Dateien, wenn Wildcards verwendet werden) innerhalb des durch FileHandleangegebenen Verzeichnis. Dieser Parameter ist optional:

  • Wenn FileName- nicht NULL ist, werden nur Dateien, deren Namen der FileName- Zeichenfolge entsprechen, in die Verzeichnisüberprüfung einbezogen.
  • Wenn FileName- NULL ist:
    • Wenn SL_RETURN_SINGLE_ENTRY nicht in QueryFlags-festgelegt ist, werden alle Dateien eingeschlossen.
    • Wenn SL_RETURN_SINGLE_ENTRY festgelegt ist, ist nur eine Datei enthalten.

Die FileName- wird als Suchausdruck verwendet und wird beim ersten Aufruf von NtQueryDirectoryFileEx für ein bestimmtes Handle erfasst. Nachfolgende Aufrufe von NtQueryDirectoryFileEx verwenden den suchausdruckssatz im ersten Aufruf. Der FileName Parameter, der an nachfolgende Aufrufe übergeben wird, wird ignoriert.

Rückgabewert

NtQueryDirectoryFileEx- gibt STATUS_SUCCESS oder einen entsprechenden Fehlerstatus zurück. Der Satz von Fehlerstatuswerten, die zurückgegeben werden können, ist dateisystemspezifisch. NtQueryDirectoryFileEx gibt auch die Anzahl der Bytes zurück, die tatsächlich in den angegebenen FileInformation Puffer im Information Member von IoStatusBlockgeschrieben wurden. Einige mögliche Fehlercodes und Gründe sind u. U. die folgenden:

Rückgabecode Bedeutung
STATUS_BUFFER_OVERFLOW Der Ausgabepuffer ist nicht groß genug, um den vollständigen Dateinamen zurückzugeben.
STATUS_BUFFER_TOO_SMALL Der Ausgabepuffer ist nicht groß genug, um mindestens die basisstruktur, die durch FileInformationClassidentifiziert wird.
STATUS_INVALID_INFO_CLASS Eine ungültige FileInformationClass angegeben wurde, oder die Informationsklasse gilt nur für eine spezielle Bedingung (z. B. nur für ein spezielles Verzeichnis gültig).
STATUS_INVALID_PARAMETER Einer der Parameter ist für das Dateisystem ungültig.

Bemerkungen

NtQueryDirectoryFileEx Gibt Informationen zu Dateien zurück, die im Verzeichnis enthalten sind, das durch FileHandle-dargestellt wird.

Wenn angegeben, bestimmt FileName die Einträge, die in der Verzeichnisüberprüfung für alle nachfolgenden Aufrufe von NtQueryDirectoryFileEx für eine bestimmte FileHandle-enthalten sind.

Wenn mindestens ein übereinstimmende Eintrag vorhanden ist, erstellt NtQueryDirectoryFileEx eine FILE_XXX-_INFORMATION struktur für jeden Eintrag und speichert sie im Puffer.

Vorausgesetzt, dass mindestens ein übereinstimmener Verzeichniseintrag gefunden wird, ist die Anzahl der Einträge, für die Informationen zurückgegeben werden, die kleinsten der folgenden:

  • Ein Eintrag, wenn SL_RETURN_SINGLE_ENTRY in QueryFlags- und FileName- NULL ist.
  • Die Anzahl der Einträge, die der FileName- Zeichenfolge entsprechen, wenn FileName- nicht NULL ist. Wenn die Zeichenfolge keine Wildcards enthält, kann es höchstens einen übereinstimmenden Eintrag geben.
  • Die Anzahl der Einträge, deren Informationen in den angegebenen Puffer passen.
  • Die Anzahl der Einträge im Verzeichnis.

Wenn beim ersten Aufruf von NtQueryDirectoryFileExdie für den ersten gefundenen Eintrag erstellte Struktur zu groß ist, um in den Ausgabepuffer einzupassen, führt diese Routine folgendes aus:

  • Schreibt den festen Teil der Struktur in FileInformationAusgabepuffers. Der feste Teil besteht aus allen Feldern mit Ausnahme der endgültigen FileName- Zeichenfolge. Im ersten Aufruf, aber nicht bei nachfolgenden Aufrufen, stellt das E/A-System sicher, dass der Puffer groß genug ist, um den festen Teil der entsprechenden FILE_XXX-_INFORMATION Struktur zu halten.
  • Schreibt in den Ausgabepuffer so viele der FileName- Zeichenfolge, wie sie passen.
  • Gibt einen geeigneten Statuswert wie STATUS_BUFFER_OVERFLOW zurück.

Bei jedem Aufruf gibt NtQueryDirectoryFileEx so viele FILE_XXX-_INFORMATION Strukturen (einen pro Verzeichniseintrag) zurück, wie sie vollständig im Puffer enthalten sein können, auf den FileInformationverweist:

  • Beim ersten Aufruf gibt NtQueryDirectoryFileEx nur dann STATUS_SUCCESS zurück, wenn der Ausgabepuffer mindestens eine vollständige Struktur enthält.
  • Wenn der Ausgabepuffer bei nachfolgenden Aufrufen keine Strukturen enthält, gibt NtQueryDirectoryFileEx STATUS_SUCCESS zurück, legt jedoch IoStatusBlock-fest –>Information = 0, um den Aufrufer dieser Bedingung zu benachrichtigen. In diesem Fall sollte der Aufrufer einen größeren Puffer zuweisen und NtQueryDirectoryFileEx erneut aufrufen. Es werden keine Informationen zu verbleibenden Einträgen gemeldet. Mit Ausnahme der oben aufgeführten Fälle, in denen nur ein Eintrag zurückgegeben wird, muss NtQueryDirectoryFileEx- mindestens zweimal aufgerufen werden, um den Inhalt eines gesamten Verzeichnisses aufzählen zu können.

Beim Aufrufen von NtQueryDirectoryFileExwerden möglicherweise Änderungen am Verzeichnis angezeigt, die parallel zu NtQueryDirectoryFileEx- Aufrufen vorgenommen werden. Dieses Verhalten hängt von der Implementierung des zugrunde liegenden Dateisystems ab.

Der letzte Aufruf von NtQueryDirectoryFileEx gibt einen leeren Ausgabepuffer zurück und meldet einen geeigneten Statuswert wie STATUS_NO_MORE_FILES.

Wenn NtQueryDirectoryFileEx- mehrmals im selben Verzeichnis aufgerufen wird und ein anderer Vorgang den Inhalt dieses Verzeichnisses ändert, werden alle Änderungen je nach Anzeigedauer der Vorgänge möglicherweise oder nicht angezeigt.

NtQueryDirectoryFileEx gibt null in einem Element einer FILE_XXX-_INFORMATION-Struktur zurück, die vom Dateisystem nicht unterstützt wird.

Aufrufer von NtQueryDirectoryFileEx- müssen unter IRQL = PASSIVE_LEVEL und mit speziellen Kernel-APCs ausgeführt werden, dieaktiviert sind.

Informationen zu anderen Dateiinformationsabfrageroutinen finden Sie unter File Objects.

Anmerkung

Wenn der Aufruf der NtQueryDirectoryFileEx--Funktion im Kernelmodus auftritt, sollten Sie den Namen "ZwQueryDirectoryFileEx" anstelle von "NtQueryDirectoryFileEx" verwenden.

Bei Aufrufen von Kernelmodustreibern können sich die NtXxx und ZwXxx- Versionen einer Windows Native System Services-Routine anders verhalten, wie sie Eingabeparameter behandeln und interpretieren. Weitere Informationen zur Beziehung zwischen den NtXxx und ZwXxx- Versionen einer Routine finden Sie unter Using Nt and Zw Versions of the Native System Services Routines.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 10, Version 1709
Header- ntifs.h
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- PASSIVE_LEVEL (siehe Abschnitt "Hinweise")

Siehe auch

FILE_BOTH_DIR_INFORMATION

FILE_DIRECTORY_INFORMATION

FILE_FULL_DIR_INFORMATION

FILE_ID_BOTH_DIR_INFORMATION

FILE_ID_FULL_DIR_INFORMATION

FILE_NAMES_INFORMATION

FILE_OBJECTID_INFORMATION

FILE_REPARSE_POINT_INFORMATION

UNICODE_STRING

Verwenden von Nt- und Zw-Versionen der systemeigenen Systemdienste-Routinen

ZwCreateFile-

ZwOpenFile-