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。spa

    固然若是但愿有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)大。
   因此建议使用后面的方式。同步

相关文章
相关标签/搜索