IoCreateFileSpecifyDeviceObjectHint-Funktion (ntddk.h)
Die IoCreateFileSpecifyDeviceObjectHint Routine wird von Dateisystemfiltertreibern verwendet, um eine Erstellungsanforderung nur an die Filter unter einem angegebenen Geräteobjekt und an das Dateisystem zu senden.
Syntax
NTSTATUS IoCreateFileSpecifyDeviceObjectHint(
[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 Disposition,
[in] ULONG CreateOptions,
[in, optional] PVOID EaBuffer,
[in] ULONG EaLength,
[in] CREATE_FILE_TYPE CreateFileType,
[in, optional] PVOID InternalParameters,
[in] ULONG Options,
[in, optional] PVOID DeviceObject
);
Parameter
[out] FileHandle
Ein Zeiger auf eine Variable, die ein Handle für das Dateiobjekt empfängt, wenn dieser Aufruf erfolgreich ist.
[in] DesiredAccess
Eine Bitmaske von Flags, die den Typ des Zugriffs angeben, den der Aufrufer für die Datei oder das Verzeichnis benötigt. Der Satz systemdefinierter DesiredAccess Flags bestimmt die folgenden spezifischen Zugriffsrechte für Dateiobjekte.
DesiredAccess-Flags | Bedeutung |
---|---|
LÖSCHEN | Die Datei kann gelöscht werden. |
FILE_READ_DATA | Daten können aus der Datei gelesen werden. |
FILE_READ_ATTRIBUTES | FileAttributes Flags, die später beschrieben werden, können gelesen werden. |
FILE_READ_EA | Erweiterte Attribute (EA), die der Datei zugeordnet sind, können gelesen werden. |
READ_CONTROL | Die Zugriffssteuerungsliste (ACL-) und besitzerinformationen, die der Datei zugeordnet sind, können gelesen werden. |
FILE_WRITE_DATA | Daten können in die Datei geschrieben werden. |
FILE_WRITE_ATTRIBUTES | FileAttributes Flags können geschrieben werden. |
FILE_WRITE_EA | Erweiterte Attribute, die der Datei zugeordnet sind, können geschrieben werden. |
FILE_APPEND_DATA | Daten können an die Datei angefügt werden. |
WRITE_DAC | Die mit der Datei verknüpfte diskretionäre Zugriffssteuerungsliste (DACL-) kann geschrieben werden. |
WRITE_OWNER | Besitzerinformationen, die der Datei zugeordnet sind, können geschrieben werden. |
SYNCHRONISIEREN | Der Aufrufer kann den Abschluss eines E/A-Vorgangs synchronisieren, indem auf die zurückgegebene FileHandle- auf den Signalzustand festgelegt wird. Dieses Kennzeichen muss festgelegt werden, wenn die CreateOptions- FILE_SYNCHRONOUS_IO_ALERT oder FILE_SYNCHRONOUS_IO_NONALERT Flag festgelegt ist. |
FILE_EXECUTE | Daten können aus der Datei mithilfe von System-Auslagerungs-E/A in den Arbeitsspeicher gelesen werden. |
Aufrufer von IoCreateFileSpecifyDeviceObjectHint können eine oder eine Kombination der folgenden angeben, möglicherweise mit zusätzlichen kompatiblen Flags aus der vorherigen Liste derDesiredAccess Flags für jedes Dateiobjekt, das keine Verzeichnisdatei darstellt:
DesiredAccess zu Dateiwerten | Zuordnung zu DesiredAccess-Flags |
---|---|
GENERIC_READ | STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA und SYNCHRONISIEREN. |
GENERIC_WRITE | STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA und SYNCHRONISIEREN. |
GENERIC_EXECUTE | STANDARD_RIGHTS_EXECUTE, SYNCHRONISIEREN, FILE_READ_ATTRIBUTES und FILE_EXECUTE. |
Die STANDARD_RIGHTS_XXX- sind vordefinierte Systemwerte, die zum Erzwingen der Sicherheit für Systemobjekte verwendet werden.
Wenn die FILE_DIRECTORY_FILE CreateOptions- Flag festgelegt ist, können Aufrufer von IoCreateFileSpecifyDeviceObjectHint eine oder eine Kombination der folgenden angeben, möglicherweise mit mindestens einem kompatiblen Flag aus der vorherigen Liste derDesiredAccess Flags.
DesiredAccess zu Verzeichniswerten | Bedeutung |
---|---|
FILE_LIST_DIRECTORY | Dateien im Verzeichnis können aufgelistet werden. |
FILE_TRAVERSE | Das Verzeichnis kann durchlaufen werden: d. h. es kann Teil des Pfadnamens einer Datei sein. |
Die Flags FILE_READ_DATA, FILE_WRITE_DATA, FILE_EXECUTE und FILE_APPEND_DATA DesiredAccess- sind mit dem Erstellen oder Öffnen einer Verzeichnisdatei nicht kompatibel.
[in] ObjectAttributes
Ein Zeiger auf eine OBJECT_ATTRIBUTES Struktur, die bereits von der InitializeObjectAttributes Routine initialisiert wurde. Wenn der Aufrufer im Systemprozesskontext ausgeführt wird, kann dieser Parameter (ObjectAttributes) NULL-sein. Andernfalls muss der Aufrufer das attribut OBJ_KERNEL_HANDLE im Aufruf der InitializeObjectAttributes Routine festlegen. Elemente der OBJECT_ATTRIBUTES-Struktur für ein Dateiobjekt enthalten Folgendes.
Mitglied | Wert |
---|---|
ULONGLength- | Gibt die Anzahl der Bytes von ObjectAttributes bereitgestellten Daten an. Dieser Wert muss mindestens Größe(OBJECT_ATTRIBUTES) sein. |
PUNICODE_STRING ObjectName- | Ein Zeiger auf eine gepufferte Unicode-Zeichenfolge, die die zu erstellende oder geöffnete Datei benennt. Dieser Wert muss eine vollqualifizierte Dateispezifikation sein, es sei denn, es handelt sich um den Namen einer Datei relativ zum verzeichnis, das durch RootDirectoryangegeben wird. Beispiel: \Device\Floppy1\myfile.dat oder \?? \B:\myfile.dat könnte die vollqualifizierte Dateispezifikation sein, vorausgesetzt, der Diskettentreiber und das Überladen des Dateisystems sind bereits geladen. (Beachten Sie, dass \?? \DosDevices als Name des Win32-Objektnamespaces ersetzt. \DosDevices funktioniert weiterhin, aber \?? wird vom Objekt-Manager schneller übersetzt.) |
HANDLERootDirectory- | Gibt optional ein Handle für ein Verzeichnis an, das durch einen vorherigen Aufruf von IoCreateFileSpecifyDeviceObjectHintabgerufen wurde. Wenn dieser Wert NULL-ist, muss der ObjectName Member eine vollqualifizierte Dateispezifikation sein, die den vollständigen Pfad zur Zieldatei enthält. Wenn dieser Wert nichtNULL-ist, gibt das element ObjectName einen Dateinamen relativ zu diesem Verzeichnis an. |
PSECURITY_DESCRIPTOR SecurityDescriptor- | Gibt optional einen Sicherheitsdeskriptor an, der auf eine Datei angewendet werden soll. AcLs, die durch einen solchen Sicherheitsdeskriptor angegeben werden, werden nur auf die Datei angewendet, wenn sie erstellt wird. Wenn der Wert NULL- ist, wenn eine Datei erstellt wird, ist die in der Datei platzierte ACL dateisystemabhängig; Die meisten Dateisysteme verteilen einen Teil einer solchen ACL aus der übergeordneten Verzeichnisdatei in Kombination mit der Standard-ACL des Aufrufers. |
ULONGAttributes- | Eine Reihe von Flags, die die Dateiobjektattribute steuern. Wenn der Aufrufer im Systemprozesskontext ausgeführt wird, kann dieser Parameter null sein. Andernfalls muss der Aufrufer das OBJ_KERNEL_HANDLE Flag festlegen. Der Aufrufer kann optional auch das OBJ_CASE_INSENSITIVE Flag festlegen, das angibt, dass der Name-Nachschlagecode die Groß-/Kleinschreibung ObjectName- ignorieren soll, anstatt eine Suche mit exakter Übereinstimmung durchzuführen. |
[out] IoStatusBlock
Ein Zeiger auf eine IO_STATUS_BLOCK Struktur, die den endgültigen Abschlussstatus und Informationen zum angeforderten Vorgang empfängt. Bei rückgabe von IoCreateFileSpecifyDeviceObjectHintenthält das Information Member einen der folgenden Werte:
FILE_CREATED
FILE_OPENED
FILE_OVERWRITTEN
FILE_SUPERSEDED
FILE_EXISTS
FILE_DOES_NOT_EXIST
[in, optional] AllocationSize
Gibt optional die anfängliche Zuordnungsgröße in Bytes für die Datei an. Ein Wert ungleich Null hat keine Auswirkung, es sei denn, die Datei wird erstellt, überschrieben oder abgelöst.
[in] FileAttributes
Explizit angegebene Attribute werden nur angewendet, wenn die Datei erstellt, abgelöst oder in einigen Fällen überschrieben wird. Standardmäßig ist dieser Wert FILE_ATTRIBUTE_NORMAL, der durch ein beliebiges anderes Flag oder durch eine kombination aus kompatiblen Flags überschrieben werden kann. Mögliche FileAttributes Flags umfassen Folgendes.
FileAttributes-Flags | Bedeutung |
---|---|
FILE_ATTRIBUTE_NORMAL | Eine Datei mit Standardattributen sollte erstellt werden. |
FILE_ATTRIBUTE_READONLY | Eine schreibgeschützte Datei sollte erstellt werden. |
FILE_ATTRIBUTE_HIDDEN | Eine ausgeblendete Datei sollte erstellt werden. |
FILE_ATTRIBUTE_SYSTEM | Es sollte eine Systemdatei erstellt werden. |
FILE_ATTRIBUTE_ARCHIVE | Die Datei sollte so markiert werden, dass sie archiviert wird. |
FILE_ATTRIBUTE_TEMPORARY | Es sollte eine temporäre Datei erstellt werden. |
[in] ShareAccess
Gibt den Typ des Freigabezugriffs auf die Datei an, die der Aufrufer als Null oder 1 oder eine oder eine Kombination der folgenden Flags verwenden möchte. Um exklusiven Zugriff anzufordern, legen Sie diesen Parameter auf Null fest. Wenn das IO_IGNORE_SHARE_ACCESS_CHECK Flag im parameter Options angegeben ist, ignoriert der E/A-Manager diesen Parameter. Das Dateisystem kann jedoch weiterhin Zugriffsprüfungen durchführen. Daher ist es wichtig, den Freigabemodus anzugeben, den Sie für diesen Parameter wünschen, auch wenn Sie das IO_IGNORE_SHARE_ACCESS_CHECK-Flag verwenden. Geben Sie für die größte Chance, Fehler bei der Freigabeverletzung zu vermeiden, alle folgenden Freigabezugriffskennzeichnungen an.
ShareAccess-Flags | Bedeutung |
---|---|
FILE_SHARE_READ | Die Datei kann für den Lesezugriff durch andere Threads geöffnet werden. |
FILE_SHARE_WRITE | Die Datei kann für den Schreibzugriff durch andere Threads geöffnet werden. |
FILE_SHARE_DELETE | Die Datei kann für den Löschzugriff durch andere Threads geöffnet werden. |
[in] Disposition
Gibt einen Wert an, der die auszuführende Aktion bestimmt, je nachdem, ob die Datei bereits vorhanden ist. Der Wert kann eine der im Folgenden beschriebenen Werte sein.
Dispositionswerte | Bedeutung |
---|---|
FILE_SUPERSEDE | Wenn die Datei bereits vorhanden ist, ersetzen Sie sie durch die angegebene Datei. Wenn dies nicht der Fall ist, erstellen Sie die angegebene Datei. |
FILE_CREATE | Wenn die Datei bereits vorhanden ist, schlägt die Anforderung fehl und erstellen oder öffnen Sie die angegebene Datei nicht. Wenn dies nicht der Fall ist, erstellen Sie die angegebene Datei. |
FILE_OPEN | Wenn die Datei bereits vorhanden ist, öffnen Sie sie, anstatt eine neue Datei zu erstellen. Wenn dies nicht der Fall ist, schlagen Sie die Anforderung fehl, und erstellen Sie keine neue Datei. |
FILE_OPEN_IF | Wenn die Datei bereits vorhanden ist, öffnen Sie sie. Wenn dies nicht der Fall ist, erstellen Sie die angegebene Datei. |
FILE_OVERWRITE | Wenn die Datei bereits vorhanden ist, öffnen Sie sie, und überschreiben Sie sie. Wenn dies nicht der Fall ist, schlägt die Anforderung fehl. |
FILE_OVERWRITE_IF | Wenn die Datei bereits vorhanden ist, öffnen Sie sie, und überschreiben Sie sie. Wenn dies nicht der Fall ist, erstellen Sie die angegebene Datei. |
[in] CreateOptions
Gibt die Optionen an, die beim Erstellen oder Öffnen der Datei angewendet werden sollen. Diese Optionen werden als kompatible Kombination der folgenden Flags angegeben.
CreateOptions-Flags | Bedeutung |
---|---|
FILE_DIRECTORY_FILE | Die zu erstellende oder geöffnete Datei ist eine Verzeichnisdatei. Wenn dieses Kennzeichen festgelegt ist, muss der parameter Disposition auf einen der FILE_CREATE, FILE_OPEN oder FILE_OPEN_IF festgelegt werden. Dieses Flag ist mit den folgenden CreateOptions- Flags kompatibel: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT und FILE_OPEN_BY_FILE_ID. |
FILE_NON_DIRECTORY_FILE | Die geöffnete Datei darf keine Verzeichnisdatei sein, oder dieser Aufruf schlägt fehl. Das geöffnete Dateiobjekt muss eine Datendatei darstellen. |
FILE_WRITE_THROUGH | Systemdienste, FSDs 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 | Alle Zugriffe auf die Datei erfolgen sequenziell. |
FILE_RANDOM_ACCESS | Der Zugriff auf die Datei kann zufällig sein, sodass keine sequenziellen Lese-/Vorlesevorgänge für die Datei durch FSDs oder das System ausgeführt werden sollten. |
FILE_NO_INTERMEDIATE_BUFFERING | Die Datei kann nicht zwischengespeichert oder in den internen Puffern eines Treibers gepuffert werden. Dieses Flag ist nicht mit dem DesiredAccess FILE_APPEND_DATA Flag kompatibel. |
FILE_SYNCHRONOUS_IO_ALERT | Alle Vorgänge in der Datei werden synchron ausgeführt. Jede Wartezeit im Auftrag des Anrufers unterliegt einer vorzeitigen Kündigung durch Warnungen. Dieses Flag bewirkt auch, dass das E/A-System den Dateipositionskontext aufrecht erhält. Wenn dieses Flag festgelegt ist, muss auch das flag DesiredAccess SYNCHRONIZE festgelegt werden. |
FILE_SYNCHRONOUS_IO_NONALERT | Alle Vorgänge in der Datei werden synchron ausgeführt. Wartezeiten, die im System vorhanden sind, um E/A-Warteschlangen zu synchronisieren und den Abschluss zu vervollständigen, unterliegen nicht Warnungen. Dieses Flag bewirkt auch, dass das E/A-System den Dateipositionskontext aufrecht erhält. Wenn dieses Flag festgelegt ist, muss auch das flag DesiredAccess SYNCHRONIZE festgelegt werden. |
FILE_CREATE_TREE_CONNECTION | Erstellen Sie eine Strukturverbindung für diese Datei, um sie über das Netzwerk zu öffnen. |
FILE_COMPLETE_IF_OPLOCKED | Schließen Sie diesen Vorgang sofort mit einem alternativen Erfolgscode ab, wenn die Zieldatei oplocked ist, anstatt den Thread des Aufrufers zu blockieren. Wenn die Datei oplocked ist, hat ein anderer Aufrufer bereits Zugriff auf die Datei über das Netzwerk. |
FILE_NO_EA_KNOWLEDGE | Wenn die erweiterten Attribute für eine vorhandene Datei, die geöffnet wird, angeben, dass der Aufrufer EAs verstehen muss, um die Datei ordnungsgemäß zu interpretieren, schlägt diese Anforderung fehl, da der Aufrufer nicht versteht, wie es mit EAs umgeht. |
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 Abschnitt Anmerkungen weiter unten. |
FILE_DELETE_ON_CLOSE | Löschen Sie die Datei, wenn das letzte Handle an ZwCloseübergeben wird. |
FILE_OPEN_BY_FILE_ID | Der im ObjectAttributes- Parameter angegebene Dateiname enthält die 8-Byte-Dateireferenznummer für die Datei. Diese Nummer wird vom Dateisystem zugewiesen und ist dateisystemspezifisch. Wenn die Datei ein Analysepunkt ist, enthält der Dateiname auch den Namen eines Geräts. Hinweis: Das FAT-Dateisystem unterstützt FILE_OPEN_BY_FILE_ID nicht. |
FILE_OPEN_FOR_BACKUP_INTENT | Die Datei wird zur Sicherung geöffnet, daher sollte das System nach bestimmten Zugriffsrechten suchen und dem Aufrufer die entsprechenden Zugriffe auf die Datei gewähren, bevor die Eingabe DesiredAccess anhand der Sicherheitsbeschreibung der Datei überprüft wird. |
FILE_OPEN_REQUIRING_OPLOCK | Die Datei wird geöffnet, und eine opportunistische Sperre (Oplock) auf der Datei wird als einzelner atomischer Vorgang angefordert. Das Dateisystem sucht nach Oplocks, bevor er den Erstellungsvorgang ausführt, und der Erstellungsvorgang schlägt mit einem Rückgabecode von STATUS_CANNOT_BREAK_OPLOCK fehl, wenn die Erstellung einen vorhandenen Oplock unterbrechen würde. |
FILE_RESERVE_OPFILTER | Mit dieser Kennzeichnung kann eine Anwendung eine opportunistische Filtersperre (Oplock) anfordern, um zu verhindern, dass andere Anwendungen Verstöße gegen die Freigabe 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". |
[in, optional] EaBuffer
Ein Zeiger auf einen vom Aufrufer bereitgestellten FILE_FULL_EA_INFORMATION-strukturierten Puffer, der informationen zum erweiterten Attribut (EXTENDED Attribute, EA) enthält, die auf die Datei angewendet werden sollen.
[in] EaLength
Die Länge von EaBuffer-in Byte.
[in] CreateFileType
Treiber müssen diesen Parameter auf CreateFileTypeNone festlegen.
[in, optional] InternalParameters
Treiber müssen diesen Parameter auf NULL-festlegen.
[in] Options
Gibt Optionen an, die während der Erstellung der Erstellung der Erstellungsanforderung verwendet werden sollen. In der folgenden Tabelle sind die verfügbaren Optionen aufgeführt.
Optionskennzeichnungen | Bedeutung |
---|---|
IO_FORCE_ACCESS_CHECK | Gibt an, dass der E/A-Manager die Erstellungsanforderung anhand des Sicherheitsdeskriptors der Datei überprüfen muss. |
IO_IGNORE_SHARE_ACCESS_CHECK | Gibt an, dass der E/A-Manager nach der Erstellung keine Freigabezugriffsprüfungen für das Dateiobjekt ausführen sollte. Das Dateisystem kann diese Überprüfungen jedoch weiterhin ausführen. |
[in, optional] DeviceObject
Ein Zeiger auf das Geräteobjekt, an das die Erstellungsanforderung gesendet werden soll. Das Geräteobjekt muss ein Filter- oder Dateisystemgeräteobjekt im Dateisystemtreiberstapel für das Volume sein, auf dem sich die Datei oder das Verzeichnis befindet. Dieser Parameter ist optional und kann NULL-werden. Wenn dieser Parameter NULL-ist, wird die Anforderung am oberen Rand des Treiberstapels an das Geräteobjekt gesendet.
Rückgabewert
IoCreateFileSpecifyDeviceObjectHint gibt STATUS_SUCCESS oder einen entsprechenden NTSTATUS-Wert wie einen der folgenden zurück:
Rückgabecode | Beschreibung |
---|---|
STATUS_INVALID_DEVICE_OBJECT_PARAMETER | Das angegebene DeviceObject- ist nicht an den Dateisystemtreiberstapel für das volume angefügt, das im Datei- oder Verzeichnisnamen angegeben ist. Dieser Fehler kann auch auftreten, wenn der Name einen anderen Analysepunkt als einen Bereitstellungspunkt enthält. |
STATUS_MOUNT_POINT_NOT_RESOLVED | Der Datei- oder Verzeichnisname enthält einen Bereitstellungspunkt, der zu einem anderen Volume aufgelöst wird als dem, an das das angegebene DeviceObject- angefügt ist. |
STATUS_OBJECT_PATH_SYNTAX_BAD |
IoCreateFileSpecifyDeviceObjectHint kann STATUS_FILE_LOCK_CONFLICT als Rückgabewert oder im Status Member der IO_STATUS_BLOCK-Struktur zurückgeben, auf die der IoStatusBlock-Parameter verweist. Dies tritt nur auf, wenn die NTFS-Protokolldatei voll ist und ein Fehler auftritt, während IoCreateFileSpecifyDeviceObjectHint versucht, diese Situation zu behandeln.
Bemerkungen
Diese Routine wird von Dateisystemfiltertreibern verwendet, um eine Erstellungsanforderung nur an die Filter unter einem angegebenen Geräteobjekt und an das Dateisystem zu senden. Filter, die oberhalb des angegebenen Geräteobjekts im Treiberstapel angefügt sind, erhalten die Erstellungsanforderung nicht.
Die Windows Vista IoCreateFileEx Routine ähnelt der IoCreateFileSpecifyDeviceObjectHint Routine, bietet jedoch eine größere Funktionalität als die IoCreateFileSpecifyDeviceObjectHint Routine, einschließlich des Zugriffs auf zusätzliche Create-Parameter (ECPs) und Transaktionsinformationen.
Wenn Sie die IoCreateFileEx Routine anstelle der IoCreateFileSpecifyDeviceObjectHint Routine verwenden, beachten Sie, dass der DriverContext Parameter der IoCreateFileSpecifyDeviceObjectHint Routine in das DeviceObjectHint Member der IO_DRIVER_CREATE_CONTEXT Struktur verschoben wurde. Die IO_DRIVER_CREATE_CONTEXT Struktur wird über den DriverContext Parameter an die IoCreateFileEx Routine übergeben.
Dateisystemfiltertreiber rufen IoCreateFileSpecifyDeviceObjectHint auf, um eine Erstellungsanforderung nur an ein angegebenes Geräteobjekt, die darunter angefügten Filter und das Dateisystem zu senden. Über dem angegebenen Geräteobjekt im Treiberstapel angefügte Filter erhalten die Erstellungsanforderung nicht. Dasselbe ist true für alle Bereinigungs- oder Schließanforderungen für das Dateiobjekt, das von IoCreateFileSpecifyDeviceObjectHinterstellt wird.
Es gibt zwei alternative Möglichkeiten, den Namen der zu erstellenden oder geöffneten Datei mithilfe von IoCreateFileSpecifyDeviceObjectHintanzugeben:
Als vollqualifizierter Pfadname, der im ObjectName Member der Eingabe ObjectAttributes-
Als Pfadname relativ zur Verzeichnisdatei, die durch das Handle im RootDirectory Member der Eingabe ObjectAttributes dargestellt wird
Jedes Handle, das von IoCreateFileSpecifyDeviceObjectHint abgerufen wird, muss schließlich durch Aufrufen von ZwClosefreigegeben werden.
Treiberroutinen, die in einem anderen Prozesskontext als dem des Systemprozesses ausgeführt werden, müssen das attribut OBJ_KERNEL_HANDLE für den ObjectAttributes Parameter von IoCreateFileSpecifyDeviceObjectHintfestlegen. Dadurch wird die Verwendung des Von IoCreateFileSpecifyDeviceObjectHint- zurückgegebenen Handles auf Prozesse beschränkt, die im Kernelmodus ausgeführt werden. Andernfalls kann über den Prozess, in dem der Treiber ausgeführt wird, auf das Handle zugegriffen werden kann.
Bestimmte DesiredAccess Flags und Kombinationen von Flags haben folgende Auswirkungen:
Damit ein Aufrufer einen E/A-Abschluss synchronisiert, indem er auf die zurückgegebene FileHandle- auf den Signalstatus festgelegt wird, muss das SYNCHRONIZE-Flag festgelegt werden.
Wenn nur die Flags FILE_APPEND_DATA und SYNCHRONIZE festgelegt sind, kann der Aufrufer nur an das Ende der Datei schreiben, und alle Offsetinformationen zu Schreibvorgängen in die Datei werden ignoriert. Die Datei wird jedoch bei Bedarf für diesen Schreibvorgang automatisch erweitert.
Das Festlegen des FILE_WRITE_DATA Flags für eine Datei ermöglicht auch das Auftreten von Schreibvorgängen über das Ende der Datei hinaus. Die Datei wird für diesen Schreibtyp automatisch erweitert.
Wenn nur die FILE_EXECUTE- und SYNCHRONIZE-Flags festgelegt sind, kann der Aufrufer keine Daten in der Datei direkt lesen oder schreiben, indem die zurückgegebene FileHandle-verwendet wird; d. h., alle Vorgänge in der Datei erfolgen über den System-Pager als Reaktion auf Anweisungen und Datenzugriffe.
Der parameter ShareAccess bestimmt, ob separate Threads gleichzeitig auf dieselbe Datei zugreifen können. Sofern beide Dateiöffner über die Berechtigung verfügen, auf eine Datei auf die angegebene Weise zuzugreifen, kann die Datei erfolgreich geöffnet und freigegeben werden. Wenn der ursprüngliche Aufrufer von IoCreateFileSpecifyDeviceObjectHint nicht FILE_SHARE_READ, FILE_SHARE_WRITE oder FILE_SHARE_DELETE angibt, können keine anderen Geöffneten Vorgänge für die Datei ausgeführt werden: d. h., der ursprüngliche Aufrufer erhält exklusiven Zugriff auf die Datei.
Damit eine freigegebene Datei erfolgreich geöffnet werden kann, muss die angeforderte DesiredAccess- mit der Datei kompatibel sein, sowohl mit der DesiredAccess- als auch mit ShareAccess- Spezifikationen aller vorherigen Öffnen, die noch nicht mit ZwCloseveröffentlicht wurden. Das heißt, die DesiredAccess-, die für IoCreateFileSpecifyDeviceObjectHint für eine bestimmte Datei angegeben wurde, darf nicht mit den Zugriffen in Konflikt stehen, die andere Öffnen der Datei nicht zulassen.
Wenn IO_IGNORE_SHARE_ACCESS_CHECK im Parameter Options angegeben wird, ignoriert der E/A-Manager den ShareAccess-Parameter. Das Dateisystem kann jedoch weiterhin Zugriffsprüfungen durchführen. Daher ist es wichtig, den Freigabemodus anzugeben, den Sie für den ShareAccess-parameter möchten, auch wenn Sie das IO_IGNORE_SHARE_ACCESS_CHECK-Flag verwenden.
Der Dispositionswert FILE_SUPERSEDE erfordert, dass der Aufrufer DELETE-Zugriff auf ein vorhandenes Dateiobjekt hat. Wenn ja, wird ein erfolgreicher Aufruf von IoCreateFileSpecifyDeviceObjectHint mit FILE_SUPERSEDE für eine vorhandene Datei effektiv gelöscht und anschließend neu erstellt. Dies bedeutet, dass die Datei, wenn die Datei bereits von einem anderen Thread geöffnet wurde, durch Angeben eines ShareAccess--Parameters mit dem FILE_SHARE_DELETE Flagsatz geöffnet wurde. Beachten Sie, dass diese Art von Löschung mit dem POSIX-Stil des Überschreibens von Dateien konsistent ist.
Die Disposition Werte FILE_OVERWRITE_IF und FILE_SUPERSEDE ähneln. Wenn IoCreateFileSpecifyDeviceObjectHint mit einer vorhandenen Datei aufgerufen wird und einer dieser Disposition Werte, wird die Datei ersetzt.
Das Überschreiben einer Datei entspricht semantisch einem Supersede-Vorgang, mit Ausnahme der folgenden Aktionen:
Der Aufrufer muss Schreibzugriff auf die Datei haben, anstatt den Zugriff zu löschen. Dies bedeutet, dass, wenn die Datei bereits von einem anderen Thread geöffnet wurde, die Datei mit dem FILE_SHARE_WRITE Flag geöffnet wurde, das in der Eingabe ShareAccess-festgelegt ist.
Die angegebenen Dateiattribute werden logisch mit den bereits in der Datei gespeicherten Attributen versehen. Dies bedeutet, dass ein nachfolgender Aufrufer von IoCreateFileSpecifyDeviceObjectHint vorhandene FileAttributes Flags nicht deaktivieren kann, aber zusätzliche Flags für dieselbe Datei aktivieren kann, wenn die Datei bereits von einem anderen Thread geöffnet wurde.
Der wert CreateOptions FILE_DIRECTORY_FILE gibt an, dass die zu erstellende oder geöffnete Datei eine Verzeichnisdatei ist. Wenn eine Verzeichnisdatei erstellt wird, erstellt das Dateisystem eine geeignete Struktur auf dem Datenträger, um ein leeres Verzeichnis für die Struktur des jeweiligen Dateisystems auf dem Datenträger darzustellen. Wenn diese Option angegeben wurde und die zu öffnende Datei keine Verzeichnisdatei ist oder wenn der Aufrufer eine inkonsistente CreateOptions oder Disposition Wert angegeben hat, schlägt der Aufruf von IoCreateFileSpecifyDeviceObjectHint fehl.
Das CreateOptions FILE_NO_INTERMEDIATE_BUFFERING Flag verhindert, dass das Dateisystem im Auftrag des Aufrufers zwischenpuffert. Wenn Sie diesen Wert angeben, werden bestimmte Einschränkungen für die Parameter des Aufrufers auf andere Zw. festgelegt. Datei- Routinen, einschließlich der folgenden:
Byte-Offset- Wert, der an ZwReadFile oder ZwWriteFile übergeben wird, muss ein Vielfaches der Sektorgröße des zugrunde liegenden Geräts sein.
Die Length, die an ZwReadFile oder ZwWriteFile übergeben wird, muss ein Vielfaches der Sektorgröße sein. Beachten Sie, dass das Angeben eines Lesevorgangs an einen Puffer, dessen Länge genau die Sektorgröße ist, zu einer geringeren Anzahl signifikanter Bytes führen kann, die an diesen Puffer übertragen werden, wenn das Ende der Datei während der Übertragung erreicht wurde.
Puffer müssen entsprechend der Ausrichtungsanforderung des zugrunde liegenden Geräts ausgerichtet werden. Diese Informationen können abgerufen werden, indem sie IoCreateFileSpecifyDeviceObjectHint aufrufen, um ein Handle für das Dateiobjekt abzurufen, das das physische Gerät darstellt, und dann ZwQueryInformationFile mit diesem Handle aufrufen. Eine Liste der Systemwerte FILE_XXX-_ALIGNMENT finden Sie unter DEVICE_OBJECT.
Aufrufe von ZwSetInformationFile mit dem Parameter FileInformationClass auf FilePositionInformation müssen einen Offset angeben, der ein Vielfaches der Sektorgröße ist.
Die sich gegenseitig ausschließenden CreateOptions, FILE_SYNCHRONOUS_IO_ALERT und FILE_SYNCHRONOUS_IO_NONALERT, geben an, dass alle E/A-Vorgänge in der Datei synchron sein sollen, solange sie durch das vom zurückgegebenen FileHandle-bezeichnete Dateiobjekt auftreten. Alle E/A-Vorgänge in einer solchen Datei werden über alle Threads serialisiert, indem das zurückgegebene Handle verwendet wird. Mit einer dieser CreateOptionsmuss das flag DesiredAccess SYNCHRONIZE festgelegt werden, damit der E/A-Manager das Dateiobjekt als Synchronisierungsobjekt verwendet. Mit einer dieser CreateOptions festgelegt, verwaltet der E/A-Manager den "Dateipositionskontext" für das Dateiobjekt, einen internen, aktuellen Dateipositionsversatz. Dieser Offset kann in Aufrufen von ZwReadFile- und ZwWriteFile-verwendet werden. Seine Position kann auch abgefragt werden, indem ZwQueryInformationFile-aufgerufen oder durch Aufrufen ZwSetInformationFile-festgelegt wird.
Wenn das CreateOptions- FILE_OPEN_REPARSE_POINT Flag nicht angegeben ist und IoCreateFileSpecifyDeviceObjectHint versucht, eine Datei mit einem Analysepunkt zu öffnen, tritt eine normale Analysepunktverarbeitung für die Datei auf. Wenn dagegen das FILE_OPEN_REPARSE_POINT Flag angegeben ist, erfolgt die normale Analyseverarbeitung nicht und IoCreateFileSpecifyDeviceObjectHint versucht, die Analysepunktdatei direkt zu öffnen. Wenn der Öffnenvorgang erfolgreich war, gibt IoCreateFileSpecifyDeviceObjectHint STATUS_SUCCESS zurück; andernfalls gibt die Routine einen NTSTATUS-Fehlercode zurück. IoCreateFileSpecifyDeviceObjectHint gibt nie STATUS_REPARSE zurück.
Die CreateOptions- FILE_OPEN_REQUIRING_OPLOCK Flag beseitigt den Zeitraum zwischen dem Öffnen der Datei und dem Anfordern eines Oplocks, der es einem Drittanbieter ermöglichen könnte, die Datei zu öffnen und einen Freigabeverstoß zu erhalten. Eine Anwendung kann das FILE_OPEN_REQUIRING_OPLOCK-Flag für IoCreateFileSpecifyDeviceObjectHint verwenden und dann oplock anfordern. Dadurch wird sichergestellt, dass ein Oplock-Besitzer über jede spätere offene Anforderung benachrichtigt wird, die einen Freigabeverstoß verursacht.
Wenn in Windows 7 andere Handles in der Datei vorhanden sind, wenn eine Anwendung das FILE_OPEN_REQUIRING_OPLOCK Flag 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 unterbricht, der bereits in der 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 dieses Flag verwendet, muss ein Oplock anfordern, nachdem dieser Aufruf erfolgreich war, oder alle späteren Versuche zum Öffnen der Datei werden blockiert, ohne dass die typische Oplock-Verarbeitung zu nutzen ist. Wenn dieser Aufruf erfolgreich ist, aber die spätere Oplock-Anforderung fehlschlägt, muss eine Anwendung, die dieses Flag verwendet, sein Handle schließen, nachdem erkannt wird, dass die Oplock-Anforderung fehlgeschlagen ist.
Das FILE_OPEN_REQUIRING_OPLOCK-Flag ist unter Windows 7, Windows Server 2008 R2 und höher unter Windows-Betriebssystemen verfügbar. Die Microsoft-Dateisysteme, die dieses Kennzeichen in Windows 7 implementieren, sind NTFS, FAT und exFAT.
Die CreateOptions Flag FILE_RESERVE_OPFILTER ermöglicht einer Anwendung das Anfordern eines Oplocks der Ebene 1, eines Batchs oder eines Filters, um zu verhindern, dass andere Anwendungen Freigabeverletzungen erhalten. FILE_RESERVE_OPFILTER ist jedoch nur praktisch nützlich für Filter oplocks. Um sie zu verwenden, müssen Sie die folgenden Schritte ausführen:
Erstellen einer Anforderung mit CreateOptions- von FILE_RESERVE_OPFILTER, DesiredAccess- genau FILE_READ_ATTRIBUTES und ShareAccess- 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 der nächste angeforderte Oplock schlägt ebenfalls fehl.
Wenn Sie mit mehr Zugriff oder weniger Freigabe öffnen, tritt auch ein Fehler von STATUS_OPLOCK_NOT_GRANTED auf.
Wenn die Erstellungsanforderung erfolgreich ist, fordern Sie ein Oplock an.
Öffnen Sie ein weiteres Handle für die Datei, um E/A zu erledigen.
Schritt 3 macht dies nur für Filter oplocks praktisch. Der in Schritt 3 geöffnete Handle kann eine DesiredAccess- haben, die maximal FILE_READ_ATTRIBUTES enthält | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | SYNCHRONISIEREN | READ_CONTROL und trotzdem keinen Filter-Oplock aufheben. Alle DesiredAccess jedoch größer als FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE unterbricht einen Oplock der Ebene 1 oder eines Batches und macht das FILE_RESERVE_OPFILTER Flag für diese Oplock-Typen nutzlos.
NTFS ist das einzige Microsoft-Dateisystem, das FILE_RESERVE_OPFILTER implementiert.
IoCreateFileSpecifyDeviceObjectHint kann nicht zum Abrufen eines Handles für ein Volume verwendet werden.
Wenn der an IoCreateFileSpecifyDeviceObjectHint übergebene Dateinamepfad einen Analysepunkt enthält, muss der Analysepunkt in dasselbe Volume aufgelöst werden, in dem sich die Datei oder das Verzeichnis befindet. Wenn dies nicht der Fall ist, wird entweder der Fehler STATUS_INVALID_DEVICE_OBJECT_PARAMETER oder STATUS_MOUNT_POINT_NOT_RESOLVED zurückgegeben.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Header- | ntddk.h (include Ntddk.h, Ntifs.h, FltKernel.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | PASSIVE_LEVEL |