驅動層的步驟
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)大。
因此建議使用後面的方式。同步