2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第五章 設(shè)備管理,,設(shè)備管理---概述,Windows I/O系統(tǒng)概述I/O系統(tǒng)結(jié)構(gòu)Windows驅(qū)動(dòng)程序I/O系統(tǒng)內(nèi)核對(duì)象I/O請(qǐng)求和處理,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ū)動(dòng)程序PnP管理器電源管理器WMI支持例程注冊(cè)表硬件抽象層(HAL),Windows驅(qū)動(dòng)程序,驅(qū)動(dòng)程序的功能發(fā)送控制命

2、令,進(jìn)行錯(cuò)誤處理對(duì)各種可能的有關(guān)設(shè)備排隊(duì)、掛起、喚醒等操作進(jìn)行處理 執(zhí)行緩沖區(qū)策略執(zhí)行一些特殊處理,比如代碼轉(zhuǎn)換。驅(qū)動(dòng)程序的分類用戶態(tài)驅(qū)動(dòng)程序:虛擬設(shè)備驅(qū)動(dòng)程序和Windows子系統(tǒng)打印機(jī)驅(qū)動(dòng)程序 核心態(tài)驅(qū)動(dòng)程序:文件系統(tǒng)驅(qū)動(dòng)程序 、即插即用驅(qū)動(dòng)程序 、非即插即用驅(qū)動(dòng)程序 其他內(nèi)核態(tài)驅(qū)動(dòng)程序:WDM驅(qū)動(dòng)程序、分層的驅(qū)動(dòng)程序,Windows驅(qū)動(dòng)程序--續(xù),驅(qū)動(dòng)程序分類圖:,Windows驅(qū)動(dòng)程序--續(xù),驅(qū)動(dòng)程序的基本結(jié)構(gòu)初

3、始化例程 “添加-設(shè)備”例程 分發(fā)例程 啟動(dòng)I/O例程 中斷服務(wù)例程 DPC例程,I/O系統(tǒng)內(nèi)核對(duì)象,文件對(duì)象文件對(duì)象代表一個(gè)文件、設(shè)備或目錄的打開實(shí)例。Windows系統(tǒng)將所有的設(shè)備都當(dāng)成文件,所以文件對(duì)象就代表這個(gè)設(shè)備的設(shè)備對(duì)象。驅(qū)動(dòng)程序?qū)ο篁?qū)動(dòng)程序代表系統(tǒng)中的一個(gè)獨(dú)立的驅(qū)動(dòng)程序驅(qū)動(dòng)程序?qū)ο蠼Y(jié)構(gòu),I/O系統(tǒng)內(nèi)核對(duì)象--續(xù),設(shè)備對(duì)象和設(shè)備擴(kuò)展設(shè)備對(duì)象代表一個(gè)具體的物理設(shè)備。設(shè)備擴(kuò)展包含與特定設(shè)

4、備相關(guān)的數(shù)據(jù)。設(shè)備對(duì)象中包含一個(gè)指向?qū)?yīng)驅(qū)動(dòng)程序?qū)ο蟮闹羔槪@樣I/O管理器就能在接收到一個(gè)I/O請(qǐng)求時(shí)應(yīng)該調(diào)用哪個(gè)驅(qū)動(dòng)程序來處理該I/O請(qǐng)求。“下一個(gè)設(shè)備對(duì)象”指針指向?qū)儆谕粋€(gè)驅(qū)動(dòng)程序的下一個(gè)設(shè)備對(duì)象,該域把多個(gè)設(shè)備對(duì)象連接起來。,I/O系統(tǒng)內(nèi)核對(duì)象--續(xù),對(duì)象之間的關(guān)系文件對(duì)象指向一個(gè)打開的設(shè)備實(shí)例,每當(dāng)一個(gè)線程打開一個(gè)文件或設(shè)備時(shí),都用一個(gè)文件對(duì)象指向?qū)?yīng)的設(shè)備對(duì)象 驅(qū)動(dòng)程序?qū)ο笥卸鄠€(gè)與他相

5、關(guān)的設(shè)備對(duì)象,這樣就能方便的實(shí)現(xiàn)對(duì)硬件設(shè)備的控制。設(shè)備對(duì)象還有一個(gè)指針指向該驅(qū)動(dòng)程序?qū)ο?,I/O管理器在接收到一個(gè)I/O請(qǐng)求時(shí)就知道該調(diào)用哪個(gè)驅(qū)動(dòng)程序。,I/O請(qǐng)求和處理,I/O請(qǐng)求包 I/O系統(tǒng)使用一個(gè)I/O請(qǐng)求包(IRP,I/O Request Packet)表示每個(gè)I/O請(qǐng)求。當(dāng)線程調(diào)用I/O服務(wù)時(shí),I/O管理器就為該請(qǐng)求創(chuàng)建一個(gè)IRP數(shù)據(jù)結(jié)構(gòu),同時(shí)為該IRP傳遞一個(gè)指向相應(yīng)驅(qū)動(dòng)程序的指針。當(dāng)驅(qū)動(dòng)程序接收到一個(gè)IRP包時(shí),執(zhí)

6、行IRP指定的操作,操作完成后將該IRP傳遞給I/O管理器。,I/O請(qǐng)求和處理--續(xù),I/O請(qǐng)求處理請(qǐng)求處理過程:I/O管理器接收用戶發(fā)來的請(qǐng)求,并為該請(qǐng)求分配一個(gè)IRP數(shù)據(jù)結(jié)構(gòu)。檢查I/O請(qǐng)求的合法性,并將IRP傳遞給合適的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序根據(jù)IRP的參數(shù)設(shè)置對(duì)設(shè)備進(jìn)行操作。操作完成時(shí),驅(qū)動(dòng)程序?qū)RP傳遞給I/O管理器。I/O管理器檢查IRP的狀態(tài)域,查看用戶的I/O請(qǐng)求是否完成。,I/O請(qǐng)求和處理--續(xù),I/O請(qǐng)求處

7、理過程圖,設(shè)備管理---實(shí)驗(yàn),WDM驅(qū)動(dòng)程序驅(qū)動(dòng)程序?qū)嵗?qū)動(dòng)程序加載,WDM驅(qū)動(dòng)程序,WDM是一個(gè)分層的驅(qū)動(dòng)程序模型。在該模型中,驅(qū)動(dòng)程序的層和堆棧一起工作處理I/O請(qǐng)求。,WDM驅(qū)動(dòng)程序--續(xù),WDM驅(qū)動(dòng)程序結(jié)構(gòu)可以把一個(gè)完整的驅(qū)動(dòng)程序看作一個(gè)容器,它包含許多例程,當(dāng)操作系統(tǒng)遇到一個(gè)IRP時(shí),它就調(diào)用這個(gè)容器中的例程執(zhí)行該IRP的各種操作。驅(qū)動(dòng)程序一般都有幾個(gè)支持不同類型IRP的派遣函數(shù),因此WDM驅(qū)動(dòng)程序開發(fā)者的一個(gè)

8、任務(wù)就是為這個(gè)容器選擇所需要的例程。,,WDM驅(qū)動(dòng)程序--續(xù),DriverEntry例程 DriverEntry是內(nèi)核模式驅(qū)動(dòng)程序主入口點(diǎn)函數(shù),大部分的設(shè)備初始化工作都是在這個(gè)例程中完成的。函數(shù)原型如下:NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); 函數(shù)返

9、回值是一個(gè)長(zhǎng)整型的NTSTATUS值,WDM驅(qū)動(dòng)程序--續(xù),DriverEntry函數(shù)的主要工作有一下幾個(gè)方面:首先是為驅(qū)動(dòng)程序指定派遣函數(shù)。每個(gè)WDM驅(qū)動(dòng)程序必須能處理PNP、POWER、SYSTEM_CONTROL這三種請(qǐng)求;應(yīng)該在這里為這些請(qǐng)求指定派遣函數(shù)。在省略號(hào)處,你可以插入設(shè)置其它MajorFunction指針的其他代碼,比如IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE等。 如果驅(qū)動(dòng)

10、程序需要訪問設(shè)備的服務(wù)鍵,可以在這里備份RegistryPath串。返回STATUS_SUCCESS說明函數(shù)成功。如果失敗,應(yīng)該返回NTSTATUS.H中的一個(gè)錯(cuò)誤代碼,或者返回用戶定義的錯(cuò)誤代碼。STATUS_SUCCESS的值為0。,WDM驅(qū)動(dòng)程序--續(xù),AddDevice例程 DriverEntry例程只能在驅(qū)動(dòng)程序第一次被裝入時(shí)執(zhí)行一次,但是一個(gè)驅(qū)動(dòng)程序可以被多個(gè)實(shí)際的設(shè)備利用,所以WDM驅(qū)動(dòng)程序有一個(gè)特殊的AddDevi

11、ce函數(shù),PnP管理器為每個(gè)設(shè)備實(shí)例調(diào)用該函數(shù)。函數(shù)原型為:NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject,PDEVICE_OBJECT pdo),WDM驅(qū)動(dòng)程序--續(xù),對(duì)于功能驅(qū)動(dòng)程序,其AddDevice函數(shù)的基本職責(zé)是創(chuàng)建一個(gè)設(shè)備對(duì)象并把它連接到以pdo為底的設(shè)備堆棧中。相關(guān)步驟如下:調(diào)用IoCreateDevice創(chuàng)建設(shè)備對(duì)象,并建立一個(gè)私有的設(shè)備擴(kuò)展對(duì)象

12、。 寄存一個(gè)或多個(gè)設(shè)備接口,以便應(yīng)用程序能知道設(shè)備的存在。另外,還可以給出設(shè)備名并創(chuàng)建符號(hào)連接。 初始化設(shè)備擴(kuò)展和設(shè)備對(duì)象的Flag成員。 調(diào)用IoAttachDeviceToDeviceStack函數(shù)把新設(shè)備對(duì)象放到堆棧上。,WDM驅(qū)動(dòng)程序--續(xù),分發(fā)例程 分發(fā)例程是一個(gè)設(shè)備驅(qū)動(dòng)程序所提供的主要函數(shù)。可以實(shí)現(xiàn)設(shè)備的打開、關(guān)閉、讀、寫、電源管理、系統(tǒng)控制等功能。分發(fā)例程主要包括以下幾個(gè): 啟動(dòng)I/O例程中斷服務(wù)程序(

13、ISR)中斷服務(wù)的DPC例程 一個(gè)或者多個(gè)I/O完成例程 取消I/O例程 系統(tǒng)停機(jī)通知例程 “錯(cuò)誤-記錄”例程,WDM驅(qū)動(dòng)程序--續(xù),所有的分發(fā)函數(shù)都有一個(gè)統(tǒng)一的函數(shù)原型:NTSTATUS dispatch_function(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp){//添加函數(shù)處理代碼 return STATUS_SUCCESS;},WDM

14、驅(qū)動(dòng)程序--續(xù),Unload例程 DriverUnload例程的作用是釋放DriverEntry例程在全局初始化過程中申請(qǐng)的任何資源,但它幾乎沒什么可做。如果你在DriverEntry中備份了RegistryPath串,應(yīng)該在這里釋放備份所占用的內(nèi)存:VOID DriverUnload (PDRIVER_OBJECT DriverObject){ RtlFreeUnicodeString(&ser

15、vkey);}如果DriverEntry例程返回一個(gè)失敗狀態(tài)代碼,系統(tǒng)將不再調(diào)用DriverUnload例程。因此不能讓DriverEntry例程出錯(cuò)后產(chǎn)生任何副作用,必須在它返回錯(cuò)誤代碼前消除副作用。,驅(qū)動(dòng)程序?qū)嵗?源代碼組成 HelloWorld驅(qū)動(dòng)程序的源代碼由四個(gè)文件組成,分別是HelloWorld.c,HelloWorld.h,makefile和source,這四個(gè)文件存放在HelloWorld文件夾里,下面分別介

16、紹這四個(gè)文件的內(nèi)容。 HelloWorld.h HelloWorld.h文件主要工作是定義一些宏,和進(jìn)行函數(shù)原型聲明。,驅(qū)動(dòng)程序?qū)嵗?-續(xù),HelloWorld.c該文件包含三個(gè)函數(shù),分別DriverEntry(),HelloWorldDispatch(),HelloWorldUnload()。DriverEntry()是驅(qū)動(dòng)程序的入口函數(shù) HelloWorldDispatch()是分發(fā)函數(shù),負(fù)責(zé)實(shí)現(xiàn)驅(qū)動(dòng)程序的讀寫、打

17、開、關(guān)閉等操作;HelloWorldUnload()是驅(qū)動(dòng)程序的卸載函數(shù) MAKEFILE文件和SOURCE文件 對(duì)于所有的驅(qū)動(dòng)程序,MAKEFILE文件都是一樣的 . SOURCE文件包含一些宏,用以指導(dǎo)BUILD工具如何生成驅(qū)動(dòng)程序可執(zhí)行文件,從哪里獲得輸入以及在哪里進(jìn)行輸出。,驅(qū)動(dòng)程序加載,驅(qū)動(dòng)安裝過程分析 加載和運(yùn)行一個(gè)服務(wù)需要執(zhí)行的典型操作步驟有:調(diào)用OpenSCManager()打開服務(wù)控制管理器,獲

18、取管理器句柄。調(diào)用CreateService()創(chuàng)建一個(gè)服務(wù),服務(wù)類型為內(nèi)核驅(qū)動(dòng)。調(diào)用OpenService()取得服務(wù)句柄。調(diào)用StartService()啟動(dòng)服務(wù)。調(diào)用CloseServiceHandle()關(guān)閉服務(wù)句柄。,驅(qū)動(dòng)程序加載--續(xù),驅(qū)動(dòng)程序的安裝函數(shù)執(zhí)行流程圖當(dāng)調(diào)用CreateService創(chuàng)建服務(wù)時(shí),系統(tǒng)調(diào)用NtLoadDriver函數(shù)執(zhí)行驅(qū)動(dòng)程序的加載操作,但是NtLoadDriver只做一些判斷,具體

19、的加載工作由IopLoadUnloadDriver函數(shù)完成,所以上圖中有一個(gè)從CreateService到NtloadDriver的調(diào)用,還有一個(gè)從NtLoadDriver到IopLoadUnloadDriver的調(diào)用路線,下面會(huì)介紹IopLoadUnloadDriver所做的具體工作。當(dāng)調(diào)用StartService啟動(dòng)服務(wù)時(shí),系統(tǒng)會(huì)調(diào)用驅(qū)動(dòng)程序的入口點(diǎn)函數(shù),進(jìn)行一些初始化操作。,驅(qū)動(dòng)程序加載--續(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ū)動(dòng)程序在

21、注冊(cè)表中的名稱。這是一個(gè)UNICODE_STRING類型的參數(shù),指定要加載的驅(qū)動(dòng)程序。返回值:成功操作結(jié)束后返回操作的狀態(tài)碼,失敗則返回NULL。,驅(qū)動(dòng)程序加載--續(xù),NtLoadDriver()函數(shù)執(zhí)行流程圖,驅(qū)動(dòng)程序加載--續(xù),實(shí)驗(yàn)?zāi)康?驗(yàn)證驅(qū)動(dòng)程序的動(dòng)態(tài)加載過程。實(shí)驗(yàn)原理 驗(yàn)證用戶態(tài)應(yīng)用程序在動(dòng)態(tài)加載驅(qū)動(dòng)程序時(shí)對(duì)NtLoadDriver ( )函數(shù)的調(diào)用過程。 實(shí)驗(yàn)環(huán)境 調(diào)試工具:Windbg編程工具:V

22、isual Studio 2005操作系統(tǒng):VMware 5.0+Windows Server 2003實(shí)驗(yàn)內(nèi)容 利用Visual Studio編寫一個(gè)loadsys函數(shù)實(shí)現(xiàn)驅(qū)動(dòng)程序的動(dòng)態(tài)加載,然后編寫一個(gè)程序test001,對(duì)驅(qū)動(dòng)程序的功能表現(xiàn)進(jìn)行測(cè)試。,驅(qū)動(dòng)程序加載--續(xù),實(shí)驗(yàn)過程步驟1:修改源代碼根據(jù)關(guān)鍵代碼分析部分的結(jié)果,對(duì)\wrk-v1.2\base\ntos\io\iomgr\loadunld.c中的NtL

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(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)論