Поделиться через


Функция NtCreateFile (ntifs.h)

Подпрограмма NtCreateFile создает новый файл или открывает существующий файл.

Синтаксис

__kernel_entry NTSYSCALLAPI NTSTATUS NtCreateFile(
  [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
);

Параметры

[out] FileHandle

Указатель на переменную HANDLE, которая получает дескриптор файла.

[in] DesiredAccess

Указывает значение ACCESS_MASK, определяющее запрошенный доступ к объекту.

Помимо стандартных прав доступа, определенных для всех типов объектов, вызывающий объект может указать любой из следующих определенных прав доступа; то есть права, относящиеся к файлам.

флаг ACCESS_MASK Позволяет вызывающей абоненту сделать это
FILE_READ_DATA Чтение данных из файла.
FILE_READ_ATTRIBUTES Чтение атрибутов файла. Дополнительные сведения см. в описании параметра FileAttributes.
FILE_READ_EA Чтение расширенных атрибутов (EAS) файла. Этот флаг не имеет значения для драйверов устройств и промежуточных драйверов.
FILE_WRITE_DATA Запись данных в файл.
FILE_WRITE_ATTRIBUTES Напишите атрибуты файла. Дополнительные сведения см. в описании параметра FileAttributes.
FILE_WRITE_EA Измените расширенные атрибуты (EAS) файла. Этот флаг не имеет значения для драйверов устройств и промежуточных драйверов.
FILE_APPEND_DATA Добавьте данные в файл.
FILE_EXECUTE Используйте системное разбиение ввода-вывода для чтения данных из файла в память. Этот флаг не имеет значения для драйверов устройств и промежуточных драйверов.

Заметка

Не указывайте FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATA или FILE_EXECUTE при создании или открытии каталога.

Вызывающий объект также может указать следующие универсальные права доступа (права, применяемые ко всем типам объектов, где значение каждого универсального права доступа относится к типу объекта). Универсальные права доступа для объектов файлов соответствуют определенным правам доступа, как показано в следующей таблице. (Обратите внимание, что "соответствует" означает "сопоставлять" и не означает, что значение универсального права "равно" значению битового или сопоставления его конкретных прав). Диспетчер ввода-вывода определяет фактическое сопоставление.

Универсальное право доступа Сопоставляется с этими конкретными правами доступа
GENERIC_READ STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA и СИНХРОНИЗАЦИЯ
GENERIC_WRITE STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA и СИНХРОНИЗАЦИЯ
GENERIC_EXECUTE STANDARD_RIGHTS_EXECUTE, FILE_EXECUTE, FILE_READ_ATTRIBUTES и СИНХРОНИЗИРОВАТЬ. Это значение не имеет значения для драйверов устройств и промежуточных драйверов.
GENERIC_ALL FILE_ALL_ACCESS

Заметка

универсальные права доступа можно указать только для файла; Их нельзя указать для каталога.

Некоторые флаги CreateOptions требуют установки определенных флагов доступа в DesiredAccess при вызове NtCreateFile. Дополнительные сведения см. в параметре CreateOptions.

Например, если указать GENERIC_READ для объекта файла, подпрограмма сопоставляет это значение с FILE_GENERIC_READ битовой маской определенных прав доступа. В предыдущей таблице определенные права доступа, перечисленные для GENERIC_READ, соответствуют (но не равны) флагам доступа, содержащимся в битовой маске FILE_GENERIC_READ.

Если файл на самом деле является каталогом, вызывающий объект также может указать следующие универсальные права доступа.

флаг DesiredAccess Позволяет вызывающей абоненту сделать это
FILE_LIST_DIRECTORY Вывод списка файлов в каталоге.
FILE_TRAVERSE Обход каталога, другими словами, включает каталог в путь к файлу.

Дополнительные сведения о правах доступа см. в ACCESS_MASK и права доступа.

[in] ObjectAttributes

Указатель на структуру OBJECT_ATTRIBUTES, указывающую имя объекта и другие атрибуты. Используйте InitializeObjectAttributes для инициализации этой структуры. Если вызывающий объект не запущен в контексте системного потока, он должен задать атрибут OBJ_KERNEL_HANDLE при вызове InitializeObjectAttributes.

[out] IoStatusBlock

Указатель на структуру IO_STATUS_BLOCK, которая получает окончательное состояние завершения и другие сведения о запрошенной операции. В частности, элемент сведений получает одно из следующих значений:

  • FILE_CREATED
  • FILE_OPENED
  • FILE_OVERWRITTEN
  • FILE_SUPERSEDED
  • FILE_EXISTS
  • FILE_DOES_NOT_EXIST

[in, optional] AllocationSize

Указатель на LARGE_INTEGER, содержащий начальный размер выделения в байтах для созданного или перезаписываемого файла. Если выделениеNULL, размер выделения не указан. Если файл не создан или перезаписан, AllocationSize игнорируется.

[in] FileAttributes

Задает один или несколько флагов FILE_ATTRIBUTE_XXX, которые представляют атрибуты файла, заданные при создании или перезаписи файла. Вызывающий объект обычно задает FILE_ATTRIBUTE_NORMAL, который задает атрибуты по умолчанию. Список допустимых флагов FILE_ATTRIBUTE_XXX см. в подпрограмме CreateFile в документации по пакету SDK для Microsoft Windows. Если файл не создан или перезаписан, FileAttributes игнорируется.

[in] ShareAccess

Тип доступа к общей папке, который указывается как ноль или любое сочетание следующих флагов.

флаг ShareAccess Позволяет другим потокам это сделать
FILE_SHARE_READ Чтение файла
FILE_SHARE_WRITE Запись файла
FILE_SHARE_DELETE Удаление файла

Устройства и промежуточные драйверы обычно задают ShareAccess равны нулю, что дает вызывающим абоненту монопольный доступ к открытому файлу.

[in] CreateDisposition

Указывает действие для выполнения, если файл не существует. CreateDisposition может быть одним из значений в следующей таблице.

значение createDisposition Действие, если файл существует Действие, если файл не существует
FILE_SUPERSEDE Замените файл. Создайте файл.
FILE_CREATE Возвращает ошибку. Создайте файл.
FILE_OPEN Откройте файл. Возвращает ошибку.
FILE_OPEN_IF Откройте файл. Создайте файл.
FILE_OVERWRITE Откройте файл и перезапишите его. Возвращает ошибку.
FILE_OVERWRITE_IF Откройте файл и перезапишите его. Создайте файл.

[in] CreateOptions

Указывает параметры, применяемые при создании или открытии файла драйвером. Используйте один или несколько флагов в следующей таблице.

Флаг CreateOptions Значение
FILE_DIRECTORY_FILE (0x00000001) Файл является каталогом. Совместимые флаги CreateOptions: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT и FILE_OPEN_BY_FILE_ID. Параметр CreateDisposition должен иметь значение FILE_CREATE, FILE_OPEN или FILE_OPEN_IF.
FILE_WRITE_THROUGH (0x00000002) Системные службы, драйверы файловой системы и драйверы, которые записывают данные в файл, должны фактически передавать данные в файл до завершения любой запрошенной операции записи.
FILE_SEQUENTIAL_ONLY (0x00000004) Все доступ к файлу будут последовательными.
FILE_NO_INTERMEDIATE_BUFFERING (0x00000008) Файл не может быть кэширован или буферирован во внутренних буферах драйвера. Этот флаг несовместим с флагом FILE_APPEND_DATA параметра DesiredAccess.
FILE_SYNCHRONOUS_IO_ALERT (0x00000010) Все операции с файлом выполняются синхронно. Любое ожидание от имени вызывающего абонента подлежит преждевременному прекращению от оповещений. Этот флаг также приводит к тому, что система ввода-вывода поддерживает указатель на положение файла. Если этот флаг задан, флаг SYNCHRONIZE должен быть задан в параметре DesiredAccess.
FILE_SYNCHRONOUS_IO_NONALERT (0x00000020) Все операции с файлом выполняются синхронно. Ожидание в системе, которая синхронизирует очередь ввода-вывода и завершение, не распространяется на оповещения. Этот флаг также приводит к тому, что система ввода-вывода поддерживает контекст положения файла. Если этот флаг задан, флаг SYNCHRONIZE должен быть задан в параметре DesiredAccess.
FILE_NON_DIRECTORY_FILE (0x00000040) Файл не каталог. Открытый объект файла может представлять файл данных; логическое, виртуальное или физическое устройство; или том. Начиная с Windows 11 версии 24H2, NTFS теперь учитывает этот флаг при открытии атрибута $INDEX_ALLOCATION.
FILE_CREATE_TREE_CONNECTION (0x00000080) Создайте дерево подключения для этого файла, чтобы открыть его по сети. Этот флаг не используется драйверами устройства и промежуточными драйверами.
FILE_COMPLETE_IF_OPLOCKED (0x00000100) Выполните эту операцию немедленно с альтернативным кодом успешного выполнения STATUS_OPLOCK_BREAK_IN_PROGRESS если целевой файл заблокирован, а не блокирует поток вызывающего объекта. Если файл заблокирован, другой вызывающий объект уже имеет доступ к файлу. Этот флаг не используется драйверами устройства и промежуточными драйверами.
FILE_NO_EA_KNOWLEDGE (0x00000200) Если расширенные атрибуты (EAs) для существующего файла указывают на то, что вызывающий объект должен правильно интерпретировать файл, NtCreateFile должен вернуть ошибку. Этот флаг не имеет значения для драйверов устройств и промежуточных драйверов.
FILE_OPEN_REMOTE_INSTANCE (0x00000400) Зарезервировано для использования системы; не используйте.
FILE_RANDOM_ACCESS (0x00000800) Доступ к файлу может быть случайным, поэтому последовательные операции чтения не должны выполняться драйверами файловой системы или системой.
FILE_DELETE_ON_CLOSE (0x00001000) Система удаляет файл, когда последний дескриптор передается в NtClose. Если этот флаг задан, флаг DELETE должен быть задан в параметре DesiredAccess.
FILE_OPEN_BY_FILE_ID (0x00002000) Имя файла, указанное параметром ObjectAttributes, включает двоичное 8-байтовое или 16-байтовое имя файла или идентификатор объекта для файла в зависимости от файловой системы. При необходимости имя устройства, за которым следует символ обратной косой черты, может продолжить эти двоичные значения. Дополнительные сведения и пример см. в примечаниях.
FILE_OPEN_FOR_BACKUP_INTENT (0x00004000) Файл открывается для намерения резервного копирования. Поэтому система должна проверить определенные права доступа и предоставить вызывающему объекту соответствующий доступ к файлу, прежде чем проверять параметр DesiredAccess в дескрипторе безопасности файла. Этот флаг не используется драйверами устройства и промежуточными драйверами.
FILE_NO_COMPRESSION (0x00008000) Подавление наследования FILE_ATTRIBUTE_COMPRESSED из родительского каталога. Это позволяет создавать не сжатый файл в каталоге, который помечен как сжатый.
FILE_OPEN_REQUIRING_OPLOCK (0x00010000) Файл открывается, а оппортунистическая блокировка (oplock) файла запрашивается как одна атомарная операция. Файловая система проверяет наличие блокировок перед выполнением операции создания и завершится сбоем создания с помощью возвращаемого кода STATUS_CANNOT_BREAK_OPLOCK если результатом будет разрыв существующего оплока. Этот флаг доступен начиная с Windows 7 и Windows Server 2008 R2.
FILE_DISALLOW_EXCLUSIVE (0x00020000) При открытии существующего файла, если FILE_SHARE_READ не заданы, а проверки доступа к файловой системе не предоставляют вызывающему файлу доступ на запись, сбой открытия с STATUS_ACCESS_DENIED. Это было поведение по умолчанию до Windows 7. Этот флаг доступен начиная с Windows 7 и Windows Server 2008 R2.
FILE_SESSION_AWARE (0x00040000) Клиент, открывающий файл или устройство, учитывает сеанс, и при необходимости проверяется доступ к сеансу. Этот флаг доступен начиная с Windows 8.
FILE_RESERVE_OPFILTER (0x00100000) Этот флаг позволяет приложению запрашивать оппортунистическую блокировку фильтра (oplock), чтобы запретить другим приложениям получать нарушения общего доступа. Если уже открытые дескрипторы, запрос на создание завершится ошибкой с STATUS_OPLOCK_NOT_GRANTED. Дополнительные сведения см. в следующем разделе "Примечания".
FILE_OPEN_REPARSE_POINT (0x00200000) Откройте файл с точкой перепарирования и обошли обычную обработку точек повторного параметров для файла. Дополнительные сведения см. в следующем разделе "Примечания".
FILE_OPEN_NO_RECALL (0x00400000) Предписывает любым фильтрам, выполняющим автономное хранилище или виртуализацию, не вспоминать содержимое файла в результате этого открытия.
FILE_OPEN_FOR_FREE_SPACE_QUERY (0x00800000) Этот флаг указывает файловой системе записать пользователя, связанного с вызывающим потоком. Любые последующие вызовы FltQueryVolumeInformation или ZwQueryVolumeInformationFile с помощью возвращенного дескриптора предполагают, что захваченный пользователь, а не вызывающий пользователь в то время для вычисления свободного места, доступного вызывающей функции. Это относится к следующим значениям FsInformationClass: FileFsSizeInformation, FileFsFullSizeInformation и FileFsFullSizeInformationEx.
FILE_CONTAINS_EXTENDED_CREATE_INFORMATION (0x10000000) Интерпретирует параметр EaBuffer как экземпляр EXTENDED_CREATE_INFORMATION. Этот флаг доступен начиная с Windows 11 версии 22H2.

[in, optional] EaBuffer

Для драйверов устройств и промежуточных параметров этот параметр должен быть указателем NULL.

[in] EaLength

Для драйверов устройств и промежуточных параметров этот параметр должен быть равен нулю.

Возвращаемое значение

NtCreateFile возвращает STATUS_SUCCESS при успешном выполнении или соответствующем коде ошибки NTSTATUS при сбое. В последнем случае вызывающий объект может определить причину сбоя, проверив параметр IoStatusBlock.

Заметка

NtCreateFile может возвращать STATUS_FILE_LOCK_CONFLICT в качестве возвращаемого значения или в элементе status структуры IO_STATUS_BLOCK, на которую указывает параметр IoStatusBlock. Это происходит только в том случае, если файл журнала NTFS заполнен, и возникает ошибка, в то время как NtCreateFile пытается справиться с этой ситуацией.

Замечания

NtCreateFile предоставляет дескриптор, который вызывающий объект может использовать для управления данными файла или состоянием и атрибутами объекта файла. Дополнительные сведения см. в разделе Using Files in a Driver.

После того как дескриптор, на который указывает FileHandle больше не используется, драйвер должен вызвать NtClose, чтобы закрыть его.

Если вызывающий объект не работает в контексте системного потока, он должен убедиться, что все создаваемые дескрипторы являются частными дескрипторами. В противном случае дескриптор может получить доступ к процессу, в контексте которого выполняется драйвер. Дополнительные сведения см. в разделе Обработчики объектов.

Существует два альтернативных способа указать имя файла для создания или открытия с помощью NtCreateFile:

  • В качестве полного имени пути, предоставленного в элементе objectName входных ObjectAttributes.
  • Как имя пути относительно файла каталога, представленного дескриптором в RootDirectory элемент входных ObjectAttributes.

Задание определенных флагов в параметре DesiredAccess приводит к следующим эффектам:

  • Чтобы вызывающий объект синхронизировать завершение ввода-вывода, ожидая возвращаемого FileHandle, необходимо задать флаг SYNCHRONIZE. В противном случае вызывающий объект, который является устройством или промежуточным драйвером, должен синхронизировать завершение ввода-вывода с помощью объекта события.
  • Если вызывающий объект задает только флаги FILE_APPEND_DATA и СИНХРОНИЗАЦИИ, он может записывать только в конец файла, а любые сведения о смещении операций записи в файл игнорируются. Файл будет автоматически расширен по мере необходимости для этой операции.
  • Установка флага FILE_WRITE_DATA для файла также позволяет вызывающей стороне записывать данные за пределы конца файла. Опять же, файл автоматически расширяется по мере необходимости.
  • Если вызывающий объект задает только флаги FILE_EXECUTE и СИНХРОНИЗАЦИИ, он не может напрямую считывать или записывать данные в файл с помощью возвращенной FileHandle. То есть все операции с файлом происходят через системный пейджер в ответ на инструкции и операции доступа к данным. Устройства и промежуточные драйверы не должны задавать флаг FILE_EXECUTE.

Параметр ShareAccess определяет, могут ли отдельные потоки получить доступ к одному файлу, возможно, одновременно. При условии, что оба вызывающих объекта имеют соответствующие права доступа, файл может быть успешно открыт и предоставлен общий доступ. Если исходный вызывающий объект NtCreateFile не указывает FILE_SHARE_READ, FILE_SHARE_WRITE или FILE_SHARE_DELETE, другой вызывающий объект не может открыть файл, то есть исходный вызывающий объект предоставляет монопольный доступ.

Чтобы успешно открыть общий файл, флаги DesiredAccess должны быть совместимы с флагами DesiredAccess и флагами ShareAccess всех предыдущих открытых операций, которые еще не были выпущены. То есть DesiredAccess, указанные для NtCreateFile для данного файла, не должны конфликтовать с доступом, которые другие открытые элементы файла запрещены.

Значение FILE_SUPERSEDE CreateDisposition требует, чтобы вызывающий объект имеет доступ DELETE к существующему объекту файла. В этом случае успешный вызов NtCreateFile с FILE_SUPERSEDE существующего файла фактически удаляет этот файл, а затем повторно создает его. Это означает, что если файл уже открыт другим потоком, он открыл файл, указав параметр ShareAccess с набором флагов FILE_SHARE_DELETE. Обратите внимание, что этот тип ликвидации соответствует стилю POSIX перезаписи файлов.

Значения CreateDisposition FILE_OVERWRITE_IF и FILE_SUPERSEDE похожи. Если NtCreateFile вызывается с существующим файлом и любой из этих значений CreateDisposition, файл будет заменен.

Перезапись файла семантически эквивалентна операции замены, за исключением следующего:

  • Вызывающий объект должен иметь доступ на запись к файлу, а не удалить доступ. Это означает, что, если файл уже открыт другим потоком, он открыл файл с флагом FILE_SHARE_WRITE, установленным в входных ShareAccess.
  • Указанные атрибуты файла логически являются ORed с теми, которые уже находятся в файле. Это означает, что если файл уже открыт другим потоком, последующий вызывающий объект NtCreateFile не может отключить существующие флаги FileAttributes, но может включить дополнительные флаги для того же файла. Обратите внимание, что этот стиль перезаписи файлов согласуется с MS-DOS, Microsoft Windows 3.1 и ОС/2.

Значение FILE_DIRECTORY_FILE CreateOptions указывает, что файл, который нужно создать или открыть, является каталогом. При создании файла каталога файловая система создает соответствующую структуру на диске, чтобы представить пустой каталог для конкретной файловой системы на диске. Если этот параметр был указан, а открытый файл не является файлом каталога, или если вызывающий объект указал несогласованный CreateOptions или Значение CreateDisposition, вызов NtCreateFile завершится ошибкой.

Флаг FILE_NO_INTERMEDIATE_BUFFERING CreateOptions запрещает файловой системе выполнять любые промежуточные буферизации от имени вызывающего объекта. Указание этого флага помещает следующие ограничения для параметров вызывающего объекта в другие подпрограммы ZwXxxFile.

  • Любые необязательные ByteOffset, передаваемые NtReadFile или NtWriteFile, должны иметь несколько размеров сектора.
  • длина, передаваемая NtReadFile или NtWriteFile, должна быть неотъемлемой частью размера сектора. Обратите внимание, что указание операции чтения в буфер, длина которого точно равна размеру сектора, может привести к меньшему количеству значительных байтов, передаваемых в этот буфер, если конец файла был достигнут во время передачи.
  • Буферы должны быть выровнены в соответствии с требованием выравнивания базового устройства. Чтобы получить эти сведения, вызовите NtCreateFile, чтобы получить дескриптор для объекта файла, представляющего физическое устройство, и передайте этот дескриптор в NtQueryInformationFile. Список значений FILE_XXX_ALIGNMENT системы см. в DEVICE_OBJECT.
  • Вызовы NtSetInformationFile с параметром FileInformationClass значение FilePositionInformation должны указывать смещение, которое является нескольким размером сектора.

Флаги FILE_SYNCHRONOUS_IO_ALERT и FILE_SYNCHRONOUS_IO_NONALERT CreateOptions (которые являются взаимоисключающими) указывают, что все операции ввода-вывода в файле будут синхронными, если операции выполняются через объект файла, на который ссылается возвращенный FileHandle. Все операции ввода-вывода в таком файле сериализуются во всех потоках с помощью возвращаемого дескриптора. Если установлен любой из этих флагов CreateOptions, флаг СИНХРОНИЗАЦИИ DesiredAccess также должен быть установлен, чтобы диспетчер ввода-вывода использовал объект файла в качестве объекта синхронизации. В таких случаях диспетчер ввода-вывода отслеживает текущее смещение положения файла, которое можно передать NtReadFile и NtWriteFile. Вызовите NtQueryInformationFile или NtSetInformationFile, чтобы получить или задать эту позицию.

Если флаг FILE_OPEN_REPARSE_POINT CreateOptions не указан, а NtCreateFile пытается открыть файл с точкой повторного вычисления, для файла выполняется обычная обработка точек повторного вычисления. Если, с другой стороны, указан флаг FILE_OPEN_REPARSE_POINT, обычная обработка перепарировки не происходит, и NtCreateFile пытается напрямую открыть файл точки повторного вычисления. В любом случае, если операция открытия была успешной, NtCreateFile возвращает STATUS_SUCCESS; В противном случае подпрограмма возвращает код ошибки NTSTATUS. NtCreateFile никогда не возвращает STATUS_REPARSE.

Флаг CreateOptions FILE_OPEN_REQUIRING_OPLOCK устраняет время между открытием файла и запросом на блокировку, которая может позволить стороннему пользователю открыть файл и получить нарушение общего доступа. Приложение может использовать флаг FILE_OPEN_REQUIRING_OPLOCK в NtCreateFile, а затем запросить любой oplock. Это гарантирует, что владелец oplock будет уведомлен о любом последующем открытом запросе, что приводит к нарушению общего доступа.

В Windows 7, если другие дескрипторы существуют в файле, если приложение использует флаг FILE_OPEN_REQUIRING_OPLOCK, операция создания завершится ошибкой с STATUS_OPLOCK_NOT_GRANTED. Это ограничение больше не существует, начиная с Windows 8.

Если эта операция создания разорвит блокировку, которая уже существует в файле, то установка флага FILE_OPEN_REQUIRING_OPLOCK приведет к сбою операции создания с STATUS_CANNOT_BREAK_OPLOCK. Существующая операция создания не будет нарушена этой операцией создания.

Приложение, использующее флаг FILE_OPEN_REQUIRING_OPLOCK, должно запрашивать оплок после успешного вызова или все последующие попытки открытия файла будут заблокированы без использования обычной обработки оплока. Аналогичным образом, если этот вызов завершается успешно, но последующий запрос oplock завершается ошибкой, приложение, использующее этот флаг, должно закрыть его дескриптор после обнаружения сбоя запроса oplock. Приложение не должно выполнять любую другую операцию файловой системы в файле, прежде чем запрашивать оплок (помимо закрытия дескриптора файла), в противном случае может возникнуть взаимоблокировка.

Заметка

Флаг FILE_OPEN_REQUIRING_OPLOCK доступен в операционных системах Windows 7, Windows Server 2008 R2 и более поздних версий. Файловые системы Майкрософт, реализующие этот флаг в Windows 7, — NTFS, FAT и exFAT.

Флаг FILE_RESERVE_OPFILTER CreateOptions CreateOptions позволяет приложению запрашивать уровень 1, пакетную или фильтруемую блокировку, чтобы другие приложения не получали нарушения общего доступа. Однако FILE_RESERVE_OPFILTER практически полезно только для блокировки фильтров. Чтобы использовать его, необходимо выполнить следующие действия.

  1. Выдача запроса на создание с CreateOptions FILE_RESERVE_OPFILTER, DesiredAccess точно FILE_READ_ATTRIBUTES и ShareAccess точно FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE.
    • Если уже открытые дескрипторы, запрос создания завершается ошибкой STATUS_OPLOCK_NOT_GRANTED, а следующий запрошенный оплок также завершается ошибкой.
    • Если вы открываете доступ или меньше общего доступа, также приведет к сбою STATUS_OPLOCK_NOT_GRANTED.
  2. Если запрос на создание выполнен успешно, запросите оплок.
  3. Откройте другой дескриптор файла для выполнения операций ввода-вывода.

Шаг 3 делает это практическим только для фильтров оплоков. Маркер, открытый на шаге 3, может иметь DesiredAccess, содержащий не более FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | СИНХРОНИЗАЦИЯ | READ_CONTROL и по-прежнему не прерывать блокировку фильтра. Однако любой DesiredAccess больше FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | СИНХРОНИЗАЦИЯ разорвит оплок уровня 1 или пакетной службы и сделает флаг FILE_RESERVE_OPFILTER бесполезным для этих типов оплоков.

NTFS — это единственная файловая система Майкрософт, реализующая FILE_RESERVE_OPFILTER.

Для флага FILE_OPEN_BY_FILE_ID createOptions имя устройства будет иметь формат:

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

Где FileID составляет 8 байт, а ObjectID составляет 16 байт:

  • В NTFS это может быть 8-байтовый или 16-байтовый ссылочный номер или идентификатор объекта. Номер ссылки на 16 байтов совпадает с числом 8-байтов, заполненным нулями.
  • В ReFS это может быть 8-байтовый или 16-байтовый ссылочный номер. Число 16 байтов не связано с 8-байтовым числом. Идентификаторы объектов не поддерживаются.
  • Файловые системы FAT, ExFAT, UDFS и CDFS не поддерживают флаг FILE_OPEN_BY_FILE_ID.

Это число назначается и зависит от конкретной файловой системы. Поскольку поле имени файла частично будет содержать двоичный большой двоичный двоичный объект, неправильно предположить, что это допустимая строка Юникода, и, что более важно, не может быть строкой, завершающейся значением NULL.

Вызовы NtCreateFile должны выполняться в IRQL = PASSIVE_LEVEL и со специальными API ядра, включенными.

Заметка

Если вызов этой функции происходит в пользовательском режиме, следует использовать имя "NtCreateFile" вместо "ZwCreateFile".

Для вызовов драйверов в режиме ядра NtXxx и ZwXxx версии подпрограммы Windows Native System Services могут вести себя по-разному в том, как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между NtXxx и ZwXxx версиями подпрограммы см. в разделе Using Nt and Zw Versions of the Native System Services Routines.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000
целевая платформа Всеобщий
заголовка ntifs.h (включая Wdm.h, Ntddk.h, Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL (см. раздел "Примечания")
правил соответствия DDI HwStorPortProhibitedDDIs, PowerIrpDDis

См. также

ACCESS_MASK

DEVICE_OBJECT

EXTENDED_CREATE_INFORMATION

IO_STATUS_BLOCK

InitializeObjectAttributes

NtClose

NtOpenFile

NtQueryInformationFile

NtReadFile

NtSetInformationFile

NtWriteFile