驅動層的步驟
-
建立通信端口
FltCreateCommunicationPort
對于安全對象,必須設定OBJ_KERNEL_HANDLE。
ServerPort 監聽用戶端連接配接請求的端口。
第三個參數ObjectAttributes 通過InitializeObjectAttributes初始化,其中包含了端口名稱。友善應用層打開。
ConnectNotifyCallback 使用者态連接配接回調,這裡對多個連接配接進行一些差別操作。
比如ClientPort,表示使用者态與核心建立的新連接配接的用戶端端口句柄。
minifilter必須把該句柄傳遞FltSendMessage之類的函數,作為第二個參數。
與FltCreateCommunicationPort傳回的ServerPort 不同。
并且一般在DisconnectNotifyCallback 中調用FltCloseClientPort釋放。
DisconnectNotifyCallback 用戶端所有連接配接端口中斷,或者minifilter解除安裝時的回調。
*MessageNotifyCallback 使用者态消息處理回調。
使用者态通過FilterReplyMessage發送的消息,都在這裡處理。
-
關閉通信端口
FltCloseCommunicationPort
====================================================================
應用層的步驟
-
建立連接配接
FilterConnectCommunicationPort 打開一個新的通信伺服器端口的連接配接。該微端口在驅動中建立。
端口名類似L"\MyFilterPort"
應用程式通過傳回的端口句柄與minifilter通信。
-
發送資料
FilterSendMessage 發送message給核心minifilter
message發送到minifilter的消息通知回調函數中,在這裡處理消息。
這些回調函數在核心建立通信端口時指定 MessageNotifyCallback。
該操作是同步的。調用者處于等待狀态,直到消息被傳遞并收到minifilter的replay。
當然如果希望有replay,那麼outbuffer參數不能為空。
-
接受資料
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)大。
是以建議使用後面的方式。