Функция NtCreateNamedPipeFile
Создает и открывает серверный дескриптор первого экземпляра определенного именованного канала или другого экземпляра существующего именованного канала. Функция возвращает дескриптор, который можно использовать для доступа к каналу.
Синтаксис
NTSTATUS NtCreateNamedPipeFile(
[out] PHANDLE FileHandle,
[in] ULONG DesiredAccess,
[in] POBJECT_ATTRIBUTES ObjectAttributes,
[out] PIO_STATUS_BLOCK IoStatusBlock,
[in] ULONG ShareAccess,
[in] ULONG CreateDisposition,
[in] ULONG CreateOptions,
[in] ULONG NamedPipeType,
[in] ULONG ReadMode,
[in] ULONG CompletionMode,
[in] ULONG MaximumInstances,
[in] ULONG InboundQuota,
[in] ULONG OutboundQuota,
[in, optional] PLARGE_INTEGER DefaultTimeout
);
Параметры
FileHandle [out]
Указатель на переменную, которая получает дескриптор файла в случае успешного вызова.
DesiredAccess [in]
Битовая маска флагов, указывающая тип доступа к файлу или каталогу, который требуется вызывающей организации. Этот набор системных флагов DesiredAccess определяет следующие конкретные права доступа для файловых объектов.
Flag | Описание |
---|---|
DELETE | Файл можно удалить. |
FILE_READ_DATA | Данные могут быть считаны из файла. |
FILE_READ_ATTRIBUTES | Флаги FileAttributes, описанные ниже, можно считать. |
FILE_READ_EA | Расширенные атрибуты (EAs), связанные с файлом, можно считать. |
READ_CONTROL | Список управления доступом (ACL) и сведения о владельце, связанные с файлом, можно считать. |
FILE_WRITE_DATA | Данные могут быть записаны в файл. |
FILE_WRITE_ATTRIBUTES | Можно записывать флаги FileAttributes. |
FILE_WRITE_EA | EA, связанные с файлом, могут быть записаны. |
FILE_APPEND_DATA | Данные можно добавить в файл. |
WRITE_DAC | Список управления доступом на уровне пользователей (DACL), связанный с файлом, можно записать. |
WRITE_OWNER | Сведения о владельце, связанные с файлом, можно записать. |
SYNCHRONIZE | Вызывающий объект может синхронизировать завершение операции ввода-вывода, ожидая, пока возвращенное значение FileHandle будет установлено в состояние Signaled. Этот флаг необходимо установить, если установлен флаг CreateOptionsFILE_SYNCHRONOUS_IO_ALERT или FILE_SYNCHRONOUS_IO_NONALERT . |
FILE_EXECUTE | Данные можно считывать в память из файла с помощью системного ввода-вывода подкачки. |
Кроме того, для любого объекта файла, который не представляет каталог, можно указать один или несколько следующих общих флагов ACCESS_MASK . Флаги STANDARD_RIGHTS_XXX — это предопределенные системные значения, которые используются для обеспечения безопасности системных объектов. Вы также можете объединить эти универсальные флаги с дополнительными флагами из предыдущей таблицы.
Требуемый доступ к значениям файлов | Сопоставляется с флагами DesiredAccess |
---|---|
GENERIC_READ | STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA, SYNCHRONIZE. |
GENERIC_WRITE | STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA, SYNCHRONIZE. |
GENERIC_EXECUTE | STANDARD_RIGHTS_EXECUTE, SYNCHRONIZE, FILE_READ_ATTRIBUTES FILE_EXECUTE. |
Для каталогов (FILE_DIRECTORY_FILE
установлен флаг CreateOptions) можно указать один или несколько следующих флагов ACCESS_MASK, которые также можно объединить с любыми совместимыми флагами, описанными ранее.
Требуемый доступ к значениям каталога | Описание |
---|---|
FILE_LIST_DIRECTORY | Файлы в каталоге могут быть перечислены. |
FILE_TRAVERSE | Каталог можно просмотреть; то есть он может быть частью пути к файлу. |
Флаги FILE_READ_DATA
, FILE_WRITE_DATA
, FILE_EXECUTE
и FILE_APPEND_DATA
DesiredAccess несовместимы с созданием или открытием файла каталога.
ObjectAttributes [in]
Указатель на структуру, OBJECT_ATTRIBUTES
уже инициализированную подпрограммой InitializeObjectAttributes . Если вызывающий объект выполняется в контексте системного процесса, этот параметр может иметь значение NULL
. В противном случае вызывающий объект должен задать OBJ_KERNEL_HANDLE
атрибут в вызове InitializeObjectAttributes.
В эту структуру для объекта файла входят следующие элементы:
Член | Значение |
---|---|
Длина ULONG | Количество байтов предоставленных данных ObjectAttributes . Это значение должно быть не менее sizeof(OBJECT_ATTRIBUTES) . |
PUNICODE_STRING ObjectName | Указатель на буферизоваемую строку Юникода, содержащую имя создаваемого или открываемого файла. Это значение должно быть полной спецификацией файла, если это не имя файла относительно каталога, указанного rootDirectory. Например, "\Device\Floppy1\myfile.dat" или "?? \B:\myfile.dat" может быть полной спецификацией файла, если драйвер гибких дисков и файловая система уже загружены. (Примечание. "??" заменяет "\DosDevices" в качестве имени пространства имен объекта Win32. "\DosDevices" по-прежнему работает, но "??" преобразуется быстрее диспетчером объектов.) |
HANDLE RootDirectory | Необязательный дескриптор для каталога, полученного при предыдущем вызове NtCreateNamedPipeFile. Если это значение равно NULL, элемент ObjectName должен быть полной спецификацией файла, которая включает полный путь к целевому файлу. Если это значение не равно NULL, элемент ObjectName указывает имя файла относительно этого каталога. |
PSECURITY_DESCRIPTOR SecurityDescriptor | Необязательный дескриптор безопасности, применяемый к файлу. Списки управления доступом, заданные таким дескриптором безопасности, применяются к файлу только при его создании. Если при создании файла значение равно NULL, список ACL, размещенный в файле, зависит от файловой системы; Большинство файловых систем распространяет часть такого списка ACL из файла родительского каталога в сочетании с ACL вызывающего объекта по умолчанию. |
Атрибуты ULONG | Набор флагов, управляющий атрибутами объекта файла. Если вызывающий объект выполняется в контексте системного процесса, этот параметр может быть равен нулю. В противном случае вызывающий объект должен установить OBJ_KERNEL_HANDLE флаг . Вызывающий объект также может при необходимости установить OBJ_CASE_INSENSITIVE флаг , который указывает, что код подстановки имени должен игнорировать регистр ObjectName вместо выполнения поиска точного соответствия. |
IoStatusBlock [out]
Указатель на переменную типа IO_STATUS_BLOCK
, которая получает окончательное состояние завершения и сведения о запрошенной операции. При возвращении из NtCreateNamedPipeFile элемент Information переменной содержит одно из следующих значений:
- FILE_CREATED
- FILE_OPENED
- FILE_OVERWRITTEN
- FILE_SUPERSEDED
- FILE_EXISTS
- FILE_DOES_NOT_EXIST
ShareAccess [in]
Указывает тип общего доступа к файлу, который требуется вызывающей объекту, равный нулю, единице или сочетанию следующих флагов. Чтобы запросить монопольный доступ, задайте для этого параметра нулевое значение. Чтобы избежать ошибок нарушения общего доступа, укажите все следующие флаги общего доступа.
Флаги ShareAccess | Описание |
---|---|
FILE_SHARE_READ | Файл можно открыть для чтения с помощью вызовов создания файлов других потоков. |
FILE_SHARE_WRITE | Файл можно открыть для записи с помощью вызовов создания файлов других потоков. |
FILE_SHARE_DELETE | Файл можно открыть для удаления с помощью вызовов создания файлов других потоков. |
Драйверы устройств и промежуточные драйверы обычно устанавливают для ShareAccess нулевое значение, что предоставляет вызывающей объекту монопольный доступ к открытому файлу.
CreateDisposition [in]
Значение, определяющее способ обработки файла, если файл уже существует. CreateDisposition может иметь один из следующих вариантов:
Значение | Описание |
---|---|
FILE_SUPERSEDE | Если файл уже существует, замените его указанным файлом. Если он не существует, создайте указанный файл. |
FILE_CREATE | Если файл уже существует, выполните запрос и не создавайте и не открывайте указанный файл. Если он не существует, создайте указанный файл. |
FILE_OPEN | Если файл уже существует, откройте его вместо создания нового. Если он не существует, выполните запрос и не создавайте новый файл. |
FILE_OPEN_IF | Если файл уже существует, откройте его. Если он не существует, создайте указанный файл. |
FILE_OVERWRITE | Если файл уже существует, откройте его и перезапишите. Если он не существует, завершите запрос ошибкой. |
FILE_OVERWRITE_IF | Если файл уже существует, откройте его и перезапишите. Если он не существует, создайте указанный файл. |
CreateOptions [in]
Указывает параметры, применяемые при создании или открытии файла в виде совместимого сочетания следующих флагов.
Флаг CreateOptions | Описание |
---|---|
FILE_DIRECTORY_FILE (0x00000001) | Создаваемый или открываемый файл является файлом каталога. При использовании этого флага параметру Disposition необходимо задать одно из значений 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_WRITE_THROUGH (0x00000002) | Системные службы, файловые системы и драйверы, которые записывают данные в файл, должны фактически передавать данные в файл, прежде чем любая запрошенная операция записи будет считаться завершенной. |
FILE_SEQUENTIAL_ONLY (0x00000004) | Все доступы к файлу будут последовательными. |
FILE_NO_INTERMEDIATE_BUFFERING (0x00000008) | Файл не может быть кэширован или помещен во внутренние буферы драйвера. Этот флаг несовместим с флагом DesiredAccessFILE_APPEND_DATA . |
FILE_SYNCHRONOUS_IO_ALERT (0x00000010) | Все операции с файлом выполняются синхронно. Любое ожидание от имени звонящего зависит от преждевременного завершения оповещений. Этот флаг также приводит к тому, что система ввода-вывода будет поддерживать контекст позиции файла. Если этот флаг установлен, необходимо также установить флаг DesiredAccessSYNCHRONIZE , чтобы диспетчер ввода-вывода использовал объект file в качестве объекта синхронизации. |
FILE_SYNCHRONOUS_IO_NONALERT (0x00000020) | Все операции с файлом выполняются синхронно. Ожидания в системе для синхронизации очередей и завершения ввода-вывода не распространяются на оповещения. Этот флаг также приводит к тому, что система ввода-вывода будет поддерживать контекст позиции файла. Если этот флаг установлен, необходимо также установить флаг DesiredAccessSYNCHRONIZE , чтобы диспетчер ввода-вывода использовал объект file в качестве объекта синхронизации. |
FILE_NON_DIRECTORY_FILE (0x00000040) | Открываемый файл не должен быть файлом каталога, иначе этот вызов завершается ошибкой. Открываемый объект файла может представлять файл данных; логическое, виртуальное или физическое устройство; или том. |
FILE_CREATE_TREE_CONNECTION (0x00000080) | Создайте подключение в виде дерева для этого файла, чтобы открыть его по сети. |
FILE_COMPLETE_IF_OPLOCKED (0x00000100) | Выполните эту операцию немедленно, используя альтернативный код успешного выполнения, если целевой файл заблокирован, а не блокирует поток вызывающего объекта. Если файл заблокирован, другой вызывающий объект уже имеет доступ к файлу по сети. |
FILE_NO_EA_KNOWLEDGE (0x00000200) | Если расширенные атрибуты в открываемом существующем файле указывают на то, что вызывающий объект должен понимать расширенные атрибуты для правильной интерпретации файла, выполните этот запрос, так как вызывающий объект не понимает, как работать с расширенными атрибутами. |
FILE_OPEN_REMOTE_INSTANCE (0x00000400) | Зарезервировано для использования системой; не использовать. |
FILE_RANDOM_ACCESS (0x00000800) | Доступ к файлу может быть случайным, поэтому файловые системы или операционная система не должны выполнять с файлом последовательные операции упреждающего чтения. |
FILE_DELETE_ON_CLOSE (0x00001000) | Удалите файл при передаче последнего дескриптора в FltClose. |
FILE_OPEN_BY_FILE_ID (0x00002000) | Файл открывается по идентификатору. Имя файла содержит имя устройства и 64-разрядный идентификатор, используемый для открытия файла. |
FILE_OPEN_FOR_BACKUP_INTENT (0x000004000) | Файл открывается с целью резервного копирования; Поэтому система должна проверить наличие определенных прав доступа и предоставить вызывающему объекту соответствующие права доступа к файлу перед проверкой входных данных 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. |
FILE_SESSION_AWARE (0x00040000) | Файл или устройство открывается с поддержкой сеанса. Если этот флаг не указан, то устройства для каждого сеанса (например, устройства, использующие перенаправление USB RemoteFX) не могут быть открыты процессами, запущенными в сеансе 0. Этот флаг не действует для вызывающих абонентов, не в сеансе 0. Этот флаг поддерживается только в серверных выпусках Windows. Этот флаг не поддерживается до Windows Server 2012. |
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 . |
NamedPipeType [in]
Тип создаваемого именованного канала (byte-type или message-type).
ReadMode [in]
Режим, в котором считывается канал (тип байта или типа сообщения).
CompletionMode [in]
Указывает, как должна быть завершена операция.
MaximumInstances [in]
Максимальное число одновременных экземпляров именованного канала.
InboundQuota [in]
Указывает квоту пула, зарезервированную для операций записи во входящую сторону именованного канала.
OutboundQuota [in]
Указывает квоту пула, зарезервированную для операций записи во входящую сторону именованного канала.
DefaultTimeout [в, необязательно]
Необязательный указатель на значение времени ожидания, которое используется, если значение времени ожидания не указано при ожидании экземпляра именованного канала.
Возвращаемое значение
Значение функции — это окончательное состояние операции создания или открытия.
Комментарии
Чтобы создать экземпляр именованного канала, пользователь должен иметь FILE_CREATE_PIPE_INSTANCE доступ к объекту именованного канала. Если создается новый именованный канал, список управления доступом (ACL) из параметра атрибутов безопасности определяет управление доступом на уровне пользователей для именованного канала.
Все экземпляры именованного канала должны указывать один и тот же тип канала (байтовый тип или тип сообщения), доступ к каналу (дуплексный, входящий или исходящий), число экземпляров и значение времени ожидания. Если используются разные значения, эта функция завершается сбоем, и GetLastError возвращает ERROR_ACCESS_DENIED.
Клиентский процесс подключается к именованной трубе с помощью функции CreateFile или CallNamedPipe . Клиентская часть именованного канала запускается в режиме байтов, даже если сервер находится в режиме сообщений. Чтобы избежать проблем с получением данных, также установите на стороне клиента режим сообщений. Чтобы изменить режим канала, клиент канала должен открыть канал только для чтения с GENERIC_READ и FILE_WRITE_ATTRIBUTES доступом.
Сервер канала не должен выполнять блокирующую операцию чтения, пока не будет запущен клиент канала. В противном случае может возникнуть состояние гонки. Обычно это происходит, когда код инициализации, такой как время выполнения C, необходимо заблокировать и изучить унаследованные дескрипторы.
При каждом создании именованного канала система создает входящий и (или) исходящий буферы с помощью пула без паха, который представляет собой физическую память, используемую ядром. Количество экземпляров канала (а также объектов, таких как потоки и процессы), которые можно создать, ограничено доступным пулом без паха. Для каждого запроса на чтение или запись требуется место в буфере для чтения или записи данных, а также дополнительное пространство для внутренних структур данных.
Размеры входных и выходных буферов являются рекомендациями. Фактический размер буфера, зарезервированный для каждого конца именованного канала, является системным значением по умолчанию, минимальным или максимальным значением системы или заданным размером, округленным до следующей границы выделения. Указанный размер буфера должен быть достаточно мал, чтобы процесс не иссякнул из невыгружаемого пула, но достаточно большим для размещения типичных запросов.
При каждом выполнении операции записи канала система сначала пытается заряжать память в зависимости от квоты записи канала. Если оставшейся квоты записи канала достаточно для выполнения запроса, операция записи завершается немедленно. Если оставшаяся квота записи канала слишком мала для выполнения запроса, система попытается расширить буферы для размещения данных, используя невыгресованный пул, зарезервированный для процесса. Операция записи будет блокироваться до тех пор, пока данные не будут считаны из канала, чтобы можно было освободить дополнительную квоту буфера. Таким образом, если указанный размер буфера слишком мал, система будет увеличивать буфер по мере необходимости, но недостаток заключается в том, что операция будет блокироваться. Если операция перекрывается, системный поток блокируется; в противном случае поток приложения блокируется.
Чтобы освободить ресурсы, используемые именованным каналом, приложение всегда должно закрывать дескрипторы, когда они больше не нужны, что выполняется путем вызова функции CloseHandle или при завершении процесса, связанного с дескриптором экземпляра. Обратите внимание, что экземпляр именованного канала может иметь несколько связанных с ним дескрипторов. Экземпляр именованного канала всегда удаляется при закрытии последнего дескриптора экземпляра именованного канала.
Требования
Требование | Значение |
---|---|
Заголовок | ntioapi.h |
Библиотека | ntdll.lib |