分享
 
 
 

WDM驱动程序设计之编译安装篇

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

(作者:苏金国)

设计开发好自己的WDM驱动程序后,为了运行该驱动程序,我们必须编译和安装它们。

■编译设备驱动程序的方法

安装DDK后,在DDK程序组下有Check和Free两个编译环境,Check环境用于编译带调试信息的驱动程序,Free则是编译正式发布版本的环境。通常情况下设备驱动程序的编译采用命令行的方式。通过一定的设置可以在VC ++的集成环境下编译。

一般来说,成功编译一个最基本的设备驱动程序需要四个文件,第一个是驱动程序,即C语言源程序文件(例如vdisk.c,注意下面所有的例子都是以vdisk来说明);第二个是RC文件(例如vdisk.rc);第三个是sources文件;第四个文件是makefile.rc文件。sources文件和make文件类似,用来指定需要编译的文件以及需要连接的库文件。这三个辅助文件都很简单,在DDK samples的每个例程里都有三个这样的文件,依样画瓢就能理解它们的结构和意义。

1.举例分析

以下以vdisk程序为例,设vdisk.rc代码为:

/vdisk.rc/

#include

#include

#define VER_FILETYPEVFT_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/

设备驱动程序一般都使用Build实用程序来进行,Build只是NMAKE外面的一个外包装程序。Build本身其实相当简单,编译的大部分工作实际上由Build传递给NMAKE来进行。

/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的文件名没有任何扩展名。

# 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

对所有驱动程序而言,makefile都是一样的,Microsoft也警告不要编辑这个文件,如果需要,可以编辑修改sources文件达到同样的效果。对于设备驱动程序,所使用的C编译器基本上无一例外地选用VC++。

2.编译的基本步骤

(1)首先进入check或free编译环境,初始化DDK编译环境。

(2)运行VC安装目录下bin目录下的vcvars32.bat,初始化VC++编译环境。

(3)运行Build.exe进行编译。

■设备驱动程序的安装和启动

1.添加注册表中的键值

Windows NT在引导的时候,通过扫描注册表构造驱动程序列表。这个列表既包括自启动的驱动程序,也包括需要手工启动的驱动程序。这个列表其实就是控制面板中设备Applet所列出来的所有设备。所有的设备驱动程序应该在注册表的HKEY_LOCAL_MACHINE\System\CurrentControl-

Set\Services\下有相应的键值。下面以vdisk为例来说明如何添加键值:

首先在HKEY_LOCAL_MACHINE\ System\ Current ControlSet\Services\下添加一个子项vdisk,注意这里的名称应该和你的驱动程序名称一致。例如驱动程序名称是vdisk.sys,那么这里的子项名称就是vdisk。然后在vdisk下添加以下键值:

名称

数据类型

说明

Type

REG_DWORD

驱动程序的种类

Start

REG_DWORD

驱动程序的起始启动时间

ErrorControl

REG_DWORD

驱动装入失败的错误处理

Group

REG_SZ

驱动程序的组名

DependOnGroup

REG_MULTI_SZ

所依赖的其他驱动程序

Tag

REG_BINARY

同组内驱动程序装入顺序

Parameters

(key)

驱动程序特定的参数键

Type值为1表示内核模式驱动程序;为2表示文件系统驱动程序。

ErrorControl值为0表示日志记录错误并忽略;值为1表示日志记录错误并显示一个对话框;值为2表示日志记录错误,并用最后的正确配置重新启动;值为3表示日志记录错误,如果已经使用过正确配置,返回失败。

在任何一个设备驱动程序中,上表中的前三项参数都是必需的。

2.控制驱动程序的装入次序

有时候控制多个驱动程序的装入次序是必要的。例如一套驱动程序中包括三个驱动程序,分别是jbChanger.sys,changerDisk.sys和vdisk.sys。jbChanger和changerDisk是两个SCSI类驱动程序,它们都依赖SCSI小端口(mini port驱动程序),同时changerDisk必须在jbChanger启动之后启动。vdisk是虚拟的磁盘驱动程序,它必须在jbChanger和changerDisk都启动之后才能启动成功。

3.驱动程序的Start值

上面注册表中驱动程序的Start值控制驱动程序在系统启动的时间。目前,Start可以取以下值,此外为该值留有扩展余地,以适用于新的要求:

(l)0x0 (SERVICE_BOOT_START):这个值指定本驱动程序应该由操作系统装入程序启动。一般的驱动程序不会采用本值,因为系统在这个时候几乎还没有启动,大部分系统尚不可用。

(2)0x1 (SERVICE_SYSTEM_START):该值表示在操作系统装入后但同时初始化它自己时启动驱动程序。

(3)0x2 (SERVICE_AUTO_START):该值表示在整个系统启动并运行后由服务控制管理器装入。

(4)0x3 (SERVICE_DEMAND_START):该值表示该驱动程序必须手工启动。可以通过控制面板的设备applet或者使用WIN32 API编程来启动。

(5)0x4 (SERVICE_DISABLED):表示本驱动程序被禁用。

注意在调试驱动程序的时候,最好将Start值设置为3来手工启动,这是因为如果设置为自动启动,而驱动程序在启动的过程中又发生了异常错误的话,可能导致系统不能启动。

如果没有紧急恢复盘,首先可以尝试在启动的时候选择用已知的配置来启动系统,看是否能启动成功。如果失败,可以用DOS启动后到\%SystemRoot%\System32\Drivers目录下将出现问题的驱动程序删除,然后系统就可以启动了。

不过如果NT安装在NTFS分区,DOS启动后将看不到这个分区,这样就必须将硬盘挂到另一NT系统上来删除这个文件了。通过设置Start可以控制驱动程序在不同的时候启动。但如果要解决依赖性问题,则需要使用Group和DependOnGroup值。

首先要确定自己的驱动程序使用的Group名,系统有一些定义好的组名,对于当前系统存在的组名,可以观察注册表的\HKEY_LOCAL_MACHINE\System\CurrentControl-

Set\Control\ServiceGroupOrder\List的键值。例如该值可以设置为:

SCSI miniport

port

Primary disk

SCSI class

SCSI CDROM class

filter

boot file system

这里每一行都是一个Group名,一般来说某个驱动程序都属于某一个Group。系统启动时按照该List下组的顺序依次启动各组里的驱动程序。例如jbChanger和changerDisk都属于SCSI Class组。如果你觉得该表中的组名都不合适,可以在该List的适当位置中添加新的组名。

DependOnGroup值控制本驱动程序启动的时候必须先启动另一组的驱动程序,例如jbChanger和changerDisk的启动就依赖于SCSI miniport组。因此jbChanger和changerDisk的DependOnGroup值都为SCSI miniport。

4.修改注册表的方法

在注册表里这些值可以手工修改,也可以自己编程利用WIN32 API进行添加,同时也可以用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为参数运行REGINI.EXE。就会自动在注册表里添加相应的项。

在注册表里添加好这些项后,必须重新启动系统,这样所添加的设备驱动程序才能在控制面板的设备applet中列出来,再进行其他操作。

5.启动设备驱动程序

在添加修改好注册表后,重新启动系统,如果选择的Start值是0、1、2,如果一切正常,驱动程序就应该已经启动起来了。可以观察控制面板的设备applet中的设备列表。如果Start选择的是3,则可以直接启动。

6.调试工具

目前NT驱动程序的调试工具只有WINDBG和SOFTICE,WINDBG的使用需要双机环境,强力推荐使用SOFTICE。注意目前国内FTP服务器上的SOFTICE 3.2 FOR NT的Setup.ins文件是错误的,它将导致安装程序不认识你的NT,可以用3.0的setup.ins文件替代3.2的setup.ins,这样就可以安装成功。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有