RSS
热门关键字:  计算机有关资料  33252  mkv  word  MKV_NT
当前位置 : 主页>vc编程>平台/系统>列表

WDM驱动程序设计

来源:程序太平洋 作者:苏金国 时间:2006-11-30 点击:
  设计开发好自己的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_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/

  设备驱动程序一般都使用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,这样就可以安装成功。
共4页: 上一页 [1] [2] [3] 4 下一页
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册