命名管道

      命名管道作为一种进程通信机制,被广泛应用于编程中。今天我将自己理解的内容记录一下。

      使用命名管道,就必须首先创建命名管道,创建命名管道的函数原型如下:

HANDLE WINAPI CreateNamedPipe(
  __in      LPCTSTR lpName,
  __in      DWORD dwOpenMode,
  __in      DWORD dwPipeMode,
  __in      DWORD nMaxInstances,
  __in      DWORD nOutBufferSize,
  __in      DWORD nInBufferSize,
  __in      DWORD nDefaultTimeOut,
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes
);


参数nMaxInstances此命名对象可以有多少个实例。对于命名管道,可以同时创建多个实例,只要不超过nMaxInstances。一个实例只能连接一个客户端,若想连接其它的客户端,需要先调用DisconnectNamedPipe关闭现有的管道连接。另外创建命名对象时可以为参数dwOpenMode指定FILE_FLAG_FIRST_PIPE_INSTANCE,指定这个参数后,若创建的命名管道对象不是第一个实例,会报错ERROR_ACCESS_DENIED。

服务器端需要调用ConnectNamedPipe接受客户端连接。若调用此函数之前,客户端已经调用CreateFile连接到了此实例,ConnectNamedPipe返回FALSE,并且GetLastError()返回ERROR_PIPE_CONNECTED。这是一个正常的连接,虽然函数返回了FALSE。

客户端端调用CreateFile连接命名对象。调用ReadFile及WriteFile发送数据。

客户端可以调用WaitNamedPipe等待命名对象实例做好准备连接客户端,SDK上说

Waits until either a time-out interval elapses or an instance of the specified named pipe is available for connection (that is, the pipe's server process has a pendingConnectNamedPipe operation on the pipe).

根据测试结果,调用CreateNamedPipe完毕后,应该已经有了一个挂起的ConnectNamedPipe 操作。服务器调用完DisconnectNamedPipe后,若客户端调用WaitNamedPipe,则此时客户端挂起等待。服务器显式调用ConnectNamedPipe后,客户端调用WaitNamedPipe结束,此时连接命名对象应该成功。

 其实我测试命名管道的目的是观察通过服务端调用ImpersonateNamedPipeClient后线程安全上下文的变化情况,sdk说的清楚,

When this function is called, the named-pipe file system changes the thread of the calling process to start impersonating the security context of the last message read from the pipe. Only the server end of the pipe can call this function.

所以说服务端接受客户端连接后,还必须接收到客户端的消息才能模拟客户端安全上下文,否则模拟失败。

调用OpenThreadToken需要注意,若此线程没有关联过令牌(设置或者扮演),此函数返回ERROR_NO_TOKEN(1008)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值