亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? wdf源代碼1.txt

?? 文件系統(tǒng)驅(qū)動(dòng)開發(fā)的文檔資料(IFS DDK)
?? TXT
字號(hào):
文件過濾系統(tǒng)設(shè)計(jì)(1) (附全部源代碼)

本文作者為上海楚狂人,有意見和建議者請(qǐng)聯(lián)系(QQ16191935,MSN walled_river@hotmail.com)

文件過濾系統(tǒng)設(shè)計(jì)(1) 友好外部接口的lib

首先說明一下,此文所附的代碼,也就是<<Windows文件系統(tǒng)過濾驅(qū)動(dòng)開發(fā)教程>>的代碼。閱讀此文需要預(yù)先了解文件過濾驅(qū)動(dòng),最好讀過<<Windows文件系統(tǒng)過濾驅(qū)動(dòng)開發(fā)教程>>。我計(jì)劃再發(fā)一系列文章總結(jié)這方面的最新積累的經(jīng)驗(yàn),當(dāng)然我不敢取名“教程”,因?yàn)槲覜]有資格教育任何人。

我不幸被卷入數(shù)個(gè)與文件過濾有關(guān)的項(xiàng)目中,以致為此耗費(fèi)了數(shù)年的時(shí)光.我期望我的設(shè)計(jì)趨于理想,把我的編碼工作引入美好的狀態(tài).

從理想的角度來說,文件過濾是與操作系統(tǒng)無關(guān)的.因?yàn)槭紫任易鑫募^濾的時(shí)候并未關(guān)心文件系統(tǒng)的類型.FAT32還是NTFS? 如果機(jī)器上有其他文件系統(tǒng),我也打算過濾它.然后,操作系統(tǒng)并未與文件系統(tǒng)相關(guān).Windows上也可以安裝ext2(聽聞已經(jīng)有人開發(fā)了相關(guān)的驅(qū)動(dòng)),linux上安裝FAT32與NTFS(NTFS的驅(qū)動(dòng)可能尚不完美)已經(jīng)是事實(shí).

提煉與操作系統(tǒng)無關(guān)的文件操作是一個(gè)比較復(fù)雜的接口設(shè)計(jì)工作.能碰到千奇百怪的困難.所以我認(rèn)為,應(yīng)該反過來入手,首先精簡Windows的文件操作的接口,再在這個(gè)基礎(chǔ)上追求操作系統(tǒng)無關(guān)化.當(dāng)然你也可以認(rèn)為操作系統(tǒng)無關(guān)是完全不可能的,這個(gè)目標(biāo)是錯(cuò)誤的.但是我已經(jīng)精簡了文件系統(tǒng)過濾操作的接口,使之后的編程工作變得簡單.

我把這個(gè)項(xiàng)目稱為FSFE(File System Filter Engine),這是一個(gè)非商業(yè)化的項(xiàng)目,所有代碼都是本人利用工作業(yè)余時(shí)間編寫.你可以下載這些代碼并修改使用,但是不能用于商業(yè)開發(fā)中.

在Windows下研究文件過濾一般都從SFilter入手.SFilter可以看作一個(gè)文件過濾和Windows的文件系統(tǒng)之間的一個(gè)"適配器",但絕對(duì)不是你要開發(fā)的文件過濾系統(tǒng)本身.既然Windows的文件系統(tǒng)操作以IRP作為單元,并在dispatch functions中處理IRP,那么你的文件過濾只需要考慮過濾IRP就可以了.又何必去考慮哪些文件系統(tǒng)何時(shí)激活,又合適加載了卷,何時(shí)卷被卸載這些無關(guān)的問題呢?

我希望我的編碼不需要考慮那些問題,而是直接如此編碼(為了避免更多的板磚我使用盡量DDK原裝的數(shù)據(jù)類型):

// 這是我的主函數(shù)
void fsfe_main()
{
  // 我為create irp的處理設(shè)置一個(gè)回調(diào)函數(shù)
  fsfe_set_create(my_create);

  // 我為close 和 clean up的irp處理設(shè)置一個(gè)回調(diào)函數(shù)
  fsfe_set_close_clean_up(my_close_clean_up);
}

以上是我打算過濾create和close的情況.create的過濾一般用來阻止某些文件被訪問,或者"重新定向"對(duì)某些文件的訪問(比如把文件操作映射到另外一個(gè)磁盤或目錄中).

我相信計(jì)算機(jī)中所有的文件的create irp都會(huì)發(fā)到我這里.這時(shí)我就可以編寫我的過濾了:

ULONG 
my_create(
  IN PDEVICE_OBJECT cur,     // 當(dāng)前設(shè)備
  IN PDEVICE_OBJECT next,     // 下一個(gè)設(shè)備   
  IN PIRP irp,         // irp
  OUT NTSTATUS status,     // 如果irp被完成,狀態(tài)返回到這里
  OUT PVOID *context)     // 可以為完成函數(shù)指定一個(gè)上下文
{
  // create傳入的參數(shù)我并不一定都要使用.如果我要打印請(qǐng)求生成文件
  // 的路徑,只要這樣這就可以了:
  PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp); 
  PFILE_OBJECT file = irpsp->FileObject;

  if(file != NULL)
  {
    DbgPrint("CREATE %wZ\r\n", &file->FileName);
  }
    
  // 自己定義的一個(gè)常量.意義為"繼續(xù)完成",對(duì)IRP我不干涉。
  return WDFF_CB_GO_ON;
}

  irpsp->FileObject->FileName只是一個(gè)請(qǐng)求路徑。直接用這個(gè)路徑用來做路徑過濾(比如限制對(duì)某個(gè)目錄下的文件訪問)是不現(xiàn)實(shí)的。首先這個(gè)路徑可能不是絕對(duì)路徑,可能只是某個(gè)目錄的相對(duì)路徑,而且不含有盤符。更糟的是可能出現(xiàn)短名,如mypath~1之類,讓你的過濾落空。后面我們專門研究如何做路徑過濾。但是這個(gè)演示還是不錯(cuò)的。

  假設(shè)你手頭有Sfilter的代碼,那么你可以按如下的解釋實(shí)現(xiàn)以上的功能.

  首先Sfilter將被編譯成一個(gè)Lib.使用Lib使你或者以你的成果為基礎(chǔ)的開發(fā)者不必再關(guān)心Sfilter的代碼.

  以上帶來的一個(gè)擔(dān)心是調(diào)試BUG的問題.但是當(dāng)然需要調(diào)試的時(shí)候,你會(huì)發(fā)現(xiàn)有代碼的lib調(diào)試起來和你常用的全代碼的情況一樣的方便.

  令一個(gè)容易被誤會(huì)的問題常常是lib的大小的問題.一般的lib編譯出來(尤其是功能非常豐富的lib)編譯出來都非常的大.其實(shí)連接一個(gè)lib絕對(duì)不等于把這個(gè)lib的全部大小放到你的驅(qū)動(dòng)中.連接器只連接必要的部分.你未使用到的部分會(huì)被剔除.因此你會(huì)發(fā)現(xiàn)你連接的結(jié)果往往比lib本身要小很多.

  修改SFilter目錄下的SOURCE文件.把

  TARGETTYPE=DRIVER
  
  修改為

  TARGETTYPE=LIBRARY

  然后我可以在SFilter.c中,DriverEntry的實(shí)現(xiàn)之前,加入

  extern void fsfe_main();   // 外部函數(shù)聲明
    
  然后在DriverEntry中,合適的位置調(diào)用:

  NT_STATUS DriverEntry(...)
  {
    ...
    // 可以把fsfe_main設(shè)計(jì)成接受一些參數(shù),但是我沒有
    // 用這樣的設(shè)計(jì).
    fsfe_main( ... );

    ... // 繼續(xù)初始化
  }
  
  這樣你的代碼中不必再有DriverEntry,但是必須有fsfe_main.當(dāng)然你必須連接這個(gè)庫.在你的SOURCE文件中,加上:

  TARGETLIBS = sfilter.lib   

  check版本和free版本需要不同的庫.你可以像這樣:

  !IF "$(DDKBUILDENV)"=="fre"
  TARGETLIBS = sfilter.lib
  !else
  TARGETLIBS = sfilterd.lib
  !ENDIF   

  以上是編譯問題.下面考慮分發(fā)函數(shù).實(shí)際上與fsfe_main的嵌入相同.但是為了這些函數(shù)不是固定名字,而是可以設(shè)置的,我必須在SFilter中定義一組函數(shù)指針:

  一個(gè)IRP處理的過濾函數(shù)類型:

  typedef LONG
  (*wdff_callback_pre_func)(
    IN PDEVICE_OBJECT cur,     // 當(dāng)前設(shè)備
    IN PDEVICE_OBJECT next,     // 下一個(gè)設(shè)備   
    IN PIRP irp,         // irp
    OUT NTSTATUS status,     // 如果irp被完成,狀態(tài)返回到這里
    OUT PVOID *context);
    
  一個(gè)IRP完成的過濾函數(shù):

  typedef LONG 
  (*wdff_callback_post_func)(
            IN PDEVICE_OBJECT cur,
            IN PDEVICE_OBJECT dev,
            IN PIRP irp,
            IN PVOID context);   

  // 一個(gè)含有一組回調(diào)指針的結(jié)構(gòu),有點(diǎn)類似linux驅(qū)動(dòng)開發(fā)的分發(fā)函數(shù)指針數(shù)組。
  typedef struct _wdff_callback
  {
    wdff_callback_pre_func read_write;
    wdff_callback_post_func read_write_comp;
    wdff_callback_pre_func create;
    wdff_callback_post_func create_comp;
    wdff_callback_pre_func close_clean_up;
    wdff_callback_post_func close_clean_up_comp;
    wdff_callback_pre_func device_io_ctrl;
    wdff_callback_post_func device_io_ctrl_comp;
    wdff_callback_pre_func other;
    wdff_callback_post_func other_comp;
  } wdff_callback;

  我在這中間做了一些簡化的處理.比如常用的IRP被單獨(dú)提出來作為函數(shù)指針.而"其他"的IRP處理則被集合到一個(gè)叫做other的處理函數(shù)中.

  現(xiàn)在在SFilter中定義一個(gè)如下的變量:

  wdff_callback g_callback;

  我很容易提供接口來設(shè)置它.我可以在庫中導(dǎo)出一個(gè)函數(shù):

  wd_void fsfe_set_create(wdff_callback_pre_func create)
  {
    g_callback.create = create;
  };
  
  其他的接口都是類似的.下面的問題,就是在SFilter中何時(shí)調(diào)用這個(gè)回調(diào)函數(shù)了.相信這個(gè)難不到對(duì)SFilter了解的諸位:

  NT_STATUS SfCreate(...)
  {
    ...
    if(g_callback.create != NULL)
    {
        (g_callback.create)( ...)
    }
  }

  但是具體到我給出的代碼中,情況有一些不同.但是都是細(xì)節(jié)問題,有興趣的讀者可以自己研究.我提供的代碼并不是SFilter修改而來,而是我自己編寫的過濾框架。比SFilter的優(yōu)點(diǎn)在于,提供了路徑過濾,影設(shè)備讀寫,2000下動(dòng)態(tài)加載卸載等一些新功能。

  所附代碼有如下的說明:

  0.使用這些代碼到你的計(jì)算機(jī)上,一切后果自負(fù)。

  1.編譯必須安裝DDK 3790或者以上的版本,用WNET編譯。必須定義環(huán)境變量DDKROOT或者BASEDIR.

  2.得到代碼后解壓。用VC6.0或者VC7.0打開工作空間后點(diǎn)Build,Rebuild All或批構(gòu)建可直接編譯之。編譯方法與編譯應(yīng)用程序同。不要試圖用ddk或者ds提供的工具去編譯它,那樣會(huì)碰到一些麻煩。如果失敗請(qǐng)檢查環(huán)境變量。

  3.編譯后得到的lib在lib目錄下,主要有wdf.lib和fsfe.lib.需要的頭文件在inc目錄下。

  4.使用這些lib的例子在Sample目錄下。這些目錄下的工程也會(huì)在工作空間全部編譯的時(shí)候被編譯。得到的sys每一個(gè)都可以在2k-2003中所有的系統(tǒng)上動(dòng)態(tài)加載和卸載。加載后打開DbgView察看輸出即可。目前只有一個(gè)例子 create_filter.我會(huì)在后面的系列文章中編寫更多的例子。create_filter.sys加載后會(huì)打印出系統(tǒng)當(dāng)前打開的文件路徑(帶盤符)。

  5.如果出現(xiàn)了蘭屏,死機(jī)或者其他意外,請(qǐng)不要過于憤怒。如果你能修改程序的bug,希望你發(fā)一份給我指出我的錯(cuò)誤,我非常感謝。

  值得指出的是,有時(shí)DbgPrint似乎會(huì)導(dǎo)致藍(lán)屏。在正式發(fā)布的商業(yè)軟件中不應(yīng)該包含DbgPrint調(diào)用。我目前包含了許多。這是為了作為演示。

  其他方面的問題將在后續(xù)的文章中繼續(xù)說明。


描述:Wdf源代碼

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲短视频| 国产成人午夜片在线观看高清观看| 北岛玲一区二区三区四区| 欧美国产一区在线| 成人国产精品免费观看视频| 国产精品久久久久久久久免费丝袜 | 欧美大白屁股肥臀xxxxxx| 美日韩一区二区| 久久无码av三级| 欧美日本在线视频| 日韩一区国产二区欧美三区| 国产盗摄视频一区二区三区| 亚洲第一搞黄网站| 久久色在线观看| 亚洲一区二区三区爽爽爽爽爽| 国产欧美日韩卡一| 一区二区三区四区亚洲| 国产在线精品视频| 99vv1com这只有精品| 国产精品久久综合| 在线观看亚洲a| 奇米一区二区三区av| 久久天堂av综合合色蜜桃网| 国产精品自拍网站| 亚洲欧美国产毛片在线| 色88888久久久久久影院按摩| 性做久久久久久久免费看| 久久精品国产亚洲aⅴ| 9久草视频在线视频精品| 国产色综合一区| 亚洲国产精品麻豆| 国产精品一二一区| 国产精品亚洲一区二区三区在线 | 国模冰冰炮一区二区| 制服丝袜在线91| 亚洲成人综合网站| 欧美在线你懂的| 亚洲国产精品久久人人爱| 99在线精品视频| 亚洲精品国产品国语在线app| 色一情一乱一乱一91av| **欧美大码日韩| 日本不卡一二三| 91精品久久久久久久久99蜜臂| 亚洲男人都懂的| 亚洲欧美日韩一区二区三区在线观看 | 中文字幕一区二区三区在线播放| 91超碰这里只有精品国产| 成人免费毛片高清视频| 日本成人中文字幕| 亚洲精品国产视频| 亚洲444eee在线观看| 精品久久久久av影院| 日韩福利视频网| 亚洲欧美成人一区二区三区| 国产亚洲精品中文字幕| 欧美一区二区三区电影| 在线精品视频免费播放| www.久久精品| 国产精品77777| 久久成人av少妇免费| 日韩在线一区二区三区| 亚洲图片欧美色图| 一区二区三区免费网站| 最近日韩中文字幕| 国产福利精品导航| 青青草精品视频| 亚洲成人av福利| 亚洲综合另类小说| 亚洲一区二区欧美日韩| 亚洲欧美一区二区在线观看| 国产婷婷精品av在线| 精品sm在线观看| 26uuu欧美| 欧美变态tickle挠乳网站| 91精品国产麻豆国产自产在线 | 天堂蜜桃一区二区三区| 亚洲成人福利片| 亚洲专区一二三| 亚洲成av人**亚洲成av**| 一区二区三区日韩精品| 亚洲一二三四久久| 亚洲国产精品久久一线不卡| 亚洲午夜私人影院| 亚洲成人免费影院| 日本欧美大码aⅴ在线播放| 全部av―极品视觉盛宴亚洲| 麻豆精品国产91久久久久久| 久久狠狠亚洲综合| 国产一区999| 成人久久视频在线观看| 色中色一区二区| 欧美日韩一本到| 51精品久久久久久久蜜臀| 日韩美女视频在线| 国产视频一区二区在线观看| 国产精品美女久久久久久久网站| 亚洲欧美偷拍三级| 亚洲第一av色| 激情图区综合网| 成人av综合在线| 欧美日韩一二三| 日韩女优av电影| 国产精品久久久一区麻豆最新章节| 亚洲欧美综合在线精品| 亚洲自拍偷拍图区| 青青草97国产精品免费观看 | 久久影视一区二区| 中文字幕一区在线| 天天综合天天做天天综合| 精品一二三四在线| 99精品视频在线免费观看| 欧美日韩黄视频| 久久综合久久99| 亚洲伦理在线精品| 美女视频黄免费的久久| www.亚洲人| 制服丝袜中文字幕一区| 中文字幕第一页久久| 亚洲国产精品久久人人爱| 国产成人在线视频免费播放| 色婷婷一区二区| 26uuu久久综合| 亚洲资源在线观看| 国产高清精品网站| 欧美日本一区二区在线观看| 久久久噜噜噜久久中文字幕色伊伊| 一区二区三区四区蜜桃| 狠狠色丁香婷婷综合久久片| 欧美最新大片在线看| 久久精品视频免费| 男女性色大片免费观看一区二区| av亚洲精华国产精华精华 | 欧美变态tickle挠乳网站| 中文字幕视频一区二区三区久| 日本在线不卡视频| 91成人国产精品| 欧美极品aⅴ影院| 麻豆精品蜜桃视频网站| 在线观看一区不卡| 国产精品传媒在线| 国产一区二区久久| 日韩一二三区不卡| 亚洲影视在线观看| 91亚洲永久精品| 精品亚洲成a人| 亚洲欧美在线视频| 日本不卡免费在线视频| 在线亚洲免费视频| 久久精品视频免费观看| 久久99国产精品久久| 欧美日韩国产一区| 亚洲免费在线播放| 成人a免费在线看| 国产欧美1区2区3区| 国产高清不卡一区| 精品国产露脸精彩对白| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲高清免费观看高清完整版在线观看| 国产美女视频一区| 精品精品国产高清a毛片牛牛| 三级在线观看一区二区| 欧美色图天堂网| 亚洲国产一二三| 欧洲精品视频在线观看| 日韩毛片精品高清免费| 91视频在线观看| 亚洲最色的网站| 欧亚一区二区三区| 亚洲国产sm捆绑调教视频| 欧美日韩一区国产| 亚洲成人av免费| 精品视频一区二区三区免费| 亚洲一区二区三区自拍| 欧美日本韩国一区二区三区视频 | 欧美人伦禁忌dvd放荡欲情| 亚洲制服丝袜在线| 欧美喷潮久久久xxxxx| 视频一区视频二区中文| 欧美一级国产精品| 国产在线视频一区二区三区| 国产亚洲一区二区三区在线观看| 国产精品小仙女| 亚洲欧洲av色图| 欧美在线不卡视频| 日韩不卡一二三区| 日韩精品中文字幕一区 | 国产91精品在线观看| 国产精品久久久久久久裸模| 日本高清无吗v一区| 香蕉成人啪国产精品视频综合网| 日韩一区二区三区在线视频| 国产伦理精品不卡| 自拍偷拍欧美精品| 91精品啪在线观看国产60岁| 国内久久婷婷综合| 中文字幕亚洲不卡| 欧美色老头old∨ideo| 狠狠色综合播放一区二区| 国产精品传媒视频|