摘要:該文介紹了WDM的特點與結構;闡述了I/O設備驅動程序的基本構成;探討了DLL在實際應用中的意義。
關鍵詞:WDMDriver;Windows;例程;DLL
中圖分類號:TP316文獻標識碼:A文章編號:1009-3044(2009)33-9557-02
Study about WDM-based I/O Device Driver
SUN Hu-jun
(Department of Computer Engineering, Xi'an Aerotechnical College, Xi'an 710077, China)
Abstract: This article describes the characteristics and structure of the WDM; Describes I/O device driver a basic component;Discusses the DLL in the practical application significance.
Key words: WDMDriver; Windows; distance; DLL
在計算機應用系統和控制系統的開發過程中,通常需要在Windows 環境下,直接訪問和控制具有特定功能的硬件設備。由于操作系統版本不同,其運行機制必然存在差異。在這里針對驅動程序的運行機制主要分為兩類。一類是以前的Dos 和Windows98系統,在這類環境下可以直接完成對I/O 端口的讀寫;另一類是NT4.0以上版本Windows系統,在這類環境下,為了使系統變得更為安全,Windows對系統底層操作采取了屏蔽策略,不允許用戶態的應用程序直接訪問I/O端口,而是通過編寫驅動程序,這樣可以使用Kernel層設備驅動程序提供的各種服務間接地訪問I/O,因此編寫I/O設備驅動程序極為重要。
為了解決I/O設備驅動程序和不同結構操作系統的兼容性[3],微軟公司在 1997年提出了一種全新的Windows 驅動程序模式(WDM),支持即插即用、電源管理和WMI技術,為存在于Windows 9x 和Windows 2000 操作系統中的設備驅動程序提供了統一的參考框架。
1 WDM系統函數
WDM 驅動程序包含了許多子例程,操作系統通過調用相關例程來執行針對I/O 請求包的各種操作[1]。WDM 驅動程序可執行包中的內容如下:
1.1 基本驅動程序與設備操作
DrvierEntry、 AddDevice
① DriverEntry例程負責初始化程序范圍的數據結構和資源。
② AddDevice例程是被系統調用,進行初始化一個被枚舉的新設備。
1.2 I/O 控制
DpcForIsr、OnInterrupt、StartIo、AdapterControl
① StartIo例程進行串行處理,對IRP進行排隊。
② AdaperControl例程負責執行DMA 傳輸。
③ OnInterrupt是一個中斷服務例程。
④ DPC是一個延遲過程調用例程。
1.3 派發功能函數
DispatchWriter、DispatchRead、DispatchWmi、DispatchPnp DispatchPower
Dispatch為調度例程,負責處理應用程序與驅動程序之間的通信,包括Writer,Read等,開發人員必須選擇特定驅動中需要的例程。
1.4 設備的創建和初始化
1) 內核模式驅動程序沒有main或WinMain,而是由I/O管理器根據需要調用一個驅動程序例程:① 驅動程序被裝入時;② 驅動程序被卸出或系統關閉時;③ 用戶程序發出I/O系統服務調用時;④ 共享硬件資源對驅動程序可用時;⑤ 設備操作過程中的任何時候。
2) 相關內容:① 所有驅動程序必須包含DriverEntry例程,進行驅動程序初始化。② 利用AddDevice函數負責創建一個設備對象,并建立一個私有的設備擴展對象。③ 給出設備名并創建符號連接名或者注冊設備接口。④ 初始化設備擴展和設備對象的標志位。⑤ 把新設備對象附著到設備堆棧中。
2 硬件的訪問及資源分配
PnP管理器使用IRP來指導驅動程序啟動、停止和刪除設備,并查詢驅動程序的設備,WDM是PnP驅動程序,必須具備PnP例程。IRP是DDK定義的一個數據結構。當驅動程序接收到PnP子碼IRP_MN_START_DEVICE 時,IRP堆棧列表內的兩個字段AllocatedResourcesTranslated 和AllocatedResources,列出分配的資源。
用來描述這些資源的結構是CM_PARTIAL_RESOURCE_LIST 類型,它包括一個CM_PARTIAL_RESOURCE_DESCRIPTOR 結構的計數數組。
數組中每一個資源描述符都有一個Type 成員[3],它表示所代表的資源的類型。主要有4個重要的共同體類型是Port(端口)、Interrupt(中斷)、Memory(內存)、Dma(直接內存訪問)。得到了設備的I/O地址,就可以對設備進行讀取了,在讀寫端口地址和內存時應該使用標準的內核讀取例程,在WDM 中應使用HAL宏等。這樣就可以不用考慮不同操作平臺的特性,也可以更好的適應Windows 2000 多任務,多進程環境的要求。
在分配硬件資源時,首先必須編輯安裝文件(inf文件),它包含了WDM 設備驅動程序的制造商信息、要復制的文件列表、要創建的注冊表項等。INF 安裝文件向操作系統添加了硬件資源。當驅動程序收到IRP_MJ_PNP 的IRP_MN_START_DEVICE 的子碼時,驅動程序獲得設備的硬件資源。
3 動態鏈接庫(.dll)
雖然驅動程序是為設備硬件層編程服務的,但同樣需要和應用程序進行通信,從而最終達到應用程序控制設備的目的。
通常情況下,應用程序通過專用的API 函數操作硬件,但由于這些函數攜帶參數很多,使用起來并不方便,因此可以另外開發一套用于中轉數據的功能函數集(動態鏈接庫),可以使得底層驅動設備對用戶是透明的[2]。采用這種分層結構,應用程序通過動態鏈接庫(.dll)來存取I/O設備。動態鏈接庫(.dll)提供給應用程序最常用的接口函數,包括設備初始化,關閉設備,存取端口等。在應用程序中加入特定的動態鏈接庫可以很方便的操作端口,并且可以重復使用,縮短了開發周期。
4 結束語
WDM驅動程序模型具有較好的可移植性:編寫驅動程序時,WDM規定只使用ANSI C標準規定的語言元素;硬件和軟件的可配置性靈活:使用HAL工具調用低級總線驅動程序或實現一個標準控制接口,避免直接引用硬件;使用注冊表作為配置信息的容器;可運行在多處理器平臺上。基于 WDM 驅動模型設計的驅動程序可以穩定地在Windows 2000/XP/NT下運行,可以更好的實現分布式的數據監測和控制。
參考文獻:
[1] 武安河.WDM設備驅動程序開發[M].北京:電子工業出版社,2003.
[2] Cant C.Writing Windows WDM Device Drivers[M].孫義,譯.北京:機械工業出版社,2007.
[3] 李建.Windows2000下I/O設備驅動程序設計[D].北京:北方交通大學,2003.
[4] 張帆.Windows驅動開發技術詳解[M].北京:電子工業出版社,2008.
[5] 湯冬誼.Windows NT4.0下設備驅動程序的開發與應用[J].電子技術應用,2000(9).