驱动层的步骤
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 与用户态的通信相关推荐

  1. Linux内核态之间进程通信,内核态和用户态通信(二)--实现

    本文主要使用netlink套接字实现中断环境与用户态进程通信. 系统环境:基于linux 2.6.32.27 和 linux 3.16.36 Linux内核态和用户态进程通信方法的提出和实现 用户上下 ...

  2. linux内核态和用户态

    参考文章: linux系统内核空间与用户空间通信的实现与分析: http://www.ibm.com/developerworks/cn/linux/l-netlink/ 进程上下文VS中断上下文: ...

  3. Linux 内核态与用户态通信 netlink

    参考资料: https://blog.csdn.net/zqixiao_09/article/details/77131283 https://www.cnblogs.com/lopnor/p/615 ...

  4. linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)

    这篇博文将针对linux内核态与用户态通信方式中的procfs进行详细的学习. /proc主要存放内核的一些控制信息,所以这些信息大部分的逻辑位置位于内核控制的内存,在/proc下使用ls -l你会发 ...

  5. Linux用户态与内核态通信的几种方式(待完善)

    文章目录 1. 内核启动参数 2.模块参数与sysfs 3.sysctl 4.系统调用 5.netlink 6. procfs(/proc) 7.seq_file 8.debugfs 9.relayf ...

  6. 内核态与用户态通信之eventfd使用

    首先需要确定eventfd已经被编译进内核,其次还要确定所使用的交叉编译器支持eventfd. 函数原型: #include <sys/eventfd.h> int eventfd(uns ...

  7. linux 用户态与内核态通信方式简介

    我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式.(关于 Linux 用户态和内核态可以参考 xx) 除此之外,还有以下四种方式: pro ...

  8. linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用

    [摘 要]本文以信号量原理为基础,重点阐述信号量在Linux多线程同步机制中的实现特色. [关键词]信号量:Linux:多线程:同步 1 信号量 1965年E. W. Dijkstra首次提出信号量的 ...

  9. C1000k 新思路:用户态 TCP/IP 协议栈

    转自:http://blog.csdn.net/solstice/article/details/26363901 C1000k 新思路:用户态 TCP/IP 协议栈 现在的服务器支撑上百万个并发 T ...

最新文章

  1. int(1) 和 int(10) 有什么区别?资深开发竟然都理解错了!
  2. php mysql odbc_PHP Database ODBC
  3. 题目 2285: [蓝桥杯][2018年第九届真题]螺旋折线(数论+思维)
  4. 机器学习——决策树的实现
  5. 2021年00后生活方式洞察报告
  6. C++:类访问修饰符
  7. 05-不是内部或外部命令,也不是可运行的程序或批处理文件
  8. 【学习】03 淘宝爬虫-使用selenium采集关键词为电动车的数据
  9. python处理识别图片验证码
  10. 2022年美赛成绩什么时候出,2022美赛思路与注意事项。
  11. python网易云音乐下载器爬取全网音乐
  12. 计算机考研复试面试系列 计算机专业英语篇
  13. 绕过深澜校园宽带认证客户端使用校园网的方法
  14. 51单片机制作计算机1602显示,51单片机对LCD1602液晶显示器的控制
  15. 新款任天堂Switch游戏机底座专用解决方案
  16. Python10_阶段性作业
  17. 高并发环境如何有效缓解带宽压力
  18. Lucene打分公式详解(TFIDFSimilarity)
  19. 你真的了解java编译优化吗?15个问题考察自己是否理解
  20. 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)

热门文章

  1. 迭代器模式(Iterator)解析例子
  2. [SPOJGCJ1C09C] Bribe the Prisoners
  3. 1.SpringMVC 概述
  4. Win10 64位系统下PCL + Visual Studio + cmake + (Qt) 安装调试
  5. T-SQL语句之创建、修改、删除数据库
  6. 隐藏多行文本框的滚动条
  7. C++知识整理 内存模型和命名空间
  8. python创建自定义函数is_number()来判断一个字符是否是数字
  9. linux命令行安装vnc_CentOS下安装VNC并设置远程服务
  10. 如何快速搭建yum源和成功检测第三方软件