




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第11章章 Windows環(huán)境下輸入輸出環(huán)境下輸入輸出程序設(shè)計程序設(shè)計 11.1 Windows設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序 11.2 WDM驅(qū)動程序驅(qū)動程序11.3 PCI總線與總線與PCI-Express總線總線 11.4 Windows2000/XP環(huán)境下輸入環(huán)境下輸入 輸出的實現(xiàn)輸出的實現(xiàn) Windows是一個多任務(wù)操作系統(tǒng),在保護模式下工作。是一個多任務(wù)操作系統(tǒng),在保護模式下工作。 Windows操作系統(tǒng)不支持用戶程序?qū)τ嬎銠C底層硬件進行操作系統(tǒng)不支持用戶程序?qū)τ嬎銠C底層硬件進行直接控制。用戶程序需要輸入直接控制。用戶程序需要輸入/輸出時,可以通過通過輸出時,可以通過通過API(App
2、lication Program Interface,應(yīng)用程序接口)來調(diào)用,應(yīng)用程序接口)來調(diào)用設(shè)備驅(qū)動程序,對設(shè)備實現(xiàn)間接控制,進行輸入設(shè)備驅(qū)動程序,對設(shè)備實現(xiàn)間接控制,進行輸入/輸出。輸出。 Windows 9x使用使用VxDs(Virtual Device Drivers,虛擬設(shè),虛擬設(shè)備驅(qū)動)設(shè)備驅(qū)動程序。備驅(qū)動)設(shè)備驅(qū)動程序。 Windows 2000/XP使用使用WDM(Windows Driver Model,Windows驅(qū)動程序模型)設(shè)備驅(qū)動程序。驅(qū)動程序模型)設(shè)備驅(qū)動程序。 11.1 Windows設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序 11.1.1 虛擬設(shè)備虛擬設(shè)備 在多任務(wù)運行環(huán)境下
3、,計算機內(nèi)的硬件、軟件資源為多在多任務(wù)運行環(huán)境下,計算機內(nèi)的硬件、軟件資源為多個任務(wù)共享。任何一個用戶程序都不能獨占系統(tǒng)的硬件、個任務(wù)共享。任何一個用戶程序都不能獨占系統(tǒng)的硬件、軟件資源。軟件資源。 虛擬設(shè)備實質(zhì)上是真實物理設(shè)備的部分資源和相關(guān)軟件虛擬設(shè)備實質(zhì)上是真實物理設(shè)備的部分資源和相關(guān)軟件的組合,用來完成用戶程序需要的功能。的組合,用來完成用戶程序需要的功能。 虛擬設(shè)備不但可以代表實際存在的硬件設(shè)備,還可以模虛擬設(shè)備不但可以代表實際存在的硬件設(shè)備,還可以模擬實際上不存在的擬實際上不存在的“設(shè)備設(shè)備”,供用戶使用。,供用戶使用。 計算機上的計算機上的“虛擬光驅(qū)虛擬光驅(qū)”就是一個典型的虛擬設(shè)
4、備。與就是一個典型的虛擬設(shè)備。與這個設(shè)備同名的物理設(shè)備是不存在的,用戶使用的是硬盤這個設(shè)備同名的物理設(shè)備是不存在的,用戶使用的是硬盤的部分存儲空間以及相應(yīng)的服務(wù)程序。的部分存儲空間以及相應(yīng)的服務(wù)程序。使用虛擬設(shè)備好處:使用虛擬設(shè)備好處: 實現(xiàn)多任務(wù)對系統(tǒng)資源的共享,方便用戶的使用;實現(xiàn)多任務(wù)對系統(tǒng)資源的共享,方便用戶的使用; 實現(xiàn)任務(wù)與任務(wù)、任務(wù)與系統(tǒng)之間的隔離和保護;實現(xiàn)任務(wù)與任務(wù)、任務(wù)與系統(tǒng)之間的隔離和保護; 規(guī)范外部設(shè)備輸入、輸出方法,使不同工作方式的設(shè)備規(guī)范外部設(shè)備輸入、輸出方法,使不同工作方式的設(shè)備用相同的方式進行輸入輸出。用相同的方式進行輸入輸出。 對對Windows應(yīng)用程序來講,
5、虛擬設(shè)備就是真實設(shè)備,應(yīng)應(yīng)用程序來講,虛擬設(shè)備就是真實設(shè)備,應(yīng)用程序分不清那個設(shè)備是由真實硬件支持的真實設(shè)備,用程序分不清那個設(shè)備是由真實硬件支持的真實設(shè)備,那個設(shè)備是由虛擬設(shè)備驅(qū)動程序模擬的虛擬設(shè)備。那個設(shè)備是由虛擬設(shè)備驅(qū)動程序模擬的虛擬設(shè)備。11.1.2 Windows9X設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序 Windows 9x是一個分層結(jié)構(gòu)的操作系統(tǒng),由工作在是一個分層結(jié)構(gòu)的操作系統(tǒng),由工作在兩個不同層面的組件構(gòu)成:兩個不同層面的組件構(gòu)成: 頂層組件,工作在頂層組件,工作在Ring3層;層; 底層組件,工作在底層組件,工作在Ring0層。層。1. 頂層:頂層:2. Windows 9x操作系統(tǒng)的頂
6、層組件工作在特權(quán)級操作系統(tǒng)的頂層組件工作在特權(quán)級3,稱為,稱為ring3層。它給應(yīng)用程序的運行提供層。它給應(yīng)用程序的運行提供Win32 API服務(wù)。服務(wù)。3. Windows 9x應(yīng)用程序和應(yīng)用程序和Win32 API服務(wù)一起構(gòu)成操作系統(tǒng)服務(wù)一起構(gòu)成操作系統(tǒng)的頂層,稱為系統(tǒng)虛擬機(的頂層,稱為系統(tǒng)虛擬機(VM,Virtual Machine)。)。4. 對于一個任務(wù)來說,這些服務(wù)程序以及他們所掌控的硬件對于一個任務(wù)來說,這些服務(wù)程序以及他們所掌控的硬件資源就是一臺資源就是一臺“實實在在實實在在”的計算機。但是,對于整個系的計算機。但是,對于整個系統(tǒng)來說,他們只是由操作系統(tǒng)向用戶提供的一個運行用
7、戶統(tǒng)來說,他們只是由操作系統(tǒng)向用戶提供的一個運行用戶程序的平臺,包括為這個應(yīng)用程序服務(wù)的操作系統(tǒng)組件和程序的平臺,包括為這個應(yīng)用程序服務(wù)的操作系統(tǒng)組件和部分的硬件資源。部分的硬件資源。5. 每一個每一個DOS應(yīng)用程序都在一個獨立的虛擬機中運行,操作應(yīng)用程序都在一個獨立的虛擬機中運行,操作系統(tǒng)允許多個虛擬機同時處于運行狀態(tài)。系統(tǒng)允許多個虛擬機同時處于運行狀態(tài)。底層:底層: Windows 9x操作系統(tǒng)的底層組件工作在操作系統(tǒng)的底層組件工作在0特權(quán)級,稱為特權(quán)級,稱為ring0層,它就是虛擬機管理器(層,它就是虛擬機管理器(VMM,Virtual Machine Manager)。)。 Windo
8、ws 9x虛擬機管理器由一個內(nèi)核服務(wù)集和許多虛擬設(shè)虛擬機管理器由一個內(nèi)核服務(wù)集和許多虛擬設(shè)備驅(qū)動程序(備驅(qū)動程序(VxDs,Virtual Device Drivers)組成。)組成。 許多許多VxDs是由是由Microsoft公司隨操作系統(tǒng)提供的,如鍵盤和公司隨操作系統(tǒng)提供的,如鍵盤和顯示器等的顯示器等的VxDs,有的,有的VxD則由設(shè)備制造商提供,或者由則由設(shè)備制造商提供,或者由用戶自行編寫。用戶自行編寫。 VxD用來支持特定的硬件或軟件,完成需用來支持特定的硬件或軟件,完成需要的功能。要的功能。 VxDs中的程序運行在中的程序運行在ring0層,可以執(zhí)行所有的指令,完成層,可以執(zhí)行所有的
9、指令,完成所需的任何軟硬件的操作。所需的任何軟硬件的操作。對于應(yīng)用程序而言,虛擬機管理器是透明的,應(yīng)用程對于應(yīng)用程序而言,虛擬機管理器是透明的,應(yīng)用程序感覺不到管理器的存在。序感覺不到管理器的存在。微軟已經(jīng)宣布,從微軟已經(jīng)宣布,從2006年年6月起不再提供對月起不再提供對Windows 9x的技術(shù)支持。因此,的技術(shù)支持。因此,Windows 9x和和VxDs的使用將逐漸減少。的使用將逐漸減少。隨著隨著Windows 2000/XP的廣泛使用,的廣泛使用,WDM驅(qū)動程序的開發(fā)驅(qū)動程序的開發(fā)和使用已成為主流。和使用已成為主流。11.1.3 Windows2000/XP設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序1.
10、Windows 2000操作系統(tǒng)組件的層次結(jié)構(gòu)操作系統(tǒng)組件的層次結(jié)構(gòu) Windows 2000操作系統(tǒng)的功能模塊劃分為用戶模式和操作系統(tǒng)的功能模塊劃分為用戶模式和內(nèi)核模式兩大類。內(nèi)核模式兩大類。用戶模式的操作系統(tǒng)功能模塊用戶模式的操作系統(tǒng)功能模塊工作在工作在ring3層,他們不能使層,他們不能使用用CPU中的特權(quán)指令,連同中的特權(quán)指令,連同IN、OUT這樣的非特權(quán)指令也這樣的非特權(quán)指令也被禁止。所有的用戶程序都在這一層上運行。被禁止。所有的用戶程序都在這一層上運行。內(nèi)核模式的操作系統(tǒng)模塊內(nèi)核模式的操作系統(tǒng)模塊工作在工作在ring0層,可以使用層,可以使用CPU的的任何指令。任何指令。Windo
11、ws 2000操作系統(tǒng)的層次結(jié)構(gòu)操作系統(tǒng)的層次結(jié)構(gòu)2. Windows 2000的設(shè)備驅(qū)動程序的設(shè)備驅(qū)動程序 Windows 2000的驅(qū)動程序也有兩種不同的類型。的驅(qū)動程序也有兩種不同的類型。 用戶模式驅(qū)動程序工作用戶模式驅(qū)動程序工作在用戶模式,通過調(diào)用內(nèi)核模在用戶模式,通過調(diào)用內(nèi)核模式驅(qū)動程序?qū)崿F(xiàn)指定的功能。用戶模式驅(qū)動程序不能直式驅(qū)動程序?qū)崿F(xiàn)指定的功能。用戶模式驅(qū)動程序不能直接對硬件設(shè)備進行訪問,僅僅用于構(gòu)建一個硬件或軟件接對硬件設(shè)備進行訪問,僅僅用于構(gòu)建一個硬件或軟件的運行環(huán)境。的運行環(huán)境。 Windows內(nèi)核驅(qū)動程序內(nèi)核驅(qū)動程序工作在內(nèi)核模式,可以直接訪工作在內(nèi)核模式,可以直接訪問硬
12、件設(shè)備。每個設(shè)備驅(qū)動程序都有一組完成各種功能問硬件設(shè)備。每個設(shè)備驅(qū)動程序都有一組完成各種功能的函數(shù),通過調(diào)用這些函數(shù)可以對某一設(shè)備完成特定的的函數(shù),通過調(diào)用這些函數(shù)可以對某一設(shè)備完成特定的操作。操作。內(nèi)核模式驅(qū)動程序的類型內(nèi)核模式驅(qū)動程序的類型 文件系統(tǒng)驅(qū)動程序文件系統(tǒng)驅(qū)動程序可以在本地硬盤、網(wǎng)絡(luò)、移動存儲設(shè)可以在本地硬盤、網(wǎng)絡(luò)、移動存儲設(shè)備或各種有存儲能力的硬件設(shè)備實現(xiàn)標準的文件系統(tǒng),備或各種有存儲能力的硬件設(shè)備實現(xiàn)標準的文件系統(tǒng),如如FAT32、NTFS系統(tǒng)等。系統(tǒng)等。 PnP驅(qū)動程序驅(qū)動程序是一種遵循是一種遵循Windows2000即插即用協(xié)議的即插即用協(xié)議的內(nèi)核模式驅(qū)動程序。內(nèi)核模式驅(qū)
13、動程序。 WDM驅(qū)動程序驅(qū)動程序是一種是一種PnP驅(qū)動程序。它同時還遵守電驅(qū)動程序。它同時還遵守電源管理協(xié)議。源管理協(xié)議。 顯示驅(qū)動程序顯示驅(qū)動程序是一種特殊的內(nèi)核驅(qū)動程序。此類的驅(qū)動是一種特殊的內(nèi)核驅(qū)動程序。此類的驅(qū)動程序還有打印驅(qū)動程序、多媒體驅(qū)動程序、網(wǎng)絡(luò)驅(qū)動程程序還有打印驅(qū)動程序、多媒體驅(qū)動程序、網(wǎng)絡(luò)驅(qū)動程序等。序等。 遺留設(shè)備驅(qū)動程序遺留設(shè)備驅(qū)動程序主要用在主要用在Windows NT系統(tǒng)中,它也系統(tǒng)中,它也可以運行在可以運行在Windows 2000系統(tǒng)中。系統(tǒng)中。Windows 2000內(nèi)核模式驅(qū)動程序的類型內(nèi)核模式驅(qū)動程序的類型11.2 WDM驅(qū)動程序驅(qū)動程序 WDM是是Mic
14、rosoft力推的新型驅(qū)動程序模型,首力推的新型驅(qū)動程序模型,首先出現(xiàn)在先出現(xiàn)在Windows NT中,現(xiàn)在的中,現(xiàn)在的Windows 98/Me/2000/XP都支持都支持WDM。 微軟宣稱,在后續(xù)的操作系統(tǒng)中將繼續(xù)支持微軟宣稱,在后續(xù)的操作系統(tǒng)中將繼續(xù)支持WDM。 WDM是一個分層的驅(qū)動程序。是一個分層的驅(qū)動程序。 它至少有功能驅(qū)動程它至少有功能驅(qū)動程序(序(Function driver)和總線驅(qū)動程序()和總線驅(qū)動程序(Bus driver)兩個)兩個層面。層面。 功能驅(qū)動程序功能驅(qū)動程序提供一個設(shè)備的使用功能,或者可以認為它提供一個設(shè)備的使用功能,或者可以認為它就是一個設(shè)備的驅(qū)動程序
15、。用戶程序需要使用該設(shè)備時,就是一個設(shè)備的驅(qū)動程序。用戶程序需要使用該設(shè)備時,需要調(diào)用功能驅(qū)動程序中的功能函數(shù)。需要調(diào)用功能驅(qū)動程序中的功能函數(shù)。 總線驅(qū)動程序總線驅(qū)動程序負責(zé)系統(tǒng)啟動時設(shè)備的安裝、檢測,并確定負責(zé)系統(tǒng)啟動時設(shè)備的安裝、檢測,并確定設(shè)備的資源使用情況。設(shè)備的啟動、停止,設(shè)備的初始化,設(shè)備的資源使用情況。設(shè)備的啟動、停止,設(shè)備的初始化,設(shè)備的電源管理等功能也都由總線驅(qū)動程序提供。設(shè)備的電源管理等功能也都由總線驅(qū)動程序提供。11.2.1 WDM驅(qū)動程序模型和層次結(jié)構(gòu)驅(qū)動程序模型和層次結(jié)構(gòu)WDM引入了引入了功能設(shè)備對象功能設(shè)備對象FDO(FunctionalDeviceObject)
16、物理設(shè)備對象物理設(shè)備對象PDO(PhysicalDeviceObject)兩個新概念來描述硬件。兩個新概念來描述硬件。 一個一個PDO對應(yīng)一個真實硬件。一個硬件只允許有一個對應(yīng)一個真實硬件。一個硬件只允許有一個PDO,卻可以擁有多個卻可以擁有多個FDO,在驅(qū)動程序中直接操作的不是硬件,在驅(qū)動程序中直接操作的不是硬件而是相應(yīng)的而是相應(yīng)的PDO與與FDO。 根據(jù)具體的需要還可以選擇過濾驅(qū)動程序(根據(jù)具體的需要還可以選擇過濾驅(qū)動程序(filter driver)。)。Windows20000的輸入輸出是包驅(qū)動的的輸入輸出是包驅(qū)動的 應(yīng)用程序調(diào)用應(yīng)用程序調(diào)用WDM驅(qū)動程序時,系統(tǒng)為每一個用戶的請驅(qū)動程
17、序時,系統(tǒng)為每一個用戶的請求打包,形成一個求打包,形成一個I/O請求包(請求包(I/O Request Package,IRP),然后將其發(fā)送至驅(qū)動程序。),然后將其發(fā)送至驅(qū)動程序。IRP中的中的PDO字段用來字段用來區(qū)別是發(fā)送給哪一個設(shè)備的。區(qū)別是發(fā)送給哪一個設(shè)備的。 某個層次的驅(qū)動程序得到某個層次的驅(qū)動程序得到IRP后,分析其中的請求,完成后,分析其中的請求,完成本層應(yīng)該完成的任務(wù)。本層應(yīng)該完成的任務(wù)。 如果如果IRP要求的任務(wù)已經(jīng)完成,該層次的驅(qū)動程序就向上要求的任務(wù)已經(jīng)完成,該層次的驅(qū)動程序就向上一層傳送結(jié)果并逐層返回。一層傳送結(jié)果并逐層返回。 如果如果IRP中的請求尚未完成,那么就繼
18、續(xù)向下層驅(qū)動程序中的請求尚未完成,那么就繼續(xù)向下層驅(qū)動程序傳遞這個傳遞這個IRP。 內(nèi)核組件就是這樣通過發(fā)送內(nèi)核組件就是這樣通過發(fā)送IRP來運行驅(qū)動程序中的代碼來運行驅(qū)動程序中的代碼WDM驅(qū)動程序?qū)哟闻c驅(qū)動程序?qū)哟闻cI/O請求過程請求過程 用戶模式IO請求WIN32子系統(tǒng)IO管理:建立IRP包選擇驅(qū)動程序驅(qū)動程序:驗證IRP參數(shù)啟動IOIRPPDO(物理設(shè)備對象)FiDO(下層過濾驅(qū)動對象)FDO(功能設(shè)備對象)FiDO(上層過濾驅(qū)動對象)完成(a) 驅(qū)動程序?qū)哟谓Y(jié)構(gòu)(b)IO請求和返回IRP傳遞11.2.2 WDM驅(qū)動程序開發(fā)工具驅(qū)動程序開發(fā)工具 目前有兩個主要的工具來開發(fā)設(shè)備驅(qū)動程序,一個
19、目前有兩個主要的工具來開發(fā)設(shè)備驅(qū)動程序,一個是是Microsoft公司提供的公司提供的Windows DDK。它有。它有Windows 98 DDK、Windows 2000 DDK、Windows XP DDK和和Windows2003DDK四個版本,分別用來支持相應(yīng)的四四個版本,分別用來支持相應(yīng)的四個操作系統(tǒng)中個操作系統(tǒng)中VxD和和WDM驅(qū)動程序的開發(fā)。驅(qū)動程序的開發(fā)。 用用Windows DDK開發(fā)驅(qū)動程序難度較大。開發(fā)驅(qū)動程序難度較大。 另一個驅(qū)動程序開發(fā)工具是另一個驅(qū)動程序開發(fā)工具是NuMega公司提供的公司提供的DriverStudio,其中包含,其中包含VtoolsD、Drive
20、rsWorks、DriversNetWorks和和SoftICE。 VtoolsD用來開發(fā)用來開發(fā)Windows 98的的VxD驅(qū)動程序。驅(qū)動程序。 DriversWorks和和DriversNetWorks分別用來開發(fā)一般設(shè)備和分別用來開發(fā)一般設(shè)備和網(wǎng)絡(luò)設(shè)備的網(wǎng)絡(luò)設(shè)備的WDM驅(qū)動程序。驅(qū)動程序。 SoftICE是一個功能強大的調(diào)試工具。是一個功能強大的調(diào)試工具。 DriverStudio的開發(fā)是建立在的開發(fā)是建立在Windows DDK的基礎(chǔ)上的,的基礎(chǔ)上的,安裝安裝DriverStudio時,先要安裝時,先要安裝Windows DDK。 DriverStudio將將Windows DDK的
21、內(nèi)容封裝在一些基本的類的內(nèi)容封裝在一些基本的類中,使用中,使用VC+編程。使用編程。使用DriverStudio來開發(fā)來開發(fā)Windows的的驅(qū)動程序,相對驅(qū)動程序,相對Windows DDK來講要容易得多。來講要容易得多。 DriverStudio使用開發(fā)向?qū)В瑤椭憬⒕帉戲?qū)動程序所需使用開發(fā)向?qū)?,幫助你建立編寫?qū)動程序所需要的工程文件和程序框架文件,這些文件已經(jīng)組成了一個要的工程文件和程序框架文件,這些文件已經(jīng)組成了一個完整的設(shè)備驅(qū)動程序。接下來的工作就是將這些文件導(dǎo)入完整的設(shè)備驅(qū)動程序。接下來的工作就是將這些文件導(dǎo)入到到VC+的開發(fā)環(huán)境中,添加具體的操作代碼,進行進一步的開發(fā)環(huán)境中,添
22、加具體的操作代碼,進行進一步的開發(fā)。的開發(fā)。11.2.3 DriverStudio中的中的WDM驅(qū)動程序結(jié)構(gòu)驅(qū)動程序結(jié)構(gòu) 從基本從基本W(wǎng)DM啟動程序的兩個頭文件中可以大致看清啟動程序的兩個頭文件中可以大致看清WDM驅(qū)動程序的基本框架結(jié)構(gòu)。驅(qū)動程序的基本框架結(jié)構(gòu)。 KDriver是是WDM驅(qū)動程序的基類,任何驅(qū)動程序都要從繼驅(qū)動程序的基類,任何驅(qū)動程序都要從繼承該類開始。承該類開始。 SimpleWdmDriver驅(qū)動程序驅(qū)動程序從派生從派生KDriver類開始。類開始。SimpleWdmDevice是是KPnpDevice類的派生類。重載其某類的派生類。重載其某些成員函數(shù)便可處理相應(yīng)事件的發(fā)生
23、。些成員函數(shù)便可處理相應(yīng)事件的發(fā)生。 最重要的方法是最重要的方法是virtual NTSTATUS DeviceControl(KIrp I),應(yīng)用程序中原本需要對硬件設(shè)備的應(yīng)用程序中原本需要對硬件設(shè)備的I/O訪問指令被移到了訪問指令被移到了DeviceControl中。應(yīng)用程序需要訪問硬件設(shè)備時,可以使中。應(yīng)用程序需要訪問硬件設(shè)備時,可以使用用DeviceIoControl函數(shù),最后函數(shù),最后DeviceIoControl會調(diào)用會調(diào)用DeviceControl,從而完成對設(shè)備的,從而完成對設(shè)備的I/O訪問??梢哉f訪問??梢哉fDeviceControl就是功能驅(qū)動程序。就是功能驅(qū)動程序。/ H
24、elloWdm.h - include file for basic WDM driverclass SimpleWdmDriver : public KDriverpublic:/ DriverEntry負責(zé)驅(qū)動程序的初始化,必須重載負責(zé)驅(qū)動程序的初始化,必須重載virtual NTSTATUS DriverEntry(PUNICODE_STRING RegistryPath); / AddDevice初始化驅(qū)動程序所控制的設(shè)備,必須重載初始化驅(qū)動程序所控制的設(shè)備,必須重載 virtual NTSTATUS AddDevice(PDEVICE_OBJECT Pdo);/ Unload刪除由刪
25、除由DriverEntry所分配的資源所分配的資源virtual VOID Unload(void);/ hellodev.h - include file for device class of basic driverclass SimpleWdmDevice : public KPnpDevicepublic:SimpleWdmDevice(PDEVICE_OBJECT Pdo, ULONG Unit);/ Plug and Play handlersNTSTATUS OnStartDevice(KIrp I);/ 設(shè)備啟設(shè)備啟動時調(diào)用。動時調(diào)用。NTSTATUS OnStopDevic
26、e(KIrp I);/ 設(shè)備停設(shè)備停止時調(diào)用。止時調(diào)用。NTSTATUS OnRemoveDevice(KIrp I); / 設(shè)備刪除時調(diào)用。設(shè)備刪除時調(diào)用。/UserControl handlers/ 設(shè)備打開時調(diào)用,應(yīng)用程序使用設(shè)備打開時調(diào)用,應(yīng)用程序使用Create函數(shù)時調(diào)用。函數(shù)時調(diào)用。 virtual NTSTATUS Create(KIrp I); / 設(shè)備關(guān)閉時調(diào)用,即應(yīng)用程序使用設(shè)備關(guān)閉時調(diào)用,即應(yīng)用程序使用Create函數(shù)時調(diào)用。函數(shù)時調(diào)用。 virtual NTSTATUS Close(KIrp I); / 設(shè)備功能調(diào)用,應(yīng)用程序使用設(shè)備功能調(diào)用,應(yīng)用程序使用DeviceI
27、oControl函數(shù)時被調(diào)用函數(shù)時被調(diào)用virtual NTSTATUS DeviceControl(KIrp I); / Power Management handlersNTSTATUS OnDevicePowerUp(KIrp I);/NTSTATUS OnDeviceSleep(KIrp I); / 設(shè)設(shè)備睡眠時調(diào)用備睡眠時調(diào)用NTSTATUS OnSetPower(KIrp I); /NTSTATUS DefaultPnp(KIrp I); /NTSTATUS DefaultPower(KIrp I); ;11.3 Windows2000/XP下輸入下輸入 輸出的實現(xiàn)輸出的實現(xiàn) Wi
28、ndows是一個基于是一個基于“消息傳遞消息傳遞”機制的多任務(wù)操作系機制的多任務(wù)操作系統(tǒng)。用戶程序需要訪問硬件設(shè)備時,通過調(diào)用統(tǒng)。用戶程序需要訪問硬件設(shè)備時,通過調(diào)用API函數(shù)調(diào)用該函數(shù)調(diào)用該設(shè)備的驅(qū)動程序。設(shè)備的驅(qū)動程序。 WIN32將用戶的請求組合成為一個將用戶的請求組合成為一個IRP包,向內(nèi)核發(fā)送包,向內(nèi)核發(fā)送“消息消息”。內(nèi)核組件根據(jù)內(nèi)核組件根據(jù)IRP中的中的PDO字段,將該字段,將該“消息消息”傳送給對傳送給對應(yīng)的應(yīng)的WDM驅(qū)動程序。驅(qū)動程序。驅(qū)動程序完成硬件設(shè)備的訪問后,向用戶程序返回結(jié)果。驅(qū)動程序完成硬件設(shè)備的訪問后,向用戶程序返回結(jié)果。調(diào)用驅(qū)動程序的過程,就是用戶程序和驅(qū)動程序
29、之間傳遞調(diào)用驅(qū)動程序的過程,就是用戶程序和驅(qū)動程序之間傳遞消息,交換數(shù)據(jù),進行通信的過程。消息,交換數(shù)據(jù),進行通信的過程。用戶程序完成對設(shè)備的訪問有兩種方式用戶程序完成對設(shè)備的訪問有兩種方式 等待方式等待方式下,用戶程序調(diào)用驅(qū)動程序,等待驅(qū)動程序完成對下,用戶程序調(diào)用驅(qū)動程序,等待驅(qū)動程序完成對硬件設(shè)備的訪問。這種方式編程簡單。硬件設(shè)備的訪問。這種方式編程簡單。 異步方式異步方式下,應(yīng)用程序調(diào)用驅(qū)動程序,啟動了硬件設(shè)備后,下,應(yīng)用程序調(diào)用驅(qū)動程序,啟動了硬件設(shè)備后,直接返回進行其它處理,并不等待輸入直接返回進行其它處理,并不等待輸入/輸出完成。硬件設(shè)備輸出完成。硬件設(shè)備完成了數(shù)據(jù)輸入輸出后,由
30、驅(qū)動程序通知應(yīng)用程序進行進一完成了數(shù)據(jù)輸入輸出后,由驅(qū)動程序通知應(yīng)用程序進行進一步的處理。這時,需要由驅(qū)動程序發(fā)起和應(yīng)用程序的通信。步的處理。這時,需要由驅(qū)動程序發(fā)起和應(yīng)用程序的通信。這種方式下,要用到反調(diào)函數(shù)、這種方式下,要用到反調(diào)函數(shù)、Win32事件通知等方法。事件通知等方法。 CreateFile() 函數(shù)用來打開設(shè)備,獲取設(shè)備句柄;函數(shù)用來打開設(shè)備,獲取設(shè)備句柄; 設(shè)備輸入輸出控制函數(shù)設(shè)備輸入輸出控制函數(shù)DeviceIoControl(),用來調(diào)用,用來調(diào)用WDM驅(qū)動程序執(zhí)行相應(yīng)的操作(包括設(shè)備的控制和數(shù)據(jù)的輸入,驅(qū)動程序執(zhí)行相應(yīng)的操作(包括設(shè)備的控制和數(shù)據(jù)的輸入,輸出)輸出); Cl
31、oseHandle()函數(shù)用來關(guān)閉設(shè)備。函數(shù)用來關(guān)閉設(shè)備。 也可以使用也可以使用ReadFile()和和WriteFile()函數(shù)進行函數(shù)進行“標準標準”的輸?shù)妮斎肴?輸出。輸出。11.3.1 用于輸入用于輸入/輸出的輸出的WIN32 API函數(shù)函數(shù)1. 打開設(shè)備打開設(shè)備 CreateFile()函數(shù)函數(shù)用來打開設(shè)備,獲取設(shè)備句柄,格式如下:用來打開設(shè)備,獲取設(shè)備句柄,格式如下:HANDLE CreateFile( “.SimpleWDMDevice”,/設(shè)備的符號鏈接名設(shè)備的符號鏈接名 GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_
32、SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, /同步打開設(shè)備同步打開設(shè)備 NULL); 使用上述函數(shù)時,除了設(shè)備名之外,不需要改變其它參使用上述函數(shù)時,除了設(shè)備名之外,不需要改變其它參數(shù)。這里假設(shè)設(shè)備的名字為數(shù)。這里假設(shè)設(shè)備的名字為SimpleWDMDevice。進行打開操。進行打開操作時首先搜索當(dāng)前目錄,然后搜索作時首先搜索當(dāng)前目錄,然后搜索Windows系統(tǒng)目錄。系統(tǒng)目錄。2. DeviceIoControl函數(shù)函數(shù)調(diào)用調(diào)用DeviceIoControl (HANDLEhDevice, /設(shè)備句柄設(shè)備句柄DWORDdwIo
33、ControlCode,/控制代碼控制代碼LPVOIDlpInBuffer, /輸入數(shù)據(jù)塊指針輸入數(shù)據(jù)塊指針DWORDnInBufferSize, /輸入數(shù)據(jù)塊大小輸入數(shù)據(jù)塊大小LPVOIDlpOutBuffer, /輸出數(shù)據(jù)塊指針輸出數(shù)據(jù)塊指針DWORDnOutBufferSize, /輸出數(shù)據(jù)塊大小輸出數(shù)據(jù)塊大小LPDWORD lpBytesReturned, /返回字節(jié)長度指針返回字節(jié)長度指針NULL /同步時為同步時為NULL ) DeviceIoControl函數(shù)調(diào)用參數(shù)函數(shù)調(diào)用參數(shù) hDevice是由是由CreateFile函數(shù)獲取的設(shè)備句柄。函數(shù)獲取的設(shè)備句柄。dwIOContr
34、olCode是應(yīng)用程序向是應(yīng)用程序向WDM驅(qū)動程序發(fā)出的控制驅(qū)動程序發(fā)出的控制代碼。代碼。 lpInBuffer和和nInBufferSize是應(yīng)用程序向是應(yīng)用程序向WDM驅(qū)動程序傳送驅(qū)動程序傳送的的I/O數(shù)據(jù)塊的地址及大小。數(shù)據(jù)塊的地址及大小。 lpOutBuffer、nOutBufferSize和和lpBytesReturned是是WDM驅(qū)驅(qū)動程序返回給應(yīng)用程序的數(shù)據(jù)塊的地址、大小以及實際返回動程序返回給應(yīng)用程序的數(shù)據(jù)塊的地址、大小以及實際返回的字節(jié)數(shù)。的字節(jié)數(shù)。 輸入輸入/輸出緩沖區(qū)的格式由驅(qū)動程序自行規(guī)定。輸出緩沖區(qū)的格式由驅(qū)動程序自行規(guī)定。 3. 關(guān)閉設(shè)備關(guān)閉設(shè)備完成對設(shè)備的輸入、輸
35、出控制后,完成對設(shè)備的輸入、輸出控制后,應(yīng)用程序調(diào)用應(yīng)用程序調(diào)用CloseHandle(hDevice)關(guān)閉設(shè)備。關(guān)閉設(shè)備。4. ReadFile和和WriteFile函數(shù)函數(shù) ReadFile (HANDLEhFile,/設(shè)備句柄設(shè)備句柄LPVOIDlpBuffer,/輸入數(shù)據(jù)塊指針輸入數(shù)據(jù)塊指針DWORD nNumberOfBytesToRead,/輸入數(shù)據(jù)塊大小輸入數(shù)據(jù)塊大小LPDWORD lpNumberOfBytesRead,/返回的字節(jié)數(shù)長度指針返回的字節(jié)數(shù)長度指針NULL ) /同步時為同步時為NULL WriteFile (HANDLEhFile,/設(shè)備句柄設(shè)備句柄LPVOID
36、lpBuffer,/輸出數(shù)據(jù)塊指針輸出數(shù)據(jù)塊指針DWORD nNumberOfBytesToWrite,/輸出數(shù)據(jù)塊大小輸出數(shù)據(jù)塊大小LPDWORD lpNumberOfBytesWritten,/實際輸出的字節(jié)數(shù)長度指針實際輸出的字節(jié)數(shù)長度指針NULL ) /同步時為同步時為NULL 本節(jié)以本節(jié)以Aedk-LabPCI計算機接口實驗儀為例,介紹計算機接口實驗儀為例,介紹WDM驅(qū)動程序的使用。驅(qū)動程序的使用。 該實驗設(shè)備由一塊該實驗設(shè)備由一塊PCI接口卡和一臺接口實驗儀組成,接口卡和一臺接口實驗儀組成,將將PCI接口卡插入接口卡插入PC機的機的PCI總線插槽,用連接線把總線插槽,用連接線把PC
37、I卡卡和實驗機相連接,整個實驗儀就成為和實驗機相連接,整個實驗儀就成為PC機的一臺機的一臺“外部設(shè)外部設(shè)備備”。在監(jiān)控軟件的控制下,進行。在監(jiān)控軟件的控制下,進行PC機與實驗儀的通訊,機與實驗儀的通訊,實現(xiàn)對實驗過程的全程控制。實現(xiàn)對實驗過程的全程控制。 PCI卡采用了卡采用了PLX公司的公司的PCI9052芯片作為接口芯片。芯片作為接口芯片。11.3.2 Windows2000/XP下輸入輸出舉例下輸入輸出舉例 進行硬件連接之后,需要安裝驅(qū)動程序,在進行硬件連接之后,需要安裝驅(qū)動程序,在Win2000中也就是安裝中也就是安裝WDM驅(qū)動程序。驅(qū)動程序。 在實驗設(shè)備所附帶的軟件中,驅(qū)動程序文件有
38、兩個:在實驗設(shè)備所附帶的軟件中,驅(qū)動程序文件有兩個: INF文件,稱為設(shè)備信息文件文件,稱為設(shè)備信息文件 ,供驅(qū)動程序安裝時使用。,供驅(qū)動程序安裝時使用。INF文件指明了硬件驅(qū)動該如何安裝到系統(tǒng)中,源文件在文件指明了硬件驅(qū)動該如何安裝到系統(tǒng)中,源文件在哪里、安裝到哪一個文件夾中、怎樣在注冊表中加入與設(shè)哪里、安裝到哪一個文件夾中、怎樣在注冊表中加入與設(shè)備有關(guān)的信息等;備有關(guān)的信息等; 后綴為后綴為sys的文件,是整個實驗儀的驅(qū)動程序。的文件,是整個實驗儀的驅(qū)動程序。 一般情況下,一般情況下,INF文件會被復(fù)制到文件會被復(fù)制到Windows2000系統(tǒng)目錄系統(tǒng)目錄中的中的INF子目錄中,子目錄中,
39、Sys文件被復(fù)制到文件被復(fù)制到System32/drivers子目子目錄中。錄中。 安裝驅(qū)動程序后,在設(shè)備管理器中可以看到相應(yīng)的設(shè)備安裝驅(qū)動程序后,在設(shè)備管理器中可以看到相應(yīng)的設(shè)備/設(shè)備的頭文件設(shè)備的頭文件/ 8255Demo.h/ 控制碼控制碼#define IOCTL_PCI_CON / 讀配置信息讀配置信息 CTL_CODE(FILE_DEVICE_UNKNOWN, 0 x800, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_IO_READ / IO讀讀 CTL_CODE(FILE_DEVICE_UNKNOWN, 0 x801, METH
40、OD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_IO_WRITE / IO寫寫 CTL_CODE(FILE_DEVICE_UNKNOWN, 0 x802, METHOD_BUFFERED, FILE_ANY_ACCESS)/設(shè)備的頭文件設(shè)備的頭文件/PCI卡配置信息卡配置信息struct pci_cfgULONGMemBase2; / 內(nèi)存基地址內(nèi)存基地址ULONGMemLength2;/ 內(nèi)存大小內(nèi)存大小ULONGIOBase2;/ IO基地址基地址ULONGIOPortLength2;/ IO基長度基長度ULONGIRQ;/ 中斷號中斷號;/ 數(shù)據(jù)緩沖
41、區(qū)數(shù)據(jù)緩沖區(qū)struct BuffersULONGAddress;UCHARData; 三個控制碼三個控制碼800H、801H和和802H分別對應(yīng)于讀配置信息、分別對應(yīng)于讀配置信息、IO讀和讀和IO寫。寫。pci_cfg是是PCI配置信息的格式,下面的示例程序只用到了配置信息的格式,下面的示例程序只用到了IOBase2數(shù)組,其中可以存放該數(shù)組,其中可以存放該PCI設(shè)備申請獲得的三處設(shè)備申請獲得的三處IO空間的首地址。空間的首地址。Buffers是應(yīng)用程序和驅(qū)動程序交換數(shù)據(jù)的緩沖區(qū)格式。是應(yīng)用程序和驅(qū)動程序交換數(shù)據(jù)的緩沖區(qū)格式。Buffers有兩個域,地址域名為有兩個域,地址域名為Address
42、,由用戶程序向驅(qū),由用戶程序向驅(qū)動程序傳遞需要讀寫的動程序傳遞需要讀寫的IO端口地址,另一個是數(shù)據(jù)域端口地址,另一個是數(shù)據(jù)域Data,讀操作時由驅(qū)動程序?qū)⒆x到的數(shù)據(jù)通過它傳遞給用戶程序,讀操作時由驅(qū)動程序?qū)⒆x到的數(shù)據(jù)通過它傳遞給用戶程序,寫操作時由用戶程序?qū)⑿枰敵龅臄?shù)據(jù)通過它傳遞給驅(qū)動寫操作時由用戶程序?qū)⑿枰敵龅臄?shù)據(jù)通過它傳遞給驅(qū)動程序。程序。需要注意的是,控制碼以及輸入、輸出緩沖區(qū)的具體格式由需要注意的是,控制碼以及輸入、輸出緩沖區(qū)的具體格式由驅(qū)動程序自行規(guī)定,操作系統(tǒng)對此不予干涉。驅(qū)動程序自行規(guī)定,操作系統(tǒng)對此不予干涉。 8255A的的PA口接口接8路開關(guān)的輸入,路開關(guān)的輸入,PB口輸
43、出,接口輸出,接8個發(fā)個發(fā)光二極管。光二極管。程序的功能是將程序的功能是將PA輸入的開關(guān)量,向輸入的開關(guān)量,向PB口輸出,用口輸出,用8個開關(guān)分別控制個開關(guān)分別控制8個發(fā)光二極管。個發(fā)光二極管。輸入全零時,程序結(jié)束運行。輸入全零時,程序結(jié)束運行。使用實驗儀使用實驗儀8255A芯片進行開關(guān)量輸入輸出芯片進行開關(guān)量輸入輸出下面的示例程序中,下面的示例程序中,.PCI9052Device0是設(shè)備名,只是設(shè)備名,只要安裝了設(shè)備驅(qū)動程序,系統(tǒng)就可認出該設(shè)備名。要安裝了設(shè)備驅(qū)動程序,系統(tǒng)就可認出該設(shè)備名。除了主函數(shù),示例程序還包含了四個子函數(shù)。除了主函數(shù),示例程序還包含了四個子函數(shù)。OpenDevice函
44、數(shù)打開設(shè)備,如果成功則返回設(shè)備句柄,失敗函數(shù)打開設(shè)備,如果成功則返回設(shè)備句柄,失敗則程序結(jié)束。則程序結(jié)束。GetPCIConfig函數(shù)讀取設(shè)備的配置信息,如果不成功,函數(shù)讀取設(shè)備的配置信息,如果不成功,程序也要結(jié)束。程序也要結(jié)束。ReadIO和和WriteIO是對是對IO端口的讀、寫函數(shù)。端口的讀、寫函數(shù)。上面三個子函數(shù)都通過調(diào)用上面三個子函數(shù)都通過調(diào)用API函數(shù)函數(shù)DeviceIoControl()實實現(xiàn)他們各自的功能,區(qū)別主要在于使用了不同的控制代碼?,F(xiàn)他們各自的功能,區(qū)別主要在于使用了不同的控制代碼。使用實驗儀使用實驗儀8255A芯片進行開關(guān)量輸入輸出芯片進行開關(guān)量輸入輸出示例程序函數(shù)關(guān)
45、系示例程序函數(shù)關(guān)系main()CreatFile()GetPciConfig()ReadIO()WriteIO()OpenDevice()CloseHandle()DeviceIOControl()用 戶 函 數(shù) 層用 戶 函 數(shù) 層Windows用 戶 層用 戶 層Ring3層層Ring0層層( Windows內(nèi) 核 )內(nèi) 核 )用 戶 程 序用 戶 程 序操 作 系 統(tǒng) 組 件操 作 系 統(tǒng) 組 件主函數(shù)首先打開設(shè)備,讀取主函數(shù)首先打開設(shè)備,讀取PCI卡的配置信息。實驗設(shè)卡的配置信息。實驗設(shè)備中備中8255的片選端連接在譯碼器的最低端,因此,的片選端連接在譯碼器的最低端,因此,PCI卡卡的
46、的IO基地址就是基地址就是8255的的PA口地址,依次是口地址,依次是PB口的地址、口的地址、PC口的地址和控制口的地址??诘牡刂泛涂刂瓶诘牡刂?。用戶編寫的用戶編寫的ReadIO函數(shù)調(diào)用函數(shù)調(diào)用DeviceIoControl函數(shù)時,函數(shù)時,輸入和輸出緩沖區(qū)使用同一個緩沖區(qū)輸入和輸出緩沖區(qū)使用同一個緩沖區(qū)buf。端口地址是輸入。端口地址是輸入?yún)?shù),調(diào)用之前預(yù)先置入輸入緩沖區(qū)參數(shù),調(diào)用之前預(yù)先置入輸入緩沖區(qū)buf的的Address字段。字段。讀操作獲得的數(shù)據(jù)是輸出參數(shù),調(diào)用完成后從讀操作獲得的數(shù)據(jù)是輸出參數(shù),調(diào)用完成后從buf的的Data字字段中取得。段中取得。主函數(shù)從主函數(shù)從PA口讀入數(shù)據(jù),然后
47、向口讀入數(shù)據(jù),然后向PB口輸出,這樣就可口輸出,這樣就可以用以用8個開關(guān)來分別控制個開關(guān)來分別控制8個發(fā)光二極管。讀入數(shù)據(jù)個發(fā)光二極管。讀入數(shù)據(jù)data為為零時,程序結(jié)束。零時,程序結(jié)束。 /8255IO讀寫演示程序,讀寫演示程序,Demo.c#include 8255Demo.hchar *sLinkName= .PCI9052Device0;struct pci_cfg pci;struct Buffers buf;HANDLE OpenDevice()HANDLE hDevice;hDevice = CreateFile(sLinkName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL );if (hDevice = = INVALID_HANDLE_VALUE)printf(請檢查請檢查PCI卡和驅(qū)動程序卡和驅(qū)動程序n);exit;return hDevice;void GetPCIConfig( HANDLE hDevice ) BOOL status;DWORD rc;status = DeviceIoControl( hDevice, IOCTL_PCI_CON
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村供應(yīng)混凝土合同范例
- 勞動違約合同范本
- 人防門拆除合同范本
- 乙方承包食堂合同范本
- 勞務(wù)公司托管合同范本
- 出納續(xù)簽合同范本
- 公司與公司合同范本
- 個人投資建筑工程合同范本
- 加盟轉(zhuǎn)讓合同范本
- 七一活動合同范本
- 《高鐵乘務(wù)安全管理與應(yīng)急處置(第3版)》全套教學(xué)課件
- 學(xué)校食品安全長效管理制度
- 2024-2025年第二學(xué)期學(xué)校教導(dǎo)處工作計劃(二)
- 2025年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 2025年春新人教版歷史七年級下冊全冊課件
- 活在課堂里 課件
- 教科版五年級下冊科學(xué)同步練習(xí)全冊
- 汶川地震波時程記錄(臥龍3向)
- 入職申請表完整版
- 美麗的貴州教學(xué)設(shè)計
- 室外雨水量及管徑計算表
評論
0/150
提交評論