天天看點

Windows 驅動開發1:重要概念

轉載:http://blog.csdn.net/bigbat/article/details/2344838

概念(一):系統模式和應用模式。

系統模式是指工作在一個管理級别的狀态。這個狀态具有沒有限制的權利。是以這樣的代碼如果工作不正常就會給系統帶來災難!驅動程式通常工作在系統級。應用模式(或稱使用者模式)。這一模式受到作業系統的管理。一個應用程式崩潰通常不回給整個系統帶來災難。要正确了解模式的概念。我的經驗是看一看unix原理的書。可以較好的了解這一含義。

概念(二):多任務。

Windows是一個多任務的作業系統。CPU的使用是影響系統性能的重要因素。任務之間要同時進行就必須要有很好的CPU排程政策。Windows的任務排程給驅動程式的編寫帶來了一些麻煩。一個驅動程式不能長時間的獨占CPU時間。通常把驅動程式劃分成可以被中斷的和不可以被中斷的。必須要獨占CPU的就是不能被中斷的。反之,是可被中斷的。在WINDOWS的系統中通過中斷級别(IRQL)來标記一段代碼是否可以被中斷。如果引入中斷就有可能帶來重入問題。這個問題會帶來資源的排程問題。這個我不多說了。可以參考作業系統的書籍。

概念(三):驅動程式的調用。

驅動程式的代碼是為應用服務的。是以,他的調用通常都是被動的。因為,你不知道使用者什麼時間使用哪個功能。是以,驅動程式的代碼多數是些片段(通常就是完成某個功能的函數)。不象應用程式一樣自己知道下一步該幹啥了。就會沒有整體感。隻要,函數完成一個規定的功能就可以了。不用管他什麼時間被調用。既然是被調用。就要讓系統知道你的函數在哪裡。這就需要告訴系統你的函數的指針。這就需要注冊你的函數指針。怎麼樣注冊呢?一種方法是寫個固定名稱的函數。就像C中的main一樣。不能瞎起名字。第二種就是指針登記。這需要填寫DriverObject這個資料結構的相應功能的項目。如:

DriverObject->MajorFunction[IRP_MJ_PNP]=CharSamplePnpDispatch;

這個代碼就完成了CharSamplePnpDispatch這個函數的注冊了。

概念(四):IRP

IRP是一個不好了解的概念。IRP就是I/O請求包的稱為。I/O請求包是什麼呢?上面說了驅動是一些等待被調用的獨立函數。使用者請求讀一個裝置時,通常需要多個步驟來完成。這就要有一個完成該功能的一個函數的調用清單。這個任務清單就是IRP結構的一部分内容。當使用者發出一個請求時,系統就根據請求産生一個IRP。然或系統就依照這個IRP的訓示去調用相應的函數功能。

1. 子系統調用NT的IO系統服務打開命名檔案。

2. NT的IO管理器調用對象管理器,查詢命名檔案,并且幫助解決檔案對象的符号連接配接。同時調用安全參照螢幕,檢查子系統是否具備打開檔案句柄的正确權限。

3. 如果NT檔案系統不認識檔案對象,IO管理器挂起請求。調用多個檔案系統直到識别出檔案對象才繼續請求。

4. IO管理器負責為打開的請求配置設定記憶體和初始化IRP。對于NT驅動,打開請求等同于建立請求。

5. IO管理器調用檔案系統驅動,将IRP傳遞給它們。檔案系統存取它們的IRP中本地IO棧,決定必須進行哪一種操作。檢查參數,确定請求檔案是否在緩存中。如果不是,設定下一個IRP中驅動的IO棧。

6. 無論是驅動處理IRP還是完成IO請求操作。都調用IO管理器和其它NT元素提供的核心态例程。

7. 驅動設定傳回給IO管理器的IRP中的IO狀态塊表示請求操作是成功還是失敗。

8. IO管理器通過擷取IRP中的IO狀态,将資訊同過保護子系統傳回給原始調用者。

9. IO管理器釋放已完成的IRP。

10. 如果打開操作成功,IO管理器傳回檔案句柄給子系統。反之傳回錯誤狀态。

概念(五):過濾驅動(過濾層、過濾函數)

Windows的WDM模型采用了分層的設計方法。這樣的設計可以實作靈活的任務組織。上面說了驅動是一些等待被調用的獨立功能函數。一段功能代碼隻完成有限的功能。在調用時在進行任務的組合。過濾函數是一些主要功能任務的補充功能。在一個主要功能前調用的是上層調用。在主要功能後調用的是下層調用。而且,可以是多層的。如我們寫了一個讀U盤的驅動。這個U盤有一個特殊的功能是對資料進行加密。我們就可以在讀寫實體裝置前後加入一個過濾驅動完成這個操作。

繼續閱讀