• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            WDM驅(qū)動程序設(shè)計之編譯安裝篇

              設(shè)計開發(fā)好自己的WDM驅(qū)動程序后,為了運(yùn)行該驅(qū)動程序,我們必須編譯和安裝它們。

              編譯設(shè)備驅(qū)動程序的方法

              安裝DDK后,在DDK程序組下有Check和Free兩個編譯環(huán)境,Check環(huán)境用于編譯帶調(diào)試信息的驅(qū)動程序,F(xiàn)ree則是編譯正式發(fā)布版本的環(huán)境。通常情況下設(shè)備驅(qū)動程序的編譯采用命令行的方式。通過一定的設(shè)置可以在VC ++的集成環(huán)境下編譯。

              一般來說,成功編譯一個最基本的設(shè)備驅(qū)動程序需要四個文件,第一個是驅(qū)動程序,即C語言源程序文件(例如vdisk.c,注意下面所有的例子都是以vdisk來說明);第二個是RC文件(例如vdisk.rc);第三個是sources文件;第四個文件是makefile.rc文件。sources文件和make文件類似,用來指定需要編譯的文件以及需要連接的庫文件。這三個輔助文件都很簡單,在DDK samples的每個例程里都有三個這樣的文件,依樣畫瓢就能理解它們的結(jié)構(gòu)和意義。

              1.舉例分析

              以下以vdisk程序為例,設(shè)vdisk.rc代碼為:

              /vdisk.rc/

              #include

              #include

              #define VER_FILETYPE  VFT_DRV

              #define VER_FILESUBTYPE VFT2_DRV_SYSTEM

              #define VER_FILEDESCRIPTION_STR "SCSI VDisk Driver"

              #define VER_INTERNALNAME_STR "vdisk.sys"

              #define VER_ORIGINALFILENAME_STR "vdisk.sys"

              #include "common.ver"

              /end of vdisk.rc/

              設(shè)備驅(qū)動程序一般都使用Build實(shí)用程序來進(jìn)行,Build只是NMAKE外面的一個外包裝程序。Build本身其實(shí)相當(dāng)簡單,編譯的大部分工作實(shí)際上由Build傳遞給NMAKE來進(jìn)行。

              /SOURCES/

              TARGETNAME=vdisk

              TARGETTYPE=DRIVER

              TARGETPATH=$(BASEDIR)\lib

              TARGETLIBS=$(BASEDIR)\lib\\$(DDKBUILDENV)\scsiport.lib

              INCLUDES=..\..\inc

              SOURCES=vdisk.c vdisk.rc

              /end of SOURCES/

              注意SOURCES的文件名沒有任何擴(kuò)展名。

              # makefile

              #

              # 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

              # end of makefile

              對所有驅(qū)動程序而言,makefile都是一樣的,Microsoft也警告不要編輯這個文件,如果需要,可以編輯修改sources文件達(dá)到同樣的效果。對于設(shè)備驅(qū)動程序,所使用的C編譯器基本上無一例外地選用VC++。

              2.編譯的基本步驟

              (1)首先進(jìn)入check或free編譯環(huán)境,初始化DDK編譯環(huán)境。

              (2)運(yùn)行VC安裝目錄下bin目錄下的vcvars32.bat,初始化VC++編譯環(huán)境。

              (3)運(yùn)行Build.exe進(jìn)行編譯。

              ■設(shè)備驅(qū)動程序的安裝和啟動

              1.添加注冊表中的鍵值

              Windows NT在引導(dǎo)的時候,通過掃描注冊表構(gòu)造驅(qū)動程序列表。這個列表既包括自啟動的驅(qū)動程序,也包括需要手工啟動的驅(qū)動程序。這個列表其實(shí)就是控制面板中設(shè)備Applet所列出來的所有設(shè)備。所有的設(shè)備驅(qū)動程序應(yīng)該在注冊表的HKEY_LOCAL_MACHINE\System\CurrentControl-

              Set\Services\下有相應(yīng)的鍵值。下面以vdisk為例來說明如何添加鍵值:

              首先在HKEY_LOCAL_MACHINE\ System\ Current ControlSet\Services\下添加一個子項vdisk,注意這里的名稱應(yīng)該和你的驅(qū)動程序名稱一致。例如驅(qū)動程序名稱是vdisk.sys,那么這里的子項名稱就是vdisk。然后在vdisk下添加以下鍵值:

            名稱
            數(shù)據(jù)類型
            說明
            Type REG_DWORD 驅(qū)動程序的種類
            Start REG_DWORD 驅(qū)動程序的起始啟動時間
            ErrorControl REG_DWORD 驅(qū)動裝入失敗的錯誤處理
            Group REG_SZ 驅(qū)動程序的組名
            DependOnGroup REG_MULTI_SZ 所依賴的其他驅(qū)動程序
            Tag REG_BINARY 同組內(nèi)驅(qū)動程序裝入順序
            Parameters (key) 驅(qū)動程序特定的參數(shù)鍵

              Type值為1表示內(nèi)核模式驅(qū)動程序;為2表示文件系統(tǒng)驅(qū)動程序。

              ErrorControl值為0表示日志記錄錯誤并忽略;值為1表示日志記錄錯誤并顯示一個對話框;值為2表示日志記錄錯誤,并用最后的正確配置重新啟動;值為3表示日志記錄錯誤,如果已經(jīng)使用過正確配置,返回失敗。

              在任何一個設(shè)備驅(qū)動程序中,上表中的前三項參數(shù)都是必需的。

              2.控制驅(qū)動程序的裝入次序

              有時候控制多個驅(qū)動程序的裝入次序是必要的。例如一套驅(qū)動程序中包括三個驅(qū)動程序,分別是jbChanger.sys,changerDisk.sys和vdisk.sys。jbChanger和changerDisk是兩個SCSI類驅(qū)動程序,它們都依賴SCSI小端口(mini port驅(qū)動程序),同時changerDisk必須在jbChanger啟動之后啟動。vdisk是虛擬的磁盤驅(qū)動程序,它必須在jbChanger和changerDisk都啟動之后才能啟動成功。

              3.驅(qū)動程序的Start值

              上面注冊表中驅(qū)動程序的Start值控制驅(qū)動程序在系統(tǒng)啟動的時間。目前,Start可以取以下值,此外為該值留有擴(kuò)展余地,以適用于新的要求:

              (l)0x0 (SERVICE_BOOT_START):這個值指定本驅(qū)動程序應(yīng)該由操作系統(tǒng)裝入程序啟動。一般的驅(qū)動程序不會采用本值,因為系統(tǒng)在這個時候幾乎還沒有啟動,大部分系統(tǒng)尚不可用。

              (2)0x1 (SERVICE_SYSTEM_START):該值表示在操作系統(tǒng)裝入后但同時初始化它自己時啟動驅(qū)動程序。

              (3)0x2 (SERVICE_AUTO_START):該值表示在整個系統(tǒng)啟動并運(yùn)行后由服務(wù)控制管理器裝入。

              (4)0x3 (SERVICE_DEMAND_START):該值表示該驅(qū)動程序必須手工啟動。可以通過控制面板的設(shè)備applet或者使用WIN32 API編程來啟動。

              (5)0x4 (SERVICE_DISABLED):表示本驅(qū)動程序被禁用。

              注意在調(diào)試驅(qū)動程序的時候,最好將Start值設(shè)置為3來手工啟動,這是因為如果設(shè)置為自動啟動,而驅(qū)動程序在啟動的過程中又發(fā)生了異常錯誤的話,可能導(dǎo)致系統(tǒng)不能啟動。

              如果沒有緊急恢復(fù)盤,首先可以嘗試在啟動的時候選擇用已知的配置來啟動系統(tǒng),看是否能啟動成功。如果失敗,可以用DOS啟動后到\%SystemRoot%\System32\Drivers目錄下將出現(xiàn)問題的驅(qū)動程序刪除,然后系統(tǒng)就可以啟動了。

              不過如果NT安裝在NTFS分區(qū),DOS啟動后將看不到這個分區(qū),這樣就必須將硬盤掛到另一NT系統(tǒng)上來刪除這個文件了。通過設(shè)置Start可以控制驅(qū)動程序在不同的時候啟動。但如果要解決依賴性問題,則需要使用Group和DependOnGroup值。

              首先要確定自己的驅(qū)動程序使用的Group名,系統(tǒng)有一些定義好的組名,對于當(dāng)前系統(tǒng)存在的組名,可以觀察注冊表的\HKEY_LOCAL_MACHINE\System\CurrentControl-

              Set\Control\ServiceGroupOrder\List的鍵值。例如該值可以設(shè)置為:

              …

              SCSI miniport

              port

              Primary disk

              SCSI class

              SCSI CDROM class

              filter

              boot file system

              …

              這里每一行都是一個Group名,一般來說某個驅(qū)動程序都屬于某一個Group。系統(tǒng)啟動時按照該List下組的順序依次啟動各組里的驅(qū)動程序。例如jbChanger和changerDisk都屬于SCSI Class組。如果你覺得該表中的組名都不合適,可以在該List的適當(dāng)位置中添加新的組名。

              DependOnGroup值控制本驅(qū)動程序啟動的時候必須先啟動另一組的驅(qū)動程序,例如jbChanger和changerDisk的啟動就依賴于SCSI miniport組。因此jbChanger和changerDisk的DependOnGroup值都為SCSI miniport。

              4.修改注冊表的方法

              在注冊表里這些值可以手工修改,也可以自己編程利用WIN32 API進(jìn)行添加,同時也可以用ini文件的方式來添加。下面是一個ini(文件名為vdisk.ini)文件的例子。

              \Registry\Machine\System\CurrentControl

              Set\Services\VDisk

              Type=REG_DWORD 0x00000001

              Start=REG_DWORD 0x00000003

              ErrorControl=REG_DWORD 0x00000001

              Group=SCSI Class

              Parameters

              DriveLetter=N:

              然后以vdisk.ini為參數(shù)運(yùn)行REGINI.EXE。就會自動在注冊表里添加相應(yīng)的項。

              在注冊表里添加好這些項后,必須重新啟動系統(tǒng),這樣所添加的設(shè)備驅(qū)動程序才能在控制面板的設(shè)備applet中列出來,再進(jìn)行其他操作。

              5.啟動設(shè)備驅(qū)動程序

              在添加修改好注冊表后,重新啟動系統(tǒng),如果選擇的Start值是0、1、2,如果一切正常,驅(qū)動程序就應(yīng)該已經(jīng)啟動起來了。可以觀察控制面板的設(shè)備applet中的設(shè)備列表。如果Start選擇的是3,則可以直接啟動。

              6.調(diào)試工具

              目前NT驅(qū)動程序的調(diào)試工具只有WINDBG和SOFTICE,WINDBG的使用需要雙機(jī)環(huán)境,強(qiáng)力推薦使用SOFTICE。注意目前國內(nèi)FTP服務(wù)器上的SOFTICE 3.2 FOR NT的Setup.ins文件是錯誤的,它將導(dǎo)致安裝程序不認(rèn)識你的NT,可以用3.0的setup.ins文件替代3.2的setup.ins,這樣就可以安裝成功。

            posted on 2008-01-17 23:35 大龍 閱讀(360) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            亚洲精品无码久久久久去q| 久久丫忘忧草产品| 久久精品亚洲福利| 要久久爱在线免费观看| 五月丁香综合激情六月久久| 91精品国产色综合久久| 婷婷久久综合| 久久精品成人免费网站| 久久国产AVJUST麻豆| 久久国产精品久久久| 久久婷婷五月综合成人D啪| 久久99精品久久久久久| 久久无码高潮喷水| 久久黄色视频| 青青青国产成人久久111网站| 国产精品99久久久精品无码| 77777亚洲午夜久久多喷| 人人狠狠综合88综合久久| 久久国产亚洲精品无码| 无夜精品久久久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲色欲久久久综合网东京热 | 草草久久久无码国产专区| 无码国产69精品久久久久网站| 久久亚洲中文字幕精品一区| 久久青青草原国产精品免费| 99久久精品影院老鸭窝| 囯产精品久久久久久久久蜜桃| 麻豆久久久9性大片| 久久精品免费网站网| 66精品综合久久久久久久| 久久国产精品国产自线拍免费 | 国产∨亚洲V天堂无码久久久| 久久综合亚洲色一区二区三区| 少妇被又大又粗又爽毛片久久黑人 | 粉嫩小泬无遮挡久久久久久| 亚洲愉拍99热成人精品热久久| 伊人热热久久原色播放www| 久久国产精品免费一区| 久久久亚洲精品蜜桃臀| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 |