




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、驅(qū)動(dòng)對(duì)象與設(shè)備對(duì)象 DRIVER_OBJECT 和 DEVICE_OBJECT 的關(guān)系 DRIVER_OBJECT 是驅(qū)動(dòng)程序在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu),每個(gè)驅(qū)動(dòng)程序有唯一 DRIVER_OBJ ECT , IO管理器使用驅(qū)動(dòng)程序?qū)ο蟠砻總€(gè)設(shè)備驅(qū)動(dòng)程序,驅(qū)動(dòng)程序描述了驅(qū)動(dòng)程序的載 入到內(nèi)存什么地方,驅(qū)動(dòng)程序的大小和它的主要入口點(diǎn)(MajorFu nction數(shù)組);驅(qū)動(dòng)程 序?qū)ο笥幸粋€(gè)DeviceObject域指向一個(gè)設(shè)備對(duì)象鏈表,每個(gè)設(shè)備對(duì)象代表一個(gè)設(shè)備。 DEVICE_OBJECT 是物理設(shè)備或邏輯設(shè)備在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu),跟這個(gè)概念相關(guān)的有 PD O和FDO ; PDO對(duì)應(yīng)于具體的硬件設(shè)備,每個(gè)
2、硬件設(shè)備對(duì)應(yīng)一個(gè) PDO,而一個(gè)PDO可以 對(duì)應(yīng)多個(gè)FDO ; PDO和FDO都是DEVICE_OBJECT 的實(shí)體;同一個(gè)設(shè)備驅(qū)動(dòng)程序?qū)ο?下的所有設(shè)備通過 NextObject 域連接成一個(gè)鏈表(即上述驅(qū)動(dòng)程序設(shè)備對(duì)象的一個(gè)域); AttachedDevice域是針對(duì) 早期驅(qū)動(dòng)的(Window NT4以前的版本,在以后的版本中也 可以正常使用);DriverObject域指向與該設(shè)備相關(guān)的驅(qū)動(dòng)程序?qū)ο蟆?這里所說的驅(qū)動(dòng)對(duì)象是一種數(shù)據(jù)結(jié)構(gòu),在DDK中名為DRIVER_OBJECT。任何驅(qū)動(dòng) 程序都對(duì)應(yīng)一個(gè) DRIVER_OBJECT.如何獲得本人所寫的驅(qū)動(dòng)對(duì)應(yīng)的DRIVER_OBJE CT呢
3、?驅(qū)動(dòng)程序的入口函數(shù)為DriverEntry ,因此,當(dāng)你寫一個(gè)驅(qū)動(dòng)的開始,你會(huì)寫下如 下的代碼: NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_ST RING RegistryPath ) 這個(gè)函數(shù)就相當(dāng)與喜歡 c語言的你所常用的 main()N 是無意義的宏,僅僅表明后邊的參 數(shù)是一種輸入,而對(duì)應(yīng)的 OUT則代表這個(gè)參數(shù)是一種返回。這里沒有使用引用,因此如果 想在參數(shù)中返回結(jié)果,一律傳入指針。 DriverObject就是你所寫的驅(qū)動(dòng)對(duì)應(yīng)的DRIVER_OBJECT ,是系統(tǒng)在加載你的驅(qū)動(dòng) 時(shí)候所分配的。
4、 RegisteryPath是專用于你記錄你的驅(qū)動(dòng)相關(guān)參數(shù)的注冊(cè)表路徑。這兩者都由系統(tǒng)分配 并通過這兩個(gè)參數(shù)傳遞給你。 DriverObject重要之處,在于它 擁有一組函數(shù)指針,稱為dispatchfunctions. 開發(fā)驅(qū)動(dòng)的 主要任務(wù)就是親手撰寫這些dispatch functions .當(dāng)系統(tǒng)用到你的驅(qū)動(dòng),會(huì)向你 的驅(qū)動(dòng)發(fā)送IRP (這是windows所有驅(qū)動(dòng)的共同工作方式)。你的任務(wù)是在dispatch f unction中處理這些請(qǐng)求。你可以讓irp失敗,也可以成功返回,也可以修改這些irp , 甚至可以自己發(fā)出irp。 設(shè)備對(duì)象 則是指DEVICE_OBJECT.下邊簡稱DO.
5、 但是實(shí)際上每個(gè)irp都是針對(duì)DO發(fā)出的。只有針對(duì)由該驅(qū)動(dòng)所生成的DO的IRP ,才 會(huì)發(fā)給該驅(qū)動(dòng)來處理。具體的分發(fā)函數(shù),決定于 DO下的DriverObject 域。 當(dāng)一個(gè)應(yīng)用程序打開文件并讀寫文件的時(shí)候,windows系統(tǒng)將這些請(qǐng)求變成irp發(fā)送給文 件系統(tǒng)驅(qū)動(dòng)。文件系統(tǒng)過濾驅(qū)動(dòng)將可以過濾這些irp .這樣,你就擁有了捕獲和改變文件系統(tǒng) 操作的能力。 象Fat32,NTFS這樣的文件系統(tǒng)(File System,簡稱FS),可能生成好幾種設(shè)備。首先 文件系統(tǒng)驅(qū)動(dòng)本身往往生成一個(gè)控制設(shè)備(CDO).這個(gè)設(shè)備的主要任務(wù)是 修改整個(gè)驅(qū)動(dòng)的 內(nèi)部配置。因此一個(gè)Driver 只對(duì)應(yīng)一個(gè)CDO .
6、另一種設(shè)備是被這個(gè)文件系統(tǒng) Mount 的Volume 。一個(gè)FS可能有多個(gè) Volume ,也可 能一個(gè)都沒有。解釋一下,如果你有 C:,D:,E:,F: 四個(gè)分區(qū)。C:,D :為NTFS ,E:,F :為Fat 32 .那么E:,F :則是Fat的兩個(gè)Volume設(shè)備對(duì)象.實(shí)際上C:是該設(shè)備的符號(hào)連接 (Sy mbolic Link )名。而不是真正的設(shè)備名??梢源蜷_ Symbolic Links Viewer ,能看到: C: DeviceHarddiskVolume1 因此該設(shè)備的設(shè)備名為“HarddiskVolume1 ”. 這里也看出來,文件系統(tǒng)驅(qū)動(dòng)是針對(duì)每個(gè)Volume 來生成一
7、個(gè) DeviceObject ,而不是針 對(duì)每個(gè)文件的。實(shí)際上對(duì)文件的讀寫的irp ,都發(fā)到Volume設(shè)備對(duì)象上去了。并不會(huì)生 成一個(gè) 文件設(shè)備對(duì)象”。掌握了這些概念的話,我們現(xiàn)在用簡單的代碼來生成我們的CDO, 作為我們開發(fā)文件系統(tǒng)驅(qū)動(dòng)的第一步牛刀小試。 NTSTATUS DriverE ntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) /定義一個(gè)Uni code 字符串。 UNICODE_STRINGn ameStri ng; RtlInitUnicodeString( /生成控制設(shè)備 stat
8、us = IoCreateDevice ( DriverObject, 0, /has no device extension /如果因?yàn)槁窂經(jīng)]找到而生成失敗 if (status = STATUS_OBJECT_PATH_NOT_FOUND ) /這是因?yàn)橐恍┑桶姹镜牟僮飨到y(tǒng)沒有這個(gè)目錄 /如果沒有,我們則改變位置,生成到下 RtlInitUnicodeString( status = IoCreateDevice ( DriverObject, 0, if (! NT_SUCCESS ( status ) KdPrint ( SFilter!DriverEntry:Error creati
9、ngcontroldevice object %wZ, status=%08xn, return status; else if (! NT_SUCCESS( status ) /失敗也打印一個(gè)。并直接返回錯(cuò)誤 KdPrint ( SFilter!DriverEntry:Error creatingcontroldevice object %wZ, status=%08xn, return status; sfilter.sys.把這個(gè)文件與前所描述的inf文件同一目錄,按上節(jié)所敘述方法安裝。 這個(gè)驅(qū)動(dòng)不起任何作用,但是你已經(jīng)成功的完成了hello world. 初次看這些代碼可能有一些慌亂。
10、但是只要注意了以下幾點(diǎn),你就會(huì)變得輕松了: 1 )習(xí)慣使用UNICODE_STRING字符串。這些字符串用Rtl -系列的函數(shù)來操作。你應(yīng) 該閱讀DDK幫助,然后熟悉這些字符串的用法。 2 ) 用KdPrint()來代替printf 輸出信息。這些信息可以在DbgView 中看到。KdPri nt()自身是一個(gè)宏,為了完整傳入?yún)?shù)所以使用了兩重括弧。這個(gè)比DbgPrint調(diào)用要稍 好。因?yàn)樵趂ree版不被編譯。 3) 查看DDK幫助了解生成設(shè)備對(duì)象IoCreateDevice的用法。 請(qǐng)注意CDO 生成后,保存在gSFilterControlDeviceObject中。這樣以后我們得到一個(gè) D
11、EVICE_OBJECT 時(shí), 就很容易判斷是否是我們的控制設(shè)備。 1 驅(qū)動(dòng)對(duì)象(DRIUEROBJECT) SI疊覩蠶鈔勵(lì)象與之對(duì)應(yīng)并且該驅(qū)動(dòng)對(duì)象是在驅(qū)動(dòng)加載是被內(nèi)核中的對(duì)象管理程 typedef struct _DRIUER_OBJECT CSHORT Type; CSHORT Size; PDEUICE_OBJECT DeuiceObject; 督土驅(qū)頊程疥含頁一個(gè)或多個(gè)殳簣對(duì)象其中, 最啟一個(gè)設(shè)備對(duì)象指向空;此處的DeuiceObjec DeuiceOb動(dòng)對(duì)漿里的所有設(shè)備肝象 驅(qū)動(dòng)卸載時(shí),遍歷每個(gè)設(shè)備對(duì)象,將其刪除; 勰飜蠶二哪A對(duì)瓠 展備對(duì)象有翟序賈創(chuàng)建,而非榛作縈統(tǒng)完成;在 ULO
12、HG Flags; PUOID DriuerStart; ULOHG DriuerSize; PUOID DriuerSection; PDRIUEREXTENSION DriuerExtension; UNICODESTRING DriuerNdiw; 驅(qū)動(dòng)程序的名字,格解般為:Driuer驅(qū)動(dòng)程序名稱; PUNICODE_STRING HardwareDatabase; 在注冊(cè)表申的鍵值名REGISTRYMACHINEHARDWAREDESCRIPTIONSVSTEM; PFAST_ld_DISPATCH FastIoDispatch; PDRIUER_YNITIALIZE Driuerl
13、nit; PDRIUEfiZsTARTIO DriuerStartlo; PDRIUER_UNLOAD DriuerUnload; 驅(qū)動(dòng)程序卸載時(shí)所用的回調(diào)函數(shù); PDRIUER_DISPATCH MajorFunctionIRPJ1J_MAXIMUrLFUNCTION * 1; IRP的派遣函數(shù)數(shù)組; DRIUER_OBJECT; typedef struct _DRIUER_OBJECT *PDRIUER_OBJECT; DEUICE OBJECT) J F會(huì)創(chuàng)建一個(gè)裁鋌殳翔象,甩)EUICEJJBJECT數(shù)據(jù)結(jié)構(gòu)表示海個(gè)設(shè)爸對(duì)象 針扌旨向下一不設(shè)備對(duì)象,形麼一個(gè)i購鋰;設(shè)留鏈的第一個(gè)設(shè)備
14、是在DRIUERJJBJECT曙杓體 鬼善構(gòu)為: typedef struct _DEUICE_OBJECT 有更咼一層的驅(qū)動(dòng)附加到這個(gè)驅(qū)動(dòng)的時(shí)候,AttachedDeuice指向的就是那 個(gè)更高一層的驅(qū)島; PIRP Currentlrp; 抬向的是當(dāng)前IRP結(jié)構(gòu); PIOTIMER Tiner; ULONG Flags; ULONG Characteristics; _uolatile PUPB Upb; PUOID DeuiceExtension; DEUICETVPE DeuiceType; CCHAR StackSize; union LIST_ENTRY ListEntry; WA
15、IT一CONTEXT BLOCK Web; Queue; ULONG AlignnentRequirement: KDEUICEQUEUE DeuiceQueue; KDPC Dpc; ULONG ActiueThreadCount; PSECURITVDESCRIPTOR SecurityDescriptor; KEUENT USHORT USHORT PDEUOBJ PUOID Reserved; DEUICEOBJECT, *PDEUICE_OBJECT; 2. ,從而可乞 DeuiceLock; SectorSize; Sparel; EXTENSION DeuiceObjectExtension; USHORT SectorSize; USHORT Sparel; PDEUOBJ_EXTENSION DeuiceObjectExtension; PUOID Reserued; DEU(CE_OBJECT *PDEUICE_OBJECT; 3 創(chuàng)建設(shè)備對(duì)象匚 IoCreateDeuice; 證一嘗號(hào)譬霞用戶模式下的識(shí)別;如: 真正的設(shè)備對(duì)塚是:DeuiceHarddiskUolune1; 漲蠶礬墾話箴盟嚨暑e Object PDO總線驅(qū)動(dòng)創(chuàng)建 能設(shè)備對(duì)象Function Deuice Object F
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年甘肅交通職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫完美版
- 2025年度學(xué)生安全教育與心理健康維護(hù)合同
- 2025年度勞動(dòng)合同解除補(bǔ)償協(xié)議及員工福利待遇保障書
- 2025年度保險(xiǎn)公司與國有企業(yè)單位全面合作協(xié)議
- 2025年度房屋租賃合同訂金及配套設(shè)施使用協(xié)議
- 2025年度摩托車進(jìn)出口代理業(yè)務(wù)合同
- 2025年度公司股東內(nèi)部關(guān)于股權(quán)結(jié)構(gòu)優(yōu)化與分配的協(xié)議書
- 2025年度委托招聘合同-行業(yè)領(lǐng)軍人才合作項(xiàng)目
- 2025年度員工向公司借款合同變更通知合同
- 2025年度工程車輛司機(jī)勞務(wù)派遣合同
- 北京市豐臺(tái)區(qū)2024-2025學(xué)年高三上學(xué)期期末英語試題
- 2025上海市嘉定工業(yè)區(qū)農(nóng)村青年干部招聘22人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《獸醫(yī)基礎(chǔ)》練習(xí)題及參考答案
- 2025年煤礦探放水證考試題庫
- 農(nóng)業(yè)機(jī)械設(shè)備運(yùn)輸及調(diào)試方案
- 污水處理設(shè)備的故障處理指南考核試卷
- ps 課件教學(xué)課件
- 神經(jīng)外科患者早期康復(fù)護(hù)理
- 2025屆浙江省寧波市鎮(zhèn)海區(qū)鎮(zhèn)海中學(xué)高二物理第一學(xué)期期末考試試題含解析
- 口腔頜面部發(fā)育(口腔組織病理學(xué)課件)
- 機(jī)房設(shè)備搬遷及系統(tǒng)割接施工方案
評(píng)論
0/150
提交評(píng)論