?? 循序漸進學minifilter(微過濾器) 之 一 (開篇) - 驅動開發 - 私のウェブサイト.htm
字號:
Filter),邏輯過濾器模型是一種比較古老的模型,它經歷過從FileMon<BR>到Sfilter的漫長歷程,直到今天它仍然在發揮著它的巨大作用,從兩者的對比上來看,<BR>我根據個人的經驗總結出了以下特點:<BR><BR>-Minifilter模型相對Logical
Filter模型具有更好的兼容性,我所談的兼容性不單單指<BR>
在和其它Filter共處時的兼容性,它更多的是對Windows后續版本的兼容性,畢竟它是<BR>
Microsoft目前推廣的過濾器模型,我想在很長一段時間不用擔心它會被Microsoft遺棄!<BR><BR>
在談到兼容性時我們不得不談的一個話題是,在開發我們的過濾器時如何避免和其它產品的<BR>
過濾器沖突呢?這確實是一個讓人惱火的話題,我記得我剛用Sfilter框架時曾經被殺毒軟件<BR>
搞的很無奈!因為這是個綜合的問題-不但和自己過濾器的實現細節有關,同時也和其它過濾器<BR>
的實現細節也有很大的關系,比如重入所導致的堆棧溢出,殺毒軟件產生的棧文件對象<BR>
(棧文件對象:Stack File
Object,顧名思義就是一種臨時文件對象,本文后面附有棧文件對象判斷的代碼片段)<BR>
所導致的下層過濾器訪問對象無效等等!所以大家在面對兼容性問題時要擺正一種心態,多Review代碼,多分析DUMP文件!<BR><BR>
再者從兼容性的另外一方面講,Minifilter模型可以完全兼容Sfilter,并且你可以用Minifilter模型<BR>
來寫Logical
Filter,關于這方面的最好例子就是WDK開發包中Minifilter目錄下的cdo工程。<BR><BR>-
Minifilter模型相對Logical
Filter更易上手。為什么這么說呢?這要從如下幾個方面來說明:<BR><BR> 1.
它解決了重入的問題,這是非常重要的(這類接口有:FltCreateFile(Ex),FltReadFile
和 FltWriteFile)。<BR>
有人會說IFS開發包中已經有IoCreateFileSpecifyDeviceObjectHint接口可以解決頭痛的重入問題了!我先前也<BR>
曾一度慶幸自己不用再去用復雜的影子設備來解決重入問題了,直到有一天我在Microsoft的網站上發現了這個接口<BR>
原來不支持網絡FS,具體現在這個接口如何我已沒有興趣!<BR><BR>
2.
實現了用戶態與核心態的雙向通訊機制(同步或異步),打破了傳統的CDO,共享內存等通訊方式,<BR>
這對需要核心態與用戶態交互完成任務的過濾器來說是莫大的好處。<BR><BR> 3.
實現了對上下文(包括Stream,Stream
Handle,File,Instance和Volume的上下文)的安全管理。為什么說是安全呢?<BR>
大家對tooflat兄的那個基于Sfilter模型的透明加解密的Demo還記憶猶新吧,其中代碼里有一大部分內容是關于文件<BR>
的上下文的跟蹤與管理,但是經過我后來在一些商業軟件上的嘗試才發現這種方式存在不少的問題,比如說:Stream<BR>
的創建并非觸發IRP_MJ_CREATE請求,往往會先觸發IRP_MJ_CLEANUP、IRP_MJ_CLOSE請求,還有何時釋放上下文等<BR>
這些問題是困擾已久的問題,漏過了某些Stream的創建則可能導致計數不正確,過早的釋放上下文有可能導致遺漏<BR>
某些請求,釋放的過晚則有可能導致大量內存被消耗。雖然目前網絡上有人提出了一定的解決方案,但總是不能令人滿意!<BR><BR>
對于初學Minifilter模型的朋友可能需要解釋下各種不同上下文類型所代表的意思:<BR>
Context - 上下文,其實就是附著在某個對象上的一段數據;<BR>
Stream Context - 流上下文,也就是大家常用的FCB(File
Control Block)的上下文,文件和FCB是一對一的關系;<BR>
Stream Handle Context - 流句柄上下文,也就是大家常見的FO(File
Object)的上下文,一個文件可以對應多個FO,屬一對多關系;<BR>
Instance Context -
實例上下文,也就是過濾驅動在文件系統的設備堆棧上創建的一個過濾器實例;<BR>
Volume Context -
卷上下文,卷就是大家通常看到的C,D,E盤以及網絡重定向器,一般情況下一個卷對應一個過濾器實例對象,<BR>
所以,在實際應用上經常用Instance
Context來代替Volume Context;<BR><BR> 5.
簡化后的開發接口更加清晰,這一點體現在實例的掛接通知,文件名的獲取與分析,上下文的清除通知,屏蔽FASTIO接口以及<BR>
IRP的前、后處理,同步、異步處理機制等上面;<BR><BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR><BR>
講完了Minifilter的特點后,我們再來看看都有哪些Minifilter資料可供參考:<BR><BR>
1. Windows Driver Kits(簡稱WDK,推薦使用WDK6000版本):<A
id=url_8 onclick="return checkUrl(this)"
href="http://connect.microsoft.com/"
target=_blank><FONT
color=#0070af>http://connect.microsoft.com/</FONT></A><BR>
前提是你得先注冊一個Hotmail帳戶,這其實就是驅動開發的MSDN。<BR>
我希望以后不要有人再無休止的詢問哪里有IFS,哪里有DDK等無聊的問題了!<BR><BR>
2.
Minifilter的中文幫助,我認為狂人兄翻譯的《Windows文件過濾驅動開發教程(第二版)》是難得一見的中文幫助,<BR>
大家可以在這里下載:<A id=url_9
onclick="return checkUrl(this)"
href="http://bbs.driverdevelop.com/htm_data/39/0701/97921.html"
target=_blank><FONT
color=#0070af>http://bbs.driverdevelop.com/htm_data/39/0701/97921.html</FONT></A><BR><BR>
3. Minifilter的官方的參考:<A id=url_10
onclick="return checkUrl(this)"
href="http://www.microsoft.com/whdc/driver/filterdrv/default.mspx"
target=_blank><FONT
color=#0070af>http://www.microsoft.com/whdc/driver/filterdrv/default.mspx</FONT></A><BR>
這是官方制作的一些非常好的演講稿,尤其是它對Minifilter模型開發過程中的重點進行逐一講述,建議大家詳讀!<BR><BR>
4.
WDK中的Demo代碼是再好不過的第一手材料,一定要仔細研究,如果沒有這些代碼的朋友,可以在下面附件中獲得。<BR><BR>
5. 我收集的一些比較好的開發網站:<BR>
OSR(<A id=url_11
onclick="return checkUrl(this)"
href="http://www.osronlne.com/"
target=_blank><FONT
color=#0070af>http://www.osronlne.com</FONT></A>)<BR>
Codeproject(<A
id=url_12 onclick="return checkUrl(this)"
href="http://www.codeproject.com/"
target=_blank><FONT
color=#0070af>http://www.codeproject.com</FONT></A>)<BR>
RootKit(<A
id=url_13 onclick="return checkUrl(this)"
href="http://www.rootkit.com/" target=_blank><FONT
color=#0070af>http://www.rootkit.com</FONT></A>)<BR>
看雪(<A id=url_14
onclick="return checkUrl(this)"
href="http://bbs.pediy.com/" target=_blank><FONT
color=#0070af>http://bbs.pediy.com</FONT></A>)<BR>
驅網^_^(<A
id=url_15 onclick="return checkUrl(this)"
href="http://bbs.driverdevelop.com/"
target=_blank><FONT
color=#0070af>http://bbs.driverdevelop.com</FONT></A>)<BR><BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR><BR>
好了,今天學習就到這里,如果有錯誤的地方歡迎大家指正,如果有什么好的建議也可以提出來!在下一節里我打算把開發環境、<BR>Makefile和Minifilter過濾器驅動的安裝等相關的東西單獨列出一章來進行講解,謝謝!<BR><BR>//<BR>//
功能: 判斷是否是棧文件對象<BR>// FileObject : 文件對象地址<BR>//
Return: TRUE - FileObject是棧文件對象;<BR>//
FALSE -
不是棧文件對象;<BR>//<BR>BOOLEAN<BR>MFIsStackFileObject
(<BR> __in PFILE_OBJECT FileObject
)<BR>{<BR> ULONG LowLimit,
HighLimit;<BR>
IoGetStackLimits(&LowLimit,
&HighLimit);<BR><BR> if( (
(ULONG)FileObject >= LowLimit ) &&
<BR> (
(ULONG)FileObject <= HighLimit ) )<BR>
{<BR> return
TRUE;<BR> }<BR> return
FALSE;<BR>}</DIV></DIV></TD></TR></TBODY></TABLE>
<P style="MARGIN: 5px; LINE-HEIGHT: 150%"></P></TD></TR>
<TR>
<TD height=25><FONT color=#000066> 發表于:
2008-12-08,修改于: 2008-12-08
15:25 已瀏覽252次,有評論0條</FONT> <A id=star title=推薦這篇文章
onclick="NewWindows(this.href);return false;"
href="http://blog.chinaunix.net/u2/star.php?blogid=21790&artid=1685924">推薦</A>
<A id=complaint title=投訴這篇文章
onclick="NewWindows(this.href);return false;"
href="http://blog.chinaunix.net/u2/complaint.php?blogid=21790&artid=1685924">投訴</A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#bbf0ff cellSpacing=0
cellPadding=0 width="100%" align=center border=1>
<TBODY>
<TR>
<TD
background="循序漸進學Minifilter(微過濾器) 之 一 (開篇) - 驅動開發 - 私のウェブサイト.files/bg_line.gif"
height=28> <B>網友評論</B></TD></TR>
<TR>
<TD align=middle>
<TABLE style="COLOR: #0066cc; BORDER-COLLAPSE: collapse"
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#bbf0ff cellSpacing=0
cellPadding=0 width="100%" align=center border=1>
<TBODY>
<TR>
<TD
background="循序漸進學Minifilter(微過濾器) 之 一 (開篇) - 驅動開發 - 私のウェブサイト.files/bg_line.gif"
height=28> <B>發表評論</B></TD></TR>
<TR>
<TD bgColor=#ffffff height=1></TD></TR>
<TR>
<TD align=middle bgColor=#ffffff><IFRAME name=comment
src="循序漸進學Minifilter(微過濾器) 之 一 (開篇) - 驅動開發 - 私のウェブサイト.files/comment.htm"
frameBorder=0 width=600
height=160></IFRAME></TD></TR></TBODY></TABLE><BR><BR></TD>
<TD width=10></TD></TR></TBODY></TABLE>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width=950
align=center border=0>
<TBODY>
<TR>
<TD height=50></TD></TR>
<TR>
<TD align=middle><BR>
<P>Copyright © 2001-2006 ChinaUnix.net All Rights Reserved<BR>
<P>感謝所有關心和支持過ChinaUnix的朋友們 <BR>頁面生成時間:0.02469
<P><A href="http://www.miibeian.gov.cn/" target=_blank>京ICP證041476號</A>
</P></TD></TR></TBODY></TABLE></CENTER></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -