青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

elva

Windows 文件過濾驅動經(jīng)驗總結

Windows 文件過濾驅動經(jīng)驗總結

看了 ChuKuangRen 的第二版《文件過濾驅動開發(fā)教程》后,頗有感觸。我想,交流都是
建立在平等的基礎上,在抱怨氛圍和環(huán)境不好的同時應該先想一想自己究竟付出了多少?
只知索取不愿付出的人也就不用抱怨了,要怪也只能怪自己。發(fā)自己心得的人無非是兩種
目的,一是引發(fā)一些討論,好糾正自己錯誤的認識,以便從中獲取更多的知識使自己進步
的更快。二是做一份備忘,當自己遺忘的時候能夠馬上找到相關資料。我這里也總結了近
幾年做文件過濾驅動時所積累下來的一些小小經(jīng)驗,這分筆記也是看了 ChuKuangRen 的
教程后,臨時想到的一小部分而已,是想到哪寫到哪,不是很全,如果以后再回想起什么
也會不斷補充。因其工作原因,近段時間在 SOLARIS 驅動與 Linux 內(nèi)核方面投入的精
力比較多,Windows 下的文件過濾驅動一直也沒有怎么去碰,所以最后還是那句老話
FIXME。



1、獲得文件全路徑以及判斷時機

除在所有 IRP_MJ_XXX 之前自己從頭創(chuàng)建 IRP 發(fā)送到下層設備查詢?nèi)窂酵猓?br>不要嘗試在 IRP_MJ_CREATE 以外的地方獲得全路徑,因為只有在 IRP_MJ_CREATE
中才會使用 ObCreateObject() 來建立一個有效的 FILE_OBJECT。而在 IRP_READ
IRP_WRITE 中它們是直接操作 FCB (File Control Block)的。


2、從頭建立 IRP 發(fā)送關注點

無論你建立什么樣的 IRP,是 IRP_MJ_CREATE 也好還是 IRP_MJ_DIRECTORY_CONTROL
也罷,最要提醒的就是一些標志。不同的標志會代來不同的結果,有些結果是直接
返回失敗。這里指的標志不光是 IRP->Flags,還要考慮 IO_STACK_LOCATION->Flags
還有其它等等。尤其是你要達到一些特殊目的,這時候更需要注意,如 IRP_MN_QUERY_DIRECTORY,
不同的標志結果有很大的不同。


3、從頭建立 IRP 獲取全路徑注意點

自己從頭建立一個 IRP_MJ_QUERY_INFORMATION 的 IRP 獲取全路徑時需要注意,
不僅在 IRP_MJ_CREATE 要做區(qū)別處理,在 IRP_MJ_CLOSE 也要做同樣的處理,
否則如果目標是 NTFS 文件系統(tǒng)的話可能產(chǎn)生 deadlock。如果是 NTFS 那么在
IRP_MJ_CLEANUP 的時候也需要對 FO_STREAM_FILE 類型的文件做同樣處理。



4、獲得本地/遠程訪問用戶名(域名/SID)

方法只有在 IRP_MJ_CREATE 中才可用,那是因為 IO_SECURITY_CONTEXT 只有
在 IO_STACK_LOCATION->Parameters.Create.SecurityContext 才會有效。
這樣你才有可能從 IO_SECURITY_CONTEXT->SecurityContext->AccessState->
SubjectSecurityContext.XXXToken 中獲得訪問 TOKEN,從而進一步得到用戶名
或 SID。記得 IFS 中有一個庫,它的 LIB 導出一個函數(shù)可以讓你在獲得以上
信息后得到用戶名與域名。但如果你想兼容 NT4 的話,只能自己分析來得出本
地和遠程的 SID。



5、文件與目錄的判斷

正確的方法在楚狂人的文檔里已經(jīng)說過了,再補充一句。如果你的文件過濾驅動
要兼容所有文件系統(tǒng),那么不要十分相信從 FileObject->FsContext 里取得的數(shù)據(jù)。
正確的方法還是在你傳遞下去 IRP_MJ_CREATE 后從最下層文件系統(tǒng)延設備棧返回到
你這里后再獲得。



6、加/解密中判斷點

只判斷 IRP_PAGING_IO,IRP_SYNCHRONOUS_PAGING_IO,IRP_NOCACHE 是
沒錯的。如果有問題,相信是自己的問題。關于有人提到在 FILE_OBJECT->Flags
中的 FO_NO_INTERMEDIATE_BUFFERING 是否需要判斷,對此問題的回答是只要
你判斷了 IRP_NOCACHE 就不用再判斷 FILE_OBJECT 中的,因為它最終會
設置 IRP->Flags 為 IRP_NOCACHE。關于你看到的諸如 IRP_DEFER_IO_COMPLETION
等 IRP 不要去管它,因為它只是一個過程。最終讀寫還是如上所介紹。至于
以上這些 IRP 哪個是由 CC MGR 發(fā)送的,哪些是由 I/O MGR 發(fā)送和在什么
時候發(fā)送的,這個已經(jīng)有很多討論了,相信可以找到。



7、舉例說明關于 IRP 傳遞與完成注意事項

只看 Walter Oney 的那本 《Programming the Microsoft Windows driver model》
里介紹的流程,自己沒有實際的體會還是不夠的,那里只介紹了基礎概念,讓自己
有了知識。知道如何用,在什么情況下用,用哪種方法,能夠用的穩(wěn)定這叫有了技術。
我們從另一個角度出發(fā),把問題分為兩段來看,這樣利于總結。一個 IRP 在過濾驅
動中,把它分為需要安裝 CompleteRoutine 的與無需安裝 CompleteRoutine 的。
那么在不需要安裝 CompleteRoutine 的有以下幾類情況。

(1) 拿到這個 IRP 后什么都不做,直接調用 IoCompleteRequest() 來返回。
(2) 拿到這個 IRP 后什么都不做,直接傳遞到底層設備,使用
  IoSkipCurrentIrpStackLocation() 后調用 IoCallDriver() 傳遞。
(3) 使用 IoBuildSynchronousFsdRequest() 或 IoBuildDeviceIoControlRequest()
  來建立 IRP 的。

以上幾種根據(jù)需要直接使用即可,除了一些參數(shù)與標志需要注意外,沒有什么系統(tǒng)
機制相關的東西需要注意了。那么再來看需要安裝 CompleteRoutine 的情況。我們
把這種情況再細分為兩種,一是在 CompleteRoutine 中返回標志為
STATUS_MORE_PROCESSING_REQUIRED 的情況。二是返回處這個外的標志,需要使用函數(shù)
IoMarkIrpPending() 的情況。在 CompleteRoutine 中絕大多數(shù)就這么兩種情況,
你需要使用其中的一種情況。那么為什么需要安裝 CompleteRoutine 呢?那是因為
我們對其 IRP 從上層驅動,經(jīng)過我們驅動,在經(jīng)過底層設備棧返回到我們這一層驅
動時需要得到其中內(nèi)容作為參考依據(jù)的,還有對其中內(nèi)容需要進行修改的。再有一種
情況是沒有經(jīng)過上層驅動,而 IRP 的產(chǎn)生是在我們驅動直接下發(fā)到底層驅動,而經(jīng)
過設備棧后返回到我們這一層,且我們不在希望它繼續(xù)向上返回的,因為這個 IRP
本身就不是從上層來的。綜上所述,先來看下 IoMarkIrpPending() 的情況。


(1) 在 CompleteRoutine 中判斷 Irp->PendingReturned 并使用 IoMarkIrpPending()
  然后返回。這種方法在沒有使用 KeSetEvent() 的情況下,且不是自建 IRP 發(fā)送
  到底層驅動返回時使用。也就是說有可能我所做的工作都是在 CompleteRoutine
  中進行的。比如加/解密時,我在這里對下層驅動返回數(shù)據(jù)的判斷并修改。修改
  后因為沒有使用 STATUS_MORE_PROCESSING_REQUIRED 標志,它會延設備堆一直向
  上返回并到用戶得到數(shù)據(jù)為止。這里一定要注意,在這種情況下 CompleteRoutine
  返回后,不要在碰這個 IRP。也就是說如果這個時候你使用了 IoCompleteRequest()
  的話會出現(xiàn)一個 MULTIPLE_IRP_COMPLIETE_REQUEST 的 BSOD 錯誤。


(2) 在 CompleteRoutine 中直接返回 STATUS_MORE_PROCESSING_REQUIRED 標志。這種
  情況在使用了 KeSetEvent() 的函數(shù)下出現(xiàn)。這里又有兩個小小的分之。

  1) 出現(xiàn)于上層發(fā)送到我這里,當我這里使用 IoCallDriver() 后,底層返回數(shù)
    據(jù)經(jīng)過我這一層時,我想讓它暫時停止繼續(xù)向上傳遞,讓這個 IRP 稍微歇息
    一會,等我對這個 IRP 返回的數(shù)據(jù)操作完成后(一般是沒有在 CompleteRoutine
    中對返回數(shù)據(jù)進行操作情況下,也就是說等到完成例程返回后再進行操作),由
    我來調用 IoCompleteRequest() 讓它延著設備棧繼續(xù)返回。這里要注意,我們
    是想讓它返回的,所以調用了 IoCompleteRequest()。這個可不同于下面所講的
    自己從頭分配 IRP 時在 CompleteRoutine 中已經(jīng)調用 IoFreeIrp() 釋放了當前
    IRP 的情況。比如我在做一個改變文件大小,向文件頭寫入加密標志的驅動時,
    在上層發(fā)來了 IRP_MJ_QUERY_INFORMATION 查詢文件,我想在這個時候獲得文件
    信息進行判斷,然后根據(jù)我的判斷結果再移動文件指針。注意:上面是兩步,第
    一步是先獲得文件大小,那么在這個時候我就需要用到上述辦法,先讓這個 IRP
    傳遞下去,得到我想要的東西后在進行對比。等待適當時機完成這個 IRP,讓數(shù)
    據(jù)繼續(xù)傳遞,直到用戶收到為止。第二步我會結合下面小節(jié)來講。

  2) 出現(xiàn)于自己從頭建立 IRP,當使用 IoAllocate() 或 IoBuildAsynchronousFsdRequest()
    創(chuàng)建 IRP 調用 IoCallDriver() 后,底層返回數(shù)據(jù)到我這一層時,我不想讓這
    個 IRP 繼續(xù)向上延設備棧傳遞。因為這個 IRP 就是在我這層次建立的,上層本
    就不知道有這么一個 IRP。那么到這里我就要在 CompleteRoutine 中使用 IoFreeIrp()
    來釋放掉這個 IRP,并不讓它繼續(xù)傳遞。這里一定要注意,在 CompleteRoutine
    函數(shù)返回后,這個 IRP 已經(jīng)釋放了,如果這個時候在有任何關于這個 IRP 的操作
    那么后果是災難性的,必定導致 BSOD 錯誤。前面 1) 小節(jié)給出的例子只完成了第
    一步這里繼續(xù)講第二步,第一步我重用這個 IRP 得到了文件大小,那么這個時候雖
    然知道大小,但我還是無法知道這個文件是否被我加過密。這時,我就需要在這里
    自己從頭建立一個 IRP_MJ_READ 的 IRP 來讀取文件來判斷是否我加密過了的文件,
    如果是,則要減少相應的大小,然后繼續(xù)返回。注意:這里的返回是指讓第一步的
    IRP 返回。而不是我們自己創(chuàng)建的。我們創(chuàng)建的都已經(jīng)在 CompleteRoutine 中銷
    毀了。



8、關于完成 IRP 的動作簡介

當一個底層驅動調用了 IoCompleteRequest() 函數(shù)時,基本上所有設備棧相關 IRP 處理工
作都是在它那里完成的。包括 IRP->Flags 的一些標志的判斷,對 APC 的處理,拋出
MULTIPLE_IRP_COMPLETE_REQUESTS 錯誤等。當它延設備棧一直調用驅動所安裝的 CompleteRoutine
時,如果發(fā)現(xiàn) STATUS_MORE_PROCESSING_REQUIRED 這個標志,則會停止向上繼續(xù)回滾。這也是
為什么在 CompleteRoutine 中使用這個標志即可暫停 IRP 的原因。



9、關于 ObQueryNameString 的使用

這個函數(shù)的使用,在有些環(huán)境下會有問題。它的上層函數(shù)是 ZwQueryObject()。在某些
情況下會導致系統(tǒng)掛起,或者直接 BSOD。它是從 對象管理器中的 ObpRootDirectoryObject
開始遍歷,通過 OBJECT_HEADER_TO_NAME_INFO 獲得對象名稱。今天問了下 PolyMeta
好象是在處理 PIPE 時會掛啟,這個問題出現(xiàn)在 2000 系統(tǒng)。在 XP 上好象補丁了。


10、關于重入問題

其實這個問題在很久前的 IFS FAQ 里已經(jīng)介紹的很清楚,包括處理方法以及每種方法
可能帶來的問題。IFS FAQ 里的 Q34 一共介紹了四種方法,包括自己從頭建立 IRP
發(fā)送,使用 ShadowDevice,使用特征字符串,根據(jù)線程 ID,在 XP 下使用IoCreateFileSpecifyDeviceObjectHint() 函數(shù)。并且把以上幾種在不同環(huán)境
下使用要處理的問題也做了簡單的介紹。且在 Q33 里介紹了在 CIFS 碰到的 FILE_COMPLETE_IF_OPLOCKED 問題的解決方法。

posted on 2007-05-07 23:48 葉子 閱讀(2938) 評論(0)  編輯 收藏 引用 所屬分類: 驅動開發(fā)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费欧美电影| 国产精品成人一区二区艾草| 国一区二区在线观看| 欧美一区二区成人| 午夜精品亚洲| 在线国产亚洲欧美| 欧美高清在线一区二区| 欧美高清在线| 正在播放亚洲| 午夜精品久久久久久99热软件| 国产麻豆精品theporn| 久久免费国产| 欧美成人免费va影院高清| 日韩视频在线观看国产| 99精品国产一区二区青青牛奶| 国产精品av免费在线观看| 欧美中文在线视频| 噜噜噜久久亚洲精品国产品小说| 亚洲人成啪啪网站| 亚洲直播在线一区| 在线欧美不卡| 一区二区三区高清在线观看| 国产日韩欧美在线播放| 亚洲春色另类小说| 欧美日韩一区二区三区在线看| 久久成人av少妇免费| 男人的天堂亚洲| 午夜精品久久久久99热蜜桃导演| 久久久精品动漫| 亚洲视频专区在线| 久久久女女女女999久久| 一区二区毛片| 久久久久.com| 亚洲欧美综合精品久久成人| 久久夜色撩人精品| 欧美一区二区高清| 欧美精品久久一区二区| 久久久91精品国产| 欧美三级中文字幕在线观看| 久久亚洲午夜电影| 国产精品国产三级国产普通话99 | 亚洲另类自拍| 久久精品动漫| 欧美一区二区三区另类| 欧美成人午夜剧场免费观看| 久久精品水蜜桃av综合天堂| 欧美视频二区| 亚洲国产精品电影| 经典三级久久| 午夜伦理片一区| 亚洲亚洲精品在线观看| 欧美~级网站不卡| 老司机午夜精品视频| 国产欧美视频一区二区| 中文在线一区| 99视频国产精品免费观看| 另类春色校园亚洲| 可以免费看不卡的av网站| 国产欧美精品一区| 亚洲一区网站| 亚洲欧美日韩爽爽影院| 欧美日韩综合另类| 99视频精品在线| 中文在线资源观看网站视频免费不卡 | 亚洲韩国日本中文字幕| 久久黄金**| 久久久久久久久久看片| 国产精品视频久久| 亚洲欧美在线一区二区| 欧美一区二区三区在线看 | 久久免费精品视频| 久久一区二区三区超碰国产精品| 国产情人节一区| 午夜视频在线观看一区二区三区 | 宅男噜噜噜66一区二区66| 欧美日韩第一区| 一本色道久久| 欧美一区二区三区的| 国产日韩专区在线| 久久久99爱| 亚洲高清一区二| 在线视频亚洲欧美| 国产精品色网| 久久高清国产| 亚洲国产精品一区二区尤物区| 99精品免费视频| 国产精品久久999| 欧美一区二区黄| 欧美jizzhd精品欧美巨大免费| 亚洲精品免费在线播放| 欧美午夜电影完整版| 亚洲男人的天堂在线| 久久亚洲视频| 99在线精品视频在线观看| 国产精品二区三区四区| 欧美一二三区在线观看| 亚洲第一综合天堂另类专| 一本久久a久久免费精品不卡| 国产精品色在线| 美女国内精品自产拍在线播放| 最近看过的日韩成人| 欧美一级片一区| 亚洲黄色影片| 国产精品久久久久久久久久三级| 久久精品国产久精国产思思| 亚洲精华国产欧美| 欧美一区二区三区啪啪| 亚洲精品久久嫩草网站秘色 | 先锋影音网一区二区| 欧美激情a∨在线视频播放| 亚洲午夜羞羞片| 亚洲第一在线| 国产欧美日韩三级| 欧美国内亚洲| 久久久久久久久蜜桃| 一本色道久久综合亚洲精品不卡| 免费看av成人| 久久动漫亚洲| 一区二区三区欧美在线| 在线观看日韩av先锋影音电影院| 国产精品v欧美精品v日韩| 蜜桃av噜噜一区二区三区| 午夜亚洲伦理| 亚洲一区二区三区中文字幕| 亚洲人成人一区二区在线观看| 久久综合九色| 久久激情久久| 欧美一区二区视频在线观看2020| 日韩视频精品| 亚洲狼人综合| 亚洲国产高清一区二区三区| 国产亚洲亚洲| 国产日韩欧美在线一区| 国产精品久久久久久户外露出| 欧美国产日韩精品| 欧美 日韩 国产 一区| 久久亚洲国产成人| 久久精品动漫| 久久精品成人一区二区三区蜜臀| 亚洲综合第一| 亚洲欧美日本国产专区一区| 一区二区高清在线观看| 夜夜嗨av一区二区三区四季av| 亚洲激情一区二区| 亚洲日本va午夜在线电影| 亚洲狠狠婷婷| 亚洲精品免费看| 99re8这里有精品热视频免费| 亚洲精品日产精品乱码不卡| 最近看过的日韩成人| 亚洲国产视频一区| 亚洲人线精品午夜| 日韩一级二级三级| 在线一区二区视频| 亚洲摸下面视频| 欧美一区二区三区四区在线观看 | 亚洲淫性视频| 欧美一区二视频在线免费观看| 性欧美videos另类喷潮| 久久精品国产清高在天天线| 久久亚洲国产成人| 欧美va亚洲va香蕉在线| 欧美日韩国产成人高清视频| 欧美色综合天天久久综合精品| 欧美视频在线观看免费网址| 国产精品免费在线| 极品av少妇一区二区| 亚洲麻豆国产自偷在线| 亚洲午夜影视影院在线观看| 久久国产精品电影| 美女在线一区二区| 日韩一区二区精品葵司在线| 亚洲视频网站在线观看| 久久精品理论片| 欧美极品一区| 国产日韩欧美三区| 亚洲精品四区| 久久精品91久久久久久再现| 欧美黄色影院| 亚洲欧美久久久| 欧美大片在线影院| 国产精品日韩一区二区| 亚洲第一天堂无码专区| 亚洲伊人伊色伊影伊综合网| 毛片av中文字幕一区二区| 亚洲三级性片| 久久精品成人欧美大片古装| 欧美精品系列| 黄色成人片子| 亚洲欧美日韩国产综合精品二区 | a91a精品视频在线观看| 欧美在线中文字幕| 亚洲日韩成人| 久久天天狠狠| 国产一区二区三区成人欧美日韩在线观看 | 欧美激情亚洲国产| 亚洲欧美日韩综合aⅴ视频| 欧美成人免费播放| 精品动漫3d一区二区三区免费| 亚洲欧美日韩网|