我這裡重點的介紹如何寫驅動程序,對於一些應用程序我就不做介紹了,因為我對於那些高層的東西寫得很少。倘若再講,有班門弄斧之嫌,呵呵!
作為WIN98和WIN2K推薦的一項新技術來說,USB的驅動程序和以往的直接跟硬件打交道的WIN95的VXD的方式的驅動程序不同,它應該是WDM類型的。
USB的WDM接口框圖如下(這個圖可以說是USB軟件總體框圖)
對於HID的設備,就可以采用上圖左上邊的結構,其它類的話采用右上的結構,其實右邊的結構可以又細分成兩層,一層是Class Driver,一層是Miniport Driver。而倒數第三行的UHCD和OpenHCI分別是由INTEL和COMPAQ兩位老大定的一個和硬件有關的底層驅動程序標准,各位可以根據所需要的選擇。
對於USB的驅動程序,大家還得去了解WDM驅動程序的寫法,或者早些時候的NT驅動程序,其實WDM驅動程序可以看做是NT驅動程序的一個update,只是增加了一些新的特性。
“寫驅動程序是一個很漫長和繁瑣的工作,在此之前,你最好要熟悉硬件,熟悉C/C++,還要用過DDK,會用一些調試程序,如SOFTICE和WINDBG之類。如果一切就緒,你就可以開始寫驅動程序,工作的進程有時侯會取決於你的運氣”。(這是一位留美的朋友對我說的,我寫出來和大家共享)
下面是我從一個朋友那裡得到的一篇文章的摘要:
NT驅動程序的分層結構
驅動程序是指管理某個外圍設備的一段程序代碼。NT采用更靈活的分層驅動方法,允許雜應用程序和硬件之間 存在幾個驅動程序層次。分層機制允許NT更加廣泛地定義驅動程序,包括文件系統、邏輯卷管理器和各種網絡組件,各種物理設備驅動程序等等。
1、 設備驅動程序
這些是管理實際數據傳輸和控制特定類型的物理設備的操作的驅動程序,包括開始和完成I/O操作,處理中斷和執行特定的設備要求的任何差錯處理。
2、 中間驅動程序
NT允許在物理設備驅動程序上分層任意數目的中間驅動程序。這些中間層次提供擴展I/O系統的功能一種方法,而不必修改底層的驅動程序。這也是微軟鼓吹的他們的系統靈活的一面!實際上我覺得這樣反而犧牲了一些效率上的東西。
3、 文件系統驅動程序(FSD)
FSD是一類比較特殊的驅動程序,通常負責維護各種文件系統 所需要的磁盤結構。注意我們並不能使用DDK來開發FSD,而必須使用Microsoft的文件系統開發人員工具包。
一般比較少寫中間過濾驅動程序,過濾驅動程序它截獲和修改高層發送給類驅動程序的請求。這樣就允許利用現有類驅動程序的功能,而不必從頭開始寫所有程序。NT內核模式對象在我們的實際開發過程中的對象是設備,由於端口驅動程序已經隱藏了硬件控制操作,因此我在這裡不講述跟硬件相關的部份。如果今後的開發對象不同,需要對硬件進行操作的時候,可能會對中斷、DMA等有比較詳細的了解,這些內容可以參考DDK幫助。
NT使用對象技術管理所有的數據,下面分別對一般驅動程序所涉及的一些對象做一介紹。不過在介紹這些對象之前,有必要先對驅動程序的結構做一介紹。
驅動程序結構
NT驅動程序和一般的DOS/Windows C語言程序不一樣,它沒有main()或者WinMain()函數入口。和DLL類似地,它向操作系統顯露一個名稱為DriverEntry()的函數,在啟動驅動程序的時候,操作系統將調用這個入口。DriverEntry除了做一些必 要的設備初始化工作外,還初始化一些Dispatch例程入口。我們知道,NT應用和設備驅動程序打交道主要是通過CreateFile、 ReadFile、WriteFile 和DeviceIoControl等Win32 API來進行 的。這些API其實都對應著驅動程序的一些Dispatch例程。而驅動程序除了DriverEntry以外,主要就是由這些Dispatch例 程組成的。例如調用Win32 API CreateFile的時候,操作系統最終轉化為對驅動程序IRP_MJ_CREATE功能代碼所對應的 Dispatch例程的調用,如果驅動程序沒有提供該例程, CreateFile調用就會失敗。
NT中一些常用的功能代碼和Win32 API的對象關系如下所示。
功能代碼 說明