Функция NtCreateFile (winternl.h)
Создает файл или каталог или открывает существующий файл, устройство, каталог или том.
Эта функция эквивалентна функции ZwCreateFile, описанной в комплекте драйверов Windows (WDK).
Синтаксис
__kernel_entry 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] PVOID EaBuffer,
[in] ULONG EaLength
);
Параметры
[out] FileHandle
Указатель на переменную, которая получает дескриптор файла, если вызов выполнен успешно.
[in] DesiredAccess
Значение ACCESS_MASK, которое выражает тип доступа, который вызывающий объект требует для файла или каталога. Набор системных флагов DesiredAccess определяет следующие определенные права доступа для объектов файлов.
Не указывайте FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATAили FILE_EXECUTE при создании или открытии каталога.
Вызывающие объекты NtCreateFile могут указать одно или сочетание следующих значений, возможно, используя побитовое ИЛИ с дополнительными совместимыми флагами из списка флагов DesiredAccess для любого объекта файла, который не представляет файл каталога.
Значение FILE_GENERIC_EXECUTE не имеет значения для драйверов устройств и промежуточных драйверов.
STANDARD_RIGHTS_XXX являются предопределенными системными значениями, используемыми для обеспечения безопасности системных объектов.
Чтобы открыть или создать файл каталога, как показано в параметре CreateOptions, вызывающие NtCreateFile могут указать одно или сочетание следующих флагов, возможно, с помощью побитового ИЛИ с одним или несколькими совместимыми флагами из списка флагов DesiredAccess.
Ценность | Значение |
---|---|
|
Файлы в каталоге можно перечислить. |
|
Каталог можно пройти по пути: т. е. он может быть частью имени пути файла. |
[in] ObjectAttributes
Указатель на структуру, уже инициализированную с помощью InitializeObjectAttributes. Члены этой структуры для объекта файла включают следующие элементы.
Ценность | Значение |
---|---|
|
Указывает количество байтов ObjectAttributes предоставленных данных. Это значение должно быть по крайней мере sizeof(OBJECT_ATTRIBUTES). |
|
При необходимости задает дескриптор каталога, полученного при предыдущем вызове NtCreateFile. Если это значение равно |
|
Указывает на буферную строку Юникода, которая называет файл, который нужно создать или открыть. Это значение должно быть полной спецификацией файла или именем объекта устройства, если только это имя файла относительно каталога, указанного RootDirectory. Например, \Device\Floppy1\myfile.dat или \?? \B:\myfile.dat может быть полной спецификацией файла, при условии, что драйвер floppy и переопределенная файловая система уже загружены. Дополнительные сведения см. в разделе Имена файлов, пути и пространства имен. |
|
Представляет собой набор флагов, которые управляют атрибутами объекта файла. Это значение может быть равно нулю или OBJ_CASE_INSENSITIVE, указывающее, что код подстановки имен должен игнорировать регистр элемента ObjectName, а не выполнять поиск точного соответствия. Значение OBJ_INHERIT не относится к драйверам устройств и промежуточным драйверам. |
|
При необходимости указывает дескриптор безопасности, применяемый к файлу. Списки управления доступом, указанные таким дескриптором безопасности, применяются к файлу только при его создании. Если значение NULL при создании файла, ACL, помещенный в файл, зависит от файловой системы; большинство файловых систем распространяют некоторую часть такого ACL из родительского файла каталога в сочетании с ACL по умолчанию вызывающего объекта. Устройства и промежуточные драйверы могут задать для этого элемента значение NULL. |
|
Указывает права доступа, которые сервер должен быть предоставлен контексту безопасности клиента. Это значение не являетсяnull только при установке подключения к защищенному серверу, что позволяет вызывающему объекту контролировать, какие части контекста безопасности вызывающего объекта становятся доступными для сервера и разрешено ли олицетворение вызывающего сервера. |
[out] IoStatusBlock
Указатель на переменную, которая получает окончательное состояние завершения и сведения о запрошенной операции. При возвращении из NtCreateFileэлемент Information содержит одно из следующих значений:
- FILE_CREATED
- FILE_OPENED
- FILE_OVERWRITTEN
- FILE_SUPERSEDED
- FILE_EXISTS
- FILE_DOES_NOT_EXIST
[in, optional] AllocationSize
Начальный размер выделения в байтах для файла. Ненулевое значение не действует, если файл не создается, перезаписывается или не заменяет его.
[in] FileAttributes
Атрибуты файла. Явно указанные атрибуты применяются только при создании, замене файла или перезаписи. По умолчанию это значение является FILE_ATTRIBUTE_NORMAL, которое можно переопределить сочетанием одного или нескольких флагов FILE_ATTRIBUTE_xxxx, определенных в Wdm.h и NtDdk.h. Список флагов, которые можно использовать с NtCreateFile, см. в разделе CreateFile.
[in] ShareAccess
Тип доступа к общей папке, который вызывающий объект хотел бы использовать в файле, как ноль, или как одно или сочетание следующих значений.
Дополнительные сведения см. в пакете SDK для Windows.
[in] CreateDisposition
Указывает, что делать, в зависимости от того, существует ли файл, как одно из следующих значений.
[in] CreateOptions
Параметры, применяемые при создании или открытии файла, в качестве совместимого сочетания следующих флагов.
Ценность | Значение |
---|---|
|
Созданный или открытый файл — это файл каталога. С этим флагом параметр CreateDisposition должен иметь значение FILE_CREATE, FILE_OPENили FILE_OPEN_IF. С этим флагом другие совместимые флаги CreateOptions включают только следующие флаги: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO _NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENTи FILE_OPEN_BY_FILE_ID. |
|
Открываемый файл не должен быть файлом каталога или этот вызов завершается ошибкой. Открытый объект файла может представлять файл данных, логический, виртуальный или физический устройство или том. |
|
Приложения, которые записывают данные в файл, должны фактически передавать данные в файл до завершения любой запрошенной операции записи. Этот FILE_NO_INTERMEDIATE _BUFFERING флаг устанавливается автоматически, если установлен флаг CreateOptions. |
|
Все доступы к файлу являются последовательными. |
|
Доступ к файлу может быть случайным, поэтому не следует выполнять последовательные операции чтения в файле с помощью FSD или системы. |
|
Файл не может быть кэширован или буферирован во внутренних буферах драйвера. Этот флаг несовместим с флагом DesiredAccessFILE_APPEND_DATA. |
|
Все операции с файлом выполняются синхронно. Любое ожидание от имени вызывающего абонента подлежит преждевременному прекращению от оповещений. Этот флаг также приводит к тому, что система ввода-вывода поддерживает контекст положения файла. Если этот флаг задан, необходимо также задать флаг DesiredAccessSYNCHRONIZE. |
|
Все операции с файлом выполняются синхронно. Ожидание синхронизации очереди ввода-вывода и завершения в системе не распространяется на оповещения. Этот флаг также приводит к тому, что система ввода-вывода поддерживает контекст положения файла. Если этот флаг задан, необходимо также задать флаг DesiredAccessSYNCHRONIZE. |
|
Создайте дерево подключения для этого файла, чтобы открыть его по сети. Этот флаг не используется драйверами устройства и промежуточными драйверами. |
|
Если расширенные атрибуты существующего файла указывают, что вызывающий объект должен правильно интерпретировать файл, завершится ошибкой, так как вызывающий объект не понимает, как справиться с EAs. Этот флаг не имеет значения для драйверов устройств и промежуточных драйверов. |
|
Откройте файл с точкой перепарирования и обошли обычную обработку точек повторного параметров для файла. Дополнительные сведения см. в разделе "Примечания". |
|
Удалите файл, когда последний дескриптор передается в NtClose. Если этот флаг задан, флаг DELETE должен быть задан в параметре DesiredAccess. |
|
Имя файла, указанное параметром ObjectAttributes, содержит номер ссылки на 8-байтовый файл для файла. Это число назначается и зависит от конкретной файловой системы. Если файл является точкой повторного использования, имя файла также будет содержать имя устройства. Обратите внимание, что файловая система FAT не поддерживает этот флаг. Этот флаг не используется драйверами устройства и промежуточными драйверами. |
|
Файл открывается для намерения резервного копирования. Таким образом, система должна проверить определенные права доступа и предоставить вызывающему объекту соответствующий доступ к файлу перед проверкой параметра DesiredAccess в дескрипторе безопасности файла. Этот флаг не используется драйверами устройства и промежуточными драйверами. |
|
Этот флаг позволяет приложению запрашивать оппортунистическую блокировку фильтра (oplock), чтобы предотвратить получение других приложений нарушений общего доступа. Если уже открытые дескрипторы, запрос на создание завершится ошибкой с STATUS_OPLOCK_NOT_GRANTED. Дополнительные сведения см. в разделе "Примечания". |
|
Файл открывается и оппортунистическая блокировка (oplock) в файле запрашивается как одна атомарная операция. Файловая система проверяет наличие оплоков перед выполнением операции создания и завершится ошибкой создания с помощью возвращаемого кода STATUS_CANNOT_BREAK_OPLOCK если результатом будет разрыв существующей операции. Дополнительные сведения см. в разделе "Примечания".Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: Этот флаг не поддерживается.
Этот флаг поддерживается в следующих файловых системах: NTFS, FAT и exFAT. |
|
Выполните эту операцию немедленно с помощью альтернативного кода успешного выполнения STATUS_OPLOCK_BREAK_IN_PROGRESS если целевой файл заблокирован, а не блокирует поток вызывающего объекта. Если файл заблокирован, другой вызывающий объект уже имеет доступ к файлу. Этот флаг не используется драйверами устройства и промежуточными драйверами. |
[in] EaBuffer
Указатель на буфер EA, используемый для передачи расширенных атрибутов.
[in] EaLength
Длина буфера EA.
Возвращаемое значение
NtCreateFile возвращает STATUS_SUCCESS или соответствующее состояние ошибки. Если он возвращает состояние ошибки, вызывающий объект может найти дополнительные сведения о причине сбоя, проверив IoStatusBlock. Чтобы упростить эту проверку, приложение может использовать макросы NT_SUCCESS, NT_ERRORи NT_WARNING.
Замечания
Дескриптор, заданный NtCreateFile, можно использовать путем последующих вызовов для управления данными в файле или состоянии или атрибутах объекта файла.
Существует два альтернативных способа указать имя файла для создания или открытия с помощью NtCreateFile:
- Полное имя пути, предоставленное в элементе objectName
входных ObjectAttributes - Как имя пути относительно файла каталога, представленного дескриптором в RootDirectory элемент входных ObjectAttributes
- Чтобы вызывающий объект синхронизировал завершение ввода-вывода, ожидая возвращаемого
FileHandle , необходимо задать флагSYNCHRONIZE. - Передача нуля в DesiredFlags недействительна.
- Если заданы только флаги FILE_APPEND_DATA и SYNCHRONIZE, вызывающий объект может записывать только в конец файла, а все сведения о смещениях записи в файл игнорируются. Однако файл автоматически расширяется при необходимости для этой операции записи.
- Установка флага FILE_WRITE_DATA для файла также позволяет записывать данные за пределы конца файла. Файл автоматически расширяется для этого типа записи, а также.
- Если заданы только флаги FILE_EXECUTE и SYNCHRONIZE, вызывающий объект не может напрямую считывать или записывать данные в файле с помощью возвращенной FileHandle, то есть все операции с файлом происходят через системный пейджер в ответ на инструкции и доступ к данным.
Чтобы общий файл был успешно открыт, запрошенный параметр DesiredAccess в файл должен быть совместим как с DesiredAccess, так и спецификации ShareAccess всех предыдущих открытий, которые еще не были выпущены с NtClose. То есть параметр DesiredAccess, указанный для NtCreateFile для данного файла, не должен конфликтовать с доступом, которые другие открытые элементы файла запрещены.
Значение CreateDispositionFILE_SUPERSEDE требует, чтобы вызывающий объект DELETE доступ к существующему объекту файла. Если это так, успешный вызов NtCreateFile с FILE_SUPERSEDE в существующем файле фактически удаляет этот файл, а затем повторно создает его. Это означает, что если файл уже открыт другим потоком, он открыл файл, указав параметр ShareAccess с набором флагов FILE_SHARE_DELETE. Обратите внимание, что этот тип ликвидации соответствует стилю POSIX перезаписи файлов. Значения CreateDispositionFILE_OVERWRITE_IF и FILE_SUPERSEDE похожи. Если ZwCreateFile вызывается с существующим файлом и любой из этих значений CreateDisposition, файл заменяется.
Перезапись файла семантически эквивалентна операции замены, за исключением следующего:
- Вызывающий объект должен иметь доступ на запись к файлу, а не удалить доступ. Это означает, что, если файл уже открыт другим потоком, он открыл файл с флагом FILE_SHARE_WRITE, заданным во входном параметре ShareAccess.
- Указанные атрибуты файла логически являются ORed с теми, которые уже находятся в файле. Это означает, что если файл уже открыт другим потоком, последующий вызывающий объект NtCreateFile не может отключить существующие флаги FileAttributes, но может включить дополнительные флаги для того же файла. Обратите внимание, что этот стиль перезаписи файлов соответствует операционным системам MS-DOS, Windows 3.1 и OS/2.
Флаг CreateOptionsFILE_NO_INTERMEDIATE_BUFFERING запрещает файловой системе выполнять любые промежуточные буферизации от имени вызывающего объекта. При указании этого значения некоторые ограничения для параметров вызывающего объекта размещаются в других подпрограммах NtXXXFile, включая следующие:
- Любые необязательные ByteOffset, передаваемые NtReadFile или Функции NtWriteFile должны быть неотъемлемой частью размера сектора.
- длина, передаваемая NtReadFile или NtWriteFile, должна быть неотъемлемой частью размера сектора. Обратите внимание, что указание операции чтения в буфер, длина которого точно равна размеру сектора, может привести к меньшему количеству значительных байтов, передаваемых в этот буфер, если конец файла был достигнут во время передачи.
- Буферы должны быть скорректированы в соответствии с требованием выравнивания базового устройства. Эти сведения можно получить путем вызова NtCreateFile для получения дескриптора для объекта файла, представляющего физическое устройство, а затем вызова NtQueryInformationFile с этим дескриптором. Список системных значений FILE_XXX_ALIGNMENT см. в документации по пакету SDK для Windows.
- Вызовы NtSetInformationFile с параметром FileInformationClass, равным FilePositionInformation, должны указывать смещение, которое является неотъемлемой частью размера сектора.
Если параметр createOptions
Флаг FILE_OPEN_REQUIRING_OPLOCK параметра CreateOptionsFILE_OPEN_REQUIRING_OPLOCK устраняет время между открытием файла и запросом оплока, который может позволить стороннему пользователю открывать файл, что приведет к нарушению общего доступа. Приложение может использовать флаг FILE_OPEN_REQUIRING_OPLOCK с NtCreateFile, а затем запросить любой oplock. Это гарантирует, что владелец oplock будет уведомлен о любом последующем открытом запросе, что приводит к нарушению общего доступа.
В Windows 7, если другие дескрипторы существуют в файле, когда приложение использует этот флаг, операция создания завершится ошибкой с STATUS_OPLOCK_NOT_GRANTED. Это ограничение больше не существует, начиная с Windows 8.
Если эта операция создания разорвит блокировку, которая уже существует в файле, то установка флага FILE_OPEN_REQUIRING_OPLOCK приведет к сбою операции создания с STATUS_CANNOT_BREAK_OPLOCK. Существующая операция создания не будет нарушена этой операцией создания.
Приложение, использующее этот флаг, должно запрашивать оплок после успешного вызова или все последующие попытки открытия файла будут заблокированы без использования обычной обработки оплока. Аналогичным образом, если этот вызов завершается успешно, но последующий запрос oplock завершается ошибкой, приложение, использующее этот флаг, должно закрыть его дескриптор после обнаружения сбоя запроса oplock.
Флаг FILE_RESERVE_OPFILTER параметра CreateOptions позволяет приложению запрашивать уровень 1, пакетную службу или фильтрацию, чтобы другие приложения не получали нарушения общего доступа. Однако в практическом плане FILE_RESERVE_OPFILTER полезно только для фильтров оплоков. Чтобы использовать его, необходимо выполнить следующие действия.
- Создайте запрос с CreateOptionsFILE_RESERVE_OPFILTER, DesiredAccess точно FILE_READ_ATTRIBUTESи ShareAccess точно
(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)
. Возможные сбои приведены следующим образом:- Если уже открытые дескрипторы, запрос создания завершается ошибкой STATUS_OPLOCK_NOT_GRANTED, а следующий запрошенный оплок также завершается ошибкой.
- Если вы открываете больше доступа, чем FILE_READ_ATTRIBUTES или меньше общего доступа, чем
(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)
, запрос завершается сбоем с STATUS_OPLOCK_NOT_GRANTED.
- Если запрос на создание выполнен успешно, запросите оплок.
- Откройте другой дескриптор файла для выполнения операций ввода-вывода.
(FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | SYNCHRONIZE | READ_CONTROL)
, и по-прежнему не прерывать блокировку фильтра. Однако любая DesiredAccess больше (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE)
разорвит блокировку уровня 1 или пакетной службы и сделает флаг FILE_RESERVE_OPFILTER бесполезным для этих типов оплоков.
NTFS — это единственная файловая система Майкрософт, реализующая FILE_RESERVE_OPFILTER.
Дополнительные сведения об оплоках см. в семантики Oplock.
Обратите внимание, что файл заголовка WDK NtDef.h необходим для многих определений констант, а также для макроса
Требования
Требование | Ценность |
---|---|
целевая платформа | Виндоус |
заголовка | winternl.h |
библиотеки |
ntdll.lib |
DLL | ntdll.dll |