Windows 2000內核模式驅動(dòng)程序設計
摘要:介紹了Windows2000驅動(dòng)程序模型的基本結構、設計和開(kāi)發(fā)的基本問(wèn)題。并以PCI接口的ATM信令接口卡開(kāi)發(fā)的驅動(dòng)程序部分為例,簡(jiǎn)單介紹了驅動(dòng)程序開(kāi)發(fā)的方法和步驟.并介紹了驅動(dòng)程序開(kāi)發(fā)環(huán)境的設置及編譯方法。這種內核模式驅動(dòng)程序設計的開(kāi)發(fā)過(guò)程得到了簡(jiǎn)化,并降低了其復雜性。
本文引用地址:http://dyxdggzs.com/article/149059.htm關(guān)鍵詞:Windows2000;驅動(dòng)程序模型;ATM信令接口
0引言
設備驅動(dòng)程序是直接同硬件打交道的軟件模塊。在Windows2000中,微軟公司在WindowsNT4.0的驅動(dòng)程序結構基礎上,同時(shí)引入了Windows9X的即插即入特性,推出了新的驅動(dòng)程序結構模式(WDM)。WDM通過(guò)提供一種靈活的方式來(lái)簡(jiǎn)化驅動(dòng)程序的開(kāi)發(fā),在實(shí)現對新硬件支持的基礎上減少并降低所必須開(kāi)發(fā)的驅動(dòng)程序的數量和復雜性。在Windows2000中的驅動(dòng)程序可以分為2大類(lèi):用戶(hù)模式驅動(dòng)程序和內核模式的驅動(dòng)程序。用戶(hù)模式驅動(dòng)程序是與子系統特定相關(guān)的,它包含了Win32多媒體驅動(dòng)程序、支持MS-DOS應用程序的虛擬設備驅動(dòng)程序VDD(VirtualDeviceDriver)。內核模式驅動(dòng)程序有3種基本類(lèi)型,每一種都有稍微不同的結構和完全不同的功能,即最高層驅動(dòng)程序(如文件系統驅動(dòng)程序(FSD))、中間層驅動(dòng)程序(例如虛擬磁盤(pán)、鏡像或設備類(lèi)型特定的外圍設備)、底層驅動(dòng)程序(例如PnP硬件總線(xiàn)驅動(dòng)程序)。在Windows2000操作系統下的驅動(dòng)程序開(kāi)發(fā)分為3個(gè)主要的領(lǐng)域:WDM驅動(dòng)程序、文件系統驅動(dòng)程序和小端口驅動(dòng)程序,見(jiàn)圖1。其中小端口驅動(dòng)程序針對的是顯示設備、SCSI和網(wǎng)絡(luò )設備等特定領(lǐng)域;文件系統驅動(dòng)程序針對的是存儲設備;WDM驅動(dòng)程序針對的則是計算機應用系統開(kāi)發(fā)所面對的大多數情況。本文我們討論了WDM內核模式的驅動(dòng)程序設計的一般問(wèn)題,雖然其他類(lèi)型驅動(dòng)程序與WDM內核模式驅動(dòng)程序開(kāi)發(fā)有所不同,但只要掌握了WDM內核模式驅動(dòng)程序開(kāi)發(fā)的基礎,結合2種基本類(lèi)型的本身特點(diǎn),就能夠很快掌握設計方法。

1WDM的基本原理
WDM是一個(gè)模塊化的、分層次類(lèi)型的微型驅動(dòng)程序結構,層次結構如圖2所示,其中左邊是一個(gè)設備對象堆棧,右邊為驅動(dòng)程序的分層結構。在WDM驅動(dòng)程序模型中,每個(gè)硬件至少要包含功能驅動(dòng)程序和總線(xiàn)驅動(dòng)程序2個(gè)層??偩€(xiàn)驅動(dòng)程序為總線(xiàn)上發(fā)現的每個(gè)設備創(chuàng )建物理設備對象PDO,每個(gè)功能設備驅動(dòng)程序創(chuàng )建自己的功能設備對象FDO。在驅動(dòng)程序中不是直接操作硬件,而是操作相應的PDO與FDO。來(lái)自用戶(hù)模式API的I/O請求包(IRP)送到設備堆棧的最上層驅動(dòng)程序,然后逐漸過(guò)濾到下層的驅動(dòng)程序。每一層驅動(dòng)程序都可以決定如何處理IRP。內核模式的WDM驅動(dòng)程序有著(zhù)可移植性、可配置性、基于對象、包驅動(dòng)等共有的屬性。

用戶(hù)態(tài)程序和內核通過(guò)設備對象訪(fǎng)問(wèn)設備驅動(dòng)程序的設備。WDM驅動(dòng)程序有2種方法提供
Win32程序可用的名稱(chēng),舊的方法是在驅動(dòng)程序的設備創(chuàng )建時(shí),通過(guò)函數IoCreate-SymbolicLink創(chuàng )建一個(gè)符號鏈接名,新的方法是使用128位的設備接口標識(GUID)。在驅動(dòng)程序編寫(xiě)中,該GUID可以通過(guò)Windows提供的guidgen.exe工具生成。
2WDM驅動(dòng)程序的結構及設計
內核模式的驅動(dòng)程序不同于常規的應用程序,可以把一個(gè)完整的驅動(dòng)程序看作是一個(gè)容器,它包含許多例程,當操作系統遇到一個(gè)IRP時(shí),它就調用這個(gè)容器中的例程來(lái)執行該IRP的各種操作。圖3表示了這一概念。在每一個(gè)WDM驅動(dòng)程序中,都必須擁有DriverEntry、AddDevice、DispatchPnP、DispatchPower和DispatchWmi這5個(gè)例程,其他的例程則是可選的。需要對IRP排隊的驅動(dòng)程序一般都有一個(gè)StartIo例程,執行DMA傳輸的驅動(dòng)程序應有一個(gè)AdapterControl例程。大部分能生成硬件中斷的設備,其驅動(dòng)程序都有一個(gè)中斷服務(wù)例程(ISR)和一個(gè)延遲過(guò)程調用(DpcForIsr)例程。驅動(dòng)程序一般都有幾個(gè)支持不同類(lèi)型IRP的分發(fā)例程。WDM驅動(dòng)程序開(kāi)發(fā)者的主要任務(wù)就是為如圖3所示的容器選擇,并完成所需要的例程。

當I/O管理器裝入驅動(dòng)程序時(shí),它調用每個(gè)驅動(dòng)程序必須有的DriverEntry例程,以用來(lái)初始化驅動(dòng)程序范圍的數據結構和資源。一般來(lái)說(shuō),在DriverEntry例程中通常完成以下功能:①找到所要控制的硬件;②在驅動(dòng)程序對象中設置驅動(dòng)程序的Dispatch-,AddDevice,Startio(如果有)和UN-LOAD(如果有)等分發(fā)例程的程序的入口點(diǎn);③建立所有驅動(dòng)程序對象或其他系統資源;④返回的NTSTATUS表明驅動(dòng)程序是否成功裝入,并能接收和處理來(lái)自PnP管理器的配置、增加(AddDevice)及啟動(dòng)其設備的請求。對于功能驅動(dòng)程序,AddDevice函數的基本職責是創(chuàng )建一個(gè)設備對象并把它聯(lián)接到以PDO為底的設備堆棧中。分發(fā)(Dispatch)例程是設備驅動(dòng)程序提供的主要函數。當被調用去執行一個(gè)I/O操作時(shí),Windows2000通過(guò)實(shí)現Dispatch例程來(lái)處理來(lái)自用戶(hù)模式應用程序的請求或來(lái)自系統的其他地方的請求。
一個(gè)完整的驅動(dòng)程序要完成以下工作:初始化;創(chuàng )建與刪除設備;處理應用層程序的打開(kāi)和關(guān)閉句柄的請求;處理應用層程序的輸入/輸出請求;串行化對設備的訪(fǎng)問(wèn);訪(fǎng)問(wèn)硬件;調用其他驅動(dòng)程序;取消I/O請求;處理可熱插拔設備的加入和刪除事件;電源管理和WMI;對能夠產(chǎn)生中斷的設備進(jìn)行中斷處理。
操作系統使用I/O請求包(IRP)的數據結構與內核模式驅動(dòng)程序通信。IRP是一個(gè)內核對象,它是一個(gè)預先定義的數據結構,帶有一組對它進(jìn)行操作的I/O管理器例程。I/O管理器接收一個(gè)I/O請求后分配并初始化一個(gè)IRP。一個(gè)IRP有一個(gè)固定的首部和可變數目的IRP堆棧單元塊,每個(gè)堆棧單元塊都對應一個(gè)將處理該IRP的驅動(dòng)程序,因此這些堆棧塊至少應與驅動(dòng)程序堆棧中將要處理這一請求的驅動(dòng)程序數目一樣多。每個(gè)I/O請求有一個(gè)主功能代碼(IRP_M(jìn)J_XXX),并可能有次功能代碼(IRP_M(jìn)N_XXX)。主功能代碼決定了該I/O請求調用的分發(fā)例程的驅動(dòng)程序入口點(diǎn)。分發(fā)例程接收到I/O請求后進(jìn)行如下處理:確認I/O請求的合法性;盡可能在分發(fā)例程中直接完成該I/O請求;如果該請求不能在驅動(dòng)程序的分發(fā)例程中被處理完,驅動(dòng)程序就把這個(gè)請求排進(jìn)隊列,以便以后完成處理。WDM驅動(dòng)程序提供了2種I/O請求排隊的方法:I/O管理器管理的系統排隊和驅動(dòng)程序自己管理的驅動(dòng)程序排隊。
c++相關(guān)文章:c++教程
評論