minifilter 与用户态的通信

简介: 驱动层的步骤 创建通信端口  FltCreateCommunicationPort    对于安全对象,必须设置OBJ_KERNEL_HANDLE。    ServerPort 监听客户端连接请求的端口。

驱动层的步骤

  1. 创建通信端口
      FltCreateCommunicationPort

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

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

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

    DisconnectNotifyCallback 客户端所有连接端口中断,或者minifilter卸载时的回调。
    *MessageNotifyCallback 用户态消息处理回调。
    用户态通过FilterReplyMessage发送的消息,都在这里处理。

  1. 关闭通信端口
      FltCloseCommunicationPort

====================================================================
应用层的步骤

  1. 创建连接
      FilterConnectCommunicationPort 打开一个新的通信服务器端口的连接。该微端口在驱动中创建。

    端口名类似L"\MyFilterPort"
    应用程序通过返回的端口句柄与minifilter通信。

  1. 发送数据
      FilterSendMessage 发送message给内核minifilter

    message发送到minifilter的消息通知回调函数中,在这里处理消息。

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

    当然如果希望有replay,那么outbuffer参数不能为空。

  1. 接受数据
      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)大。
  所以建议使用后面的方式。

目录
相关文章
|
4月前
|
存储 缓存 Linux
基于dpdk的用户态协议栈设计实现(二)
基于dpdk的用户态协议栈设计实现(二)
47 0
|
4月前
|
消息中间件 存储 程序员
进程间的通信
进程间的通信
33 1
|
3月前
|
编译器 开发工具
用户态协议栈之协议栈设计
用户态协议栈之协议栈设计
20 0
|
3月前
|
存储 网络协议 数据库
用户态协议栈
用户态协议栈
|
4月前
|
安全 API 数据处理
基于dpdk的用户态协议栈设计实现(一)
基于dpdk的用户态协议栈设计实现(一)
49 0
|
5月前
|
网络协议 Ubuntu C语言
2.4.1 用户态协议栈设计实现
网卡工作在网络协议栈的哪一层? 网卡是硬件,不在这些协议内容中。
40 0
|
9月前
用户空间与内核空间通信方式
用户空间与内核空间通信方式
93 0
|
10月前
进程同步与通信
进程同步与通信
44 0
|
10月前
|
算法 Linux C语言
Linux进程通信——共享内存(上)
Linux进程通信——共享内存(上)
|
10月前
|
Linux C语言
Linux进程通信——共享内存(中)
Linux进程通信——共享内存(中)

热门文章

最新文章