




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第11章Windows環境下輸入輸出程序設計2023/6/9第11章Windows環境下輸入輸出程序設計Windows是一個多任務操作系統,在保護模式下工作。Windows操作系統不支持用戶程序對計算機底層硬件進行直接控制。用戶程序需要輸入/輸出時,可以通過通過API(ApplicationProgramInterface,應用程序接口)來調用設備驅動程序,對設備實現間接控制,進行輸入/輸出。Windows9x使用VxDs(VirtualDeviceDriver’s,虛擬設備驅動)設備驅動程序。Windows2000/XP使用WDM(WindowsDriverModel,Windows驅動程序模型)設備驅動程序。第11章Windows環境下輸入輸出程序設計11.1Windows設備驅動程序
11.1.1虛擬設備 在多任務運行環境下,計算機內的硬件、軟件資源為多個任務共享。任何一個用戶程序都不能獨占系統的硬件、軟件資源。虛擬設備實質上是真實物理設備的部分資源和相關軟件的組合,用來完成用戶程序需要的功能。虛擬設備不但可以代表實際存在的硬件設備,還可以模擬實際上不存在的“設備”,供用戶使用。計算機上的“虛擬光驅”就是一個典型的虛擬設備。與這個設備同名的物理設備是不存在的,用戶使用的是硬盤的部分存儲空間以及相應的服務程序。第11章Windows環境下輸入輸出程序設計使用虛擬設備好處:實現多任務對系統資源的共享,方便用戶的使用;實現任務與任務、任務與系統之間的隔離和保護;規范外部設備輸入、輸出方法,使不同工作方式的設備用相同的方式進行輸入輸出。對Windows應用程序來講,虛擬設備就是真實設備,應用程序分不清那個設備是由真實硬件支持的真實設備,那個設備是由虛擬設備驅動程序模擬的虛擬設備。第11章Windows環境下輸入輸出程序設計11.1.2
Windows9X設備驅動程序Windows9x是一個分層結構的操作系統,由工作在兩個不同層面的組件構成:頂層組件,工作在Ring3層;底層組件,工作在Ring0層。第11章Windows環境下輸入輸出程序設計頂層:Windows9x操作系統的頂層組件工作在特權級3,稱為ring3層。它給應用程序的運行提供Win32API服務。Windows9x應用程序和Win32API服務一起構成操作系統的頂層,稱為系統虛擬機(VM,VirtualMachine)。對于一個任務來說,這些服務程序以及他們所掌控的硬件資源就是一臺“實實在在”的計算機。但是,對于整個系統來說,他們只是由操作系統向用戶提供的一個運行用戶程序的平臺,包括為這個應用程序服務的操作系統組件和部分的硬件資源。每一個DOS應用程序都在一個獨立的虛擬機中運行,操作系統允許多個虛擬機同時處于運行狀態。第11章Windows環境下輸入輸出程序設計底層:Windows9x操作系統的底層組件工作在0特權級,稱為ring0層,它就是虛擬機管理器(VMM,VirtualMachineManager)。Windows9x虛擬機管理器由一個內核服務集和許多虛擬設備驅動程序(VxDs,VirtualDeviceDriver’s)組成。許多VxDs是由Microsoft公司隨操作系統提供的,如鍵盤和顯示器等的VxDs,有的VxD則由設備制造商提供,或者由用戶自行編寫。VxD用來支持特定的硬件或軟件,完成需要的功能。VxDs中的程序運行在ring0層,可以執行所有的指令,完成所需的任何軟硬件的操作。第11章Windows環境下輸入輸出程序設計 對于應用程序而言,虛擬機管理器是透明的,應用程序感覺不到管理器的存在。 微軟已經宣布,從2006年6月起不再提供對Windows9x的技術支持。因此,Windows9x和VxDs的使用將逐漸減少。隨著Windows2000/XP的廣泛使用,WDM驅動程序的開發和使用已成為主流。第11章Windows環境下輸入輸出程序設計11.1.3
Windows2000/XP設備驅動程序Windows2000操作系統組件的層次結構 Windows2000操作系統的功能模塊劃分為用戶模式和內核模式兩大類。用戶模式的操作系統功能模塊工作在ring3層,他們不能使用CPU中的特權指令,連同IN、OUT這樣的非特權指令也被禁止。所有的用戶程序都在這一層上運行。內核模式的操作系統模塊工作在ring0層,可以使用CPU的任何指令。第11章Windows環境下輸入輸出程序設計Windows2000操作系統的層次結構第11章Windows環境下輸入輸出程序設計2.Windows2000的設備驅動程序Windows2000的驅動程序也有兩種不同的類型。
用戶模式驅動程序工作在用戶模式,通過調用內核模式驅動程序實現指定的功能。用戶模式驅動程序不能直接對硬件設備進行訪問,僅僅用于構建一個硬件或軟件的運行環境。
Windows內核驅動程序工作在內核模式,可以直接訪問硬件設備。每個設備驅動程序都有一組完成各種功能的函數,通過調用這些函數可以對某一設備完成特定的操作。第11章Windows環境下輸入輸出程序設計內核模式驅動程序的類型文件系統驅動程序可以在本地硬盤、網絡、移動存儲設備或各種有存儲能力的硬件設備實現標準的文件系統,如FAT32、NTFS系統等。PnP驅動程序是一種遵循Windows2000即插即用協議的內核模式驅動程序。WDM驅動程序是一種PnP驅動程序。它同時還遵守電源管理協議。顯示驅動程序是一種特殊的內核驅動程序。此類的驅動程序還有打印驅動程序、多媒體驅動程序、網絡驅動程序等。遺留設備驅動程序主要用在WindowsNT系統中,它也可以運行在Windows2000系統中。第11章Windows環境下輸入輸出程序設計Windows2000內核模式驅動程序的類型第11章Windows環境下輸入輸出程序設計11.2WDM驅動程序
WDM是Microsoft力推的新型驅動程序模型,首先出現在WindowsNT中,現在的Windows98/Me/2000/XP都支持WDM。微軟宣稱,在后續的操作系統中將繼續支持WDM。第11章Windows環境下輸入輸出程序設計WDM是一個分層的驅動程序。它至少有功能驅動程序(Functiondriver)和總線驅動程序(Busdriver)兩個層面。功能驅動程序提供一個設備的使用功能,或者可以認為它就是一個設備的驅動程序。用戶程序需要使用該設備時,需要調用功能驅動程序中的功能函數。總線驅動程序負責系統啟動時設備的安裝、檢測,并確定設備的資源使用情況。設備的啟動、停止,設備的初始化,設備的電源管理等功能也都由總線驅動程序提供。11.2.1WDM驅動程序模型和層次結構第11章Windows環境下輸入輸出程序設計 WDM引入了
功能設備對象FDO(FunctionalDeviceObject)
物理設備對象PDO(PhysicalDeviceObject)
兩個新概念來描述硬件。一個PDO對應一個真實硬件。一個硬件只允許有一個PDO,卻可以擁有多個FDO,在驅動程序中直接操作的不是硬件而是相應的PDO與FDO。根據具體的需要還可以選擇過濾驅動程序(filterdriver)。第11章Windows環境下輸入輸出程序設計Windows20000的輸入輸出是包驅動的應用程序調用WDM驅動程序時,系統為每一個用戶的請求打包,形成一個I/O請求包(I/ORequestPackage,IRP),然后將其發送至驅動程序。IRP中的PDO字段用來區別是發送給哪一個設備的。某個層次的驅動程序得到IRP后,分析其中的請求,完成本層應該完成的任務。如果IRP要求的任務已經完成,該層次的驅動程序就向上一層傳送結果并逐層返回。如果IRP中的請求尚未完成,那么就繼續向下層驅動程序傳遞這個IRP。內核組件就是這樣通過發送IRP來運行驅動程序中的代碼第11章Windows環境下輸入輸出程序設計WDM驅動程序層次與I/O請求過程第11章Windows環境下輸入輸出程序設計11.2.2
WDM驅動程序開發工具 目前有兩個主要的工具來開發設備驅動程序,一個是Microsoft公司提供的WindowsDDK。它有Windows98DDK、Windows2000DDK、WindowsXPDDK和Windows2003DDK四個版本,分別用來支持相應的四個操作系統中VxD和WDM驅動程序的開發。 用WindowsDDK開發驅動程序難度較大。第11章Windows環境下輸入輸出程序設計另一個驅動程序開發工具是NuMega公司提供的DriverStudio,其中包含VtoolsD、DriversWorks、DriversNetWorks和SoftICE。VtoolsD用來開發Windows98的VxD驅動程序。DriversWorks和DriversNetWorks分別用來開發一般設備和網絡設備的WDM驅動程序。SoftICE是一個功能強大的調試工具。第11章Windows環境下輸入輸出程序設計DriverStudio的開發是建立在WindowsDDK的基礎上的,安裝DriverStudio時,先要安裝WindowsDDK。DriverStudio將WindowsDDK的內容封裝在一些基本的類中,使用VC++編程。使用DriverStudio來開發Windows的驅動程序,相對WindowsDDK來講要容易得多。DriverStudio使用開發向導,幫助你建立編寫驅動程序所需要的工程文件和程序框架文件,這些文件已經組成了一個完整的設備驅動程序。接下來的工作就是將這些文件導入到VC++的開發環境中,添加具體的操作代碼,進行進一步的開發。第11章Windows環境下輸入輸出程序設計11.2.3
DriverStudio中的WDM驅動程序結構
從基本WDM啟動程序的兩個頭文件中可以大致看清WDM驅動程序的基本框架結構。KDriver是WDM驅動程序的基類,任何驅動程序都要從繼承該類開始。SimpleWdmDriver驅動程序從派生KDriver類開始。SimpleWdmDevice是KPnpDevice類的派生類。重載其某些成員函數便可處理相應事件的發生。第11章Windows環境下輸入輸出程序設計最重要的方法是virtualNTSTATUSDeviceControl(KIrpI),應用程序中原本需要對硬件設備的I/O訪問指令被移到了DeviceControl中。應用程序需要訪問硬件設備時,可以使用DeviceIoControl函數,最后DeviceIoControl會調用DeviceControl,從而完成對設備的I/O訪問。可以說DeviceControl就是功能驅動程序。第11章Windows環境下輸入輸出程序設計//HelloWdm.h-includefileforbasicWDMdriverclassSimpleWdmDriver:publicKDriver{public:
//DriverEntry負責驅動程序的初始化,必須重載 virtualNTSTATUS
DriverEntry(PUNICODE_STRINGRegistryPath);
//AddDevice初始化驅動程序所控制的設備,必須重載virtualNTSTATUSAddDevice(PDEVICE_OBJECTPdo);
//Unload刪除由DriverEntry所分配的資源 virtualVOIDUnload(void);};第11章Windows環境下輸入輸出程序設計//hellodev.h-includefilefordeviceclassofbasicdriverclassSimpleWdmDevice:publicKPnpDevice{public: SimpleWdmDevice(PDEVICE_OBJECTPdo,ULONGUnit);
//PlugandPlayhandlers NTSTATUSOnStartDevice(KIrpI); //設備啟動時調用。 NTSTATUSOnStopDevice(KIrpI); //設備停止時調用。 NTSTATUSOnRemoveDevice(KIrpI);
//設備刪除時調用。
//UserControlhandlers
//設備打開時調用,應用程序使用Create函數時調用。第11章Windows環境下輸入輸出程序設計virtualNTSTATUSCreate(KIrpI); //設備關閉時調用,即應用程序使用Create函數時調用。virtualNTSTATUSClose(KIrpI); //設備功能調用,應用程序使用DeviceIoControl函數時被調用 virtualNTSTATUSDeviceControl(KIrpI); //PowerManagementhandlers NTSTATUSOnDevicePowerUp(KIrpI); // NTSTATUSOnDeviceSleep(KIrpI); //設備睡眠時調用 NTSTATUSOnSetPower(KIrpI); // NTSTATUSDefaultPnp(KIrpI); // NTSTATUSDefaultPower(KIrpI); };第11章Windows環境下輸入輸出程序設計11.3Windows2000/XP下輸入
輸出的實現Windows是一個基于“消息傳遞”機制的多任務操作系統。用戶程序需要訪問硬件設備時,通過調用API函數調用該設備的驅動程序。WIN32將用戶的請求組合成為一個IRP包,向內核發送“消息”。 內核組件根據IRP中的PDO字段,將該“消息”傳送給對應的WDM驅動程序。 驅動程序完成硬件設備的訪問后,向用戶程序返回結果。 調用驅動程序的過程,就是用戶程序和驅動程序之間傳遞消息,交換數據,進行通信的過程。第11章Windows環境下輸入輸出程序設計 用戶程序完成對設備的訪問有兩種方式等待方式下,用戶程序調用驅動程序,等待驅動程序完成對硬件設備的訪問。這種方式編程簡單。異步方式下,應用程序調用驅動程序,啟動了硬件設備后,直接返回進行其它處理,并不等待輸入/輸出完成。硬件設備完成了數據輸入輸出后,由驅動程序通知應用程序進行進一步的處理。這時,需要由驅動程序發起和應用程序的通信。這種方式下,要用到反調函數、Win32事件通知等方法。第11章Windows環境下輸入輸出程序設計CreateFile()函數用來打開設備,獲取設備句柄;設備輸入輸出控制函數DeviceIoControl(),用來調用WDM驅動程序執行相應的操作(包括設備的控制和數據的輸入,輸出);CloseHandle()函數用來關閉設備。也可以使用ReadFile()和WriteFile()函數進行“標準”的輸入/輸出。11.3.1用于輸入/輸出的WIN32API函數第11章Windows環境下輸入輸出程序設計1.打開設備
CreateFile()函數用來打開設備,獲取設備句柄,格式如下:HANDLECreateFile(“\\\\.\\SimpleWDMDevice”, //設備的符號鏈接名GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, //同步打開設備NULL );使用上述函數時,除了設備名之外,不需要改變其它參數。這里假設設備的名字為SimpleWDMDevice。進行打開操作時首先搜索當前目錄,然后搜索Windows系統目錄。第11章Windows環境下輸入輸出程序設計2.DeviceIoControl函數調用DeviceIoControl( HANDLE hDevice, //設備句柄 DWORD dwIoControlCode, //控制代碼 LPVOID lpInBuffer, //輸入數據塊指針 DWORD nInBufferSize,//輸入數據塊大小 LPVOID lpOutBuffer, //輸出數據塊指針 DWORD nOutBufferSize,//輸出數據塊大小 LPDWORD lpBytesReturned, //返回字節長度指針 NULL //同步時為NULL )第11章Windows環境下輸入輸出程序設計DeviceIoControl函數調用參數hDevice是由CreateFile函數獲取的設備句柄。dwIOControlCode是應用程序向WDM驅動程序發出的控制代碼。lpInBuffer和nInBufferSize是應用程序向WDM驅動程序傳送的I/O數據塊的地址及大小。lpOutBuffer、nOutBufferSize和lpBytesReturned是WDM驅動程序返回給應用程序的數據塊的地址、大小以及實際返回的字節數。輸入/輸出緩沖區的格式由驅動程序自行規定。第11章Windows環境下輸入輸出程序設計3.關閉設備 完成對設備的輸入、輸出控制后, 應用程序調用CloseHandle(hDevice)關閉設備。第11章Windows環境下輸入輸出程序設計4.ReadFile和WriteFile函數ReadFile( HANDLE hFile, //設備句柄 LPVOID lpBuffer, //輸入數據塊指針 DWORDnNumberOfBytesToRead,//輸入數據塊大小 LPDWORD lpNumberOfBytesRead, //返回的字節數長度指針 NULL ) //同步時為NULLWriteFile( HANDLE hFile, //設備句柄 LPVOID lpBuffer, //輸出數據塊指針 DWORDnNumberOfBytesToWrite,//輸出數據塊大小 LPDWORD lpNumberOfBytesWritten,
//實際輸出的字節數長度指針 NULL ) //同步時為NULL第11章Windows環境下輸入輸出程序設計 本節以Aedk-LabPCI計算機接口實驗儀為例,介紹WDM驅動程序的使用。 該實驗設備由一塊PCI接口卡和一臺接口實驗儀組成,將PCI接口卡插入PC機的PCI總線插槽,用連接線把PCI卡和實驗機相連接,整個實驗儀就成為PC機的一臺“外部設備”。在監控軟件的控制下,進行PC機與實驗儀的通訊,實現對實驗過程的全程控制。 PCI卡采用了PLX公司的PCI9052芯片作為接口芯片。11.3.2Windows2000/XP下輸入輸出舉例第11章Windows環境下輸入輸出程序設計 進行硬件連接之后,需要安裝驅動程序,在Win2000中也就是安裝WDM驅動程序。 在實驗設備所附帶的軟件中,驅動程序文件有兩個:INF文件,稱為設備信息文件,供驅動程序安裝時使用。INF文件指明了硬件驅動該如何安裝到系統中,源文件在哪里、安裝到哪一個文件夾中、怎樣在注冊表中加入與設備有關的信息等;后綴為sys的文件,是整個實驗儀的驅動程序。一般情況下,INF文件會被復制到Windows2000系統目錄中的INF子目錄中,Sys文件被復制到System32/drivers子目錄中。第11章Windows環境下輸入輸出程序設計安裝驅動程序后,在設備管理器中可以看到相應的設備第11章Windows環境下輸入輸出程序設計//設備的頭文件//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環境下輸入輸出程序設計//設備的頭文件//PCI卡配置信息structpci_cfg{ ULONG MemBase[2]; //內存基地址 ULONG MemLength[2]; //內存大小 ULONG IOBase[2]; //IO基地址 ULONG IOPortLength[2]; //IO基長度 ULONG IRQ; //中斷號}; //數據緩沖區structBuffers{ ULONG Address; UCHAR Data;};第11章Windows環境下輸入輸出程序設計三個控制碼800H、801H和802H分別對應于讀配置信息、IO讀和IO寫。pci_cfg是PCI配置信息的格式,下面的示例程序只用到了IOBase[2]數組,其中可以存放該PCI設備申請獲得的三處IO空間的首地址。Buffers是應用程序和驅動程序交換數據的緩沖區格式。Buffers有兩個域,地址域名為Address,由用戶程序向驅動程序傳遞需要讀寫的IO端口地址,另一個是數據域Data,讀操作時由驅動程序將讀到的數據通過它傳遞給用戶程序,寫操作時由用戶程序將需要輸出的數據通過它傳遞給驅動程序。需要注意的是,控制碼以及輸入、輸出緩沖區的具體格式由驅動程序自行規定,操作系統對此不予干涉。第11章Windows環境下輸入輸出程序設計 8255A的PA口接8路開關的輸入,PB口輸出,接8個發光二極管。 程序的功能是將PA輸入的開關量,向PB口輸出,用8個開關分別控制8個發光二極管。 輸入全零時,程序結束運行。使用實驗儀8255A芯片進行開關量輸入輸出第11章Windows環境下輸入輸出程序設計 下面的示例程序中,"\\\\.\\PCI9052Device0"是設備名,只要安裝了設備驅動程序,系統就可認出該設備名。 除了主函數,示例程序還包含了四個子函數。
OpenDevice函數打開設備,如果成功則返回設備句柄,失敗則程序結束。
GetPCIConfig函數讀取設備的配置信息,如果不成功,程序也要結束。
ReadIO和WriteIO是對IO端口的讀、寫函數。
上面三個子函數都通過調用API函數DeviceIoControl()實現他們各自的功能,區別主要在于使用了不同的控制代碼。使用實驗儀8255A芯片進行開關量輸入輸出第11章Windows環境下輸入輸出程序設計示例程序函數關系第11章Windows環境下輸入輸出程序設計 主函數首先打開設備,讀取PCI卡的配置信息。實驗設備中8255的片選端連接在譯碼器的最低端,因此,PCI卡的IO基地址就是8255的PA口地址,依次是PB口的地址、PC口的地址和控制口的地址。 用戶編寫的ReadIO函數調用DeviceIoControl函數時,輸入和輸出緩沖區使用同一個緩沖區buf。端口地址是輸入參數,調用之前預先置入輸入緩沖區buf的Address字段。讀操作獲得的數據是輸出參數,調用完成后從buf的Data字段中取得。 主函數從PA口讀入數據,然后向PB口輸出,這樣就可以用8個開關來分別控制8個發光二極管。讀入數據data為零時,程序結束。第11章Windows環境下輸入輸出程序設計//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環境下輸入輸出程序設計 if(hDevice==INVALID_HANDLE_VALUE) { printf("請檢查PCI卡和驅動程序\n"); exit; } returnhDevice;}第11章Windows環境下輸入輸出程序設計voidGetPCIConfig(HANDLEhDevice){ BOOLstatus; DWORDrc; status=DeviceIoControl(hDevice,IOCTL_PCI_CON, NULL,0,&pci,sizeof(pci_cfg),&rc,NULL); //調用DeviceIoControl函數; //獲取PCI設備配置 if(!status){ printf("無法獲取pci配置信息\n"); exit; } return;}第11章Windows環境下輸入輸出程序設計 if(hDevice==INVALID_HANDLE_VALUE) { printf("請檢查PCI卡和驅動程序\n"); exit; } returnhDevice;}第11章Windows環境下輸入輸出程序設計 voidWriteIO(WORDport,BYTEd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025商場攤位租賃合同范本
- 2025健身房合作合同范本模板
- 2025合同績效評估與獎懲機制
- 2025標準版合同租賃協議
- 2025桐鄉市茶葉收購合同范本
- 2025勞動合同法律法規要點梳理
- 2024年環磷酰胺原料藥項目資金申請報告代可行性研究報告
- 2025年中國合同法范本
- 2025年中國農業銀行教育貸款合同范本
- 2025多方協作合同協議范本
- 直播電商運營實務PPT完整全套教學課件
- 醫患溝通技巧培訓
- 消化系統藥 抗消化性潰瘍藥 (護用藥理學)
- 山東省青島市第一中學 年自主招生考試數學試題( )
- GB/T 4798.1-1986電工電子產品應用環境條件貯存
- GB/T 20388-2006紡織品鄰苯二甲酸酯的測定
- 銀行結售匯統計案例分析
- 語文五年級下冊教學課件部編版-第六單元 習作:神奇的探險之旅
- 行車吊裝作業安全風險分級清單
- 電梯日常巡視記錄表(日檢查表)
- 小學生生理衛生班會
評論
0/150
提交評論