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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值