驅動開發(1)基礎知識

2021-09-24 23:54:15 字數 2116 閱讀 8910

驅動程式是作業系統和硬體通訊的橋梁,同時,驅動程式可以實現很多特殊功能,比如,虛擬光碟機(虛擬裝置),核心級hook,檔案系統透明加密(過濾驅動),修改windows核心等等

並非所有驅動程式都必須由裝置的設計方編寫。如果裝置根據已發布的硬體標準來設計。這時驅動程式可以由 microsoft 編寫,裝置設計者無須提供驅動程式。

並非所有的驅動程式都與硬體關聯。某些驅動程式與任何硬體裝置根本不關聯。 例如,如果需要訪問核心,或者實現虛擬裝置,過濾裝置等等,需要通過編寫驅動程式實現。提供乙個使用者模式下執行且提供使用者介面的應用程式,還需要在核心模式下執行且可以訪問核心作業系統資料的驅動程式。這個驅動程式可以稱為「軟體驅動程式」。軟體驅動程式與硬體裝置不關聯。還有個例子是一些螢幕錄影軟體通過驅動程式直接讀取螢幕,而不是從應用層呼叫api截圖,實現硬體加速。

在正式開始介紹驅動開發之前,我們需要先來了解一下基本的概念。

1。驅動程式的執行級別

以核心模式驅動程式為例,使用者模式驅動是後來才有的。

其實intel 80x86提供了四個執行級別,r0,r1,r2和r3,現代主流作業系統,windows自然也不例外,只用了r0和r3兩個執行級別,分別為「核心模式」和「使用者模式」。應用程式執行在使用者模式,驅動程式執行在核心模式。

這也就是說,驅動程式在執行的那一刻,就是天道!驅動程式中的指令,就是天道法則!(打個比方),所以說驅動程式執行時理論上可以做任何事情,rootkit病毒和防毒軟體都是利用的驅動程式。

2。windows驅動程式的種類

windows9x時代,是vxd驅動,從nt的第一代開始到現在的windows 10,windows逐漸出現了三種驅動程式模型,它們分別是:

1。遺留驅動:nt驅動程式:這是基礎的驅動模型,也是本系列博文著重介紹的驅動模型。

2。wdm驅動:為了支援裝置的熱插拔(比如usb裝置),微軟推出了wdm驅動,支援電源管理和即插即用

3。wdf驅動:有人說,如果wdm是win32,wdf就是mfc。這個比喻還是比較恰當的。wdf驅動其實就是微軟又封裝了一些更方便的核心函式,使驅動開發更加便捷。另外wdf還提供了兩套機制,一種是核心模式驅動程式,一種是使用者模式驅動程式。

3。虛擬記憶體(虛擬位址空間)驅動程式可以訪問整個4gb的虛擬記憶體,使用者程式只允許訪問低2g。

關於虛擬記憶體的分頁原理和windows的記憶體管理機制,這裡不再介紹,有興趣的可以查閱相關資料

4。api的處理

在win32子系統呼叫的api,會進一步呼叫在ntdll裡的native api,native api進入核心,呼叫系統的服務例程,被i/o管理器生成irp併發送到裝置棧最上層的裝置物件所在驅動程式的派遣函式中,有可能會進一步向下層的驅動程式繼續傳送(比如過濾驅動),驅動程式完成任務。

5。同步與非同步

我對同步和非同步的理解,可能不是很準確:

同步:呼叫乙個介面後,一直等待到被呼叫者處理完畢,再返回

非同步:呼叫乙個介面後,不等待到被呼叫者處理完畢,直接返回,處理其他東西。

同步處理是驅動開發中的重要任務。windows是支援非同步操作的作業系統,編寫驅動程式時,如果有必要,需要進行同步處理。

6。 裝置物件和裝置堆疊

「裝置物件」為 device_object 結構的乙個例項。裝置堆疊是一系列裝置形成的和棧結構類似的東西,簡單說,磁碟裝置之上可能有磁碟過濾裝置,再上面是卷裝置,再上面可能有檔案系統過濾裝置,等等,irp總是z先傳送到裝置堆疊最上面一層的裝置中。

7。符號連線

一般的,對於nt驅動而言,應用程式不直接訪問裝置,而是訪問裝置的符號連線,比如第乙個磁碟卷的裝置名是

「\device\harddiskvolume1」

其符號連線為:核心模式下

"\??\c:"

使用者模式下:

而我們的應用程式訪問的時候都是用符號連線。

對於wdm驅動,一般不使用符號連線,而是使用裝置介面。



敏捷開發 基礎知識1

敏捷開發 人與人之間的互動是複雜的,並且其效果從來都是難以預期的,但卻是工作中最重要的方面。tom demacro和timothy lister 敏捷軟體開發宣言 n 個體和互動 勝過 過程和工具 n 可以工作的軟體 勝過 面面俱到的文件 n 客戶合作 勝過 合同談判 n 響應變化 勝過 遵循計畫 ...

llinux驅動基礎知識

開篇語 1.linux體系結構 分為使用者空間和核心空間 主要講核心結構 1 system call inte ce sci層 為使用者空間提供了一套標準的系統呼叫函式來訪問linux核心 2 procees management pm 程序管理是建立程序 fork exec 停止程序 kill e...

開發基礎知識

msdn 使用應用程式域和程式集程式設計 描述如何建立和使用程式集和應用程式域。利用屬性擴充套件元資料 描述如何使用屬性自定義元資料。使用基型別 討論如何格式化和分析基礎資料型別以及如何使用正規表示式處理文字。集合和資料結構 討論在 net framework 中提供的各種集合型別,包括堆疊 佇列 ...