驱动程序和用户模式服务之间的消息

Posted

技术标签:

【中文标题】驱动程序和用户模式服务之间的消息【英文标题】:Messages between driver and user mode service 【发布时间】:2021-03-26 04:24:33 【问题描述】:

如何将通知从驱动程序发送到用户模式服务?同时,我希望这仅在一个方向上起作用,即服务不具备向驱动程序发送消息的能力。 是的,我知道 IOCTL、事件和所有这些东西......但也许我不知道一些技术

【问题讨论】:

【参考方案1】:

Communication Between User Mode and Kernel Mode

过滤器管理器支持通过通信端口在用户模式和内核模式之间进行通信。 minifilter 驱动程序通过指定一个安全描述符来控制端口的安全性,以应用于通信端口对象。通过通信端口进行的通信没有缓冲,因此速度更快,效率更高。用户模式应用程序或服务可以回复来自微过滤器驱动程序的消息以进行双向通信。

当 minifilter 驱动创建一个通信服务器端口时,它隐式地开始监听端口上的传入连接。当用户模式调用者尝试连接到端口时,过滤器管理器调用微过滤器驱动程序的ConnectNotifyCallback 例程,并带有新创建的连接的句柄。当过滤器管理器重新获得控制权时,它会向用户模式调用者传递一个单独的文件句柄,该文件句柄代表用户模式调用者的连接端点。此句柄可用于将 I/O 完成端口与侦听器端口相关联。

仅当用户模式调用方具有足够的访问权限(如端口上的安全描述符所指定)时,才接受连接。每个到端口的连接都有自己的消息队列和私有端点。

关闭任一端点(内核或用户)都会终止该连接。当用户模式调用者关闭其到端点的句柄时,过滤器管理器调用微过滤器驱动程序的DisconnectNotifyCallback 例程,以便微过滤器驱动程序可以关闭其对连接的句柄。

关闭通信服务器端口会阻止新连接,但不会终止现有连接。当 minifilter 驱动卸载时,filter manager 会终止现有的连接。


用于用户模式和内核模式之间通信的过滤管理器例程

过滤器管理器为内核模式微过滤器驱动程序提供以下支持例程以与用户模式应用程序通信:

FltCloseClientPort FltCloseCommunicationPort FltCreateCommunicationPort FltSendMessage

为用户模式应用程序与微过滤器驱动程序通信提供了以下支持例程:

FilterConnectCommunicationPort FilterGetMessage FilterReplyMessage FilterSendMessage

用于用户模式和内核模式之间通信的 Minifilter 驱动程序回调例程

以下微过滤器驱动回调例程作为参数传递给FltCreateCommunicationPort

Callback Routine Name Callback Routine Type
ConnectNotifyCallback PFLT_CONNECT_NOTIFY
DisconnectNotifyCallback PFLT_DISCONNECT_NOTIFY
MessageNotifyCallback PFLT_MESSAGE_NOTIFY

了解更多:Examples

【讨论】:

以上是关于驱动程序和用户模式服务之间的消息的主要内容,如果未能解决你的问题,请参考以下文章

Nginx与用户和服务器之间的传输模式

GitLab Runner CI/CD 中用户模式和系统模式之间的区别

在内核模式和用户模式之间使用ioctl通信

ActiveMQ使用

消息队列-一篇读懂rabbitmq(生命周期,confirm模式,延迟队列,集群)

无法通过 Smack API 使用 openfire 服务器发送/接收消息