版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第五章 設(shè)備管理,,設(shè)備管理---概述,Windows I/O系統(tǒng)概述I/O系統(tǒng)結(jié)構(gòu)Windows驅(qū)動程序I/O系統(tǒng)內(nèi)核對象I/O請求和處理,Windows I/O系統(tǒng)概述,I/O系統(tǒng):負(fù)責(zé)管理輸入輸出設(shè)備。向用戶隱藏硬件細(xì)節(jié)。,I/O系統(tǒng)結(jié)構(gòu),I/O系統(tǒng)組成I/O管理器設(shè)備驅(qū)動程序PnP管理器電源管理器WMI支持例程注冊表硬件抽象層(HAL),Windows驅(qū)動程序,驅(qū)動程序的功能發(fā)送控制命
2、令,進(jìn)行錯誤處理對各種可能的有關(guān)設(shè)備排隊、掛起、喚醒等操作進(jìn)行處理 執(zhí)行緩沖區(qū)策略執(zhí)行一些特殊處理,比如代碼轉(zhuǎn)換。驅(qū)動程序的分類用戶態(tài)驅(qū)動程序:虛擬設(shè)備驅(qū)動程序和Windows子系統(tǒng)打印機驅(qū)動程序 核心態(tài)驅(qū)動程序:文件系統(tǒng)驅(qū)動程序 、即插即用驅(qū)動程序 、非即插即用驅(qū)動程序 其他內(nèi)核態(tài)驅(qū)動程序:WDM驅(qū)動程序、分層的驅(qū)動程序,Windows驅(qū)動程序--續(xù),驅(qū)動程序分類圖:,Windows驅(qū)動程序--續(xù),驅(qū)動程序的基本結(jié)構(gòu)初
3、始化例程 “添加-設(shè)備”例程 分發(fā)例程 啟動I/O例程 中斷服務(wù)例程 DPC例程,I/O系統(tǒng)內(nèi)核對象,文件對象文件對象代表一個文件、設(shè)備或目錄的打開實例。Windows系統(tǒng)將所有的設(shè)備都當(dāng)成文件,所以文件對象就代表這個設(shè)備的設(shè)備對象。驅(qū)動程序?qū)ο篁?qū)動程序代表系統(tǒng)中的一個獨立的驅(qū)動程序驅(qū)動程序?qū)ο蠼Y(jié)構(gòu),I/O系統(tǒng)內(nèi)核對象--續(xù),設(shè)備對象和設(shè)備擴(kuò)展設(shè)備對象代表一個具體的物理設(shè)備。設(shè)備擴(kuò)展包含與特定設(shè)
4、備相關(guān)的數(shù)據(jù)。設(shè)備對象中包含一個指向?qū)?yīng)驅(qū)動程序?qū)ο蟮闹羔?,這樣I/O管理器就能在接收到一個I/O請求時應(yīng)該調(diào)用哪個驅(qū)動程序來處理該I/O請求。“下一個設(shè)備對象”指針指向?qū)儆谕粋€驅(qū)動程序的下一個設(shè)備對象,該域把多個設(shè)備對象連接起來。,I/O系統(tǒng)內(nèi)核對象--續(xù),對象之間的關(guān)系文件對象指向一個打開的設(shè)備實例,每當(dāng)一個線程打開一個文件或設(shè)備時,都用一個文件對象指向?qū)?yīng)的設(shè)備對象 驅(qū)動程序?qū)ο笥卸鄠€與他相
5、關(guān)的設(shè)備對象,這樣就能方便的實現(xiàn)對硬件設(shè)備的控制。設(shè)備對象還有一個指針指向該驅(qū)動程序?qū)ο螅琁/O管理器在接收到一個I/O請求時就知道該調(diào)用哪個驅(qū)動程序。,I/O請求和處理,I/O請求包 I/O系統(tǒng)使用一個I/O請求包(IRP,I/O Request Packet)表示每個I/O請求。當(dāng)線程調(diào)用I/O服務(wù)時,I/O管理器就為該請求創(chuàng)建一個IRP數(shù)據(jù)結(jié)構(gòu),同時為該IRP傳遞一個指向相應(yīng)驅(qū)動程序的指針。當(dāng)驅(qū)動程序接收到一個IRP包時,執(zhí)
6、行IRP指定的操作,操作完成后將該IRP傳遞給I/O管理器。,I/O請求和處理--續(xù),I/O請求處理請求處理過程:I/O管理器接收用戶發(fā)來的請求,并為該請求分配一個IRP數(shù)據(jù)結(jié)構(gòu)。檢查I/O請求的合法性,并將IRP傳遞給合適的驅(qū)動程序。驅(qū)動程序根據(jù)IRP的參數(shù)設(shè)置對設(shè)備進(jìn)行操作。操作完成時,驅(qū)動程序?qū)RP傳遞給I/O管理器。I/O管理器檢查IRP的狀態(tài)域,查看用戶的I/O請求是否完成。,I/O請求和處理--續(xù),I/O請求處
7、理過程圖,設(shè)備管理---實驗,WDM驅(qū)動程序驅(qū)動程序?qū)嵗?qū)動程序加載,WDM驅(qū)動程序,WDM是一個分層的驅(qū)動程序模型。在該模型中,驅(qū)動程序的層和堆棧一起工作處理I/O請求。,WDM驅(qū)動程序--續(xù),WDM驅(qū)動程序結(jié)構(gòu)可以把一個完整的驅(qū)動程序看作一個容器,它包含許多例程,當(dāng)操作系統(tǒng)遇到一個IRP時,它就調(diào)用這個容器中的例程執(zhí)行該IRP的各種操作。驅(qū)動程序一般都有幾個支持不同類型IRP的派遣函數(shù),因此WDM驅(qū)動程序開發(fā)者的一個
8、任務(wù)就是為這個容器選擇所需要的例程。,,WDM驅(qū)動程序--續(xù),DriverEntry例程 DriverEntry是內(nèi)核模式驅(qū)動程序主入口點函數(shù),大部分的設(shè)備初始化工作都是在這個例程中完成的。函數(shù)原型如下:NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); 函數(shù)返
9、回值是一個長整型的NTSTATUS值,WDM驅(qū)動程序--續(xù),DriverEntry函數(shù)的主要工作有一下幾個方面:首先是為驅(qū)動程序指定派遣函數(shù)。每個WDM驅(qū)動程序必須能處理PNP、POWER、SYSTEM_CONTROL這三種請求;應(yīng)該在這里為這些請求指定派遣函數(shù)。在省略號處,你可以插入設(shè)置其它MajorFunction指針的其他代碼,比如IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE等。 如果驅(qū)動
10、程序需要訪問設(shè)備的服務(wù)鍵,可以在這里備份RegistryPath串。返回STATUS_SUCCESS說明函數(shù)成功。如果失敗,應(yīng)該返回NTSTATUS.H中的一個錯誤代碼,或者返回用戶定義的錯誤代碼。STATUS_SUCCESS的值為0。,WDM驅(qū)動程序--續(xù),AddDevice例程 DriverEntry例程只能在驅(qū)動程序第一次被裝入時執(zhí)行一次,但是一個驅(qū)動程序可以被多個實際的設(shè)備利用,所以WDM驅(qū)動程序有一個特殊的AddDevi
11、ce函數(shù),PnP管理器為每個設(shè)備實例調(diào)用該函數(shù)。函數(shù)原型為:NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject,PDEVICE_OBJECT pdo),WDM驅(qū)動程序--續(xù),對于功能驅(qū)動程序,其AddDevice函數(shù)的基本職責(zé)是創(chuàng)建一個設(shè)備對象并把它連接到以pdo為底的設(shè)備堆棧中。相關(guān)步驟如下:調(diào)用IoCreateDevice創(chuàng)建設(shè)備對象,并建立一個私有的設(shè)備擴(kuò)展對象
12、。 寄存一個或多個設(shè)備接口,以便應(yīng)用程序能知道設(shè)備的存在。另外,還可以給出設(shè)備名并創(chuàng)建符號連接。 初始化設(shè)備擴(kuò)展和設(shè)備對象的Flag成員。 調(diào)用IoAttachDeviceToDeviceStack函數(shù)把新設(shè)備對象放到堆棧上。,WDM驅(qū)動程序--續(xù),分發(fā)例程 分發(fā)例程是一個設(shè)備驅(qū)動程序所提供的主要函數(shù)??梢詫崿F(xiàn)設(shè)備的打開、關(guān)閉、讀、寫、電源管理、系統(tǒng)控制等功能。分發(fā)例程主要包括以下幾個: 啟動I/O例程中斷服務(wù)程序(
13、ISR)中斷服務(wù)的DPC例程 一個或者多個I/O完成例程 取消I/O例程 系統(tǒng)停機通知例程 “錯誤-記錄”例程,WDM驅(qū)動程序--續(xù),所有的分發(fā)函數(shù)都有一個統(tǒng)一的函數(shù)原型:NTSTATUS dispatch_function(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp){//添加函數(shù)處理代碼 return STATUS_SUCCESS;},WDM
14、驅(qū)動程序--續(xù),Unload例程 DriverUnload例程的作用是釋放DriverEntry例程在全局初始化過程中申請的任何資源,但它幾乎沒什么可做。如果你在DriverEntry中備份了RegistryPath串,應(yīng)該在這里釋放備份所占用的內(nèi)存:VOID DriverUnload (PDRIVER_OBJECT DriverObject){ RtlFreeUnicodeString(&ser
15、vkey);}如果DriverEntry例程返回一個失敗狀態(tài)代碼,系統(tǒng)將不再調(diào)用DriverUnload例程。因此不能讓DriverEntry例程出錯后產(chǎn)生任何副作用,必須在它返回錯誤代碼前消除副作用。,驅(qū)動程序?qū)嵗?源代碼組成 HelloWorld驅(qū)動程序的源代碼由四個文件組成,分別是HelloWorld.c,HelloWorld.h,makefile和source,這四個文件存放在HelloWorld文件夾里,下面分別介
16、紹這四個文件的內(nèi)容。 HelloWorld.h HelloWorld.h文件主要工作是定義一些宏,和進(jìn)行函數(shù)原型聲明。,驅(qū)動程序?qū)嵗?-續(xù),HelloWorld.c該文件包含三個函數(shù),分別DriverEntry(),HelloWorldDispatch(),HelloWorldUnload()。DriverEntry()是驅(qū)動程序的入口函數(shù) HelloWorldDispatch()是分發(fā)函數(shù),負(fù)責(zé)實現(xiàn)驅(qū)動程序的讀寫、打
17、開、關(guān)閉等操作;HelloWorldUnload()是驅(qū)動程序的卸載函數(shù) MAKEFILE文件和SOURCE文件 對于所有的驅(qū)動程序,MAKEFILE文件都是一樣的 . SOURCE文件包含一些宏,用以指導(dǎo)BUILD工具如何生成驅(qū)動程序可執(zhí)行文件,從哪里獲得輸入以及在哪里進(jìn)行輸出。,驅(qū)動程序加載,驅(qū)動安裝過程分析 加載和運行一個服務(wù)需要執(zhí)行的典型操作步驟有:調(diào)用OpenSCManager()打開服務(wù)控制管理器,獲
18、取管理器句柄。調(diào)用CreateService()創(chuàng)建一個服務(wù),服務(wù)類型為內(nèi)核驅(qū)動。調(diào)用OpenService()取得服務(wù)句柄。調(diào)用StartService()啟動服務(wù)。調(diào)用CloseServiceHandle()關(guān)閉服務(wù)句柄。,驅(qū)動程序加載--續(xù),驅(qū)動程序的安裝函數(shù)執(zhí)行流程圖當(dāng)調(diào)用CreateService創(chuàng)建服務(wù)時,系統(tǒng)調(diào)用NtLoadDriver函數(shù)執(zhí)行驅(qū)動程序的加載操作,但是NtLoadDriver只做一些判斷,具體
19、的加載工作由IopLoadUnloadDriver函數(shù)完成,所以上圖中有一個從CreateService到NtloadDriver的調(diào)用,還有一個從NtLoadDriver到IopLoadUnloadDriver的調(diào)用路線,下面會介紹IopLoadUnloadDriver所做的具體工作。當(dāng)調(diào)用StartService啟動服務(wù)時,系統(tǒng)會調(diào)用驅(qū)動程序的入口點函數(shù),進(jìn)行一些初始化操作。,驅(qū)動程序加載--續(xù),關(guān)鍵代碼分析 NtLoadDri
20、ver( )函數(shù)在\wrk-v1.2\base\ntos\io\iomgr\loadunld.c中定義,函數(shù)原型如下:NTSTATUS NtLoadDriver ( __in PUNICODE_STRING DriverServiceName );參數(shù):DriverServiceName是要加載的驅(qū)動程序在
21、注冊表中的名稱。這是一個UNICODE_STRING類型的參數(shù),指定要加載的驅(qū)動程序。返回值:成功操作結(jié)束后返回操作的狀態(tài)碼,失敗則返回NULL。,驅(qū)動程序加載--續(xù),NtLoadDriver()函數(shù)執(zhí)行流程圖,驅(qū)動程序加載--續(xù),實驗?zāi)康?驗證驅(qū)動程序的動態(tài)加載過程。實驗原理 驗證用戶態(tài)應(yīng)用程序在動態(tài)加載驅(qū)動程序時對NtLoadDriver ( )函數(shù)的調(diào)用過程。 實驗環(huán)境 調(diào)試工具:Windbg編程工具:V
22、isual Studio 2005操作系統(tǒng):VMware 5.0+Windows Server 2003實驗內(nèi)容 利用Visual Studio編寫一個loadsys函數(shù)實現(xiàn)驅(qū)動程序的動態(tài)加載,然后編寫一個程序test001,對驅(qū)動程序的功能表現(xiàn)進(jìn)行測試。,驅(qū)動程序加載--續(xù),實驗過程步驟1:修改源代碼根據(jù)關(guān)鍵代碼分析部分的結(jié)果,對\wrk-v1.2\base\ntos\io\iomgr\loadunld.c中的NtL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論