Hello World - WDM驅動程序入門 安裝步驟

DDK分爲98 DDK和2000 DDK兩種,它們工作起來是大同小異的,不過有些驅動程序只能在2000 DDK中使用。由於Win98註定是一種即將被淘汰的操作系統了,所以我也不打算介紹如何在98 DDK中進行編譯,以下的所有內容都是針對2000 DDK的。

·準備工作
1、確定你已經安裝了Visual C++
2、安裝2000 DDK
3、安裝2000 DDK成功後,在“開始”->“程序”裏應該有“Development Kits”->“Windows 2000 DDK”的項目。
注意一定要先安裝好VC,然後才安裝DDK,這個順序決不能顛倒!!
4、保證DDKROOT環境變量設置爲Windows 2000 DDK的基目錄,如果不是的話,請在控制面板“系統”屬性的“高級”標籤環境變量編輯器中設置好這個環境變量。


·編寫必需的文件
編譯WDM程序的時候,有兩個文件是必須要有的,它們是:
1、makefile
(這個是什麼啊?你可能會問。)對於比較年輕的程序員來說,有可能沒有見過這個文件吧。其實在VC這些IDE出現之前,我們都必須使用makefile來確定項目中哪些文件需要重新編譯,現在的IDE都把這個工作自動做好了。(Well……其實這樣也好。)
我們要做的工作很簡單,就是提供這樣一個文件,它的內容是:

#
# DO NOT EDIT THIS FILE!!!  Edit ./sources. If you want to add a new source
# file to this component.  This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)/makefile.def


正如它所述,不要編輯這個文件。事實上每個WDM程序所需要的makefile的內容都是一樣的,也就是說,我們只需要簡單地copy一個makefile到新的項目中就可以了。(呵呵,是不是很方便呢?)

2、Sources

TARGETNAME=HelloWDM
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)/inc;/
         $(BASEDIR)/inc/ddk;/

TARGETLIBS=$(BASEDIR)/lib/*/free/usbd.lib/

SOURCES=HelloWDM.cpp/


這個文件指定了驅動程序目標名是HelloWDM.sys,是一個WDM驅動程序,生成的文件存放在OBJ目錄中。值得注意的是,“=”前後不能有空格,否則編譯的時候會出錯。


·開始編譯
娃哈哈,前面羅羅嗦嗦講了一大堆,現在終於到重點了。WDM程序的編譯過程比較特殊,它不是在VC裏面按F7來編譯的(儘管你可以通過設置來達到這一目的),而是通過一個DDK實用工具build來完成。下面我們來講講具體步驟:
1、“Debug”版的生成
首先,我們假設你的源代碼放在D:/HelloWDM裏面。請跟着以下步驟:

“開始”->“程序”->“Development Kits”->“Windows 2000 DDK”->“Checked Build Environment”

屏幕將顯示:(有“回車”的那行是需要讀者你親自打進去的)

New or updated MSVC detected.  Updating DDK environment….

Setting environment for using Microsoft Visual C++ tools.
Starting dirs creation…Completed.

D:/NTDDK>cd/HelloWDM    (回車)

D:/HelloWDM>build    (回車)


如果源代碼沒有錯誤的話,生成的HelloWDM.sys將存放在objchk/i386目錄中。

2、“Release”版的生成
請跟着以下步驟:

“開始”->“程序”->“Development Kits”->“Windows 2000 DDK”->“Free Build Environment”

隨後的步驟跟“Debug”版相同,不同的是生成的HelloWDM.sys將存放在objfre/i386目錄中。


·安裝
如果前面的編譯過程沒有錯誤的話,現在我們應該已經得到了一個HelloWDM.sys文件,假設它是放在D:/HelloWDM/objfre/i386中。

我們還要幹什麼呢?…………對啦,就是安裝它!不然辛辛苦苦編譯出來有什麼用?

安裝WDM驅動程序可以用兩種方法,一種是利用註冊表,還有一種是利用INF文件。我們一般是採用INF文件(這是微軟推薦的)。INF文件可以在 WINNT/INF 目錄中找到很多。爲了順利安裝,我在這裏先給出 HelloWDM 所需要的 HelloWDM.INF 文件:

;; The Win2K DDK documentation contains an excellent INF reference.

;--------- Version Section ---------------------------------------------------

[Version]
Signature="$CHICAGO$"
Provider=LC_Device
DriverVer=8/21/2002,3.0.0.3

; If device fits one of the standard classes, use the name and GUID here,
; otherwise create your own device class and GUID as this example shows.

Class=Unknown
ClassGUID={ff646f80-8def-11d2-9449-00105a075f6b}

;--------- SourceDiskNames and SourceDiskFiles Section -----------------------

; These sections identify source disks and files for installation. They are
; shown here as an example, but commented out.

[SourceDisksNames]
1 = "HelloWDM",Disk1,,

[SourceDisksFiles]
HelloWDM.sys = 1,objfre/i386,

;--------- ClassInstall/ClassInstall32 Section -------------------------------

; Not necessary if using a standard class

; 9X Style
[ClassInstall]
Addreg=Class_AddReg

; NT Style
[ClassInstall32]
Addreg=Class_AddReg

[Class_AddReg]
HKR,,,,%DeviceClassName%
HKR,,Icon,,"-5"

;--------- DestinationDirs Section -------------------------------------------

[DestinationDirs]
YouMark_Files_Driver = 10,System32/Drivers

;--------- Manufacturer and Models Sections ----------------------------------

[Manufacturer]
%MfgName%=Mfg0

[Mfg0]

; PCI hardware Ids use the form
; PCI/VEN_aaaa&DEV_bbbb&SUBSYS_cccccccc&REV_dd
;改成你自己的ID
%DeviceDesc%=YouMark_DDI, PCI/VEN_9999&DEV_9999

;---------- DDInstall Sections -----------------------------------------------
; --------- Windows 9X -----------------

; Experimentation has shown that DDInstall root names greater than 19 characters
; cause problems in Windows 98

[YouMark_DDI]
CopyFiles=YouMark_Files_Driver
AddReg=YouMark_9X_AddReg

[YouMark_9X_AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,HelloWDM.sys
HKR, "Parameters", "BreakOnEntry", 0x00010001, 0

; --------- Windows NT -----------------

[YouMark_DDI.NT]
CopyFiles=YouMark_Files_Driver
AddReg=YouMark_NT_AddReg

[YouMark_DDI.NT.Services]
Addservice = HelloWDM, 0x00000002, YouMark_AddService

[YouMark_AddService]
DisplayName = %SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%/System32/Drivers/HelloWDM.sys

[YouMark_NT_AddReg]
HKLM, "System/CurrentControlSet/Services/HelloWDM/Parameters",/
"BreakOnEntry", 0x00010001, 0


; --------- Files (common) -------------

[YouMark_Files_Driver]
HelloWDM.sys

;--------- Strings Section ---------------------------------------------------

[Strings]
ProviderName="Flying L Co.,Ltd."
MfgName="LC Soft"
DeviceDesc="Hello World WDM!"
DeviceClassName="LC_Device"
SvcDesc="???"



注意它可以同時在Win98或者Win2000中使用(系統會通過這個INF文件裏面的字段名稱,自動選擇適合當前系統的安裝方法的)。由於INF文件的各個字段含義比較複雜,限於篇幅,我在這裏就不詳細講解了,請讀者自行參閱有關的文章或者書籍。

準備好這個 HelloWDM.INF 文件後,讓我們打開控制面板,雙擊“添加/刪除硬件”,選擇“添加/排除設備故障”->“添加新設備”->“否,我想從列表選擇硬件”->“其它設備”->“從磁盤安裝”,選擇 HelloWDM.INF 所在的路徑,然後安裝。

當安裝完成後,系統就會添加上你寫好的驅動程序了。(可以在“設備管理器”中查看到)。然後重啓電腦,這個驅動程序就投入使用啦。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章