CreateNamedPipe()中的lpSecurityAttributes需要什么生命周期?

时间:2011-11-01 10:03:01

标签: windows security named-pipes dacl

  1. 我多久可以销毁传递给lpSecurityAttributes的{​​{1}}指向的结构?
  2. 每个管道实例是否需要单独的一个?
  3. CreateNamedPipe()的MSDN文档说:

      

    lpSecurityAttributes [in,optional]

         

    指向SECURITY_ATTRIBUTES结构的指针,该结构为 new 命名管道指定安全描述符...

    强调我的。 “new”是指新命名管道,还是命名管道的新实例?它继续说:

      

    说明

         

    使用CreateNamedPipe创建命名管道的实例   用户必须具有对命名管道的FILE_CREATE_PIPE_INSTANCE访问权限   宾语。 如果正在创建新的命名管道,则为访问控制列表   (ACL)来自security attributes参数定义了自由选择   命名管道的访问控制。

    (再一次,强调我的。)人们可以读到这意味着只有在创建命名管道的第一个实例( new 命名管道)时才使用CreateNamedPipe(),并且在创建同一命名管道的更多实例时忽略。如果是这样,则只需要lpSecurityAttributes结构的一个实例。

    或许你必须为每个实例传入一个有效的lpSecurityAttributes,但它可以(应该?)是同一个吗?

    或许你必须为每个管道实例分配一个新的SECURITY_ATTRIBUTES结构?

    我的相关问题 - 一旦对lpSecurityAttributes的调用返回,SECURITY_ATTRIBUTES结构是否会被销毁,或者它是否必须保持有效直到最后一个句柄(到管道,或者只是那个管道实例?)关闭 - 甚至没有解决。

    有没有人对这两个问题有明确的答案?

2 个答案:

答案 0 :(得分:4)

您需要为每次调用CreateNamedPipe传递有效的SECURITY_ATTRIBUTES结构或NULL。您可以重复使用相同的结构进行其他调用,也可以使用单独的结构,以更方便的方式。在来自不同线程的多个同时调用中使用相同的结构可能不安全 - 我怀疑它会没问题,但无论如何我都会避免它。

'新'意味着'新管'不是'新实例'。如果命名管道已存在,则不使用lpSecurityDescriptor成员中的ACL。因此,如果您知道要创建现有管道的新实例,并且不需要设置bInheritHandle,则应该只为lpSecurityAttributes传递NULL。如果确实需要设置bInheritHandle,请确保lpSecurityDescriptor为NULL或指向有效的安全描述符。

如前所述,lpSecurityAttributes中的内容可以在调用返回后立即丢弃(除非您计划在另一个调用中重用它!),是的,包括分配给安全描述符的内存。

答案 1 :(得分:2)

呼叫结束后复制结构。这适用于创建内核对象时的所有安全描述符调用。

因此:在通话结束后你可以丢弃它的内容。