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


Функция 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_DATADesiredAccess несовместимы с созданием или открытием файла каталога.

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_NONALERTFILE_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