Minifilter 優點介紹

Just4life發表於2013-07-23

提起Minifilter大家可能都已經非常熟悉了,它是Microsoft極力推薦的一種新型
過濾器模型,不過談及Minifilter模型我們就不得不提邏輯過濾器模型
(Legacy Filter),邏輯過濾器模型是一種比較古老的模型,它經歷過從FileMon
到Sfilter的漫長曆程,直到今天它仍然在發揮著它的巨大作用,從兩者的對比上來看,
我根據個人的經驗總結出了以下特點:

-Minifilter模型相對Legacy Filter模型具有更好的相容性,我所談的相容性不單單指
在和其它Filter共處時的相容性,它更多的是對Windows後續版本的相容性,畢竟它是
Microsoft目前推廣的過濾器模型,我想在很長一段時間不用擔心它會被Microsoft遺棄!

在談到相容性時我們不得不談的一個話題是,在開發我們的過濾器時如何避免和其它產品的
過濾器衝突呢?這確實是一個讓人惱火的話題,我記得我剛用Sfilter框架時曾經被防毒軟體
搞的很無奈!因為這是個綜合的問題-不但和自己過濾器的實現細節有關,同時也和其它過濾器
的實現細節也有很大的關係,比如重入所導致的堆疊溢位,防毒軟體產生的棧檔案物件
(棧檔案物件:Stack File Object,顧名思義就是一種臨時檔案物件,
本文後面附有棧檔案物件判斷的程式碼片段)所導致的下層過濾器訪問物件無效等等!
所以大家在面對相容性問題時要擺正一種心態,多Review程式碼,多分析DUMP檔案!

再者從相容性的另外一方面講,Minifilter模型可以完全相容Sfilter,並且你可以用Minifilter模型
來寫Legacy Filter,關於這方面的最好例子就是WDK開發包中Minifilter目錄下的cdo工程。

- Minifilter模型相對Legacy Filter更易上手。為什麼這麼說呢?這要從如下幾個方面來說明:

1. 它解決了重入的問題,這是非常重要的
(這類介面有:FltCreateFile(Ex),FltReadFile 和 FltWriteFile)。
有人會說IFS開發包中已經有IoCreateFileSpecifyDeviceObjectHint介面可以解決頭痛的重入問題了!
我先前也曾一度慶幸自己不用再去用複雜的影子裝置來解決重入問題了,直到有一天我在Microsoft的
網站上發現了這個介面原來不支援網路FS,具體現在這個介面如何我已沒有興趣!

2. 實現了使用者態與核心態的雙向通訊機制(同步或非同步),打破了傳統的CDO,共享記憶體等通訊方式,
這對需要核心態與使用者態互動完成任務的過濾器來說是莫大的好處。

3. 實現了對上下文(包括Stream,Stream Handle,File,Instance和Volume的上下文)的安全管理。為什麼說是安全呢?
大家對tooflat兄的那個基於Sfilter模型的透明加解密的Demo還記憶猶新吧,其中程式碼裡有一大部分內容是關於檔案
的上下文的跟蹤與管理,但是經過我後來在一些商業軟體上的嘗試才發現這種方式存在不少的問題,比如說:Stream
的建立並非觸發IRP_MJ_CREATE請求,往往會先觸發IRP_MJ_CLEANUP、IRP_MJ_CLOSE請求,還有何時釋放上下文等
這些問題是困擾已久的問題,漏過了某些Stream的建立則可能導致計數不正確,過早的釋放上下文有可能導致遺漏
某些請求,釋放的過晚則有可能導致大量記憶體被消耗。雖然目前網路上有人提出了一定的解決方案,但總是不能令人滿意!

對於初學Minifilter模型的朋友可能需要解釋下各種不同上下文型別所代表的意思:
Context -上下文,其實就是附著在某個物件上的一段資料;
Stream Context - 流上下文,也就是大家常用的FCB(File Control Block)的上下文,檔案和FCB是一對一的關係;
Stream Handle Context - 流控制程式碼上下文,也就是大家常見的FO(File Object)的上下文,一個檔案可以對應多個FO,屬一對多關係;
Instance Context - 例項上下文,也就是過濾驅動在檔案系統的裝置堆疊上建立的一個過濾器例項;
Volume Context - 捲上下文,卷就是大家通常看到的C,D,E盤以及網路重定向器,一般情況下一個卷對應一個過濾器例項物件,
所以,在實際應用上經常用Instance Context來代替Volume Context;

5. 簡化後的開發介面更加清晰,這一點體現在例項的掛接通知,檔名的獲取與分析,上下文的清除通知,遮蔽FASTIO介面以及
IRP的前、後處理,同步、非同步處理機制等上面;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

講完了Minifilter的特點後,我們再來看看都有哪些Minifilter資料可供參考:

1. Windows Driver Kits(簡稱WDK,推薦使用WDK6000版本):http://connect.microsoft.com/
前提是你得先註冊一個Hotmail帳戶,這其實就是驅動開發的MSDN。
我希望以後不要有人再無休止的詢問哪裡有IFS,哪裡有DDK等無聊的問題了!

2. Minifilter的中文幫助,我認為狂人兄翻譯的《Windows檔案過濾驅動開發教程(第二版)》是難得一見的中文幫助,
大家可以在這裡下載:http://bbs.driverdevelop.com/htm_data/39/0701/97921.html

3. Minifilter的官方的參考:http://www.microsoft.com/whdc/driver/filterdrv/default.mspx
這是官方製作的一些非常好的演講稿,尤其是它對Minifilter模型開發過程中的重點進行逐一講述,建議大家詳讀!

4. WDK中的Demo程式碼是再好不過的第一手材料,一定要仔細研究,如果沒有這些程式碼的朋友,可以在下面附件中獲得。


//
// 功能: 判斷是否是棧檔案物件
// FileObject : 檔案物件地址
// Return: TRUE - FileObject是棧檔案物件;
// FALSE - 不是棧檔案物件;
//
BOOLEAN
MFIsStackFileObject (
__in PFILE_OBJECT FileObject )
{
ULONG LowLimit, HighLimit;
IoGetStackLimits(&LowLimit, &HighLimit);

if( ( (ULONG)FileObject >= LowLimit ) &&
( (ULONG)FileObject <= HighLimit ) )
{
return TRUE;
}
return FALSE;
}

相關文章