驱动层的步骤
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)大。
因此建议使用后面的方式。同步