




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Windows環(huán)境下的程序設(shè)計(jì)Instructor:HengmingZou,Ph.D.InPursuitofAbsoluteSimplicity
求于至簡(jiǎn),歸于永恒Windows環(huán)境下的程序設(shè)計(jì)Instructor:HenWindows環(huán)境下的程序設(shè)計(jì)1.Windows應(yīng)用程序設(shè)計(jì)模式2.結(jié)構(gòu)化異常處理3.動(dòng)態(tài)鏈接庫(kù)4.Windows驅(qū)動(dòng)程序模型5.WDM驅(qū)動(dòng)程序編程實(shí)例6.開(kāi)發(fā)WDM驅(qū)動(dòng)程序的一般方法Windows環(huán)境下的程序設(shè)計(jì)1.Windows應(yīng)用程序Windows應(yīng)用程序設(shè)計(jì)模式Windows應(yīng)用程序是特意為在Windows環(huán)境中運(yùn)行而編寫(xiě)的應(yīng)用程序以窗口為核心的用戶界面、以事件驅(qū)動(dòng)為動(dòng)力的程序運(yùn)行機(jī)制、以及將程序代碼與用戶界面分開(kāi)處理的程序開(kāi)發(fā)手段,構(gòu)成了Windows應(yīng)用程序特有的設(shè)計(jì)模式Windows應(yīng)用程序設(shè)計(jì)模式Windows應(yīng)用程序是特Win32APIWindows應(yīng)用程序總是在常規(guī)的用戶態(tài)下運(yùn)行操作系統(tǒng)核心組件則對(duì)外界表現(xiàn)出中立的性質(zhì),它們不實(shí)現(xiàn)用戶界面,甚至不提供編程接口,系統(tǒng)服務(wù)調(diào)用對(duì)應(yīng)用程序而言是不公開(kāi)的Windows操作系統(tǒng)依靠一組用戶態(tài)環(huán)境子系統(tǒng),作為應(yīng)用程序與操作系統(tǒng)核心之間的接口Win32APIWindows應(yīng)用程序總是在常規(guī)的用戶態(tài)Win32APIWin32子系統(tǒng)是Windows操作系統(tǒng)的固有的子系統(tǒng),這個(gè)子系統(tǒng)能夠提供應(yīng)用程序運(yùn)行所需要的窗口管理、圖形設(shè)備接口、媒體控制、內(nèi)存管理等各項(xiàng)服務(wù)功能,這些功能以函數(shù)庫(kù)的形式組織在一起,這就是Win32應(yīng)用程序編程接口,簡(jiǎn)稱為Win32APIWin32子系統(tǒng)負(fù)責(zé)將API調(diào)用轉(zhuǎn)換成Windows操作系統(tǒng)的系統(tǒng)服務(wù)調(diào)用Win32APIWin32子系統(tǒng)是Windows操作系統(tǒng)Win32APIWindows應(yīng)用程序與操作系統(tǒng)的關(guān)系Windows應(yīng)用程序Win32子系統(tǒng)子系統(tǒng)用戶態(tài)核心態(tài)系統(tǒng)服務(wù)Windows應(yīng)用程序硬件層Win32APIWindows應(yīng)用程序與操作系統(tǒng)的關(guān)系WWin32APIUSER32.DLL:負(fù)責(zé)處理用戶接口GDI32.DLL:負(fù)責(zé)在圖形設(shè)備上執(zhí)行繪圖操作KERNEL32.DLL:操作系統(tǒng)核心功能服務(wù)COMCTL32.DLL:通用控件庫(kù)COMDLG32.DLL:公共對(duì)話框SHELL32.DLL:用戶界面外殼DIBENG.DLL:圖形引擎NETAPI32.DLL:網(wǎng)絡(luò)Win32APIUSER32.DLL:負(fù)責(zé)處理用戶接口Win32API標(biāo)準(zhǔn)Win32API函數(shù)分類(lèi):系統(tǒng)服務(wù)通用控件庫(kù)圖形設(shè)備接口網(wǎng)絡(luò)服務(wù)用戶接口系統(tǒng)ShellWindows系統(tǒng)信息Win32API標(biāo)準(zhǔn)Win32API函數(shù)分類(lèi):Windows應(yīng)用程序設(shè)計(jì)模式窗口目的是保證用戶能夠同時(shí)訪問(wèn)大多數(shù)應(yīng)用程序應(yīng)用程序使用窗口來(lái)顯示輸出或接收用戶的輸入應(yīng)用程序只有通過(guò)窗口才能訪問(wèn)系統(tǒng)顯示器;并且通過(guò)使用窗口與其他應(yīng)用程序共享系統(tǒng)顯示器Windows應(yīng)用程序設(shè)計(jì)模式窗口Windows應(yīng)用程序設(shè)計(jì)模式事件驅(qū)動(dòng)Windows應(yīng)用程序的執(zhí)行順序取決于事件發(fā)生的順序,描述事件發(fā)生的信息稱為消息,而事件驅(qū)動(dòng)程序設(shè)計(jì)則是圍繞著消息的產(chǎn)生與處理而展開(kāi)的消息可以分為由硬件設(shè)備產(chǎn)生的輸入消息和來(lái)自Windows系統(tǒng)的窗口管理消息發(fā)送消息——send指派消息——postWindows應(yīng)用程序設(shè)計(jì)模式事件驅(qū)動(dòng)Windows應(yīng)用程序設(shè)計(jì)模式事件驅(qū)動(dòng)硬件輸入系統(tǒng)消息隊(duì)列應(yīng)用程序隊(duì)列1應(yīng)用程序隊(duì)列nWindowsWinMain函數(shù)消息循環(huán)窗口函數(shù)1窗口函數(shù)m應(yīng)用程序1WinMain函數(shù)消息循環(huán)應(yīng)用程序n窗口函數(shù)1窗口函數(shù)mWindows應(yīng)用程序設(shè)計(jì)模式事件驅(qū)動(dòng)硬件輸入系統(tǒng)消息隊(duì)列應(yīng)Windows應(yīng)用程序設(shè)計(jì)模式Windows應(yīng)用程序的開(kāi)發(fā)流程Windows應(yīng)用程序分為程序代碼和用戶界面資源兩部分,兩部分通過(guò)資源編譯器組合為一個(gè)完整的EXE文件將用戶界面資源一類(lèi)的靜態(tài)數(shù)據(jù)與程序代碼相分離有如下一些優(yōu)點(diǎn):減少內(nèi)存要求;劃清了程序員與用戶界面設(shè)計(jì)人員的任務(wù)分工用戶界面風(fēng)格的變化可以不必修改程序代碼或只需進(jìn)行少量的修改Windows應(yīng)用程序設(shè)計(jì)模式Windows應(yīng)用程序的開(kāi)發(fā)流Windows應(yīng)用程序設(shè)計(jì)模式Windows應(yīng)用程序的開(kāi)發(fā)流程.C.H.RC.DEF.DLG.EXE鏈接器.LIB...BMP.CUR.ICO.FON.RES.OBJ資源編譯器C編譯器字體編輯器圖象編輯器對(duì)話框編輯器工具文本文件二進(jìn)制文件Windows應(yīng)用程序設(shè)計(jì)模式Windows應(yīng)用程序的開(kāi)發(fā)流Windows應(yīng)用程序的基本結(jié)構(gòu)Windows應(yīng)用程序具有相對(duì)固定的基本結(jié)構(gòu),入口點(diǎn)函數(shù)WinMain和窗口函數(shù)構(gòu)成了Windows應(yīng)用程序的基本框架Windows應(yīng)用程序的基本結(jié)構(gòu)Windows應(yīng)用程序具有相Windows應(yīng)用程序的基本結(jié)構(gòu)WinMain函數(shù)是程序的入口點(diǎn),相當(dāng)于標(biāo)準(zhǔn)C語(yǔ)言中的main函數(shù)WinMain函數(shù)主要由四部分組成:注冊(cè)窗口類(lèi)創(chuàng)建窗口顯示窗口建立消息循環(huán)Windows應(yīng)用程序的基本結(jié)構(gòu)WinMain函數(shù)Windows應(yīng)用程序的基本結(jié)構(gòu)WinMain函數(shù)
消息循環(huán)Windows并不直接把輸入消息發(fā)送給應(yīng)用程序,而是將其送入應(yīng)用程序的消息隊(duì)列之中。此外,Windows和其他應(yīng)用程序也可以將消息指派到應(yīng)用程序隊(duì)列中應(yīng)用程序必須讀取應(yīng)用程序隊(duì)列,檢索消息并將它們發(fā)送出去,以便適當(dāng)?shù)拇翱诤瘮?shù)能夠處理它們,負(fù)責(zé)這一任務(wù)的便是消息循環(huán)Windows應(yīng)用程序的基本結(jié)構(gòu)WinMain函數(shù)消息Windows應(yīng)用程序的基本結(jié)構(gòu)WinMain函數(shù)
消息循環(huán)while(GetMessage(&Msg,NULL,0,0)){ TranslateMessage(&Msg); DispatchMessage(&Msg);}GetMessage函數(shù)檢索到WM_QUIT消息時(shí)返回非零值,檢索到其他消息均返回Windows應(yīng)用程序的基本結(jié)構(gòu)WinMain函數(shù)消息Windows應(yīng)用程序的基本結(jié)構(gòu)窗口函數(shù)窗口函數(shù)也稱為窗口過(guò)程,負(fù)責(zé)從Windows接收消息,并根據(jù)這些消息完成特定的操作窗口函數(shù)是一個(gè)回調(diào)函數(shù),由Windows系統(tǒng)調(diào)用,應(yīng)用程序并不會(huì)直接調(diào)用它的窗口函數(shù)窗口函數(shù)的主體是由一系列case語(yǔ)句組成的消息處理程序段如果窗口函數(shù)不處理某些消息,則必須把它們傳給DefWindowProc函數(shù)Windows應(yīng)用程序的基本結(jié)構(gòu)窗口函數(shù)case1case2case3…DefaultWindows系統(tǒng)應(yīng)用程序WinMain()消息循環(huán)WndProc()④DispatchMessage()⑥⑤DefWindowProc()檢索到的消息③GetMessage()②指派的消息WM_KEYDOWNWM_KEYUPWM_MOUSEMOVEWM_LBUTTONDOWNWM_QUIT…...發(fā)送的消息WM_CREATEWM_DESTROYWM_SIZEWM_PAINT…...①應(yīng)用程序的消息隊(duì)列回調(diào)Windows應(yīng)用程序的消息處理過(guò)程case1case2case3…DefaultWindWindows應(yīng)用程序的基本結(jié)構(gòu)當(dāng)用戶關(guān)閉窗口時(shí),Windows系統(tǒng)將把WM_DESTROY消息發(fā)送給該窗口的窗口函數(shù),在這種情況下,窗口函數(shù)應(yīng)該使用PostQuitMessage函數(shù)將WM_QUIT消息發(fā)送到應(yīng)用程序隊(duì)列中,這樣可以使GetMessage函數(shù)檢索到WM_QUIT消息,從而結(jié)束消息循環(huán),退出應(yīng)用程序Windows應(yīng)用程序的基本結(jié)構(gòu)當(dāng)用戶關(guān)閉窗口時(shí),Windocase1case2...caseWM_DESTROYDefaultWindows系統(tǒng)應(yīng)用程序WinMain()消息循環(huán)WndProc()②PostQuitMessage(0)WM_QUIT消息⑤GetMessage()④WM_QUIT消息應(yīng)用程序的消息隊(duì)列WM_DESTROY消息①③退出消息循環(huán)結(jié)束應(yīng)用程序⑥WM_DESTROY消息的處理過(guò)程case1case2...caseWM_DESTROY結(jié)構(gòu)化異常處理Windows在系統(tǒng)底層提供了一種稱為結(jié)構(gòu)化異常處理SEH的系統(tǒng)機(jī)制。利用SEH可以把程序主要的工作同錯(cuò)誤處理分離開(kāi)來(lái),這樣的分離,可以使程序員集中精力關(guān)注程序要完成的任務(wù),而將可能發(fā)生的錯(cuò)誤放在后面處理異常是在應(yīng)用程序的正常執(zhí)行過(guò)程中發(fā)生的不正常事件。CPU引發(fā)的異常稱為硬件異常,操作系統(tǒng)和應(yīng)用程序直接引發(fā)的異常,稱為軟件異常結(jié)構(gòu)化異常處理Windows在系統(tǒng)底層提供了一種稱為結(jié)構(gòu)化異結(jié)構(gòu)化異常處理SHE是操作系統(tǒng)的一種系統(tǒng)機(jī)制,與特定的程序設(shè)計(jì)語(yǔ)言無(wú)關(guān)應(yīng)用程序要利用系統(tǒng)提供的SHE機(jī)制,則必須借助于特定程序設(shè)計(jì)語(yǔ)言的相關(guān)語(yǔ)法因此,SEH不但涉及操作系統(tǒng),而且與編譯器有密切的關(guān)系結(jié)構(gòu)化異常處理包括異常處理和終止處理兩個(gè)方面結(jié)構(gòu)化異常處理SHE是操作系統(tǒng)的一種系統(tǒng)機(jī)制,與特定的程序設(shè)結(jié)構(gòu)化異常處理異常處理__try{ ... //guardedsection}__except(exceptionfilter){ ... //exceptionhandler}結(jié)構(gòu)化異常處理異常處理結(jié)構(gòu)化異常處理異常處理異常過(guò)濾器返回如下三個(gè)異常標(biāo)識(shí)符之一ECXEPTION_EXECUTE_HANDLERECXEPTION_CONTINUE_EXECUTIONECXEPTION_CONTINUE_SEARCH結(jié)構(gòu)化異常處理異常處理結(jié)構(gòu)化異常處理終止處理Windows應(yīng)用程序在運(yùn)行時(shí)通常要分配資源,使用這些資源,然后釋放它們由于異常改變了控制的流程,因此很容易導(dǎo)致無(wú)法釋放在產(chǎn)生異常的代碼塊中分配的資源使用終止處理程序可以保證進(jìn)行這樣的清除工作結(jié)構(gòu)化異常處理終止處理結(jié)構(gòu)化異常處理終止處理__try{ ... }__finally{ ... }結(jié)構(gòu)化異常處理終止處理結(jié)構(gòu)化異常處理終止處理有兩種情況可能使受保護(hù)段不正常地結(jié)束在try塊中執(zhí)行了return、goto、break或continue等控制語(yǔ)句在try塊中發(fā)生異常結(jié)構(gòu)化異常處理終止處理結(jié)構(gòu)化異常處理軟件異常當(dāng)一個(gè)函數(shù)執(zhí)行失敗時(shí),習(xí)慣上要返回一些特殊的值來(lái),函數(shù)的調(diào)用者可以檢查這些特殊值并采取一種替代的動(dòng)作如果這個(gè)調(diào)用者是被另一個(gè)調(diào)用者調(diào)用的函數(shù),那么它還需要將它自己的失敗代碼返回給它的調(diào)用者這種錯(cuò)誤代碼的逐層傳遞會(huì)使源程序變得非常難于編寫(xiě)和維護(hù)采用軟件異常則可以解決這些問(wèn)題結(jié)構(gòu)化異常處理軟件異常動(dòng)態(tài)鏈接庫(kù)動(dòng)態(tài)鏈接庫(kù)DLL是一個(gè)可執(zhí)行程序模塊,模塊中包含了可以被其他應(yīng)用程序或其他DLL共享的程序代碼和資源動(dòng)態(tài)鏈接庫(kù)動(dòng)態(tài)鏈接庫(kù)DLL是一個(gè)可執(zhí)行程序模塊,模塊中包含了動(dòng)態(tài)鏈接庫(kù)采用DLL的優(yōu)點(diǎn):當(dāng)多個(gè)進(jìn)程同時(shí)使用同一個(gè)DLL時(shí),只要在內(nèi)存中裝入它的一個(gè)副本即可,從而可以節(jié)省內(nèi)存;DLL與調(diào)用它的應(yīng)用程序相分離,因此可以在不修改應(yīng)用程序的情況下對(duì)DLL進(jìn)行更新;只要在調(diào)用DLL中的函數(shù)時(shí)遵循相同的調(diào)用規(guī)范,那么DLL中的函數(shù)就可以被各種編程語(yǔ)言編制的應(yīng)用程序調(diào)用動(dòng)態(tài)鏈接庫(kù)采用DLL的優(yōu)點(diǎn):動(dòng)態(tài)鏈接庫(kù)DLL到進(jìn)程地址空間的映射裝入時(shí)刻動(dòng)態(tài)鏈接經(jīng)過(guò)編譯的.obj文件引入庫(kù),包含DLL函數(shù)的重定位信息鏈接器可執(zhí)行程序重定位信息動(dòng)態(tài)鏈接庫(kù)調(diào)用DLL中的函數(shù)內(nèi)存動(dòng)態(tài)鏈接庫(kù)DLL到進(jìn)程地址空間的映射經(jīng)過(guò)編譯的.obj文件引動(dòng)態(tài)鏈接庫(kù)DLL到進(jìn)程地址空間的映射運(yùn)行時(shí)刻動(dòng)態(tài)鏈接在運(yùn)行時(shí)刻,通過(guò)調(diào)用LoadLibrary可以使DLL加載到一個(gè)進(jìn)程的地址空間中為了在運(yùn)行時(shí)刻從DLL中調(diào)用一個(gè)函數(shù),可以通過(guò)調(diào)用GetProcAddress獲取函數(shù)的地址動(dòng)態(tài)鏈接庫(kù)DLL到進(jìn)程地址空間的映射動(dòng)態(tài)鏈接庫(kù)DLL到進(jìn)程地址空間的映射虛擬地址空間02GB02GB進(jìn)程1進(jìn)程2DLL數(shù)據(jù)(共享)DLL數(shù)據(jù)(私用進(jìn)程1)DLL數(shù)據(jù)(私用進(jìn)程1)DLL代碼物理內(nèi)存動(dòng)態(tài)鏈接庫(kù)DLL到進(jìn)程地址空間的映射虛擬地址空間02GB02動(dòng)態(tài)鏈接庫(kù)DLL的入口點(diǎn)函數(shù)DLL沒(méi)有WinMain函數(shù),不含有消息循環(huán),一般也不獲取自己的消息,但是它有自己特殊的入口點(diǎn)函數(shù),入口點(diǎn)函數(shù)的缺省名為DllMain當(dāng)進(jìn)程和線程被初始化或終止時(shí),DllMain函數(shù)被Windows系統(tǒng)調(diào)用DllMain要做的主要任務(wù)是執(zhí)行進(jìn)程級(jí)或線程級(jí)的初始化和清理工作如果不要求DLL初始化,DllMain可以只是一個(gè)虛設(shè)函數(shù)動(dòng)態(tài)鏈接庫(kù)DLL的入口點(diǎn)函數(shù)動(dòng)態(tài)鏈接庫(kù)DLL的創(chuàng)建和使用創(chuàng)建DLL文件需要用到源文件(.C)和頭文件(.H)。DLL源文件通常包括入口點(diǎn)函數(shù)和供應(yīng)用程序調(diào)用的DLL庫(kù)函數(shù)。頭文件中含有DLL要導(dǎo)出的所有函數(shù)與變量的說(shuō)明在應(yīng)用程序中調(diào)用DLL中的函數(shù)或訪問(wèn)DLL中的變量時(shí),須告訴編譯器要調(diào)用的函數(shù)或要訪問(wèn)的變量是在DLL中:__declspec(dllimport)intSub(intnPara1,intPara2);動(dòng)態(tài)鏈接庫(kù)DLL的創(chuàng)建和使用習(xí)題Win32子系統(tǒng)與Win32API的關(guān)系是什么?什么是事件驅(qū)動(dòng)?Windows應(yīng)用程序?yàn)槭裁床捎檬录?qū)動(dòng)的程序設(shè)計(jì)方法,而不是象傳統(tǒng)DOS應(yīng)用程序那樣采用過(guò)程驅(qū)動(dòng)的程序設(shè)計(jì)方法?與靜態(tài)鏈接相比,動(dòng)態(tài)鏈接有哪些優(yōu)點(diǎn)?有哪些缺點(diǎn)?習(xí)題Win32子系統(tǒng)與Win32API的關(guān)系是什么?Windows驅(qū)動(dòng)程序模型WDM以WindowsNT4.0的內(nèi)部結(jié)構(gòu)為基礎(chǔ),同時(shí)引入了Windows9x的即插即用特性,為存在于Windows98和Windows2000/XP/2003操作系統(tǒng)中的設(shè)備驅(qū)動(dòng)程序提供了一個(gè)統(tǒng)一的參考框架WDM驅(qū)動(dòng)程序還可以在不修改源代碼的情況下經(jīng)過(guò)重新編譯后在非Intel平臺(tái)上運(yùn)行,因此WDM是一個(gè)跨平臺(tái)的驅(qū)動(dòng)程序模型Windows驅(qū)動(dòng)程序模型WDM以WindowsNT4.設(shè)備和驅(qū)動(dòng)程序的分層WDM是一個(gè)分層化的驅(qū)動(dòng)程序模型,在這個(gè)模型中,驅(qū)動(dòng)程序的層或堆棧一起工作處理I/O請(qǐng)求FiDOFDOFiDOPDO上層過(guò)濾器驅(qū)動(dòng)程序功能驅(qū)動(dòng)程序下層過(guò)濾器驅(qū)動(dòng)程序總線驅(qū)動(dòng)程序IRP設(shè)備和驅(qū)動(dòng)程序的分層WDM是一個(gè)分層化的驅(qū)動(dòng)程序模型,在這個(gè)設(shè)備和驅(qū)動(dòng)程序的分層總線驅(qū)動(dòng)程序總線驅(qū)動(dòng)程序負(fù)責(zé)枚舉連接在該總線上的所有設(shè)備并進(jìn)行必要處理Microsoft為大多數(shù)總線如PCI、PnPISA、SCSI以及USB等提供了驅(qū)動(dòng)程序機(jī)器中每種類(lèi)型的總線都有相應(yīng)的總線驅(qū)動(dòng)程序總線枚舉時(shí)驅(qū)動(dòng)程序識(shí)別其上的設(shè)備并為其創(chuàng)建一個(gè)物理設(shè)備對(duì)象設(shè)備和驅(qū)動(dòng)程序的分層總線驅(qū)動(dòng)程序設(shè)備和驅(qū)動(dòng)程序的分層功能驅(qū)動(dòng)程序功能驅(qū)動(dòng)程序是一個(gè)設(shè)備的主要驅(qū)動(dòng)程序,它知道如何控制設(shè)備的主要功能功能驅(qū)動(dòng)程序?yàn)樗脑O(shè)備提供操作接口,處理對(duì)設(shè)備的讀/寫(xiě),并管理設(shè)備的電源策略功能驅(qū)動(dòng)程序創(chuàng)建一個(gè)功能設(shè)備對(duì)象FDO放在設(shè)備棧中設(shè)備和驅(qū)動(dòng)程序的分層功能驅(qū)動(dòng)程序設(shè)備和驅(qū)動(dòng)程序的分層過(guò)濾器驅(qū)動(dòng)程序過(guò)濾器驅(qū)動(dòng)程序過(guò)濾對(duì)每個(gè)設(shè)備、每一類(lèi)設(shè)備或一條總線的I/O請(qǐng)求過(guò)濾器驅(qū)動(dòng)程序是可選擇的設(shè)備和驅(qū)動(dòng)程序的分層過(guò)濾器驅(qū)動(dòng)程序IRP的處理IRP是驅(qū)動(dòng)程序操作的中心。I/O管理器接收一個(gè)I/O請(qǐng)求之后,在把它傳遞到合適的驅(qū)動(dòng)程序堆棧中的最高層驅(qū)動(dòng)程序之前,分配并初始化一個(gè)IRP當(dāng)一個(gè)IRP由多個(gè)驅(qū)動(dòng)程序處理時(shí),使用多個(gè)I/O堆棧單元。每個(gè)驅(qū)動(dòng)程序從當(dāng)前I/O堆棧單元得到它的IRP參數(shù)。如果把一個(gè)IRP沿當(dāng)前設(shè)備的驅(qū)動(dòng)程序堆棧向下傳遞,必須使用正確的常數(shù)設(shè)置下一個(gè)堆棧單元IRP的處理IRP是驅(qū)動(dòng)程序操作的中心。I/O管理器接收一個(gè)IRP的處理驅(qū)動(dòng)程序1驅(qū)動(dòng)程序2驅(qū)動(dòng)程序3驅(qū)動(dòng)程序4I/O堆棧單元1I/O堆棧單元2I/O堆棧單元3I/O堆棧單元4IRP最低最高IRP的處理驅(qū)動(dòng)程序1驅(qū)動(dòng)程序2驅(qū)動(dòng)程序3驅(qū)動(dòng)程序4I/O堆用戶程序?qū)υO(shè)備的訪問(wèn)過(guò)程Windows中對(duì)設(shè)備的訪問(wèn)分為用戶態(tài)和核心態(tài)兩種方式:用戶態(tài)通過(guò)調(diào)用Win32API函數(shù)如ReadFile、WriteFile等訪問(wèn)設(shè)備,它不能直接控制硬件核心態(tài)通過(guò)發(fā)送I/O請(qǐng)求包IRP來(lái)運(yùn)行驅(qū)動(dòng)程序?qū)崿F(xiàn)對(duì)設(shè)備的控制用戶程序?qū)υO(shè)備的訪問(wèn)過(guò)程Windows中對(duì)設(shè)備的訪問(wèn)分為用戶用戶程序?qū)υO(shè)備的訪問(wèn)過(guò)程應(yīng)用程序Win32子系統(tǒng)用戶態(tài)核心態(tài)I/O系統(tǒng)服務(wù)I/O管理器IRP高層驅(qū)動(dòng)程序中層驅(qū)動(dòng)程序低層驅(qū)動(dòng)程序HAL用戶程序?qū)υO(shè)備的訪問(wèn)過(guò)程應(yīng)用程序Win32子系統(tǒng)用戶態(tài)核心態(tài)WDM驅(qū)動(dòng)程序的結(jié)構(gòu)分發(fā)例程I/O控制例程StartIoAdapterControlOnInterruptDpcForIsrDriverEntryAddDevice基本驅(qū)動(dòng)程序例程必須的驅(qū)動(dòng)程序例程處理請(qǐng)求隊(duì)列需要包含StarIo如果設(shè)備產(chǎn)生中斷需要包含中斷和DPC例程DMA操作需要包含AdapterControl例程可選的IRP分發(fā)例程DispatchPnpDispatchPowerDispatchWmiDispatchReadDispatchWriteWDM驅(qū)動(dòng)程序的結(jié)構(gòu)分發(fā)例程I/O控制例程StartIoAdWDM驅(qū)動(dòng)程序的結(jié)構(gòu)初始化例程,當(dāng)I/O管理器把驅(qū)動(dòng)程序加載到操作系統(tǒng)中時(shí),它執(zhí)行驅(qū)動(dòng)程序的初始化例程添加設(shè)備例程,用于支持PnP管理器的操作一系列分發(fā)(調(diào)度)例程,調(diào)度例程是設(shè)備驅(qū)動(dòng)程序提供的主要函數(shù)啟動(dòng)I/O例程,驅(qū)動(dòng)程序可以使用啟動(dòng)I/O例程來(lái)初始化與設(shè)備之間的數(shù)據(jù)傳輸WDM驅(qū)動(dòng)程序的結(jié)構(gòu)初始化例程,當(dāng)I/O管理器把驅(qū)動(dòng)程序加載WDM驅(qū)動(dòng)程序的結(jié)構(gòu)中斷服務(wù)例程(ISR),當(dāng)一個(gè)設(shè)備中斷時(shí),內(nèi)核的中斷調(diào)度程序把控制轉(zhuǎn)交給這個(gè)例程。ISR運(yùn)行在高級(jí)的設(shè)備中斷請(qǐng)求級(jí)(IRQL)上,越簡(jiǎn)單越好,以避免對(duì)低優(yōu)先級(jí)中斷產(chǎn)生不希望的阻塞中斷服務(wù)DPC例程,DPC例程執(zhí)行在ISR執(zhí)行以后的大部分設(shè)備中斷處理工作。DPC例程在低于ISR的IRQ的時(shí)候執(zhí)行,從而避免對(duì)其他中斷產(chǎn)生不希望的阻塞。DPC例程初始化I/O完成并啟動(dòng)關(guān)于設(shè)備的下一個(gè)隊(duì)列的I/O操作WDM驅(qū)動(dòng)程序的結(jié)構(gòu)中斷服務(wù)例程(ISR),當(dāng)一個(gè)設(shè)備中斷時(shí)WDM驅(qū)動(dòng)程序編程實(shí)例WdmDriver是一個(gè)WDM驅(qū)動(dòng)程序,它實(shí)現(xiàn)了一個(gè)4字節(jié)的核心態(tài)內(nèi)存緩沖區(qū),Win32應(yīng)用程序可以對(duì)該緩沖區(qū)進(jìn)行讀寫(xiě)操作由于采用WDM模型,WdmDriver可以運(yùn)行在Windows98和Windows2000/XP/2003兩個(gè)平臺(tái)上WDM驅(qū)動(dòng)程序編程實(shí)例WdmDriver是一個(gè)WDM驅(qū)動(dòng)程序DriverEntry例程驅(qū)動(dòng)程序向I/O管理器顯露一個(gè)名為DriverEntry的函數(shù),在啟動(dòng)驅(qū)動(dòng)程序的時(shí)候,I/O管理器將調(diào)用這個(gè)入口函數(shù)。DriverEntry相當(dāng)于作為應(yīng)用程序入口的main函數(shù)或WinMain函數(shù)驅(qū)動(dòng)程序可以被多個(gè)類(lèi)似的硬件使用,但驅(qū)動(dòng)程序的某些全局初始化操作只能在第一次被裝入時(shí)執(zhí)行一次,DriverEntry例程就是用于這個(gè)目的DriverEntry例程的主要工作是把各種函數(shù)指針填入驅(qū)動(dòng)程序?qū)ο?,這些指針為操作系統(tǒng)指明了驅(qū)動(dòng)程序容器中各種子例程的位置DriverEntry例程驅(qū)動(dòng)程序向I/O管理器顯露一個(gè)名為DriverEntry例程DriverEntry例程AddDevice例程AddDevice函數(shù)的基本職責(zé)是創(chuàng)建一個(gè)設(shè)備對(duì)象并把它連接到以pdo為棧底的設(shè)備堆棧中,主要步驟如下:調(diào)用IoCreateDevice創(chuàng)建設(shè)備對(duì)象,并建立一個(gè)私有的設(shè)備擴(kuò)展對(duì)象注冊(cè)一個(gè)或多個(gè)設(shè)備接口,以便應(yīng)用程序能知道設(shè)備的存在。另外,還可以給出設(shè)備名并創(chuàng)建符號(hào)連接調(diào)用IoAttachDeviceToDeviceStack函數(shù),把新設(shè)備對(duì)象放到堆棧上初始化設(shè)備對(duì)象的Flag成員AddDevice例程AddDevice函數(shù)的基本職責(zé)是創(chuàng)建AddDevice例程1.創(chuàng)建設(shè)備對(duì)象與設(shè)備擴(kuò)展對(duì)象:AddDevice例程1.創(chuàng)建設(shè)備對(duì)象與設(shè)備擴(kuò)展對(duì)象:AddDevice例程2.注冊(cè)設(shè)備接口AddDevice例程2.注冊(cè)設(shè)備接口AddDevice例程3.建立設(shè)備堆棧AddDevice例程3.建立設(shè)備堆棧AddDevice例程4.設(shè)置設(shè)備標(biāo)志fdo->Flags|=DO_BUFFERED_IO;
fdo->Flags&=~DO_DEVICE_INITIALIZING;
returnSTATUS_SUCCESS;
AddDevice例程4.設(shè)置設(shè)備標(biāo)志fdo->Flags其他必須的例程DispatchPnp例程DispatchPower例程DispatchWmi例程其他必須的例程DispatchPnp例程DispatchPnp例程N(yùn)TSTATUSDispatchPnp(PDEVICE_OBJECTfdo,PIRPIrp)
{
PIO_STACK_LOCATIONstack=IoGetCurrentIrpStackLocation(Irp);
ULONGfcn=stack->MinorFunction;
NTSTATUSstatus=StaTUS_SUCCESS;
Switch(fcn)
{
caseIRP_MN_START_DEVICE:
status=PnpStartDeviceHandler(fdo,irp);
break;
caseIRP_MN_REMOVE_DEVICE:
status=PnpRemoveDeviceHandler(fdo,irp);
break;
...
default:
PnpDefaultHandler(fdo,irp);
};
returnstatus;
}
DispatchPnp例程N(yùn)TSTATUSDispatchDispatchPower例程DispatchPower例程DispatchWmi例程驅(qū)動(dòng)程序?qū)MI的支持主要是基于對(duì)主代碼為IRP_MJ_SYSTEM_CONTROL的IRP的支持。為了能接收到這種IRP,必須先注冊(cè)這種需求:IoWMIRegistrationControl(fdo,WMI_ACTION_REGISTER);調(diào)用IoWMIRegistrationControl函數(shù)的恰當(dāng)位置是在AddDevice例程中,注冊(cè)完成后,一旦系統(tǒng)認(rèn)為可以安全地向驅(qū)動(dòng)程序發(fā)送系統(tǒng)控制IRP時(shí),它就向驅(qū)動(dòng)程序發(fā)出一個(gè)IRP_MJ_SYSTEM_CONTROL請(qǐng)求,以獲得設(shè)備的詳細(xì)寄存信息對(duì)于WDM驅(qū)動(dòng)程序而言,系統(tǒng)控制IRP的分發(fā)例程DispatchWmi是必須提供的,一般的做法是委托WMILIB來(lái)處理系統(tǒng)控制IRP,WMILIB實(shí)際上是一個(gè)內(nèi)核模式DLL,它導(dǎo)出的服務(wù)可以被其他驅(qū)動(dòng)程序調(diào)用DispatchWmi例程驅(qū)動(dòng)程序?qū)MI的支持主要是基于對(duì)其他可選的例程Windows應(yīng)用程序與設(shè)備驅(qū)動(dòng)程序打交道主要是通過(guò)CreateFile、ReadFile、WriteFile和DeviceIoControl等Win32API來(lái)進(jìn)行的,這些API對(duì)應(yīng)著驅(qū)動(dòng)程序的一些分發(fā)例程其他可選的例程Windows應(yīng)用程序與設(shè)備驅(qū)動(dòng)程序打交道主要DispatchWrite例程DispatchWrite例程WDM驅(qū)動(dòng)程序編程實(shí)例驅(qū)動(dòng)程序中除了DriverEntry例程必須以DriverEntry命名以外,其他例程都可以使用程序員自定義的名字,并且都要由DriverEntry例程向系統(tǒng)注冊(cè)WDM驅(qū)動(dòng)程序編程實(shí)例驅(qū)動(dòng)程序中除了DriverEntry例開(kāi)發(fā)WDM驅(qū)動(dòng)程序的一般方法對(duì)照相關(guān)設(shè)備的資料仔細(xì)分析驅(qū)動(dòng)程序應(yīng)實(shí)現(xiàn)哪些功能根據(jù)WDM設(shè)備驅(qū)動(dòng)程序的組成,采用漸進(jìn)的方法對(duì)驅(qū)動(dòng)程序進(jìn)行模塊化設(shè)計(jì)開(kāi)發(fā)WDM驅(qū)動(dòng)程序的一般方法對(duì)照相關(guān)設(shè)備的資料仔細(xì)分析驅(qū)動(dòng)程開(kāi)發(fā)WDM驅(qū)動(dòng)程序的一般方法一個(gè)WDM設(shè)備驅(qū)動(dòng)程序通常完成以下工作:初始化創(chuàng)建、刪除設(shè)備即插即用處理訪問(wèn)硬件處理電源管理使用WMI處理Win32I/O及控制請(qǐng)求將這些功能劃分為不同模塊開(kāi)發(fā)WDM驅(qū)動(dòng)程序的一般方法一個(gè)WDM設(shè)備驅(qū)動(dòng)程序通常完成以設(shè)備驅(qū)動(dòng)程序的創(chuàng)建與調(diào)試過(guò)程設(shè)備驅(qū)動(dòng)程序的創(chuàng)建與調(diào)試過(guò)程構(gòu)造WDM驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境1)安裝MicrosoftVisualStudio.NET2)安裝MicrosoftWindowsDDK3)安裝DebuggingToolsforWindows構(gòu)造WDM驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境1)安裝MicrosoftVis構(gòu)造WDM驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境安裝成功VisualStudio.NET后,運(yùn)行界面如下圖所示構(gòu)造WDM驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境安裝成功VisualStudio構(gòu)造WDM驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境安裝成功WindowsDDK后,菜單欄如下圖所示構(gòu)造WDM驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境安裝成功WindowsDDK后,構(gòu)造WDM驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境安裝成功DebuggingTools后,菜單欄如下圖所示構(gòu)造WDM驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境安裝成功DebuggingToo編輯、編譯和鏈接1)編寫(xiě)驅(qū)動(dòng)程序源文件,包括:WdmDriver.hguid.hinit.cppPnp.cppWmi.cppDispatch.cppWdm.mof編輯、編譯和鏈接1)編寫(xiě)驅(qū)動(dòng)程序源文件,包括:編輯、編譯和鏈接2)編譯鏈接驅(qū)動(dòng)程序,生成驅(qū)動(dòng)程序可執(zhí)行文件成功編譯一個(gè)驅(qū)動(dòng)程序需要在要被編譯的源文件目錄下面提供三個(gè)文本文件(三個(gè)文件都沒(méi)有擴(kuò)展名):MAKEFILESOURCESDIRS驅(qū)動(dòng)程序生成工具BUILD從這三個(gè)文件讀取輸入,并且創(chuàng)建BUILD.LOG、BUILD.ERR等文件作為輸出,如果一切正常,執(zhí)行BUILD的最后結(jié)果是創(chuàng)建驅(qū)動(dòng)程序的可執(zhí)行版本,其文件類(lèi)型是.SYS編輯、編譯和鏈接2)編譯鏈接驅(qū)動(dòng)程序,生成驅(qū)動(dòng)程序可執(zhí)行文件編輯、編譯和鏈接2)編譯鏈接驅(qū)動(dòng)程序,生成驅(qū)動(dòng)程序可執(zhí)行文件驅(qū)動(dòng)程序的編譯單擊開(kāi)始
所有程序
DevelopmentKits
WindowsDDK
BuildEnviroments
WinXPCheckedBuildEnviroment,將出現(xiàn)一個(gè)控制臺(tái)窗口使用cd命令進(jìn)入待編譯驅(qū)動(dòng)程序所在的目錄,鍵入build命令即可編譯運(yùn)行build命令只編譯需要重新編譯的文件,而build-c命令則強(qiáng)迫編譯器重新編譯所有的文件編輯、編譯和鏈接2)編譯鏈接驅(qū)動(dòng)程序,生成驅(qū)動(dòng)程序可執(zhí)行文件編輯、編譯和鏈接編輯、編譯和鏈接安裝驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)程序的自動(dòng)安裝由一個(gè)以inf為擴(kuò)展名的文本文件控制。正確的保存在Windows系統(tǒng)上的一個(gè)inf文件,允許自動(dòng)安裝驅(qū)動(dòng)程序文件,或者在對(duì)話框支持下安裝驅(qū)動(dòng)程序文件安裝驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)程序的自動(dòng)安裝由一個(gè)以inf為擴(kuò)展名的文安裝驅(qū)動(dòng)程序驅(qū)動(dòng)程序的安裝過(guò)程:首先進(jìn)入控制面板,選擇“添加新硬件”,“下一步”后系統(tǒng)會(huì)掃描硬件,選擇“是,硬件已經(jīng)連接好”,然后在對(duì)話框的底部選擇“添加新的硬件設(shè)備”,接著選擇“安裝我手動(dòng)從列表選擇的硬件”,確定后再選“從磁盤(pán)安裝”,“瀏覽”找到WdmDriver.inf文件所在的文件夾,單擊“確定”。從接下來(lái)的對(duì)話框中指定WdmDriver.sys所在的位置,系統(tǒng)將把驅(qū)動(dòng)程序WdmDriver.sys復(fù)制到Windows系統(tǒng)的system32\drivers文件夾中安裝驅(qū)動(dòng)程序驅(qū)動(dòng)程序的安裝過(guò)程:安裝驅(qū)動(dòng)程序安裝之后,WdmDriver應(yīng)該出現(xiàn)在設(shè)備管理器的“其它設(shè)備”類(lèi)別中,選中該設(shè)備,單擊“屬性”,可以查看驅(qū)動(dòng)程序的信息:安裝驅(qū)動(dòng)程序安裝之后,WdmDriver應(yīng)該出現(xiàn)在設(shè)備管理
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公共水庫(kù)出租合同范本
- 產(chǎn)品更新合同范本
- 買(mǎi)金龍魚(yú)養(yǎng)殖合同范本
- 代辦車(chē)牌合同范本
- 商場(chǎng)導(dǎo)購(gòu)聘用合同范例
- 商業(yè)土地合同范本
- 交房質(zhì)保合同范例
- 保安與中介合同范本
- 合伙企業(yè)協(xié)議合同范本
- 農(nóng)村產(chǎn)權(quán)協(xié)議合同范本
- 部編版語(yǔ)文四年級(jí)上冊(cè)《 中國(guó)古代神話選編》整本書(shū)共讀 課件 (共10張PPT)
- 《計(jì)算機(jī)與網(wǎng)絡(luò)技術(shù)基礎(chǔ)》
- 下穿高速鐵路監(jiān)測(cè)方案
- 手機(jī)號(hào)碼段歸屬地?cái)?shù)據(jù)庫(kù)(2016年3月)
- 《登快閣》課件完整版
- 農(nóng)村公共管理組織
- 建筑結(jié)構(gòu)加固培訓(xùn)講義
- 平面設(shè)計(jì)需求表、流程表
- GB/T 5195.8-2006螢石二氧化硅含量的測(cè)定
- 化妝品培訓(xùn)材料課件
- 論文泰安抽水蓄能電站水利樞紐上水庫(kù)庫(kù)盆及導(dǎo)流建筑物設(shè)計(jì)畢業(yè)設(shè)計(jì)說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論