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

相關文章
相關標籤/搜索