




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第11章Windows環(huán)境下輸入輸出程序設(shè)計2022/12/17第11章Windows環(huán)境下輸入輸出程序設(shè)計第11章Windows環(huán)境下輸入輸出程序設(shè)計2022/12/1Windows是一個多任務(wù)操作系統(tǒng),在保護模式下工作。Windows操作系統(tǒng)不支持用戶程序?qū)τ嬎銠C底層硬件進行直接控制。用戶程序需要輸入/輸出時,可以通過通過API(ApplicationProgramInterface,應(yīng)用程序接口)來調(diào)用設(shè)備驅(qū)動程序,對設(shè)備實現(xiàn)間接控制,進行輸入/輸出。Windows9x使用VxDs(VirtualDeviceDriver’s,虛擬設(shè)備驅(qū)動)設(shè)備驅(qū)動程序。Windows2000/XP使用WDM(WindowsDriverModel,Windows驅(qū)動程序模型)設(shè)備驅(qū)動程序。第11章Windows環(huán)境下輸入輸出程序設(shè)計Windows是一個多任務(wù)操作系統(tǒng),在保護模式下工作。第11211.1Windows設(shè)備驅(qū)動程序
11.1.1虛擬設(shè)備 在多任務(wù)運行環(huán)境下,計算機內(nèi)的硬件、軟件資源為多個任務(wù)共享。任何一個用戶程序都不能獨占系統(tǒng)的硬件、軟件資源。虛擬設(shè)備實質(zhì)上是真實物理設(shè)備的部分資源和相關(guān)軟件的組合,用來完成用戶程序需要的功能。虛擬設(shè)備不但可以代表實際存在的硬件設(shè)備,還可以模擬實際上不存在的“設(shè)備”,供用戶使用。計算機上的“虛擬光驅(qū)”就是一個典型的虛擬設(shè)備。與這個設(shè)備同名的物理設(shè)備是不存在的,用戶使用的是硬盤的部分存儲空間以及相應(yīng)的服務(wù)程序。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.1Windows設(shè)備驅(qū)動程序11.1.13使用虛擬設(shè)備好處:實現(xiàn)多任務(wù)對系統(tǒng)資源的共享,方便用戶的使用;實現(xiàn)任務(wù)與任務(wù)、任務(wù)與系統(tǒng)之間的隔離和保護;規(guī)范外部設(shè)備輸入、輸出方法,使不同工作方式的設(shè)備用相同的方式進行輸入輸出。對Windows應(yīng)用程序來講,虛擬設(shè)備就是真實設(shè)備,應(yīng)用程序分不清那個設(shè)備是由真實硬件支持的真實設(shè)備,那個設(shè)備是由虛擬設(shè)備驅(qū)動程序模擬的虛擬設(shè)備。第11章Windows環(huán)境下輸入輸出程序設(shè)計使用虛擬設(shè)備好處:第11章Windows環(huán)境下輸入輸出程序設(shè)411.1.2
Windows9X設(shè)備驅(qū)動程序Windows9x是一個分層結(jié)構(gòu)的操作系統(tǒng),由工作在兩個不同層面的組件構(gòu)成:頂層組件,工作在Ring3層;底層組件,工作在Ring0層。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.1.2Windows9X設(shè)備驅(qū)動程序5頂層:Windows9x操作系統(tǒng)的頂層組件工作在特權(quán)級3,稱為ring3層。它給應(yīng)用程序的運行提供Win32API服務(wù)。Windows9x應(yīng)用程序和Win32API服務(wù)一起構(gòu)成操作系統(tǒng)的頂層,稱為系統(tǒng)虛擬機(VM,VirtualMachine)。對于一個任務(wù)來說,這些服務(wù)程序以及他們所掌控的硬件資源就是一臺“實實在在”的計算機。但是,對于整個系統(tǒng)來說,他們只是由操作系統(tǒng)向用戶提供的一個運行用戶程序的平臺,包括為這個應(yīng)用程序服務(wù)的操作系統(tǒng)組件和部分的硬件資源。每一個DOS應(yīng)用程序都在一個獨立的虛擬機中運行,操作系統(tǒng)允許多個虛擬機同時處于運行狀態(tài)。第11章Windows環(huán)境下輸入輸出程序設(shè)計頂層:第11章Windows環(huán)境下輸入輸出程序設(shè)計6底層:Windows9x操作系統(tǒng)的底層組件工作在0特權(quán)級,稱為ring0層,它就是虛擬機管理器(VMM,VirtualMachineManager)。Windows9x虛擬機管理器由一個內(nèi)核服務(wù)集和許多虛擬設(shè)備驅(qū)動程序(VxDs,VirtualDeviceDriver’s)組成。許多VxDs是由Microsoft公司隨操作系統(tǒng)提供的,如鍵盤和顯示器等的VxDs,有的VxD則由設(shè)備制造商提供,或者由用戶自行編寫。VxD用來支持特定的硬件或軟件,完成需要的功能。VxDs中的程序運行在ring0層,可以執(zhí)行所有的指令,完成所需的任何軟硬件的操作。第11章Windows環(huán)境下輸入輸出程序設(shè)計底層:第11章Windows環(huán)境下輸入輸出程序設(shè)計7 對于應(yīng)用程序而言,虛擬機管理器是透明的,應(yīng)用程序感覺不到管理器的存在。 微軟已經(jīng)宣布,從2006年6月起不再提供對Windows9x的技術(shù)支持。因此,Windows9x和VxDs的使用將逐漸減少。隨著Windows2000/XP的廣泛使用,WDM驅(qū)動程序的開發(fā)和使用已成為主流。第11章Windows環(huán)境下輸入輸出程序設(shè)計 對于應(yīng)用程序而言,虛擬機管理器是透明的,應(yīng)用程序感覺不到811.1.3
Windows2000/XP設(shè)備驅(qū)動程序Windows2000操作系統(tǒng)組件的層次結(jié)構(gòu) Windows2000操作系統(tǒng)的功能模塊劃分為用戶模式和內(nèi)核模式兩大類。用戶模式的操作系統(tǒng)功能模塊工作在ring3層,他們不能使用CPU中的特權(quán)指令,連同IN、OUT這樣的非特權(quán)指令也被禁止。所有的用戶程序都在這一層上運行。內(nèi)核模式的操作系統(tǒng)模塊工作在ring0層,可以使用CPU的任何指令。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.1.3Windows2000/XP設(shè)備驅(qū)動程序Wi9Windows2000操作系統(tǒng)的層次結(jié)構(gòu)第11章Windows環(huán)境下輸入輸出程序設(shè)計Windows2000操作系統(tǒng)的層次結(jié)構(gòu)第11章Windo102.Windows2000的設(shè)備驅(qū)動程序Windows2000的驅(qū)動程序也有兩種不同的類型。
用戶模式驅(qū)動程序工作在用戶模式,通過調(diào)用內(nèi)核模式驅(qū)動程序?qū)崿F(xiàn)指定的功能。用戶模式驅(qū)動程序不能直接對硬件設(shè)備進行訪問,僅僅用于構(gòu)建一個硬件或軟件的運行環(huán)境。
Windows內(nèi)核驅(qū)動程序工作在內(nèi)核模式,可以直接訪問硬件設(shè)備。每個設(shè)備驅(qū)動程序都有一組完成各種功能的函數(shù),通過調(diào)用這些函數(shù)可以對某一設(shè)備完成特定的操作。第11章Windows環(huán)境下輸入輸出程序設(shè)計2.Windows2000的設(shè)備驅(qū)動程序第11章Wi11內(nèi)核模式驅(qū)動程序的類型文件系統(tǒng)驅(qū)動程序可以在本地硬盤、網(wǎng)絡(luò)、移動存儲設(shè)備或各種有存儲能力的硬件設(shè)備實現(xiàn)標(biāo)準的文件系統(tǒng),如FAT32、NTFS系統(tǒng)等。PnP驅(qū)動程序是一種遵循Windows2000即插即用協(xié)議的內(nèi)核模式驅(qū)動程序。WDM驅(qū)動程序是一種PnP驅(qū)動程序。它同時還遵守電源管理協(xié)議。顯示驅(qū)動程序是一種特殊的內(nèi)核驅(qū)動程序。此類的驅(qū)動程序還有打印驅(qū)動程序、多媒體驅(qū)動程序、網(wǎng)絡(luò)驅(qū)動程序等。遺留設(shè)備驅(qū)動程序主要用在WindowsNT系統(tǒng)中,它也可以運行在Windows2000系統(tǒng)中。第11章Windows環(huán)境下輸入輸出程序設(shè)計內(nèi)核模式驅(qū)動程序的類型第11章Windows環(huán)境下輸入輸出程12Windows2000內(nèi)核模式驅(qū)動程序的類型第11章Windows環(huán)境下輸入輸出程序設(shè)計Windows2000內(nèi)核模式驅(qū)動程序的類型第11章Win1311.2WDM驅(qū)動程序
WDM是Microsoft力推的新型驅(qū)動程序模型,首先出現(xiàn)在WindowsNT中,現(xiàn)在的Windows98/Me/2000/XP都支持WDM。微軟宣稱,在后續(xù)的操作系統(tǒng)中將繼續(xù)支持WDM。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.2WDM驅(qū)動程序WDM是Mi14WDM是一個分層的驅(qū)動程序。它至少有功能驅(qū)動程序(Functiondriver)和總線驅(qū)動程序(Busdriver)兩個層面。功能驅(qū)動程序提供一個設(shè)備的使用功能,或者可以認為它就是一個設(shè)備的驅(qū)動程序。用戶程序需要使用該設(shè)備時,需要調(diào)用功能驅(qū)動程序中的功能函數(shù)??偩€驅(qū)動程序負責(zé)系統(tǒng)啟動時設(shè)備的安裝、檢測,并確定設(shè)備的資源使用情況。設(shè)備的啟動、停止,設(shè)備的初始化,設(shè)備的電源管理等功能也都由總線驅(qū)動程序提供。11.2.1WDM驅(qū)動程序模型和層次結(jié)構(gòu)第11章Windows環(huán)境下輸入輸出程序設(shè)計WDM是一個分層的驅(qū)動程序。它15 WDM引入了
功能設(shè)備對象FDO(FunctionalDeviceObject)
物理設(shè)備對象PDO(PhysicalDeviceObject)
兩個新概念來描述硬件。一個PDO對應(yīng)一個真實硬件。一個硬件只允許有一個PDO,卻可以擁有多個FDO,在驅(qū)動程序中直接操作的不是硬件而是相應(yīng)的PDO與FDO。根據(jù)具體的需要還可以選擇過濾驅(qū)動程序(filterdriver)。第11章Windows環(huán)境下輸入輸出程序設(shè)計 WDM引入了
功能設(shè)備對象FDO(FunctionalDe16Windows20000的輸入輸出是包驅(qū)動的應(yīng)用程序調(diào)用WDM驅(qū)動程序時,系統(tǒng)為每一個用戶的請求打包,形成一個I/O請求包(I/ORequestPackage,IRP),然后將其發(fā)送至驅(qū)動程序。IRP中的PDO字段用來區(qū)別是發(fā)送給哪一個設(shè)備的。某個層次的驅(qū)動程序得到IRP后,分析其中的請求,完成本層應(yīng)該完成的任務(wù)。如果IRP要求的任務(wù)已經(jīng)完成,該層次的驅(qū)動程序就向上一層傳送結(jié)果并逐層返回。如果IRP中的請求尚未完成,那么就繼續(xù)向下層驅(qū)動程序傳遞這個IRP。內(nèi)核組件就是這樣通過發(fā)送IRP來運行驅(qū)動程序中的代碼第11章Windows環(huán)境下輸入輸出程序設(shè)計Windows20000的輸入輸出是包驅(qū)動的第11章Wind17WDM驅(qū)動程序?qū)哟闻cI/O請求過程第11章Windows環(huán)境下輸入輸出程序設(shè)計WDM驅(qū)動程序?qū)哟闻cI/O請求過程第11章Windows環(huán)1811.2.2
WDM驅(qū)動程序開發(fā)工具 目前有兩個主要的工具來開發(fā)設(shè)備驅(qū)動程序,一個是Microsoft公司提供的WindowsDDK。它有Windows98DDK、Windows2000DDK、WindowsXPDDK和Windows2003DDK四個版本,分別用來支持相應(yīng)的四個操作系統(tǒng)中VxD和WDM驅(qū)動程序的開發(fā)。 用WindowsDDK開發(fā)驅(qū)動程序難度較大。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.2.2WDM驅(qū)動程序開發(fā)工具 19另一個驅(qū)動程序開發(fā)工具是NuMega公司提供的DriverStudio,其中包含VtoolsD、DriversWorks、DriversNetWorks和SoftICE。VtoolsD用來開發(fā)Windows98的VxD驅(qū)動程序。DriversWorks和DriversNetWorks分別用來開發(fā)一般設(shè)備和網(wǎng)絡(luò)設(shè)備的WDM驅(qū)動程序。SoftICE是一個功能強大的調(diào)試工具。第11章Windows環(huán)境下輸入輸出程序設(shè)計另一個驅(qū)動程序開發(fā)工具是NuMega公司提供的Dr20DriverStudio的開發(fā)是建立在WindowsDDK的基礎(chǔ)上的,安裝DriverStudio時,先要安裝WindowsDDK。DriverStudio將WindowsDDK的內(nèi)容封裝在一些基本的類中,使用VC++編程。使用DriverStudio來開發(fā)Windows的驅(qū)動程序,相對WindowsDDK來講要容易得多。DriverStudio使用開發(fā)向?qū)?,幫助你建立編寫?qū)動程序所需要的工程文件和程序框架文件,這些文件已經(jīng)組成了一個完整的設(shè)備驅(qū)動程序。接下來的工作就是將這些文件導(dǎo)入到VC++的開發(fā)環(huán)境中,添加具體的操作代碼,進行進一步的開發(fā)。第11章Windows環(huán)境下輸入輸出程序設(shè)計DriverStudio的開發(fā)是建立在WindowsDDK2111.2.3
DriverStudio中的WDM驅(qū)動程序結(jié)構(gòu)
從基本W(wǎng)DM啟動程序的兩個頭文件中可以大致看清WDM驅(qū)動程序的基本框架結(jié)構(gòu)。KDriver是WDM驅(qū)動程序的基類,任何驅(qū)動程序都要從繼承該類開始。SimpleWdmDriver驅(qū)動程序從派生KDriver類開始。SimpleWdmDevice是KPnpDevice類的派生類。重載其某些成員函數(shù)便可處理相應(yīng)事件的發(fā)生。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.2.3DriverStudio中的WDM驅(qū)動程序結(jié)22最重要的方法是virtualNTSTATUSDeviceControl(KIrpI),應(yīng)用程序中原本需要對硬件設(shè)備的I/O訪問指令被移到了DeviceControl中。應(yīng)用程序需要訪問硬件設(shè)備時,可以使用DeviceIoControl函數(shù),最后DeviceIoControl會調(diào)用DeviceControl,從而完成對設(shè)備的I/O訪問??梢哉fDeviceControl就是功能驅(qū)動程序。第11章Windows環(huán)境下輸入輸出程序設(shè)計最重要的方法是virtualNTSTATUSDevice23//HelloWdm.h-includefileforbasicWDMdriverclassSimpleWdmDriver:publicKDriver{public:
//DriverEntry負責(zé)驅(qū)動程序的初始化,必須重載 virtualNTSTATUS
DriverEntry(PUNICODE_STRINGRegistryPath);
//AddDevice初始化驅(qū)動程序所控制的設(shè)備,必須重載virtualNTSTATUSAddDevice(PDEVICE_OBJECTPdo);
//Unload刪除由DriverEntry所分配的資源 virtualVOIDUnload(void);};第11章Windows環(huán)境下輸入輸出程序設(shè)計//HelloWdm.h-includefilef24//hellodev.h-includefilefordeviceclassofbasicdriverclassSimpleWdmDevice:publicKPnpDevice{public: SimpleWdmDevice(PDEVICE_OBJECTPdo,ULONGUnit);
//PlugandPlayhandlers NTSTATUSOnStartDevice(KIrpI); //設(shè)備啟動時調(diào)用。 NTSTATUSOnStopDevice(KIrpI); //設(shè)備停止時調(diào)用。 NTSTATUSOnRemoveDevice(KIrpI);
//設(shè)備刪除時調(diào)用。
//UserControlhandlers
//設(shè)備打開時調(diào)用,應(yīng)用程序使用Create函數(shù)時調(diào)用。第11章Windows環(huán)境下輸入輸出程序設(shè)計//hellodev.h-includefilef25virtualNTSTATUSCreate(KIrpI); //設(shè)備關(guān)閉時調(diào)用,即應(yīng)用程序使用Create函數(shù)時調(diào)用。virtualNTSTATUSClose(KIrpI); //設(shè)備功能調(diào)用,應(yīng)用程序使用DeviceIoControl函數(shù)時被調(diào)用 virtualNTSTATUSDeviceControl(KIrpI); //PowerManagementhandlers NTSTATUSOnDevicePowerUp(KIrpI); // NTSTATUSOnDeviceSleep(KIrpI); //設(shè)備睡眠時調(diào)用 NTSTATUSOnSetPower(KIrpI); // NTSTATUSDefaultPnp(KIrpI); // NTSTATUSDefaultPower(KIrpI); };第11章Windows環(huán)境下輸入輸出程序設(shè)計virtualNTSTATUSCreate(KIrp2611.3Windows2000/XP下輸入
輸出的實現(xiàn)Windows是一個基于“消息傳遞”機制的多任務(wù)操作系統(tǒng)。用戶程序需要訪問硬件設(shè)備時,通過調(diào)用API函數(shù)調(diào)用該設(shè)備的驅(qū)動程序。WIN32將用戶的請求組合成為一個IRP包,向內(nèi)核發(fā)送“消息”。 內(nèi)核組件根據(jù)IRP中的PDO字段,將該“消息”傳送給對應(yīng)的WDM驅(qū)動程序。 驅(qū)動程序完成硬件設(shè)備的訪問后,向用戶程序返回結(jié)果。 調(diào)用驅(qū)動程序的過程,就是用戶程序和驅(qū)動程序之間傳遞消息,交換數(shù)據(jù),進行通信的過程。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.3Windows2000/XP下輸入
27 用戶程序完成對設(shè)備的訪問有兩種方式等待方式下,用戶程序調(diào)用驅(qū)動程序,等待驅(qū)動程序完成對硬件設(shè)備的訪問。這種方式編程簡單。異步方式下,應(yīng)用程序調(diào)用驅(qū)動程序,啟動了硬件設(shè)備后,直接返回進行其它處理,并不等待輸入/輸出完成。硬件設(shè)備完成了數(shù)據(jù)輸入輸出后,由驅(qū)動程序通知應(yīng)用程序進行進一步的處理。這時,需要由驅(qū)動程序發(fā)起和應(yīng)用程序的通信。這種方式下,要用到反調(diào)函數(shù)、Win32事件通知等方法。第11章Windows環(huán)境下輸入輸出程序設(shè)計 用戶程序完成對設(shè)備的訪問有兩種方式第11章Windows環(huán)28CreateFile()函數(shù)用來打開設(shè)備,獲取設(shè)備句柄;設(shè)備輸入輸出控制函數(shù)DeviceIoControl(),用來調(diào)用WDM驅(qū)動程序執(zhí)行相應(yīng)的操作(包括設(shè)備的控制和數(shù)據(jù)的輸入,輸出);CloseHandle()函數(shù)用來關(guān)閉設(shè)備。也可以使用ReadFile()和WriteFile()函數(shù)進行“標(biāo)準”的輸入/輸出。11.3.1用于輸入/輸出的WIN32API函數(shù)第11章Windows環(huán)境下輸入輸出程序設(shè)計CreateFile()函數(shù)用來打開設(shè)備,獲取設(shè)備句柄;1291.打開設(shè)備
CreateFile()函數(shù)用來打開設(shè)備,獲取設(shè)備句柄,格式如下:HANDLECreateFile(“\\\\.\\SimpleWDMDevice”, //設(shè)備的符號鏈接名GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, //同步打開設(shè)備NULL );使用上述函數(shù)時,除了設(shè)備名之外,不需要改變其它參數(shù)。這里假設(shè)設(shè)備的名字為SimpleWDMDevice。進行打開操作時首先搜索當(dāng)前目錄,然后搜索Windows系統(tǒng)目錄。第11章Windows環(huán)境下輸入輸出程序設(shè)計1.打開設(shè)備第11章Windows環(huán)境下輸入輸出程302.DeviceIoControl函數(shù)調(diào)用DeviceIoControl( HANDLE hDevice, //設(shè)備句柄 DWORD dwIoControlCode, //控制代碼 LPVOID lpInBuffer, //輸入數(shù)據(jù)塊指針 DWORD nInBufferSize,//輸入數(shù)據(jù)塊大小 LPVOID lpOutBuffer, //輸出數(shù)據(jù)塊指針 DWORD nOutBufferSize,//輸出數(shù)據(jù)塊大小 LPDWORD lpBytesReturned, //返回字節(jié)長度指針 NULL //同步時為NULL )第11章Windows環(huán)境下輸入輸出程序設(shè)計2.DeviceIoControl函數(shù)調(diào)用第11章Wind31DeviceIoControl函數(shù)調(diào)用參數(shù)hDevice是由CreateFile函數(shù)獲取的設(shè)備句柄。dwIOControlCode是應(yīng)用程序向WDM驅(qū)動程序發(fā)出的控制代碼。lpInBuffer和nInBufferSize是應(yīng)用程序向WDM驅(qū)動程序傳送的I/O數(shù)據(jù)塊的地址及大小。lpOutBuffer、nOutBufferSize和lpBytesReturned是WDM驅(qū)動程序返回給應(yīng)用程序的數(shù)據(jù)塊的地址、大小以及實際返回的字節(jié)數(shù)。輸入/輸出緩沖區(qū)的格式由驅(qū)動程序自行規(guī)定。第11章Windows環(huán)境下輸入輸出程序設(shè)計DeviceIoControl函數(shù)調(diào)用參數(shù)第11章W323.關(guān)閉設(shè)備 完成對設(shè)備的輸入、輸出控制后, 應(yīng)用程序調(diào)用CloseHandle(hDevice)關(guān)閉設(shè)備。第11章Windows環(huán)境下輸入輸出程序設(shè)計3.關(guān)閉設(shè)備第11章Windows環(huán)境下輸入輸出程序設(shè)計334.ReadFile和WriteFile函數(shù)ReadFile( HANDLE hFile, //設(shè)備句柄 LPVOID lpBuffer, //輸入數(shù)據(jù)塊指針 DWORDnNumberOfBytesToRead,//輸入數(shù)據(jù)塊大小 LPDWORD lpNumberOfBytesRead, //返回的字節(jié)數(shù)長度指針 NULL ) //同步時為NULLWriteFile( HANDLE hFile, //設(shè)備句柄 LPVOID lpBuffer, //輸出數(shù)據(jù)塊指針 DWORDnNumberOfBytesToWrite,//輸出數(shù)據(jù)塊大小 LPDWORD lpNumberOfBytesWritten,
//實際輸出的字節(jié)數(shù)長度指針 NULL ) //同步時為NULL第11章Windows環(huán)境下輸入輸出程序設(shè)計4.ReadFile和WriteFile函數(shù)第11章Wi34 本節(jié)以Aedk-LabPCI計算機接口實驗儀為例,介紹WDM驅(qū)動程序的使用。 該實驗設(shè)備由一塊PCI接口卡和一臺接口實驗儀組成,將PCI接口卡插入PC機的PCI總線插槽,用連接線把PCI卡和實驗機相連接,整個實驗儀就成為PC機的一臺“外部設(shè)備”。在監(jiān)控軟件的控制下,進行PC機與實驗儀的通訊,實現(xiàn)對實驗過程的全程控制。 PCI卡采用了PLX公司的PCI9052芯片作為接口芯片。11.3.2Windows2000/XP下輸入輸出舉例第11章Windows環(huán)境下輸入輸出程序設(shè)計 本節(jié)以Aedk-LabPCI計算機接口實驗儀為例35 進行硬件連接之后,需要安裝驅(qū)動程序,在Win2000中也就是安裝WDM驅(qū)動程序。 在實驗設(shè)備所附帶的軟件中,驅(qū)動程序文件有兩個:INF文件,稱為設(shè)備信息文件,供驅(qū)動程序安裝時使用。INF文件指明了硬件驅(qū)動該如何安裝到系統(tǒng)中,源文件在哪里、安裝到哪一個文件夾中、怎樣在注冊表中加入與設(shè)備有關(guān)的信息等;后綴為sys的文件,是整個實驗儀的驅(qū)動程序。一般情況下,INF文件會被復(fù)制到Windows2000系統(tǒng)目錄中的INF子目錄中,Sys文件被復(fù)制到System32/drivers子目錄中。第11章Windows環(huán)境下輸入輸出程序設(shè)計 進行硬件連接之后,需要安裝驅(qū)動程序,在Win2036安裝驅(qū)動程序后,在設(shè)備管理器中可以看到相應(yīng)的設(shè)備第11章Windows環(huán)境下輸入輸出程序設(shè)計安裝驅(qū)動程序后,在設(shè)備管理器中可以看到相應(yīng)的設(shè)備第11章Wi37//設(shè)備的頭文件//8255Demo.h//控制碼#defineIOCTL_PCI_CON //讀配置信息 CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)#defineIOCTL_IO_READ //IO讀 CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ANY_ACCESS)#defineIOCTL_IO_WRITE //IO寫 CTL_CODE(FILE_DEVICE_UNKNOWN,0x802,METHOD_BUFFERED,FILE_ANY_ACCESS)第11章Windows環(huán)境下輸入輸出程序設(shè)計//設(shè)備的頭文件第11章Windows環(huán)境下輸入輸出程序設(shè)計38//設(shè)備的頭文件//PCI卡配置信息structpci_cfg{ ULONG MemBase[2]; //內(nèi)存基地址 ULONG MemLength[2]; //內(nèi)存大小 ULONG IOBase[2]; //IO基地址 ULONG IOPortLength[2]; //IO基長度 ULONG IRQ; //中斷號}; //數(shù)據(jù)緩沖區(qū)structBuffers{ ULONG Address; UCHAR Data;};第11章Windows環(huán)境下輸入輸出程序設(shè)計//設(shè)備的頭文件第11章Windows環(huán)境下輸入輸出程序設(shè)計39三個控制碼800H、801H和802H分別對應(yīng)于讀配置信息、IO讀和IO寫。pci_cfg是PCI配置信息的格式,下面的示例程序只用到了IOBase[2]數(shù)組,其中可以存放該PCI設(shè)備申請獲得的三處IO空間的首地址。Buffers是應(yīng)用程序和驅(qū)動程序交換數(shù)據(jù)的緩沖區(qū)格式。Buffers有兩個域,地址域名為Address,由用戶程序向驅(qū)動程序傳遞需要讀寫的IO端口地址,另一個是數(shù)據(jù)域Data,讀操作時由驅(qū)動程序?qū)⒆x到的數(shù)據(jù)通過它傳遞給用戶程序,寫操作時由用戶程序?qū)⑿枰敵龅臄?shù)據(jù)通過它傳遞給驅(qū)動程序。需要注意的是,控制碼以及輸入、輸出緩沖區(qū)的具體格式由驅(qū)動程序自行規(guī)定,操作系統(tǒng)對此不予干涉。第11章Windows環(huán)境下輸入輸出程序設(shè)計三個控制碼800H、801H和802H分別對應(yīng)于讀配置信息40 8255A的PA口接8路開關(guān)的輸入,PB口輸出,接8個發(fā)光二極管。 程序的功能是將PA輸入的開關(guān)量,向PB口輸出,用8個開關(guān)分別控制8個發(fā)光二極管。 輸入全零時,程序結(jié)束運行。使用實驗儀8255A芯片進行開關(guān)量輸入輸出第11章Windows環(huán)境下輸入輸出程序設(shè)計 8255A的PA口接8路開關(guān)的輸入,PB口輸出,接8個發(fā)41 下面的示例程序中,"\\\\.\\PCI9052Device0"是設(shè)備名,只要安裝了設(shè)備驅(qū)動程序,系統(tǒng)就可認出該設(shè)備名。 除了主函數(shù),示例程序還包含了四個子函數(shù)。
OpenDevice函數(shù)打開設(shè)備,如果成功則返回設(shè)備句柄,失敗則程序結(jié)束。
GetPCIConfig函數(shù)讀取設(shè)備的配置信息,如果不成功,程序也要結(jié)束。
ReadIO和WriteIO是對IO端口的讀、寫函數(shù)。
上面三個子函數(shù)都通過調(diào)用API函數(shù)DeviceIoControl()實現(xiàn)他們各自的功能,區(qū)別主要在于使用了不同的控制代碼。使用實驗儀8255A芯片進行開關(guān)量輸入輸出第11章Windows環(huán)境下輸入輸出程序設(shè)計 下面的示例程序中,"\\\\.\\PCI9052Devi42示例程序函數(shù)關(guān)系第11章Windows環(huán)境下輸入輸出程序設(shè)計示例程序函數(shù)關(guān)系第11章Windows環(huán)境下輸入輸出程序設(shè)計43 主函數(shù)首先打開設(shè)備,讀取PCI卡的配置信息。實驗設(shè)備中8255的片選端連接在譯碼器的最低端,因此,PCI卡的IO基地址就是8255的PA口地址,依次是PB口的地址、PC口的地址和控制口的地址。 用戶編寫的ReadIO函數(shù)調(diào)用DeviceIoControl函數(shù)時,輸入和輸出緩沖區(qū)使用同一個緩沖區(qū)buf。端口地址是輸入?yún)?shù),調(diào)用之前預(yù)先置入輸入緩沖區(qū)buf的Address字段。讀操作獲得的數(shù)據(jù)是輸出參數(shù),調(diào)用完成后從buf的Data字段中取得。 主函數(shù)從PA口讀入數(shù)據(jù),然后向PB口輸出,這樣就可以用8個開關(guān)來分別控制8個發(fā)光二極管。讀入數(shù)據(jù)data為零時,程序結(jié)束。第11章Windows環(huán)境下輸入輸出程序設(shè)計 主函數(shù)首先打開設(shè)備,讀取PCI卡的配置信息。實驗設(shè)備中844//8255IO讀寫演示程序,Demo.c#include"8255Demo.h"char*sLinkName="\\\\.\\PCI9052Device0";structpci_cfgpci;structBuffersbuf;HANDLEOpenDevice(){ HANDLEhDevice; hDevice=CreateFile( sLinkName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);第11章Windows環(huán)境下輸入輸出程序設(shè)計//8255IO讀寫演示程序,Demo.c第11章Windo45 if(hDevice==INVALID_HANDLE_VALUE) { printf("請檢查PCI卡和驅(qū)動程序\n"); exit; } returnhDevice;}第11章Windows環(huán)境下輸入輸出程序設(shè)計 if(hDevice==INVALID_HAND46voidGetPCIConfig(HANDLEhDevice){ BOOLstatus; DWORDrc; status=DeviceIoControl(hDevice,IOCTL_PCI_CON, NULL,0,&pci,sizeof(pci_cfg),&rc,NULL); //調(diào)用DeviceIoControl函數(shù); //獲取PCI設(shè)備配置 if(!status){ printf("無法獲取pci配置信息\n"); exit; } return;}第11章Windows環(huán)境下輸入輸出程序設(shè)計voidGetPCIConfig(HANDLEh47 if(hDevice==INVALID_HANDLE_VALUE) { printf("請檢查PCI卡和驅(qū)動程序\n"); exit; } returnhDevice;}第11章Windows環(huán)境下輸入輸出程序設(shè)計 if(hDevice==INVALID_HAND48 voidWriteIO(WORDport,BYTEdata){ BOOLstatus; DWORDrc; buf->Address=port; //端口地址寫入IO緩沖區(qū) buf->Data=data; //輸出數(shù)據(jù)寫入IO緩沖區(qū) status=DeviceIoControl(hDevice, IOCTL_IO_WRITE,&buf, sizeof(Buffers),NULL,0,&rc,NULL); //調(diào)用DeviceIoControl函數(shù) //向設(shè)備進行輸出 if(!status)printf("無法寫入\n");}第11章Windows環(huán)境下輸入輸出程序設(shè)計 voidWriteIO(WORDport,BYTE49 UCHARReadIO(WORDport){ DWORDrc; BOOLstatus buf->Address=port;//將端口地址寫入IO緩沖區(qū) status=DeviceIoControl(hDevice,IOCTL_IO_READ,
&buf,sizeof(Buffers),&buf,sizeof(Buffers), &rc,NULL); //調(diào)用DeviceIoControl函數(shù) //從設(shè)備輸入 if(!status)printf("無法讀出\n"); returnbuf->Data;}第11章Windows環(huán)境下輸入輸出程序設(shè)計 UCHARReadIO(WORDport)第11章W50 voidmain(){ HANDLE hDevice; WORD 8255PAaddr,8255PBaddr,8255ConAddr; UCHAR data; hDevice=OpenDevice(); //打開設(shè)備 GetPCIConfig(hDevice); //讀取配置信息 8255PAaddr=pci.IOBase[1] //取得PA口地址 8255PBaddr=pci.IOBase[1]+1; //取得PB口地址 8255ConAddr=pci.IOBase[1]+3; //取得控制口地址 WriteIO(8255ConAddr,0x90); //寫控制字90h,方式0,PA口讀,PB口寫第11章Windows環(huán)境下輸入輸出程序設(shè)計 voidmain()第11章Windows環(huán)境下輸入輸出51
do{ data=ReadIO(8255PAaddr); //從PA口讀取數(shù)據(jù) WriteIO(8255PBaddr,data); //將數(shù)據(jù)寫入PB口 }while(data); //數(shù)據(jù)不為0繼續(xù)
CloseHandle(hDevice); //關(guān)閉設(shè)備 return;} 第11章Windows環(huán)境下輸入輸出程序設(shè)計 第11章Windows環(huán)境下輸入輸出程序設(shè)計52演講完畢,謝謝聽講!再見,seeyouagain3rew2022/12/17第11章Windows環(huán)境下輸入輸出程序設(shè)計演講完畢,謝謝聽講!再見,seeyouagain3rew53第11章Windows環(huán)境下輸入輸出程序設(shè)計2022/12/17第11章Windows環(huán)境下輸入輸出程序設(shè)計第11章Windows環(huán)境下輸入輸出程序設(shè)計2022/12/54Windows是一個多任務(wù)操作系統(tǒng),在保護模式下工作。Windows操作系統(tǒng)不支持用戶程序?qū)τ嬎銠C底層硬件進行直接控制。用戶程序需要輸入/輸出時,可以通過通過API(ApplicationProgramInterface,應(yīng)用程序接口)來調(diào)用設(shè)備驅(qū)動程序,對設(shè)備實現(xiàn)間接控制,進行輸入/輸出。Windows9x使用VxDs(VirtualDeviceDriver’s,虛擬設(shè)備驅(qū)動)設(shè)備驅(qū)動程序。Windows2000/XP使用WDM(WindowsDriverModel,Windows驅(qū)動程序模型)設(shè)備驅(qū)動程序。第11章Windows環(huán)境下輸入輸出程序設(shè)計Windows是一個多任務(wù)操作系統(tǒng),在保護模式下工作。第115511.1Windows設(shè)備驅(qū)動程序
11.1.1虛擬設(shè)備 在多任務(wù)運行環(huán)境下,計算機內(nèi)的硬件、軟件資源為多個任務(wù)共享。任何一個用戶程序都不能獨占系統(tǒng)的硬件、軟件資源。虛擬設(shè)備實質(zhì)上是真實物理設(shè)備的部分資源和相關(guān)軟件的組合,用來完成用戶程序需要的功能。虛擬設(shè)備不但可以代表實際存在的硬件設(shè)備,還可以模擬實際上不存在的“設(shè)備”,供用戶使用。計算機上的“虛擬光驅(qū)”就是一個典型的虛擬設(shè)備。與這個設(shè)備同名的物理設(shè)備是不存在的,用戶使用的是硬盤的部分存儲空間以及相應(yīng)的服務(wù)程序。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.1Windows設(shè)備驅(qū)動程序11.1.156使用虛擬設(shè)備好處:實現(xiàn)多任務(wù)對系統(tǒng)資源的共享,方便用戶的使用;實現(xiàn)任務(wù)與任務(wù)、任務(wù)與系統(tǒng)之間的隔離和保護;規(guī)范外部設(shè)備輸入、輸出方法,使不同工作方式的設(shè)備用相同的方式進行輸入輸出。對Windows應(yīng)用程序來講,虛擬設(shè)備就是真實設(shè)備,應(yīng)用程序分不清那個設(shè)備是由真實硬件支持的真實設(shè)備,那個設(shè)備是由虛擬設(shè)備驅(qū)動程序模擬的虛擬設(shè)備。第11章Windows環(huán)境下輸入輸出程序設(shè)計使用虛擬設(shè)備好處:第11章Windows環(huán)境下輸入輸出程序設(shè)5711.1.2
Windows9X設(shè)備驅(qū)動程序Windows9x是一個分層結(jié)構(gòu)的操作系統(tǒng),由工作在兩個不同層面的組件構(gòu)成:頂層組件,工作在Ring3層;底層組件,工作在Ring0層。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.1.2Windows9X設(shè)備驅(qū)動程序58頂層:Windows9x操作系統(tǒng)的頂層組件工作在特權(quán)級3,稱為ring3層。它給應(yīng)用程序的運行提供Win32API服務(wù)。Windows9x應(yīng)用程序和Win32API服務(wù)一起構(gòu)成操作系統(tǒng)的頂層,稱為系統(tǒng)虛擬機(VM,VirtualMachine)。對于一個任務(wù)來說,這些服務(wù)程序以及他們所掌控的硬件資源就是一臺“實實在在”的計算機。但是,對于整個系統(tǒng)來說,他們只是由操作系統(tǒng)向用戶提供的一個運行用戶程序的平臺,包括為這個應(yīng)用程序服務(wù)的操作系統(tǒng)組件和部分的硬件資源。每一個DOS應(yīng)用程序都在一個獨立的虛擬機中運行,操作系統(tǒng)允許多個虛擬機同時處于運行狀態(tài)。第11章Windows環(huán)境下輸入輸出程序設(shè)計頂層:第11章Windows環(huán)境下輸入輸出程序設(shè)計59底層:Windows9x操作系統(tǒng)的底層組件工作在0特權(quán)級,稱為ring0層,它就是虛擬機管理器(VMM,VirtualMachineManager)。Windows9x虛擬機管理器由一個內(nèi)核服務(wù)集和許多虛擬設(shè)備驅(qū)動程序(VxDs,VirtualDeviceDriver’s)組成。許多VxDs是由Microsoft公司隨操作系統(tǒng)提供的,如鍵盤和顯示器等的VxDs,有的VxD則由設(shè)備制造商提供,或者由用戶自行編寫。VxD用來支持特定的硬件或軟件,完成需要的功能。VxDs中的程序運行在ring0層,可以執(zhí)行所有的指令,完成所需的任何軟硬件的操作。第11章Windows環(huán)境下輸入輸出程序設(shè)計底層:第11章Windows環(huán)境下輸入輸出程序設(shè)計60 對于應(yīng)用程序而言,虛擬機管理器是透明的,應(yīng)用程序感覺不到管理器的存在。 微軟已經(jīng)宣布,從2006年6月起不再提供對Windows9x的技術(shù)支持。因此,Windows9x和VxDs的使用將逐漸減少。隨著Windows2000/XP的廣泛使用,WDM驅(qū)動程序的開發(fā)和使用已成為主流。第11章Windows環(huán)境下輸入輸出程序設(shè)計 對于應(yīng)用程序而言,虛擬機管理器是透明的,應(yīng)用程序感覺不到6111.1.3
Windows2000/XP設(shè)備驅(qū)動程序Windows2000操作系統(tǒng)組件的層次結(jié)構(gòu) Windows2000操作系統(tǒng)的功能模塊劃分為用戶模式和內(nèi)核模式兩大類。用戶模式的操作系統(tǒng)功能模塊工作在ring3層,他們不能使用CPU中的特權(quán)指令,連同IN、OUT這樣的非特權(quán)指令也被禁止。所有的用戶程序都在這一層上運行。內(nèi)核模式的操作系統(tǒng)模塊工作在ring0層,可以使用CPU的任何指令。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.1.3Windows2000/XP設(shè)備驅(qū)動程序Wi62Windows2000操作系統(tǒng)的層次結(jié)構(gòu)第11章Windows環(huán)境下輸入輸出程序設(shè)計Windows2000操作系統(tǒng)的層次結(jié)構(gòu)第11章Windo632.Windows2000的設(shè)備驅(qū)動程序Windows2000的驅(qū)動程序也有兩種不同的類型。
用戶模式驅(qū)動程序工作在用戶模式,通過調(diào)用內(nèi)核模式驅(qū)動程序?qū)崿F(xiàn)指定的功能。用戶模式驅(qū)動程序不能直接對硬件設(shè)備進行訪問,僅僅用于構(gòu)建一個硬件或軟件的運行環(huán)境。
Windows內(nèi)核驅(qū)動程序工作在內(nèi)核模式,可以直接訪問硬件設(shè)備。每個設(shè)備驅(qū)動程序都有一組完成各種功能的函數(shù),通過調(diào)用這些函數(shù)可以對某一設(shè)備完成特定的操作。第11章Windows環(huán)境下輸入輸出程序設(shè)計2.Windows2000的設(shè)備驅(qū)動程序第11章Wi64內(nèi)核模式驅(qū)動程序的類型文件系統(tǒng)驅(qū)動程序可以在本地硬盤、網(wǎng)絡(luò)、移動存儲設(shè)備或各種有存儲能力的硬件設(shè)備實現(xiàn)標(biāo)準的文件系統(tǒng),如FAT32、NTFS系統(tǒng)等。PnP驅(qū)動程序是一種遵循Windows2000即插即用協(xié)議的內(nèi)核模式驅(qū)動程序。WDM驅(qū)動程序是一種PnP驅(qū)動程序。它同時還遵守電源管理協(xié)議。顯示驅(qū)動程序是一種特殊的內(nèi)核驅(qū)動程序。此類的驅(qū)動程序還有打印驅(qū)動程序、多媒體驅(qū)動程序、網(wǎng)絡(luò)驅(qū)動程序等。遺留設(shè)備驅(qū)動程序主要用在WindowsNT系統(tǒng)中,它也可以運行在Windows2000系統(tǒng)中。第11章Windows環(huán)境下輸入輸出程序設(shè)計內(nèi)核模式驅(qū)動程序的類型第11章Windows環(huán)境下輸入輸出程65Windows2000內(nèi)核模式驅(qū)動程序的類型第11章Windows環(huán)境下輸入輸出程序設(shè)計Windows2000內(nèi)核模式驅(qū)動程序的類型第11章Win6611.2WDM驅(qū)動程序
WDM是Microsoft力推的新型驅(qū)動程序模型,首先出現(xiàn)在WindowsNT中,現(xiàn)在的Windows98/Me/2000/XP都支持WDM。微軟宣稱,在后續(xù)的操作系統(tǒng)中將繼續(xù)支持WDM。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.2WDM驅(qū)動程序WDM是Mi67WDM是一個分層的驅(qū)動程序。它至少有功能驅(qū)動程序(Functiondriver)和總線驅(qū)動程序(Busdriver)兩個層面。功能驅(qū)動程序提供一個設(shè)備的使用功能,或者可以認為它就是一個設(shè)備的驅(qū)動程序。用戶程序需要使用該設(shè)備時,需要調(diào)用功能驅(qū)動程序中的功能函數(shù)??偩€驅(qū)動程序負責(zé)系統(tǒng)啟動時設(shè)備的安裝、檢測,并確定設(shè)備的資源使用情況。設(shè)備的啟動、停止,設(shè)備的初始化,設(shè)備的電源管理等功能也都由總線驅(qū)動程序提供。11.2.1WDM驅(qū)動程序模型和層次結(jié)構(gòu)第11章Windows環(huán)境下輸入輸出程序設(shè)計WDM是一個分層的驅(qū)動程序。它68 WDM引入了
功能設(shè)備對象FDO(FunctionalDeviceObject)
物理設(shè)備對象PDO(PhysicalDeviceObject)
兩個新概念來描述硬件。一個PDO對應(yīng)一個真實硬件。一個硬件只允許有一個PDO,卻可以擁有多個FDO,在驅(qū)動程序中直接操作的不是硬件而是相應(yīng)的PDO與FDO。根據(jù)具體的需要還可以選擇過濾驅(qū)動程序(filterdriver)。第11章Windows環(huán)境下輸入輸出程序設(shè)計 WDM引入了
功能設(shè)備對象FDO(FunctionalDe69Windows20000的輸入輸出是包驅(qū)動的應(yīng)用程序調(diào)用WDM驅(qū)動程序時,系統(tǒng)為每一個用戶的請求打包,形成一個I/O請求包(I/ORequestPackage,IRP),然后將其發(fā)送至驅(qū)動程序。IRP中的PDO字段用來區(qū)別是發(fā)送給哪一個設(shè)備的。某個層次的驅(qū)動程序得到IRP后,分析其中的請求,完成本層應(yīng)該完成的任務(wù)。如果IRP要求的任務(wù)已經(jīng)完成,該層次的驅(qū)動程序就向上一層傳送結(jié)果并逐層返回。如果IRP中的請求尚未完成,那么就繼續(xù)向下層驅(qū)動程序傳遞這個IRP。內(nèi)核組件就是這樣通過發(fā)送IRP來運行驅(qū)動程序中的代碼第11章Windows環(huán)境下輸入輸出程序設(shè)計Windows20000的輸入輸出是包驅(qū)動的第11章Wind70WDM驅(qū)動程序?qū)哟闻cI/O請求過程第11章Windows環(huán)境下輸入輸出程序設(shè)計WDM驅(qū)動程序?qū)哟闻cI/O請求過程第11章Windows環(huán)7111.2.2
WDM驅(qū)動程序開發(fā)工具 目前有兩個主要的工具來開發(fā)設(shè)備驅(qū)動程序,一個是Microsoft公司提供的WindowsDDK。它有Windows98DDK、Windows2000DDK、WindowsXPDDK和Windows2003DDK四個版本,分別用來支持相應(yīng)的四個操作系統(tǒng)中VxD和WDM驅(qū)動程序的開發(fā)。 用WindowsDDK開發(fā)驅(qū)動程序難度較大。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.2.2WDM驅(qū)動程序開發(fā)工具 72另一個驅(qū)動程序開發(fā)工具是NuMega公司提供的DriverStudio,其中包含VtoolsD、DriversWorks、DriversNetWorks和SoftICE。VtoolsD用來開發(fā)Windows98的VxD驅(qū)動程序。DriversWorks和DriversNetWorks分別用來開發(fā)一般設(shè)備和網(wǎng)絡(luò)設(shè)備的WDM驅(qū)動程序。SoftICE是一個功能強大的調(diào)試工具。第11章Windows環(huán)境下輸入輸出程序設(shè)計另一個驅(qū)動程序開發(fā)工具是NuMega公司提供的Dr73DriverStudio的開發(fā)是建立在WindowsDDK的基礎(chǔ)上的,安裝DriverStudio時,先要安裝WindowsDDK。DriverStudio將WindowsDDK的內(nèi)容封裝在一些基本的類中,使用VC++編程。使用DriverStudio來開發(fā)Windows的驅(qū)動程序,相對WindowsDDK來講要容易得多。DriverStudio使用開發(fā)向?qū)?,幫助你建立編寫?qū)動程序所需要的工程文件和程序框架文件,這些文件已經(jīng)組成了一個完整的設(shè)備驅(qū)動程序。接下來的工作就是將這些文件導(dǎo)入到VC++的開發(fā)環(huán)境中,添加具體的操作代碼,進行進一步的開發(fā)。第11章Windows環(huán)境下輸入輸出程序設(shè)計DriverStudio的開發(fā)是建立在WindowsDDK7411.2.3
DriverStudio中的WDM驅(qū)動程序結(jié)構(gòu)
從基本W(wǎng)DM啟動程序的兩個頭文件中可以大致看清WDM驅(qū)動程序的基本框架結(jié)構(gòu)。KDriver是WDM驅(qū)動程序的基類,任何驅(qū)動程序都要從繼承該類開始。SimpleWdmDriver驅(qū)動程序從派生KDriver類開始。SimpleWdmDevice是KPnpDevice類的派生類。重載其某些成員函數(shù)便可處理相應(yīng)事件的發(fā)生。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.2.3DriverStudio中的WDM驅(qū)動程序結(jié)75最重要的方法是virtualNTSTATUSDeviceControl(KIrpI),應(yīng)用程序中原本需要對硬件設(shè)備的I/O訪問指令被移到了DeviceControl中。應(yīng)用程序需要訪問硬件設(shè)備時,可以使用DeviceIoControl函數(shù),最后DeviceIoControl會調(diào)用DeviceControl,從而完成對設(shè)備的I/O訪問??梢哉fDeviceControl就是功能驅(qū)動程序。第11章Windows環(huán)境下輸入輸出程序設(shè)計最重要的方法是virtualNTSTATUSDevice76//HelloWdm.h-includefileforbasicWDMdriverclassSimpleWdmDriver:publicKDriver{public:
//DriverEntry負責(zé)驅(qū)動程序的初始化,必須重載 virtualNTSTATUS
DriverEntry(PUNICODE_STRINGRegistryPath);
//AddDevice初始化驅(qū)動程序所控制的設(shè)備,必須重載virtualNTSTATUSAddDevice(PDEVICE_OBJECTPdo);
//Unload刪除由DriverEntry所分配的資源 virtualVOIDUnload(void);};第11章Windows環(huán)境下輸入輸出程序設(shè)計//HelloWdm.h-includefilef77//hellodev.h-includefilefordeviceclassofbasicdriverclassSimpleWdmDevice:publicKPnpDevice{public: SimpleWdmDevice(PDEVICE_OBJECTPdo,ULONGUnit);
//PlugandPlayhandlers NTSTATUSOnStartDevice(KIrpI); //設(shè)備啟動時調(diào)用。 NTSTATUSOnStopDevice(KIrpI); //設(shè)備停止時調(diào)用。 NTSTATUSOnRemoveDevice(KIrpI);
//設(shè)備刪除時調(diào)用。
//UserControlhandlers
//設(shè)備打開時調(diào)用,應(yīng)用程序使用Create函數(shù)時調(diào)用。第11章Windows環(huán)境下輸入輸出程序設(shè)計//hellodev.h-includefilef78virtualNTSTATUSCreate(KIrpI); //設(shè)備關(guān)閉時調(diào)用,即應(yīng)用程序使用Create函數(shù)時調(diào)用。virtualNTSTATUSClose(KIrpI); //設(shè)備功能調(diào)用,應(yīng)用程序使用DeviceIoControl函數(shù)時被調(diào)用 virtualNTSTATUSDeviceControl(KIrpI); //PowerManagementhandlers NTSTATUSOnDevicePowerUp(KIrpI); // NTSTATUSOnDeviceSleep(KIrpI); //設(shè)備睡眠時調(diào)用 NTSTATUSOnSetPower(KIrpI); // NTSTATUSDefaultPnp(KIrpI); // NTSTATUSDefaultPower(KIrpI); };第11章Windows環(huán)境下輸入輸出程序設(shè)計virtualNTSTATUSCreate(KIrp7911.3Windows2000/XP下輸入
輸出的實現(xiàn)Windows是一個基于“消息傳遞”機制的多任務(wù)操作系統(tǒng)。用戶程序需要訪問硬件設(shè)備時,通過調(diào)用API函數(shù)調(diào)用該設(shè)備的驅(qū)動程序。WIN32將用戶的請求組合成為一個IRP包,向內(nèi)核發(fā)送“消息”。 內(nèi)核組件根據(jù)IRP中的PDO字段,將該“消息”傳送給對應(yīng)的WDM驅(qū)動程序。 驅(qū)動程序完成硬件設(shè)備的訪問后,向用戶程序返回結(jié)果。 調(diào)用驅(qū)動程序的過程,就是用戶程序和驅(qū)動程序之間傳遞消息,交換數(shù)據(jù),進行通信的過程。第11章Windows環(huán)境下輸入輸出程序設(shè)計11.3Windows2000/XP下輸入
80 用戶程序完成對設(shè)備的訪問有兩種方式等待方式下,用戶程序調(diào)用驅(qū)動程序,等待驅(qū)動程序完成對硬件設(shè)備的訪問。這種方式編程簡單。異步方式下,應(yīng)用程序調(diào)用驅(qū)動程序,啟動了硬件設(shè)備后,直接返回進行其它處理,并不等待輸入/輸出完成。硬件設(shè)備完成了數(shù)據(jù)輸入輸出后,由驅(qū)動程序通知應(yīng)用程序進行進一步的處理。這時,需要由驅(qū)動程序發(fā)起和應(yīng)用程序的通信。這種方式下,要用到反調(diào)函數(shù)、Win32事件通知等方法。第11章Windows環(huán)境下輸入輸出程序設(shè)計 用戶程序完成對設(shè)備的訪問有兩種方式第11章Windows環(huán)81CreateFile()函數(shù)用來打開設(shè)備,獲取設(shè)備句柄;設(shè)備輸入輸出控制函數(shù)DeviceIoControl(),用來調(diào)用WDM驅(qū)動程序執(zhí)行相應(yīng)的操作(包括設(shè)備的控制和數(shù)據(jù)的輸入,輸出);CloseHandle()函數(shù)用來關(guān)閉設(shè)備。也可以使用ReadFile()和WriteFile()函數(shù)進行“標(biāo)準”的輸入/輸出。11.3.1用于輸入/輸出的WIN32API函數(shù)第11章Windows環(huán)境下輸入輸出程序設(shè)計CreateFile()函數(shù)用來打開設(shè)備,獲取設(shè)備句柄;1821.打開設(shè)備
CreateFile()函數(shù)用來打開設(shè)備,獲取設(shè)備句柄,格式如下:HANDLECreateFile(“\\\\.\\SimpleWDMDevice”, //設(shè)備的符號鏈接名GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, //同步打開設(shè)備NULL );使用上述函數(shù)時,除了設(shè)備名之外,不需要改變其它參數(shù)。這里假設(shè)設(shè)備的名字為SimpleWDMDevice。進行打開操作時首先搜索當(dāng)前目錄,然后搜索Windows系統(tǒng)目錄。第11章Windows環(huán)境下輸入輸出程序設(shè)計1.打開設(shè)備第11章Windows環(huán)境下輸入輸出程832.DeviceIoControl函數(shù)調(diào)用DeviceIoControl( HANDLE hDevice, //設(shè)備句柄 DWORD dwIoControlCode, //控制代碼 LPVOID lpInBuffer, //輸入數(shù)據(jù)塊指針 DWORD nInBufferSize,//輸入數(shù)據(jù)塊大小 LPVOID lpOutBuffer, //輸出數(shù)據(jù)塊指針 DWORD nOutBufferSize,//輸出數(shù)據(jù)塊大小 LPDWORD lpBytesReturned, //返回字節(jié)長度指針 NULL //同步時為NULL )第11章Windows環(huán)境下輸入輸出程序設(shè)計2.DeviceIoControl函數(shù)調(diào)用第11章Wind84DeviceIoControl函數(shù)調(diào)用參數(shù)hDevice是由CreateFile函數(shù)獲取的設(shè)備句柄。dwIOControlCode是應(yīng)用程序向WDM驅(qū)動程序發(fā)出的控制代碼。lpInBuffer和nInBufferSize是應(yīng)用程序向WDM驅(qū)動程序傳送的I/O數(shù)據(jù)塊的地址及大小。lpOutBuffer、nOutBufferSize和lpBytesReturned是WDM驅(qū)動程序返回給應(yīng)用程序的數(shù)據(jù)塊的地址、大小以及實際返回的字節(jié)數(shù)。輸入/輸出緩沖區(qū)的格式由驅(qū)動程序自行規(guī)定。第11章Windows環(huán)境下輸入輸出程序設(shè)計DeviceIoControl函數(shù)調(diào)用參數(shù)第11章W853.關(guān)閉設(shè)備 完成對設(shè)備的輸入、輸出控制后, 應(yīng)用程序調(diào)用CloseHandle(hDevice)關(guān)閉設(shè)備。第11章Windows環(huán)境下輸入輸出程序設(shè)計3.關(guān)閉設(shè)備第11章Windows環(huán)境下輸入輸出程序設(shè)計864.ReadFile和WriteFile函數(shù)ReadFile( HANDLE hFile, //設(shè)備句柄 LPVOID lpBuffer, //輸入數(shù)據(jù)塊指針 DWORDnNumberOfBytesToRead,//輸入數(shù)據(jù)塊大小 LPDWORD lpNumberOfBytesRead, //返回的字節(jié)數(shù)長度指針 NULL ) //同步時為NULLWriteFile( HANDLE hFile, //設(shè)備句柄 LPVOID lpBuffer, //輸出數(shù)據(jù)塊指針 DWORDnNumberOfBytesToWrite,//輸出數(shù)據(jù)塊大小 LPDWORD lpNumberOfBytesWritten,
//實際輸出的字節(jié)數(shù)長度指針 NULL ) //同步時為NULL第11章Windows環(huán)境下輸入輸出程序設(shè)計4.ReadFile和WriteFile函數(shù)第11章Wi87 本節(jié)以Aedk-LabPCI計算機接口實驗儀為例,介紹WDM驅(qū)動程序的使用。 該實驗設(shè)備由一塊PCI接口卡和一臺接口實驗儀組成,將PCI接口卡插入PC機的PCI總線插槽,用連接線把PCI卡和實驗機相連接,整個實驗儀就成為PC機的一臺“外部設(shè)備”。在監(jiān)控軟件的控制下,進行PC機與實驗儀的通訊,實現(xiàn)對實驗過程的全程控制。 PCI卡采用了PLX公司的PCI9052芯片作為接口芯片。11.3.2Windows2000/XP下輸入輸出舉例第11章Windows環(huán)境下輸入輸出程序設(shè)計 本節(jié)以Aedk-LabPCI計算機接口實驗儀為例88 進行硬件連接之后,需要安裝驅(qū)動程序,在Win2000中也就是安裝WDM驅(qū)動程序。 在實驗設(shè)備所附帶的軟件中,驅(qū)動程序文件有兩個:INF文件,稱為設(shè)備信息文件,供驅(qū)動程序安裝時使用。INF文件指明了硬件驅(qū)動該如何安裝到系統(tǒng)中,源文件在哪里、安裝到哪一個文件夾中、怎樣在注冊表中加入與設(shè)備有關(guān)的信息等;后綴為sys的文件,是整個實驗儀的驅(qū)動程序。一般情況下,INF文件會被復(fù)制到Windows2000系統(tǒng)目錄中的INF子目錄中,Sys文件被復(fù)制到System32/drivers子目錄中。第11章Windows環(huán)境下輸入輸出程序設(shè)計 進行硬件連接之后,需要安裝驅(qū)動程序,在Win2089安裝驅(qū)動程序后,在設(shè)備管理器中可以看到相應(yīng)的設(shè)備第11章Windows環(huán)境下輸入輸出程序設(shè)計安裝驅(qū)動程序后,在設(shè)備管理器中可以看到相應(yīng)的設(shè)備第11章Wi90//設(shè)備的頭文件//8255Demo.h//控制碼#defineIOCTL_PCI_CON //讀配置信息 CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)#defineIOCTL_IO_READ //IO讀 CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ANY_ACCESS)#defineIOCTL_IO_WRITE //IO寫 CTL_CODE(FILE_DEVICE_UNKNOWN,0x802,METHOD_BUFFERED,FILE_ANY_ACCESS)第11章Windows環(huán)境下輸入輸出程序設(shè)計//設(shè)備的頭文件第11章Windows環(huán)境下輸入輸出程序設(shè)計91//設(shè)備的頭文件//PCI卡配置信息structpci_cfg{ ULONG MemBase[2]; //內(nèi)存基地址 ULONG MemLength[2]; //內(nèi)存大小 ULONG IOBase[2]; //IO基地址 ULONG IOPortLength[2]; //IO基長度 ULONG IRQ; //中斷號}; //數(shù)據(jù)緩沖區(qū)structBuffers{ ULONG Address; UCHAR Data;};第11章Windows環(huán)境下輸入輸出程序設(shè)計//設(shè)備的頭文件第11章Windows環(huán)境下輸入輸出程序設(shè)計92三個控制碼800H、801H和802H分別對應(yīng)于讀配置信息、IO讀和IO寫。pci_cfg是PCI配置信息的格式,下面的示例程序只用到了IOBase[2]數(shù)組,其中可以存放該PCI設(shè)備申請獲得的三處IO空間的首地址。Buffers是應(yīng)用程序和驅(qū)動程序交換數(shù)據(jù)的緩沖區(qū)格式。Buffers有兩個域,地址域名為Address,由用戶程序向驅(qū)動程序傳遞需要讀寫的IO端口地址,另一個是數(shù)據(jù)域Data,讀操作時由驅(qū)動程序?qū)⒆x到的數(shù)據(jù)通過它傳遞給用戶程序,寫操作時由用戶程序?qū)⑿枰敵龅臄?shù)據(jù)通過它傳遞給驅(qū)動程序。需要注意的是,控制碼以及輸入、輸出緩沖區(qū)的具體格式由驅(qū)動程序自行規(guī)定,操作系統(tǒng)對此不予干涉。第11章Windows環(huán)境下輸入輸出程序設(shè)計三個控制碼800H、801H和802H分別對應(yīng)于讀配置信息93 8255A的PA口接8路開關(guān)的輸入,PB口輸出,接8個發(fā)光二極管。 程序的功能是將PA輸入的開關(guān)量,向PB口輸出,用8個開關(guān)分別控制8個發(fā)光二極管。 輸入全零時,程序結(jié)束運行。使用實驗儀8255A芯片進行開關(guān)量輸入輸出第11章Windows環(huán)境下輸入輸出程序設(shè)計 8255A的PA口接8路開關(guān)的輸入,PB口輸出,接8個發(fā)94 下面的示例程序中,"\\\\.\\PCI9052Device0"是設(shè)備名,只要安裝了設(shè)備驅(qū)動程序,系統(tǒng)就可認出該設(shè)備名。 除了主函數(shù),示例程序還包含了四個子函數(shù)。
OpenDevice函數(shù)打開設(shè)備,如果成功則返回設(shè)備句柄,失敗則程序結(jié)束。
GetPCIConfig函數(shù)讀取設(shè)備的配置信息,如果不成功,程序也要結(jié)束。
ReadIO和WriteIO是對IO端口的讀、寫函數(shù)。
上面三個子函數(shù)都通過調(diào)用API函數(shù)DeviceIoControl()實現(xiàn)他們各自的功能,區(qū)別主要在于使用了不同的控制代碼。使用實驗儀8255A芯片進行開關(guān)量輸入輸出第11章Windows環(huán)境下輸入輸出程序設(shè)計 下面的示例程序中,"\\\\.\\PCI9052Devi95示例程序函數(shù)關(guān)系第11章Windows環(huán)境下輸入輸出程序設(shè)計示例程序
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 借款投資合作合同范本
- 公司廠房抵押合同范本
- ktv經(jīng)營合同范本
- 與商戶合同范本
- 親戚之間租車合同范本
- 勞動合同范本 日語
- 2024年重慶市榮昌區(qū)人民醫(yī)院招聘筆試真題
- 中國監(jiān)理合同范本
- 中山餐飲合同范本
- 2024年河源市紫金縣藍塘鎮(zhèn)招聘考試真題
- 港口集裝箱物流系統(tǒng)建模與仿真技術(shù)研究-教學(xué)平臺課件
- 合肥市城市大腦·數(shù)字底座白皮書2020
- 杭州灣跨海大橋項目案例ppt課件
- (完整版)光榮榜25張模板
- 機電預(yù)留預(yù)埋工程施工組織設(shè)計方案
- 工業(yè)催化劑作用原理—金屬氧化物催化劑
- 2022年三八婦女節(jié)婦女權(quán)益保障法律知識競賽題庫及答案(共290題)
- 優(yōu)秀教材推薦意見(真實的專家意見)
- Of studies原文譯文及賞析
- QTD01鋼質(zhì)焊接氣瓶檢驗工藝指導(dǎo)書
- 辛棄疾生平簡介(課堂PPT)
評論
0/150
提交評論