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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
看了 ChuKuangRen 的《Windows文件系統(tǒng)過濾驅(qū)動開發(fā)教程(第二版).pdf》后,頗有感觸。我想,交流都是建立在平等的基礎上,在抱怨氛圍和環(huán)境不好的同時應該先想一想自己究竟付出了多少?只知索取不愿付出的人也就不用抱怨了,要怪也只能怪自己。發(fā)自己心得的人無非是兩種目的,一是引發(fā)一些討論,好糾正自己錯誤的認識,以便從中獲取更多的知識使自己進步的更快。二是做一份備忘,當自己遺忘的時候能夠馬上找到相關資料。我這里也總結了近幾年做文件過濾驅(qū)動時所積累下來的一些小小經(jīng)驗,這分筆記也是看了 ChuKuangRen 的教程后,臨時想到的一小部分而已,是想到哪寫到哪,不是很全,如果以后再回想起什么也會不斷補充。因其工作原因,近段時間在 SOLARIS 驅(qū)動與 Linux 內(nèi)核方面投入的精力比較多,Windows 下的文件過濾驅(qū)動一直也沒有怎么去碰,所以最后還是那句老話 FIXME。

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

除在所有 IRP_MJ_XXX 之前自己從頭創(chuàng)建 IRP 發(fā)送到下層設備查詢?nèi)窂酵猓灰獓L試在 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)說過了,再補充一句。如果你的文件過濾驅(qū)動要兼容所有文件系統(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 在過濾驅(qū)動中,把它分為需要安裝 CompleteRoutine 的與無需安裝 CompleteRoutine 的。那么在不需要安裝 CompleteRoutine 的有以下幾類情況。

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

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

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

2) 出現(xiàn)于自己從頭建立 IRP,當使用 IoAllocate() 或 IoBuildAsynchronousFsdRequest()創(chuàng)建 IRP 調(diào)用 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 的動作簡介

當一個底層驅(qū)動調(diào)用了 IoCompleteRequest() 函數(shù)時,基本上所有設備棧相關 IRP 處理工作都是在它那里完成的。包括 IRP->Flags 的一些標志的判斷,對 APC 的處理,拋出MULTIPLE_IRP_COMPLETE_REQUESTS 錯誤等。當它延設備棧一直調(diào)用驅(qū)動所安裝的 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 問題的解決方法。


(全文完)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩一区二区视频在线 | 91久久亚洲| 久久福利电影| 精品不卡一区| 欧美国产日韩一区二区三区| 毛片av中文字幕一区二区| 亚洲国产91| 亚洲国产综合在线| 欧美日韩在线一二三| 亚洲欧美综合国产精品一区| 午夜在线一区| 在线观看91久久久久久| 亚洲高清影视| 国产精品电影网站| 久久久久久自在自线| 欧美va亚洲va香蕉在线| 亚洲色在线视频| 欧美一区二区三区视频免费| 亚洲韩国青草视频| 日韩视频在线一区二区| 国产日韩专区在线| 亚洲精美视频| 国产精品中文字幕在线观看| 免费久久99精品国产| 欧美日韩精品一区二区三区| 欧美一区午夜精品| 欧美va亚洲va香蕉在线| 欧美精品一卡| 日韩午夜视频在线观看| 亚洲在线一区二区| 性色av一区二区三区在线观看| 精品成人在线观看| 亚洲美女中文字幕| 国产综合av| 在线一区二区三区四区五区| 精品成人一区二区| 一区二区动漫| 亚洲欧洲精品成人久久奇米网| 亚洲视频视频在线| 亚洲精品免费网站| 久久久久久久久久久久久久一区| 国产精品99久久不卡二区| 久久久久国产精品人| 亚洲欧美日韩网| 欧美日韩黄色大片| 欧美二区在线观看| 国产一区二区三区在线观看免费| 99精品国产在热久久| 影音先锋日韩精品| 性欧美18~19sex高清播放| 亚洲视频电影图片偷拍一区| 久久香蕉国产线看观看网| 亚洲欧美一区二区三区在线| 欧美日韩少妇| 亚洲高清视频一区| 亚洲第一黄色网| 久久久999精品视频| 久久岛国电影| 国产欧美日韩不卡| 亚洲欧美综合精品久久成人| 亚洲一区二区在线观看视频| 欧美日韩亚洲视频| 亚洲日本欧美| 一本久道久久久| 欧美区高清在线| 日韩一区二区精品| 亚洲一区二区三区四区视频| 欧美日韩国产综合久久| 亚洲卡通欧美制服中文| 一区二区欧美日韩| 欧美精品一区二区精品网| 亚洲黄一区二区| 日韩午夜高潮| 国产精品国产a| 亚洲欧美变态国产另类| 久久av一区二区三区亚洲| 国产日韩免费| 久久久国产视频91| 欧美激情bt| 一本色道久久综合亚洲精品婷婷| 欧美日韩精品久久| 一区二区三区四区蜜桃| 欧美一区亚洲二区| 国内精品久久久久影院薰衣草| 久久久久久久久蜜桃| 蜜臀av性久久久久蜜臀aⅴ| 亚洲激情在线视频| 欧美日韩国产999| 亚洲一区自拍| 久久中文精品| 一本色道久久综合亚洲精品高清| 欧美午夜精品一区二区三区| 亚洲欧美一区二区三区极速播放| 久久婷婷国产综合国色天香| 91久久国产综合久久91精品网站| 欧美日韩国产三级| 亚洲男女毛片无遮挡| 免费成人美女女| 一本色道久久综合亚洲精品不 | 欧美夫妇交换俱乐部在线观看| 亚洲激情六月丁香| 午夜影院日韩| 亚洲国产精品久久久久| 欧美三级第一页| 久久精品国产2020观看福利| 亚洲精品看片| 久久久蜜桃一区二区人| 999在线观看精品免费不卡网站| 国产精品一国产精品k频道56| 老司机精品视频网站| 中文一区字幕| 亚洲国产欧美精品| 久久精品视频一| 一本色道久久综合亚洲精品按摩 | 欧美日韩一区二区免费在线观看| 亚洲欧美一区二区视频| 亚洲国产综合在线| 久久婷婷国产综合国色天香 | 国产日产欧美a一级在线| 欧美成人一区二区在线| 欧美一级专区| 亚洲一区久久久| 亚洲三级观看| 欧美黄色小视频| 久久久久久久尹人综合网亚洲| 一本久道久久久| 亚洲电影成人| 激情欧美丁香| 好吊视频一区二区三区四区 | 国产精品国产三级国产专播品爱网| 久久久久国产一区二区三区四区 | 亚洲精品极品| 欧美黄在线观看| 女主播福利一区| 久久久www成人免费精品| 亚洲欧美日韩一区二区三区在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 韩日视频一区| 国产综合婷婷| 国内精品美女av在线播放| 国产女人18毛片水18精品| 国产精品久久午夜夜伦鲁鲁| 欧美日韩精品中文字幕| 欧美激情第1页| 欧美精品一区二区高清在线观看| 欧美成人乱码一区二区三区| 蜜月aⅴ免费一区二区三区| 久久精品日韩| 久久婷婷国产麻豆91天堂| 久久久青草婷婷精品综合日韩 | 久久久精品一区| 久久国产一区| 久久久久久婷| 欧美成人精品在线视频| 欧美精品一区二区三区视频 | 西西裸体人体做爰大胆久久久| 亚洲天堂黄色| 亚洲欧美卡通另类91av | 欧美77777| 亚洲国产黄色片| 亚洲精品国久久99热| 在线视频欧美日韩精品| 性8sex亚洲区入口| 久久久国产视频91| 欧美精品97| 国产精品美女久久久久久久| 国产一区二区三区久久| 亚洲第一色在线| 亚洲一区二区三区成人在线视频精品 | 欧美在线观看一区二区| 久久一区二区三区四区五区| 欧美激情一区三区| 欧美午夜一区二区| 国产一区999| 亚洲免费久久| 久久国产免费| 亚洲黄色av| 亚洲欧美一区二区激情| 奶水喷射视频一区| 国产精品成人一区| 精品1区2区| 亚洲免费在线| 欧美福利小视频| 一区二区三区四区五区精品视频| 午夜精品久久久久久99热| 快播亚洲色图| 国产精品一区亚洲| 亚洲麻豆视频| 久久综合久久综合这里只有精品| 亚洲欧洲三级电影| 欧美亚洲免费| 欧美视频国产精品| 在线精品国产欧美| 欧美在线观看一区二区| 亚洲激情一区二区| 久久久久久久久久久成人| 国产精品久久久| 99精品视频免费在线观看| 美女图片一区二区| 亚洲欧美国产精品va在线观看 |