驅(qū)動(dòng)對(duì)象與設(shè)備對(duì)象資料_第1頁
驅(qū)動(dòng)對(duì)象與設(shè)備對(duì)象資料_第2頁
驅(qū)動(dòng)對(duì)象與設(shè)備對(duì)象資料_第3頁
驅(qū)動(dòng)對(duì)象與設(shè)備對(duì)象資料_第4頁
驅(qū)動(dòng)對(duì)象與設(shè)備對(duì)象資料_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論