ZwCreateFile-Funktion (wdm.h)

Die ZwCreateFile-Routine erstellt eine neue Datei oder öffnet eine vorhandene Datei.

Syntax

NTSYSAPI NTSTATUS ZwCreateFile(
  [out]          PHANDLE            FileHandle,
  [in]           ACCESS_MASK        DesiredAccess,
  [in]           POBJECT_ATTRIBUTES ObjectAttributes,
  [out]          PIO_STATUS_BLOCK   IoStatusBlock,
  [in, optional] PLARGE_INTEGER     AllocationSize,
  [in]           ULONG              FileAttributes,
  [in]           ULONG              ShareAccess,
  [in]           ULONG              CreateDisposition,
  [in]           ULONG              CreateOptions,
  [in, optional] PVOID              EaBuffer,
  [in]           ULONG              EaLength
);

Parameter

[out] FileHandle

Ein Zeiger auf eine HANDLE-Variable, die ein Handle für die Datei empfängt.

[in] DesiredAccess

Gibt einen ACCESS_MASK Wert an, der den angeforderten Zugriff auf das Objekt bestimmt. Zusätzlich zu den Zugriffsrechten, die für alle Arten von Objekten definiert sind, kann der Aufrufer eine der folgenden Zugriffsrechte angeben, die für Dateien spezifisch sind.

ACCESS_MASK Flag Ermöglicht dem Aufrufer, dies zu tun
FILE_READ_DATA Liest Daten aus der Datei.
FILE_READ_ATTRIBUTES Lesen Sie die Attribute der Datei. (Weitere Informationen finden Sie in der Beschreibung des FileAttributes-Parameters .)
FILE_READ_EA Lesen Sie die erweiterten Attribute (EAs) der Datei. Dieses Flag ist für Geräte- und Zwischentreiber irrelevant.
FILE_WRITE_DATA Schreiben Sie Daten in die Datei.
FILE_WRITE_ATTRIBUTES Schreiben Sie die Attribute der Datei. (Weitere Informationen finden Sie in der Beschreibung des FileAttributes-Parameters .)
FILE_WRITE_EA Ändern Sie die erweiterten Attribute (EAs) der Datei. Dieses Flag ist für Geräte- und Zwischentreiber irrelevant.
FILE_APPEND_DATA Fügen Sie daten an die Datei an.
FILE_EXECUTE Verwenden Sie system paging-E/A, um Daten aus der Datei in den Arbeitsspeicher zu lesen. Dieses Flag ist für Geräte- und Zwischentreiber irrelevant.

Geben Sie beim Erstellen oder Öffnen eines Verzeichnisses keine FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATA oder FILE_EXECUTE an.

Der Aufrufer kann nur ein generisches Zugriffsrecht angeben, GENERIC_XXX, für eine Datei, nicht für ein Verzeichnis. Generische Zugriffsrechte entsprechen bestimmten Zugriffsrechten, wie in der folgenden Tabelle dargestellt.

Generisches Zugriffsrecht Satz bestimmter Zugriffsrechte
GENERIC_READ STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA und SYNCHRONIZE.
GENERIC_WRITE STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA und SYNCHRONIZE.
GENERIC_EXECUTE STANDARD_RIGHTS_EXECUTE, FILE_EXECUTE, FILE_READ_ATTRIBUTES und SYNCHRONIZE. Dieser Wert ist für Geräte- und Zwischentreiber irrelevant.
GENERIC_ALL FILE_ALL_ACCESS.

Wenn Sie beispielsweise GENERIC_READ für ein Dateiobjekt angeben, ordnet die Routine diesen Wert der FILE_GENERIC_READ Bitmaske bestimmter Zugriffsrechte zu. In der vorherigen Tabelle entsprechen die spezifischen Zugriffsrechte, die für GENERIC_READ aufgeführt sind, den Zugriffsflags, die in der FILE_GENERIC_READ Bitmaske enthalten sind.

Wenn die Datei tatsächlich ein Verzeichnis ist, kann der Aufrufer auch die folgenden generischen Zugriffsrechte angeben.

DesiredAccess-Flag Ermöglicht dem Aufrufer, dies zu tun
FILE_LIST_DIRECTORY Listen Sie die Dateien im Verzeichnis auf.
FILE_TRAVERSE Durchqueren Sie das Verzeichnis, d. h. schließen Sie das Verzeichnis in den Pfad einer Datei ein.

Weitere Informationen zu Zugriffsrechten finden Sie unter ACCESS_MASK.

[in] ObjectAttributes

Ein Zeiger auf eine OBJECT_ATTRIBUTES-Struktur , die den Objektnamen und andere Attribute angibt. Verwenden Sie InitializeObjectAttributes , um diese Struktur zu initialisieren. Wenn der Aufrufer nicht in einem Systemthreadkontext ausgeführt wird, muss er das attribut OBJ_KERNEL_HANDLE festlegen, wenn initializeObjectAttributes aufgerufen wird.

[out] IoStatusBlock

Ein Zeiger auf eine IO_STATUS_BLOCK-Struktur, die die endgültige Vervollständigung status und andere Informationen zum angeforderten Vorgang empfängt. Insbesondere erhält das Information-Element einen der folgenden Werte:

  • FILE_CREATED

  • FILE_OPENED

  • FILE_OVERWRITTEN

  • FILE_SUPERSEDED

  • FILE_EXISTS

  • FILE_DOES_NOT_EXIST

[in, optional] AllocationSize

Ein Zeiger auf einen LARGE_INTEGER, der die anfängliche Zuordnungsgröße in Bytes für eine datei enthält, die erstellt oder überschrieben wird. Wenn AllocationSizeNULL ist, wird keine Zuordnungsgröße angegeben. Wenn keine Datei erstellt oder überschrieben wird, wird AllocationSize ignoriert.

[in] FileAttributes

Gibt mindestens ein FILE_ATTRIBUTE_XXX-Flags an, die die Dateiattribute darstellen, die beim Erstellen oder Überschreiben einer Datei festgelegt werden sollen. Der Aufrufer gibt normalerweise FILE_ATTRIBUTE_NORMAL an, wodurch die Standardattribute festgelegt werden. Eine Liste der gültigen FILE_ATTRIBUTE_XXX-Flags finden Sie in der CreateFile-Routine . Wenn keine Datei erstellt oder überschrieben wird, wird FileAttributes ignoriert.

[in] ShareAccess

Typ des Freigabezugriffs, der als Null oder eine beliebige Kombination der folgenden Flags angegeben wird.

ShareAccess-Flag Ermöglicht es anderen Threads, dies zu tun
FILE_SHARE_READ Lesen der Datei
FILE_SHARE_WRITE Schreiben der Datei
FILE_SHARE_DELETE Löschen der Datei

Geräte- und Zwischentreiber legen ShareAccess in der Regel auf 0 fest, wodurch der Aufrufer exklusiven Zugriff auf die geöffnete Datei erhält.

[in] CreateDisposition

Gibt die Aktion an, die ausgeführt werden soll, wenn die Datei vorhanden ist oder nicht vorhanden ist. CreateDisposition kann einer der Werte in der folgenden Tabelle sein.

CreateDisposition-Wert Aktion, wenn die Datei vorhanden ist Aktion, wenn die Datei nicht vorhanden ist
FILE_SUPERSEDE Ersetzen Sie die Datei. Erstellen Sie die Datei.
FILE_CREATE Gibt einen Fehler zurück. Erstellen Sie die Datei.
FILE_OPEN Öffnen Sie die Datei. Gibt einen Fehler zurück.
FILE_OPEN_IF Öffnen Sie die Datei. Erstellen Sie die Datei.
FILE_OVERWRITE Öffnen Sie die Datei, und überschreiben Sie sie. Gibt einen Fehler zurück.
FILE_OVERWRITE_IF Öffnen Sie die Datei, und überschreiben Sie sie. Erstellen Sie die Datei.

[in] CreateOptions

Gibt die Optionen an, die angewendet werden sollen, wenn der Treiber die Datei erstellt oder öffnet. Verwenden Sie mindestens eines der Flags in der folgenden Tabelle.

CreateOptions-Flag Bedeutung
FILE_DIRECTORY_FILE Die Datei ist ein Verzeichnis. Kompatible CreateOptions-Flags sind FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT und FILE_OPEN_BY_FILE_ID. Der CreateDisposition-Parameter muss auf FILE_CREATE, FILE_OPEN oder FILE_OPEN_IF festgelegt werden.
FILE_NON_DIRECTORY_FILE Die Datei ist kein Verzeichnis. Das zu öffnende Dateiobjekt kann eine Datendatei darstellen. ein logisches, virtuelles oder physisches Gerät; oder ein Volume.
FILE_WRITE_THROUGH Systemdienste, Dateisystemtreiber und Treiber, die Daten in die Datei schreiben, müssen die Daten tatsächlich in die Datei übertragen, bevor ein angeforderter Schreibvorgang als abgeschlossen betrachtet wird.
FILE_SEQUENTIAL_ONLY Der gesamte Zugriff auf die Datei erfolgt sequenziell.
FILE_RANDOM_ACCESS Der Zugriff auf die Datei kann zufällig erfolgen, sodass keine sequenziellen Read-Ahead-Vorgänge von Dateisystemtreibern oder vom System ausgeführt werden sollten.
FILE_NO_INTERMEDIATE_BUFFERING Die Datei kann nicht in den internen Puffern eines Treibers zwischengespeichert oder gepuffert werden. Dieses Flag ist mit dem FILE_APPEND_DATA-Flag des DesiredAccess-Parameters nicht kompatibel.
FILE_SYNCHRONOUS_IO_ALERT Alle Vorgänge für die Datei werden synchron ausgeführt. Jede Wartezeit im Namen des Anrufers unterliegt einer vorzeitigen Beendigung von Warnungen. Dieses Flag bewirkt auch, dass das E/A-System den Dateipositionszeiger verwaltet. Wenn dieses Flag festgelegt ist, muss das SYNCHRONIZE-Flag im DesiredAccess-Parameter festgelegt werden.
FILE_SYNCHRONOUS_IO_NONALERT Alle Vorgänge für die Datei werden synchron ausgeführt. Wartezeiten im System, die E/A-Warteschlangen und Abschluss synchronisieren, unterliegen keinen Warnungen. Dieses Flag bewirkt auch, dass das E/A-System den Dateipositionskontext verwaltet. Wenn dieses Flag festgelegt ist, muss das SYNCHRONIZE-Flag im DesiredAccess-Parameter festgelegt werden.
FILE_CREATE_TREE_CONNECTION Erstellen Sie eine Strukturverbindung für diese Datei, um sie über das Netzwerk zu öffnen. Dieses Flag wird von Geräte- und Zwischentreibern nicht verwendet.
FILE_COMPLETE_IF_OPLOCKED Schließen Sie diesen Vorgang sofort mit einem alternativen Erfolgscode STATUS_OPLOCK_BREAK_IN_PROGRESS ab, wenn die Zieldatei opportunistisch gesperrt (Oplock) ist, anstatt den Thread des Aufrufers zu blockieren. Wenn die Datei oplocked ist, hat bereits ein anderer Aufrufer Zugriff auf die Datei. Dieses Flag wird von Geräte- und Zwischentreibern nicht verwendet. Informationen zu Oplock finden Sie unter Opportunistische Sperren.
FILE_NO_EA_KNOWLEDGE Wenn die erweiterten Attribute (EAs) für eine vorhandene Datei, die geöffnet wird, angeben, dass der Aufrufer EAs verstehen muss, um die Datei ordnungsgemäß zu interpretieren, sollte ZwCreateFile einen Fehler zurückgeben. Dieses Flag ist für Geräte- und Zwischentreiber irrelevant.
FILE_OPEN_REPARSE_POINT Öffnen Sie eine Datei mit einem Analysepunkt, und umgehen Sie die normale Analysepunktverarbeitung für die Datei. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise". Informationen zum Analysepunkt finden Sie unter Analysepunkte.
FILE_DELETE_ON_CLOSE Das System löscht die Datei, wenn das letzte Handle an die Datei an ZwClose übergeben wird. Wenn dieses Flag festgelegt ist, muss das DELETE-Flag im DesiredAccess-Parameter festgelegt werden.
FILE_OPEN_BY_FILE_ID Der durch den ObjectAttributes-Parameter angegebene Dateiname enthält je nach Dateisystem wie unten dargestellt eine binäre 8-Byte- oder 16-Byte-Dateireferenznummer oder Objekt-ID für die Datei. Optional kann ein Gerätename, gefolgt von einem umgekehrten Schrägstrich, diese binären Werte fortsetzen. Ein Gerätename hat beispielsweise das folgende Format:

?? \C:\FileID
\device\HardDiskVolume1\ObjectID

Wobei FileID 8 Bytes und ObjectID 16 Bytes ist.

Unter NTFS kann dies eine 8-Byte- oder 16-Byte-Referenznummer oder Objekt-ID sein. Eine 16-Byte-Verweisnummer entspricht einer 8-Byte-Zahl, die mit Nullen aufgefüllt ist.

Bei ReFS kann dies eine 8-Byte- oder 16-Byte-Referenznummer sein. Eine 16-Byte-Zahl steht nicht im Zusammenhang mit einer 8-Byte-Zahl. Objekt-IDs werden nicht unterstützt.

Die Dateisysteme FAT, ExFAT, UDFS und CDFS unterstützen dieses Flag nicht.

Diese Nummer wird von und spezifisch für das jeweilige Dateisystem zugewiesen.

Da das Feld "dateiname" teilweise ein binäres Blob enthält, ist es falsch anzunehmen, dass es sich um eine gültige Unicode-Zeichenfolge handelt, und noch wichtiger ist, dass es sich nicht um eine Zeichenfolge mit NULL-Beendigung handelt.
FILE_OPEN_FOR_BACKUP_INTENT Die Datei wird für die Sicherungsabsicht geöffnet. Daher sollte das System bestimmte Zugriffsrechte überprüfen und dem Aufrufer den entsprechenden Zugriff auf die Datei gewähren– bevor der DesiredAccess-Parameter mit dem Sicherheitsdeskriptor der Datei überprüft wird. Dieses Flag wird von Geräte- und Zwischentreibern nicht verwendet.
FILE_RESERVE_OPFILTER Mit diesem Flag kann eine Anwendung eine opportunistische Filtersperre (Oplock) anfordern, um zu verhindern, dass andere Anwendungen Freigabeverletzungen erhalten. Wenn bereits geöffnete Handles vorhanden sind, schlägt die Erstellungsanforderung mit STATUS_OPLOCK_NOT_GRANTED fehl. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise". Informationen zu Oplock finden Sie unter Opportunistische Sperren.
FILE_OPEN_REQUIRING_OPLOCK Die Datei wird geöffnet, und eine opportunistische Sperre (Oplock) für die Datei wird als einzelner atomischer Vorgang angefordert. Das Dateisystem sucht nach Oplocks, bevor der Erstellungsvorgang ausgeführt wird, und schlägt beim Erstellen mit dem Rückgabecode STATUS_CANNOT_BREAK_OPLOCK fehl, wenn das Ergebnis einen vorhandenen Oplock unterbrechen würde.

Das flag FILE_OPEN_REQUIRING_OPLOCK ist unter Windows 7, Windows Server 2008 R2 und höher unter Windows verfügbar.
FILE_SESSION_AWARE Der Client, der die Datei oder das Gerät öffnet, ist sitzungsfähig, und der Zugriff pro Sitzung wird bei Bedarf überprüft.

Das flag FILE_SESSION_AWARE ist abWindows 8 verfügbar.

[in, optional] EaBuffer

Für Geräte- und Zwischentreiber muss dieser Parameter ein NULL-Zeiger sein.

[in] EaLength

Für Geräte- und Zwischentreiber muss dieser Parameter null sein.

Rückgabewert

ZwCreateFile gibt STATUS_SUCCESS bei Erfolg oder einen entsprechenden NTSTATUS-Fehlercode bei Einem Fehler zurück. Im letzteren Fall kann der Aufrufer die Ursache des Fehlers ermitteln, indem er den IoStatusBlock-Parameter überprüft.

ZwCreateFile gibt möglicherweise STATUS_FILE_LOCK_CONFLICT als Rückgabewert oder im Status-Element der IO_STATUS_BLOCK-Struktur zurück, auf die der IoStatusBlock-Parameter verweist. Dies tritt nur auf, wenn die NTFS-Protokolldatei voll ist und ein Fehler auftritt, während ZwCreateFile versucht, diese Situation zu behandeln.

Hinweise

ZwCreateFile stellt ein Handle bereit, mit dem der Aufrufer die Daten einer Datei oder den Zustand und die Attribute des Dateiobjekts bearbeiten kann. Weitere Informationen finden Sie unter Verwenden von Dateien in einem Treiber.

Sobald das Handle, auf das von FileHandle verwiesen wird, nicht mehr verwendet wird, muss der Treiber ZwClose aufrufen, um es zu schließen.

Wenn der Aufrufer nicht in einem Systemthreadkontext ausgeführt wird, muss sichergestellt werden, dass es sich bei allen von ihr erstellten Handles um private Handles handelt. Andernfalls kann der Prozess, in dessen Kontext der Treiber ausgeführt wird, auf das Handle zugreifen. Weitere Informationen finden Sie unter Objekthandles.

Es gibt zwei alternative Möglichkeiten, den Namen der Datei anzugeben, die mit ZwCreateFile erstellt oder geöffnet werden soll:

  1. Als vollqualifizierter Pfadname, der im ObjectName-Element der Eingabe ObjectAttributes angegeben wird.

  2. Als Pfadname relativ zur Verzeichnisdatei, die durch das Handle im RootDirectory-Element der ObjectAttributes-Eingabe dargestellt wird.

Das Festlegen bestimmter Flags im DesiredAccess-Parameter führt zu den folgenden Auswirkungen:

  • Damit ein Aufrufer eine E/A-Vervollständigung synchronisieren kann, indem er auf die zurückgegebene FileHandle wartet, muss das SYNCHRONIZE-Flag festgelegt werden. Andernfalls muss ein Aufrufer, der ein Geräte- oder Zwischentreiber ist, eine E/A-Vervollständigung mithilfe eines Ereignisobjekts synchronisieren.

  • Wenn der Aufrufer nur die Flags FILE_APPEND_DATA und SYNCHRONIZE festlegt, kann er nur am Ende der Datei schreiben, und alle Offsetinformationen zu Schreibvorgängen in die Datei werden ignoriert. Die Datei wird bei Bedarf für diesen Vorgangstyp automatisch erweitert.

  • Durch das Festlegen des FILE_WRITE_DATA-Flags für eine Datei kann der Aufrufer auch über das Ende der Datei hinaus schreiben. Auch hier wird die Datei bei Bedarf automatisch erweitert.

  • Wenn der Aufrufer nur die flags FILE_EXECUTE und SYNCHRONIZE festlegt, kann er keine Daten direkt in die Datei lesen oder schreiben, indem er das zurückgegebene FileHandle verwendet. Das heißt, alle Vorgänge für die Datei erfolgen über den System-Pager als Reaktion auf Anweisungen und Datenzugriffsvorgänge. Geräte- und Zwischentreiber sollten das flag FILE_EXECUTE nicht festlegen.

Der ShareAccess-Parameter bestimmt, ob separate Threads möglicherweise gleichzeitig auf dieselbe Datei zugreifen können. Sofern beide Aufrufer über die entsprechenden Zugriffsberechtigungen verfügen, kann die Datei erfolgreich geöffnet und freigegeben werden. Wenn der ursprüngliche Aufrufer von ZwCreateFile keine FILE_SHARE_READ, FILE_SHARE_WRITE oder FILE_SHARE_DELETE angibt, kann kein anderer Aufrufer die Datei öffnen, d. h. dem ursprünglichen Aufrufer wird exklusiver Zugriff gewährt.

Damit eine freigegebene Datei erfolgreich geöffnet werden kann, müssen die DesiredAccess-Flags mit den DesiredAccess- und ShareAccess-Flags aller vorherigen geöffneten Vorgänge kompatibel sein, die noch nicht über freigegeben wurden. Das heißt, der desiredAccess , der für eine bestimmte Datei in ZwCreateFile angegeben ist, darf nicht mit den Zugriffen in Konflikt stehen, die andere Öffnende der Datei nicht zugelassen haben.

Der CreateDisposition-Wert FILE_SUPERSEDE erfordert, dass der Aufrufer über DELETE-Zugriff auf ein vorhandenes Dateiobjekt verfügt. Wenn ja, wird diese Datei bei einem erfolgreichen Aufruf von ZwCreateFile mit FILE_SUPERSEDE für eine vorhandene Datei effektiv gelöscht und dann neu erstellt. Dies bedeutet, dass die Datei geöffnet wurde, wenn die Datei bereits von einem anderen Thread geöffnet wurde, indem sie einen ShareAccess-Parameter mit festgelegtem FILE_SHARE_DELETE Flag angegeben hat. Beachten Sie, dass diese Art von Disposition mit dem POSIX-Stil des Überschreibens von Dateien konsistent ist.

Die CreateDisposition-Werte FILE_OVERWRITE_IF und FILE_SUPERSEDE sind ähnlich. Wenn ZwCreateFile mit einer vorhandenen Datei und einem dieser CreateDisposition-Werte aufgerufen wird, wird die Datei ersetzt.

Das Überschreiben einer Datei entspricht semantisch einem Ablösungsvorgang, mit Ausnahme von Folgenden:

  • Der Aufrufer muss über Schreibzugriff auf die Datei verfügen, anstatt den Zugriff zu löschen. Dies bedeutet, dass, wenn die Datei bereits von einem anderen Thread geöffnet wurde, die Datei mit dem in der ShareAccess-Eingabe festgelegten FILE_SHARE_WRITE-Flag geöffnet wurde.

  • Die angegebenen Dateiattribute werden logisch mit denen, die sich bereits in der Datei befinden, aufgehoben. Dies bedeutet, dass, wenn die Datei bereits von einem anderen Thread geöffnet wurde, ein nachfolgender Aufrufer von ZwCreateFile vorhandene FileAttributes-Flags nicht deaktivieren kann, sondern zusätzliche Flags für dieselbe Datei aktivieren kann.

Der FILE_DIRECTORY_FILE CreateOptions-Wert gibt an, dass die zu erstellende oder zu öffnende Datei ein Verzeichnis ist. Wenn eine Verzeichnisdatei erstellt wird, erstellt das Dateisystem eine geeignete Struktur auf dem Datenträger, um ein leeres Verzeichnis für die Struktur auf dem Datenträger dieses bestimmten Dateisystems darzustellen. Wenn diese Option angegeben wurde und die zu öffnende Datei keine Verzeichnisdatei ist, oder wenn der Aufrufer einen inkonsistenten CreateOptions - oder CreateDisposition-Wert angegeben hat, schlägt der Aufruf von ZwCreateFile fehl.

Das FILE_NO_INTERMEDIATE_BUFFERING Flag CreateOptions verhindert, dass das Dateisystem im Auftrag des Aufrufers Zwischenpufferungen ausführt. Wenn Sie dieses Flag angeben, gelten die folgenden Einschränkungen für die Parameter des Aufrufers für andere Zw Xxx-Dateiroutinen:

  • Jedes optionale ByteOffset , das an ZwReadFile oder ZwWriteFile übergeben wird, muss ein Vielfaches der Sektorgröße sein.

  • Die anZwReadFile oder ZwWriteFile übergebene Länge muss ein Integral der Sektorgröße sein. Beachten Sie, dass die Angabe eines Lesevorgangs für einen Puffer, dessen Länge genau der Sektorgröße entspricht, dazu führen kann, dass eine geringere Anzahl signifikanter Bytes an diesen Puffer übertragen wird, wenn das Ende der Datei während der Übertragung erreicht wurde.

  • Puffer müssen entsprechend der Ausrichtungsanforderung des zugrunde liegenden Geräts ausgerichtet werden. Rufen Sie zum Abrufen dieser Informationen ZwCreateFile auf, um ein Handle für das Dateiobjekt abzurufen, das das physische Gerät darstellt, und übergeben Sie dieses Handle an ZwQueryInformationFile. Eine Liste der FILE_XXX_ALIGNMENT-Werte des Systems finden Sie unter DEVICE_OBJECT.

  • Aufrufe von ZwSetInformationFile mit dem FileInformationClass-Parameter , der auf FilePositionInformation festgelegt ist, müssen einen Offset angeben, der ein Vielfaches der Sektorgröße ist.

Die FILE_SYNCHRONOUS_IO_ALERT- und FILE_SYNCHRONOUS_IO_NONALERT CreateOptions-Flags , die sich gegenseitig ausschließen, wie ihre Namen vermuten lassen, geben an, dass alle E/A-Vorgänge für die Datei synchron sind– solange sie über das Dateiobjekt erfolgen, auf das vom zurückgegebenen FileHandle verwiesen wird. Alle E/A-Vorgänge in einer solchen Datei werden mithilfe des zurückgegebenen Handles über alle Threads serialisiert. Wenn eines dieser CreateOptions-Flags festgelegt ist, muss auch das SYNCHRONIZE DesiredAccess-Flag festgelegt werden, um den E/A-Manager zu zwingen, das Dateiobjekt als Synchronisierungsobjekt zu verwenden. In diesen Fällen verfolgt der E/A-Manager den aktuellen Dateipositionsoffset nach, den Sie an ZwReadFile und ZwWriteFile übergeben können. Rufen Sie ZwQueryInformationFile oder ZwSetInformationFile auf, um diese Position abzurufen oder festzulegen.

Wenn das Flag CreateOptions FILE_OPEN_REPARSE_POINT nicht angegeben ist und ZwCreateFile versucht, eine Datei mit einem Analysepunkt zu öffnen, erfolgt die normale Analysepunktverarbeitung für die Datei. Wenn dagegen das flag FILE_OPEN_REPARSE_POINT angegeben wird, findet keine normale Analyseverarbeitung statt, und ZwCreateFile versucht, die Analysepunktdatei direkt zu öffnen. In beiden Fällen gibt ZwCreateFile STATUS_SUCCESS zurück, wenn der Öffnenvorgang erfolgreich war. Andernfalls gibt die Routine einen NTSTATUS-Fehlercode zurück. ZwCreateFile gibt nie STATUS_REPARSE zurück.

Das Flag CreateOptions FILE_OPEN_REQUIRING_OPLOCK entfernt die Zeit zwischen dem Öffnen der Datei und dem Anfordern eines Oplocks, der es einem Drittanbieter möglicherweise ermöglichen könnte, die Datei zu öffnen und einen Freigabeverstoß zu erhalten. Eine Anwendung kann das FILE_OPEN_REQUIRING_OPLOCK-Flag für ZwCreateFile verwenden und dann einen beliebigen Oplock anfordern. Dadurch wird sichergestellt, dass ein Oplock-Besitzer über jede nachfolgende offene Anforderung benachrichtigt wird, die einen Freigabeverstoß verursacht.

Wenn in Windows 7 andere Handles für die Datei vorhanden sind, wenn eine Anwendung das flag FILE_OPEN_REQUIRING_OPLOCK verwendet, schlägt der Erstellungsvorgang mit STATUS_OPLOCK_NOT_GRANTED fehl. Diese Einschränkung ist ab Windows 8 nicht mehr vorhanden.

Wenn dieser Erstellungsvorgang einen oplock unterbrechen würde, der bereits für die Datei vorhanden ist, führt das Festlegen des FILE_OPEN_REQUIRING_OPLOCK-Flags dazu, dass der Erstellungsvorgang mit STATUS_CANNOT_BREAK_OPLOCK fehlschlägt. Der vorhandene Oplock wird durch diesen Erstellungsvorgang nicht unterbrochen.

Eine Anwendung, die das FILE_OPEN_REQUIRING_OPLOCK-Flag verwendet, muss nach erfolgreichem Aufruf einen Oplock anfordern. Andernfalls werden alle nachfolgenden Versuche zum Öffnen der Datei ohne den Vorteil der normalen Oplockverarbeitung blockiert. Wenn dieser Aufruf erfolgreich ist, aber die nachfolgende oplock-Anforderung fehlschlägt, muss eine Anwendung, die dieses Flag verwendet, ihr Handle schließen, nachdem erkannt wurde, dass die oplock-Anforderung fehlgeschlagen ist.

Das flag FILE_OPEN_REQUIRING_OPLOCK ist unter Windows 7, Windows Server 2008 R2 und höher unter Windows verfügbar. Die Microsoft-Dateisysteme, die dieses Flag in Windows 7 implementieren, sind NTFS, FAT und exFAT.

Das CreateOptions-Flag FILE_RESERVE_OPFILTER ermöglicht es einer Anwendung, einen Level 1-, Batch- oder Filter-Oplock anzufordern, um zu verhindern, dass andere Anwendungen Freigabeverletzungen erhalten. FILE_RESERVE_OPFILTER ist jedoch nur für Filter-Oplocks praktisch nützlich. Um es verwenden zu können, müssen Sie die folgenden Schritte ausführen:

  1. Stellen Sie eine Create-Anforderung mit CreateOptions von FILE_RESERVE_OPFILTER, DesiredAccess von genau FILE_READ_ATTRIBUTES und ShareAccess von genau FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE.

    • Wenn bereits geöffnete Handles vorhanden sind, schlägt die Erstellungsanforderung mit STATUS_OPLOCK_NOT_GRANTED fehl, und auch der nächste angeforderte Oplock schlägt fehl.

    • Wenn Sie mit mehr Zugriff oder weniger Freigabe öffnen, tritt auch ein Fehler von STATUS_OPLOCK_NOT_GRANTED auf.

  2. Wenn die Erstellungsanforderung erfolgreich ist, fordern Sie einen Oplock an.

  3. Öffnen Sie ein weiteres Handle für die Datei, um E/A-Vorgänge zu erledigen.

Schritt 3 macht dies nur für Filter oplocks praktisch. Das in Schritt 3 geöffnete Handle kann einen DesiredAccess-Wert aufweisen, der maximal FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | SYNCHRONISIEREN | READ_CONTROL einen Filter-Oplock nicht auf und unterbricht sie immer noch nicht. Alle DesiredAccess-Werte , die größer als FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE unterbricht einen Level 1- oder Batch-Oplock und macht das FILE_RESERVE_OPFILTER Flag für diese Oplocktypen unbrauchbar.

NTFS ist das einzige Microsoft-Dateisystem, das FILE_RESERVE_OPFILTER implementiert.

Aufrufer von ZwCreateFile müssen unter IRQL = PASSIVE_LEVEL und mit aktivierten speziellen Kernel-APCs ausgeführt werden.

Wenn der Aufruf dieser Funktion im Benutzermodus erfolgt, sollten Sie den Namen "NtCreateFile" anstelle von "ZwCreateFile" verwenden.

Bei Aufrufen von Kernelmodustreibern können sich die NtXxx - und ZwXxx-Versionen einer Windows Native System Services-Routine anders verhalten, wie sie Eingabeparameter verarbeiten und interpretieren. Weitere Informationen zur Beziehung zwischen den Nt Xxx- und ZwXxx-Versionen einer Routine finden Sie unter Verwenden von Nt- und Zw-Versionen der systemeigenen Systemdienstroutinen.

Anforderungen

Anforderung Wert
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL (siehe Abschnitt "Hinweise")
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Weitere Informationen

ACCESS_MASK

DEVICE_OBJECT

IO_STATUS_BLOCK

InitializeObjectAttributes

Verwenden von Nt- und Zw-Versionen der Systemdienstroutinen

ZwClose

ZwOpenFile

ZwQueryInformationFile

ZwReadFile

ZwSetInformationFile

ZwWriteFile

 Opportunistische Sperren

Reparse Points