ano*_*non 2 c windows drivers driver named-pipes
我正在编写一个通过命名管道与用户态应用程序通信的驱动程序.userland应用程序通过调用CreateNamedPipe()创建命名管道,然后通过调用IOCTL将管道名称传递给驱动程序.然后驱动程序通过调用ZwCreateFile()打开管道.
然后userland应用程序命中一个循环,该循环读取来自管道的请求,处理请求并将结果写回管道,即:
while(1) {
ReadFromPipe
ProcessRequest
WriteToPipe
}
Run Code Online (Sandbox Code Playgroud)
驱动程序基本上将请求写入管道,然后直接读回答案:
WriteRequestToPipe
ReadAnswerFromPipe
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果在应用程序中发生WriteToPipe之前在驱动程序中发生ReadAnswerFromPipe,则ReadAnswerFromPipe永远不会返回.所以基本上做
WriteRequestToPipe
Sleep(10 seconds)
ReadAnswerFromPipe
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
我为什么看到这个?
澄清:我使用两个不同的单向管道,尽管应用程序最终成功调用WriteToPipe,但ReadAnswerFromPipe调用永远不会返回...
由于命名管道在任何给定时间都支持单向通信,因此您必须使用2个管道(如已建议的)进行真正的异步访问,或者同步访问单个管道(如步话机).一个信号对象应为正常工作.如果只将CreateSemaphore()的Maximum Count参数设置为1,它将充当二进制信号量.然后ZwWaitForSingleObject(),您可以在while(true)客户端和服务器上的消息循环内的信号量上进行同步访问.
编辑:记得您正在编写驱动程序作为此服务器组件,因此您将需要特定于内核的函数和结构,驱动程序端的KSEMAPHORE结构.