CreateNamedPipe()中lpSecurityAttributes的生存期要求是多少


  1. 我多久才能破坏传递给CreateNamedPipe()lpSecurityAttributes所指向的结构
  2. 我需要为每个管道实例单独使用一个吗

CreateNamedPipe((的MSDN文档中写道:

lpSecurityAttributes[in,可选]

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

强调我的。"new"是指新的命名管道,还是命名管道的新实例?它接着说:

备注

要使用CreateNamedPipe创建命名管道的实例用户必须具有对命名管道的FILE_CREATE_PIPE_INSTANCE访问权限对象如果正在创建新的命名管道,则访问控制列表安全属性参数中的(ACL(定义自由裁量命名管道的访问控制。

(再次强调我的观点。(可以理解为,lpSecurityAttributes仅在创建命名管道的第一个实例(命名管道(时使用,而在创建同一命名管道的更多实例时被忽略。如果是,则只需要lpSecurityAttributes结构的一个实例。

或者,您必须为每个实例传递一个有效的lpSecurityAttributes,但它可以(应该?(是同一个?

或者您可能必须为每个管道实例分配一个新的SECURITY_ATTRIBUTES结构?

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

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

您需要向CreateNamedPipe的每个调用传递有效的SECURITY_ATTRIBUTES结构或NULL。您可以为其他调用重用相同的结构,也可以使用单独的结构,以更方便的为准。在来自不同线程的多个同时调用中使用相同的结构可能不安全——我怀疑这是可以的,但无论如何我都会避免。

"New"表示"New pipe"而非"New instance"。如果命名管道已存在,则不使用lpSecurityDescriptor成员中的ACL。因此,如果您知道您正在创建一个现有管道的新实例,并且不需要设置bInheritHandle,那么您应该只为lpSecurityAttributes传递NULL。如果确实需要设置bInheritHandle,请确保lpSecurityDescriptor为NULL或指向有效的安全描述符。

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

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

因此:在调用之后,您可以丢弃它的内容。

相关内容

  • 没有找到相关文章

最新更新