天天看點

minifilter 與使用者态的通信

驅動層的步驟

  1. 建立通信端口

      FltCreateCommunicationPort

    對于安全對象,必須設定OBJ_KERNEL_HANDLE。

    ServerPort 監聽用戶端連接配接請求的端口。

    第三個參數ObjectAttributes 通過InitializeObjectAttributes初始化,其中包含了端口名稱。友善應用層打開。

    ConnectNotifyCallback 使用者态連接配接回調,這裡對多個連接配接進行一些差別操作。

    比如ClientPort,表示使用者态與核心建立的新連接配接的用戶端端口句柄。

    minifilter必須把該句柄傳遞FltSendMessage之類的函數,作為第二個參數。

    與FltCreateCommunicationPort傳回的ServerPort 不同。

    并且一般在DisconnectNotifyCallback 中調用FltCloseClientPort釋放。

    DisconnectNotifyCallback 用戶端所有連接配接端口中斷,或者minifilter解除安裝時的回調。

    *MessageNotifyCallback 使用者态消息處理回調。

    使用者态通過FilterReplyMessage發送的消息,都在這裡處理。

  1. 關閉通信端口

      FltCloseCommunicationPort

====================================================================

應用層的步驟

  1. 建立連接配接

      FilterConnectCommunicationPort 打開一個新的通信伺服器端口的連接配接。該微端口在驅動中建立。

    端口名類似L"\MyFilterPort"

    應用程式通過傳回的端口句柄與minifilter通信。

  1. 發送資料

      FilterSendMessage 發送message給核心minifilter

    message發送到minifilter的消息通知回調函數中,在這裡處理消息。

    這些回調函數在核心建立通信端口時指定  MessageNotifyCallback。

    該操作是同步的。調用者處于等待狀态,直到消息被傳遞并收到minifilter的replay。

    當然如果希望有replay,那麼outbuffer參數不能為空。

  1. 接受資料

      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)大。

  是以建議使用後面的方式。

繼續閱讀