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