1. 程式人生 > >Windows驅動模型

Windows驅動模型

Windows有兩種驅動型別,一種是NT式驅動,另一種是WDM式驅動,兩者最大不同是WDM式驅動支援即插即用(PNP)而NT式驅動則不支援。由於USB裝置為即插即用裝置,因此選擇WDM為設計所用型別。

一、資料結構

Windows驅動中有兩個重要的資料結構:DRIVER_OBJECT和DEVICE_OBJECT,兩者結構中部分成員如下:

typedef struct _DRIVER_OBJECT
{
PDEVICE_OBJECT		DeviceObject;
PVOID			DriverStart;
ULONG			DriverSize;
PVOID			DriverSection;
PDRIVER_EXTENSION	DriverExtension;
UNICODE_STRING		DriverName;
PFAST_IO_DISPATCH	FastIoDispatch;
PDRIVER_UNLOAD		DriverUnload;
PDRIVER_DISPATCH	MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+ 1];
……
} DRIVER_OBJECT, *PDRIVER_OBJECT;
其中重要的部分有:

DeviceObject:每個驅動都會有一個或多個裝置物件。每個裝置物件中都有一個指標指向下一物件,最後一個裝置物件的該指標為空,這類似於單向連結串列。驅動物件中的DeviceObject指向的則是這個連結串列中的第一個。通過DeviceObject即可遍歷所有裝置物件。

DriverName:驅動的名字,用UNICODE字串進行記錄,該字串一般為\Driver\[驅動程式名稱]。

DriverUnload:指定該驅動解除安裝時的回撥函式。

MajorFunction:此為一個函式指標陣列,每個指標成員的記錄一個I/O請求包的派遣函式。這一點和Linux下struct usb_driver結構體的介面函式是一樣的原理。如MajorFunction[IRP_MJ_READ]指向的是處理讀請求包的派遣函式,MajorFunction[IRP_MJ_WRITE]指向的是處理寫請求包的派遣函式。這些函式是需要驅動開發者自行編寫並將函式地址賦值給MajorFunction陣列的。

typedef struct _DEVICE_OBJECT
{
PDRIVER_OBJECT		DriverObject;
PDEVICE_OBJECT		NextDevice;
PDEVICE_OBJECT		AttachedDevice;
PIRP			CurrentIrp;
PVOID			DeviceExtension;
DEVICE_TYPE		DeviceType;
CCHAR			StackSize;
……
} DEVICE_OBJECT, *PDEVICE_OBJECT;
 其中重要的部分有:

DriverObject:回指該產生裝置的驅動物件。

NextDevice:指向下一個由同樣驅動產生的裝置物件。通過這個指標產生了上面提到的裝置物件連結串列。

AttachedDevice:WDM驅動模型中驅動和裝置都是分層的。本層驅動產生的裝置可能會有高一層驅動產生的裝置依附在其上面,而AttachedDevice則指向高一層的裝置。該結構也稱為驅動程式的垂直結構,此概念將在下面講述。

Flags:裝置物件的標誌,32個位每一位都代表相應的性質。

DeviceType:指明裝置型別。

DeviceExtension:此指標指向驅動開發者自己定義的資料結構,大小不限,用於儲存一些針對該裝置的特殊資訊。另外驅動程式中避免使用全域性變數,因為全域性變數不易同步,辦法便是將其存入裝置擴充套件中。

StackSize:由於WDM驅動模型中驅動和裝置都是分層的,形成堆疊結構。StackSize會指出當前驅動為堆疊結構的第幾層。

裝置物件和驅動物件這兩種資料結構為Windows驅動結構的形成奠定了基礎。

二、驅動結構

WDM模型中,完成一個裝置的操作,至少需要兩個裝置物件:物理裝置物件(Physical Device Object,PDO)和功能裝置物件(Function Device Object,FDO)。當某裝置被插入時,物理裝置物件被建立,這是由匯流排驅動建立的。該裝置不可被單獨操作,需要功能裝置物件。實際應用中,插入裝置Windows會提示檢測到新裝置並要求安裝驅動,指的就是WDM驅動。此驅動建立功能裝置物件並附加到物理裝置物件之上。物理裝置物件中的AttachedDevice指標會指向功能裝置物件,但實際情況比上述情況複雜。物理裝置物件和功能裝置物件間可能會存在過濾裝置物件,如圖3.3所示。產生這些裝置物件的驅動,有些是系統自帶,而有些需要程式設計師編寫。通過裝置物件的AttachedDevice指標可以找到在其上方的裝置物件;通過在DeviceExtension中定義下層裝置物件的指標可以找到在其下方的裝置物件。


(本文是將相關材料整理後寫出的,來源:張帆. Windows驅動開發技術詳解[M]. 北京:電子工業出版社,2008)

相關推薦

Windows 驅動模型的發展歷史

直接從win95/98說起,因為之前的系統基本上沒有保護模式的概念,程式設計師可以直接修改任意記憶體的資料。在95/98中採用的核心開發模型是VxD(虛擬裝置驅動),在dos時期,程式認為它們擁有系統的一切,嚴格來說95/98是建立在dos的基礎上的作業系統,當dos程式

Windows驅動模型

Windows有兩種驅動型別,一種是NT式驅動,另一種是WDM式驅動,兩者最大不同是WDM式驅動支援即插即用(PNP)而NT式驅動則不支援。由於USB裝置為即插即用裝置,因此選擇WDM為設計所用型別。 一、資料結構 Windows驅動中有兩個重要的資料結構:DRIVER_

linux設備驅動模型之平臺總線實踐環節(一)

linux設備驅動模型1、首先回顧下之前寫的驅動和數據在一起的led驅動代碼,代碼如下:#include <linux/module.h> #include <linux/init.h> #include <linux/leds.h> #include <asm/io

Windows 驅動開發 - 8

time 驅動程序 lis note dcom 驅動開發 cut sla tor 最後的一點開發工作:跟蹤驅動。 一、驅動跟蹤 1. 包括TMH頭文件 #include "step5.tmh"

Guava ---- EventBus事件驅動模型

sim div spa tar 共享 execution ext 實例 處理 在軟件開發過程中, 難免有信息的共享或者對象間的協作。 怎樣讓對象間信息共享高效, 而且耦合性低。 這是一個難題。 而耦合性高將帶來編碼改動牽一發而動全身的連鎖效應。 Spring的風靡正

讓天堂的歸天堂,讓塵土的歸塵土——談Linux的總線、設備、驅動模型

linux 總線 設備 驅動公元1951年5月15日的國會聽證上,美國陸軍五星上將麥克阿瑟建議把朝鮮戰爭擴大至中國,布萊德利隨後發言:“如果我們把戰爭擴大到共產黨中國,那麽我們會被卷入到一場錯誤的時間,錯誤的地點同錯誤的對手打的一場錯誤的戰爭中。”寫代碼,適用於同樣的原則,那就是把正確的代碼放到正確的位置而不

Linux 設備驅動模型

最終 store attrs 模式 用戶 kref 方式 內核 電源管理 Linux系統將設備和驅動歸一到設備驅動模型中了來管理 設備驅動程序功能:     1,對硬件設備初始化和釋放     2,對設備進行管理,包括實參設置,以及提供對設備的統一操作接口     3,

事件驅動模型

image 獨立 之間 如果 png 實例 相等 不知道 響應時間 一、為什麽要用事件驅動模型? 在UI編程中,常常要對鼠標點擊進行相應,首先如何獲得鼠標點擊呢?方式一:創建一個線程,該線程一直循環檢測是否有鼠標點擊。 那麽這個方式有以下幾個缺點:1. CPU資源浪費,可能

Linux audio驅動模型

codec rfi ear code blank 設備 control sdn pos linux驅動 alsa模型: Linux ALSA聲卡驅動之一:ALSA架構簡介 Linux ALSA聲卡驅動之二:聲卡的創建 Linux ALSA聲卡驅動之三:PCM設備

struts2屬性驅動模型

bsp 表單提交 man let 用戶 啟動服務 equal tex 屬性 屬性驅動模型的作用: 因為struts2與servlet API 實現了解耦,無法直接使用HttpServlet Request對象獲取表單提交的參數,但Struts2提供了屬性驅動模型機制來解決這

【轉】Windows驅動開發如何入門

算法 war math.h detail article stat 開發指南 自己 人類 1、http://blog.csdn.net/charlessimonyi/article/details/50904854  (2016年03月16日 14:55:36) 2、 搞W

Linux塊設備IO子系統(一) _驅動模型(轉載)

validate per ring span () VC isp 設備 思路   塊設備是Linux三大設備之一,其驅動模型主要針對磁盤,Flash等存儲類設備,塊設備(blockdevice)是一種具有一定結構的隨機存取設備,對這種設備的讀寫是按塊(所以叫塊設備)進行的,

Linux驅動之平臺設備驅動模型簡析(驅動分離分層概念的建立)

技術 描述 rst 操作 mem iou 系統 簡單 reg Linux設備模型的目的:為內核建立一個統一的設備模型,從而有一個對系統結構的一般性抽象描述。換句話說,Linux設備模型提取了設備操作的共同屬性,進行抽象,並將這部分共同的屬性在內核中實現,而為需要新添加設備

windows 驅動開發 MDL 核心層 使用者層共享記憶體

參考資料    https://blog.csdn.net/wdykanq/article/details/7752909    http://blog.51cto.com/laokaddk/404584   核心層建立記憶體對映使用者層 PVOID

linux裝置驅動模型 - regmap

1. regmap介紹 regmap主要是為了方便操作暫存器而設計的,它將所有模組的暫存器(包括soc上模組的暫存器和外圍裝置的暫存器等) 抽象出來,用一套統一介面來操作暫存器 比如,如果要操作i2c裝置的暫存器,那麼就要呼叫i2c_transfer介面,要操作spi裝置的暫存

linux裝置驅動模型 - device/bus/driver

在linux驅動模型中,為了便於管理各種裝置,我們把不同裝置分別掛在他們對應的總線上,裝置對應的驅動程式也在總線上找,這樣就提出了deivce-bus-driver的模型,硬體上有許多裝置匯流排,那麼我們就在裝置模型上抽象出bus概念,相應的device就代表裝置,driver表示驅動,

linux裝置驅動模型 - sys/kobject

1. sysfs 1.1 sysfs檔案系統註冊 在系統啟動時會註冊sysfs檔案系統 (fs/sysfs/mount.c) int __init sysfs_init(void) { int err; sysfs_root = kernfs_creat

linux裝置驅動模型 - 驅動框架

linux驅動模型框架如圖所示: 1. kernfs 驅動最終是提供給使用者層使用,那麼其中的介面就是通過kernfs檔案系統來註冊,kernfs是一個通用的核心虛擬檔案系統 2. sysfs/kobject sysfs是裝置驅動檔案系統,裝置之間的各種關係會在在/

事件驅動模型的簡單Java實現

事件驅動模型的原理不再贅述,Swing是不錯的實現。別人也有不錯的博文來說明原理。 本文的目的是提供一種簡單的,可供參考的簡短程式碼,用來幫助理解該模型。   Project Navigator     Event   事件通用介面:

windows驅動面試 基礎

1、CreateFile從r3到r0所呼叫的函式 CreateFile->ZwCreateFile->NtCreateFile->IoCreateFile->IRP_MJ_CREATE 2、自旋鎖和訊號量在互斥使用時注意哪些? 使用自旋鎖的程序不能睡眠,使用訊號量