Какое время жизни требуется для атрибутов lpSecurityAttributes в CreateNamedPipe ()? - PullRequest
4 голосов
/ 01 ноября 2011
  1. Как скоро я могу уничтожить структуру, на которую указывает lpSecurityAttributes, переданная CreateNamedPipe()?
  2. Нужна ли отдельная для каждого экземпляра трубы?

Документация MSDN для CreateNamedPipe () гласит:

lpSecurityAttributes [in, необязательно]

Указатель на структуру SECURITY_ATTRIBUTES, которая задает дескриптор безопасности для новый именованная труба ...

Акцент мой.Означает ли «новый» новый именованный канал или новый экземпляр именованного канала?Далее говорится:

Замечания

Чтобы создать экземпляр именованного канала с помощью CreateNamedPipe, пользователь должен иметь доступ FILE_CREATE_PIPE_INSTANCE к объекту именованного канала. Если создается новый именованный канал , список контроля доступа (ACL) из параметра атрибутов безопасности определяет дискреционное управление доступом для именованного канала.

(Снова выделениемое.) Это можно прочитать как означающее, что lpSecurityAttributes используется только при создании первого экземпляра именованного канала ( new именованный канал) и игнорируется при создании дальнейших экземпляров * 1037.* из одноименной трубы.Если это так, то требуется только один экземпляр структуры lpSecurityAttributes.

Или, возможно, вам нужно передать действительные атрибуты lpSecurityAttributes для каждого экземпляра, но он может (должен?) Быть одним и тем же?

Или, возможно, вам нужно выделить новую структуру SECURITY_ATTRIBUTES для каждого экземпляра канала?

Мой связанный вопрос - может ли структура SECURITY_ATTRIBUTES быть уничтожена, как только вызов CreateNamedPipe() вернется, или он должен это сделать?остаются в силе до тех пор, пока не будет закрыт последний дескриптор (для канала или только этого экземпляра канала?) - даже не указан.

У кого-нибудь есть окончательные ответы на эти два вопроса?

Ответы [ 2 ]

4 голосов
/ 02 ноября 2011

Вам необходимо передавать либо действительную структуру SECURITY_ATTRIBUTES, либо NULL для каждого вызова CreateNamedPipe. Вы можете повторно использовать ту же структуру для дополнительных вызовов или использовать отдельные структуры, в зависимости от того, что удобнее. Возможно, небезопасно использовать одну и ту же структуру в нескольких одновременных вызовах из разных потоков - я подозреваю, что все будет в порядке, но я бы все равно избежал.

«Новый» означает «новый канал», а не «новый экземпляр». ACL в элементе lpSecurityDescriptor не используется, если именованный канал уже существует. Поэтому, если вы знаете, что создаете новый экземпляр существующего канала, и вам не нужно устанавливать bInheritHandle, вам просто нужно передать NULL для lpSecurityAttributes. Если вам нужно установить bInheritHandle, убедитесь, что lpSecurityDescriptor имеет значение NULL или указывает на допустимый дескриптор безопасности.

Как уже упоминалось, содержимое в lpSecurityAttributes может быть отброшено, как только вызов вернется (если только вы не планируете использовать его в другом вызове!), И да, это включает память, выделенную для дескриптора безопасности.

2 голосов
/ 01 ноября 2011

Структура копируется после завершения вызова. Это для всех вызовов дескрипторов безопасности при создании объектов ядра.

Таким образом: после разговора вы можете отказаться от его контента.

...