前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >minifilter 与用户态的通信

minifilter 与用户态的通信

作者头像
战神伽罗
发布2019-07-24 15:36:32
1.4K0
发布2019-07-24 15:36:32
举报

驱动层的步骤 1. 创建通信端口 FltCreateCommunicationPort     对于安全对象,必须设置OBJ_KERNEL_HANDLE。     ServerPort 监听客户端连接请求的端口。     第三个参数ObjectAttributes 通过InitializeObjectAttributes初始化,其中包含了端口名称。方便应用层打开。 ConnectNotifyCallback 用户态连接回调,这里对多个连接进行一些区别操作。     比如ClientPort,表示用户态与内核建立的新连接的客户端端口句柄。

    minifilter必须把该句柄传递FltSendMessage之类的函数,作为第二个参数。

    与FltCreateCommunicationPort返回的ServerPort 不同。     并且一般在DisconnectNotifyCallback 中调用FltCloseClientPort释放。

DisconnectNotifyCallback 客户端所有连接端口中断,或者minifilter卸载时的回调。 ***MessageNotifyCallback 用户态消息处理回调。     用户态通过FilterReplyMessage发送的消息,都在这里处理。 2. 关闭通信端口 FltCloseCommunicationPort ==================================================================== 应用层的步骤 1. 创建连接 FilterConnectCommunicationPort 打开一个新的通信服务器端口的连接。该微端口在驱动中创建。     端口名类似L"\\MyFilterPort"     应用程序通过返回的端口句柄与minifilter通信。 2. 发送数据 FilterSendMessage 发送message给内核minifilter     message发送到minifilter的消息通知回调函数中,在这里处理消息。

    这些回调函数在内核创建通信端口时指定  MessageNotifyCallback。     该操作是同步的。调用者处于等待状态,直到消息被传递并收到minifilter的replay。

    当然如果希望有replay,那么outbuffer参数不能为空。 3. 接受数据 FilterGetMessage 从minifilter取得一个message     注意参数lpMessageBuffer,必须包含FILTER_MESSAGE_HEADER 结构。     如果是同步操作,会一直等待直到收到消息。     如果是异步操作,返回ERROR_IO_PENDING,通过重叠结构的事件来得知消息是否被传递。

FilterReplyMessage     注意参数lpReplyBuffer,必须包含FILTER_REPLY_HEADER 结构。

***特别注意,FltSendMessage 与FilterReplyMessage的buffersize,由于padding的缘故,需要精确指定大小。   typedef struct _REPLY_STRUCT   { FILTER_REPLY_HEADERHeader; MY_STRUCTUREData;// The structure to be sent to the minifilter.   } REPLY_STRUCT, *PREPLY_STRUCT;

sizeof(REPLY_STRUCT) 可能比sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)大。   所以建议使用后面的方式。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档