minifilter 与用户态的通信
驱动层的步骤
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)大。
所以建议使用后面的方式。
转载于:https://www.cnblogs.com/huangyong9527/archive/2012/09/07/2674720.html
minifilter 与用户态的通信相关推荐
- Linux内核态之间进程通信,内核态和用户态通信(二)--实现
本文主要使用netlink套接字实现中断环境与用户态进程通信. 系统环境:基于linux 2.6.32.27 和 linux 3.16.36 Linux内核态和用户态进程通信方法的提出和实现 用户上下 ...
- linux内核态和用户态
参考文章: linux系统内核空间与用户空间通信的实现与分析: http://www.ibm.com/developerworks/cn/linux/l-netlink/ 进程上下文VS中断上下文: ...
- Linux 内核态与用户态通信 netlink
参考资料: https://blog.csdn.net/zqixiao_09/article/details/77131283 https://www.cnblogs.com/lopnor/p/615 ...
- linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)
这篇博文将针对linux内核态与用户态通信方式中的procfs进行详细的学习. /proc主要存放内核的一些控制信息,所以这些信息大部分的逻辑位置位于内核控制的内存,在/proc下使用ls -l你会发 ...
- Linux用户态与内核态通信的几种方式(待完善)
文章目录 1. 内核启动参数 2.模块参数与sysfs 3.sysctl 4.系统调用 5.netlink 6. procfs(/proc) 7.seq_file 8.debugfs 9.relayf ...
- 内核态与用户态通信之eventfd使用
首先需要确定eventfd已经被编译进内核,其次还要确定所使用的交叉编译器支持eventfd. 函数原型: #include <sys/eventfd.h> int eventfd(uns ...
- linux 用户态与内核态通信方式简介
我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式.(关于 Linux 用户态和内核态可以参考 xx) 除此之外,还有以下四种方式: pro ...
- linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用
[摘 要]本文以信号量原理为基础,重点阐述信号量在Linux多线程同步机制中的实现特色. [关键词]信号量:Linux:多线程:同步 1 信号量 1965年E. W. Dijkstra首次提出信号量的 ...
- C1000k 新思路:用户态 TCP/IP 协议栈
转自:http://blog.csdn.net/solstice/article/details/26363901 C1000k 新思路:用户态 TCP/IP 协议栈 现在的服务器支撑上百万个并发 T ...
最新文章
- int(1) 和 int(10) 有什么区别?资深开发竟然都理解错了!
- php mysql odbc_PHP Database ODBC
- 题目 2285: [蓝桥杯][2018年第九届真题]螺旋折线(数论+思维)
- 机器学习——决策树的实现
- 2021年00后生活方式洞察报告
- C++:类访问修饰符
- 05-不是内部或外部命令,也不是可运行的程序或批处理文件
- 【学习】03 淘宝爬虫-使用selenium采集关键词为电动车的数据
- python处理识别图片验证码
- 2022年美赛成绩什么时候出,2022美赛思路与注意事项。
- python网易云音乐下载器爬取全网音乐
- 计算机考研复试面试系列 计算机专业英语篇
- 绕过深澜校园宽带认证客户端使用校园网的方法
- 51单片机制作计算机1602显示,51单片机对LCD1602液晶显示器的控制
- 新款任天堂Switch游戏机底座专用解决方案
- Python10_阶段性作业
- 高并发环境如何有效缓解带宽压力
- Lucene打分公式详解(TFIDFSimilarity)
- 你真的了解java编译优化吗?15个问题考察自己是否理解
- 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)
热门文章
- 迭代器模式(Iterator)解析例子
- [SPOJGCJ1C09C] Bribe the Prisoners
- 1.SpringMVC 概述
- Win10 64位系统下PCL + Visual Studio + cmake + (Qt) 安装调试
- T-SQL语句之创建、修改、删除数据库
- 隐藏多行文本框的滚动条
- C++知识整理 内存模型和命名空间
- python创建自定义函数is_number()来判断一个字符是否是数字
- linux命令行安装vnc_CentOS下安装VNC并设置远程服务
- 如何快速搭建yum源和成功检测第三方软件