给你一些资料:
NT DDK的安装以及设备驱动程序的编译
作者:程序员客栈
NT DDK的安装以及设备驱动程序的编译
--By 程序员客栈 经常有人问及如何安装DDK,如何编译第一个设备驱动程序以及如何消除掉编译驱动程序
时出现的大量错误信息. 其实, DDK的安装和驱动程序的编译是很简单的. 为了编译驱动程
序, 你必须首先打开一个DOS窗口, 并正确设置好所需的全部环境变量. 本文假定你将要
安装NT DDK 4.0, 并且在安装NT DDK之前,VC已经被安装在 C:\vcdev\vc\bin\目录下(尽量使
用短的VC路径名称,不要用长的路径命名格式). 可按如下方法安装NT DDK( 其实就是进行一些环境变量的设置), NT DDK的安装并不需要
SDK--如果你已经安装好了VC的话. 1. 从微软或其他站点下载NT
DDK(http://download.microsoft.com/download/winntwks40/Install/1998/NT4/EN-US/nt4ddk.zip),
将其安装在硬盘上(本文假定DDK安装目录为c:\ddk). 2. 用任何文本编辑器打开c:\ddk\bin\目录下的setenv.bat文件, 在此文件的第三行(不含空白
行)之后加入如下一行并保存: call C:\vcdev\vc\bin\vcvars32.bat, 具体示例: @echo off
if "%1"=="" goto usage
rem This will put the SDK headers & libs first in the search path. call C:\vcdev\vc\bin\vcvars32.bat if "%BASEDIR%"=="" goto setbasedir
if NOT "%BASEDIR%"=="%1" goto setbasedir
... 3. 完成步骤1和2之后, 你就可以开始编译第一个设备驱动程序了(本文假定驱动程序选为
checked类型): 顺次进入Programs->Windows NT DDK(Common)->Checked Build
Enviroment, 出现一个 DOS窗口. 使用cd命令进入c:\ddk\src\general\simple\sys目录, 键入
build -c命令即可编译, 然后编译器提示已经成功编译好 ldunld.sys文件并已将此文件拷到
c:\ddk\lib\i386\checked目录中. 运行build命令只编译需要重新编译的文件, 而build -c命令则
强迫编译器重新编译所有的文件. 4.使用cd命令进入c:\ddk\src\general\simple\exe目录, 在DOS提示符下键入NMAKE -f
GETHNDL.MAK 即可在当前目录下生成Win32 控制台程序gethndl.exe,此程序用于调用并测
试在第3步中所生成的ldunld.sys设备驱动程序. 5. 从OSR下载OSR driver load(V2.2), 地址如下: http://www.osr.com/files/osrloaderv22.zip, 然
后进行解压缩, 并将osrloader.exe文件拷贝到c:\ddk\bin 目录中. 运行osrloader, 在 driver
path中敲入C:\DDK\lib\i386\checked\ldunld.sys (或用Browse选取), 点击Register Service按钮,
然后点击Start service按钮, 如能顺利完成这些步骤, 就意味着 ldunld.sys已经被成功注册及
加载了.
6. 从OSR下载OSR debug monitor, 地址如下: http://www.osr.com/files/dbgmon_v3.zip, 然后进
行解压缩, 并将dbggui.exe文件拷贝到c:\ddk\bin 目录中. 运行dbggui, 选中local mode选项. 7. 切换到DOS 窗口, 转入到 c:\ddk\src\general\simple\exe目录, 运行gethndl, 显示:
Wow - it really worked!!!. 祝贺你,你已经成功地编译并运行第一个设备驱动程序了. 此时在
dbggui中也会出现一些KdPrint()提示信息! 8. 在osrloader中先点击Stop service, 然后再点击Unregister service即可卸载ldunld.sys. 一些注意事项;
1. 如编译DDK中的示范程序时编译器提示缺少哪个文件, 可用Windows或VC的搜索工具先
找到这个文件, 然后将此文件拷入示范程序所在目录再行编译. 也可对示范程序目录中的
Sources文件进行修改以便使所缺失的路径被包括进来.
2 . 用build命令时出现的一些错误或警告信息, 有时可用build -c命令消除掉.
3. 如遇到last line incomplete错误,可下载一个叫lastline.exe的工具来解决
(http://grwy.online.ha.cn/dzhang/lastline.exe).
4. 为了使build能正确运行, 在需被编译的源文件目录下面必须有两个文件: SOURCES和
DIRS, 注意这两个文件没有后缀名. SOURCES的文件格式: TARGETNAME=drivername , 本参数用于指定生成的设备驱动程序名称(不需后缀名),所产
生的文件为drivername.sys. TARGETPATH=.\lib, 本参数用于指定生成的设备驱动程序所存放的路径. 一般采用.\lib.
TARGETTYPE=DRIVER, build能够生成许多不同的目标对象,设备驱动程序一般选用
DRIVER.
INCLUDES=path1;path2;..., 本参数是可选的, 用于指定其他的#include文件的搜索路径.
TARGETLIBS=lib1;lib2;..., 本参数是可选的, 用于指定其他的lib库文件的搜索路径.
SOURCES=file1.c file2.c ..., 本参数用于指定需被编译的全部源文件名称, 后缀名不能省
略,文件名之间用空格分开. DIRS文件格式:
DIRS文件用于指定在当前目录下必须创建的子目录。DIRS文件的内容由一系列用空格分
开的目录名组成, \可用于表示对上一行的继续.
DIRS = \
subdir1 \
subdir2 \
subdir3 当前目录下如果只有DIRS文件而没有SOURCES, 则表示没有任何源文件需要编译,但需在
当前目录下创建子目录, 只有SOURCES文件而没有DIRS则表示有源文件需要编译但不需
创建子目录. 二者都有则表示有源文件需要编译且需创建子目录. 5. BUILD在编译时将会在TARGETPATH和当前目录下创建子目录或文件. 对于一般的
Intel平台, 以c:\ddk\src\general\simple\sys为例说明, 编译完后Build在sys目录下创建子目录
obj\i386\用于存放ldunld.obj. 在c:\ddk\lib\i386\checked保存编译好的ldunld.sys文件. 6. 如果你将设备驱动程序的类型从checked转到free, 则第一次编译源文件的free类型驱动
程序时你必须使用build 的-c选项来编译.
7. 可以使用regedit或regedit32来在注册表中加入驱动程序的表项, ldunld.ini的内容: \registry\machine\system\currentcontrolset\services\Ldunld
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000003
Group = Extended base
ErrorControl = REG_DWORD 0x00000001 运行regini ldunld.ini即可加入相应的注册表项. 7. 在ddk的src目录下有许多示范程序可供参考. 8. 经过一些繁琐的设置,也可以在VC中直接编译驱动程序
(http://grwy.online.ha.cn/dzhang/insider17.pdf和
http://www.computerworld.com.cn/99/tips/9904/040601_03.asp).
发信人: TBsoft (TBsoft), 信区: WinDrvProgram
标 题: NT DDK安装以及SYS编译调试经验点滴
发信站: 武汉白云黄鹤站 (Wed May 26 20:08:49 1999), 站内信件 一、NTDDK的安装 准备下列软件: WIN32SDK或者PLATFORM SDK,NTDDK,Visual C++ 5.0 1、安装Win32SDK或者PLATFORM SDK到C:\MSTOOLS。 2、如果是安装PLATFORM SDK,安装完成后请修改注册表: HKEY_CURRENT_USER\Environment 添加一个“MSTOOLS”字符串,值为C:\MSTOOLS。 3、安装Visual C++ 5.0。 4、安装NT DDK到C:\NTDDK即可。 二、SYS的编译 实例: 1、建立C:\DDK\USER\SIMPLE目录。 2、将C:\DDK\SRC\GENERAL\SIMPLE目录下的文件拷贝到C:\DDK\USER\SIMPLE
目录。 3、进入Checked编译环境,转入C:\DDK\USER\SIMPLE目录,运行BULID 命令
编译,警告不必理会。 4、将生成的C:\DDK\LIB\I386\CHECKED\LDUNLD.SYS 文件拷贝到C:\WINNTSYSTEM32\DRIVERS,然后在C:\DDK\USER\SIMPLE\SYS目录下运行REGINI LDUNLD.
INI命令注册驱动程序。 5、重新启动计算机。 6、用“控制面板”中的“设备”安装LDUNLD.SYS。 7、进入MS-DOS方式,转入C:\DDK\USER\SIMPLE\EXE 目录,运行 NMAKE /F
GETHNDL.MAK编译GETHNDL.C文件(也可以在VC集成环境下编译),生成GETHNDL.
EXE文件。 8、运行GETHNDL.EXE,结果应该正确。 三、用Soft-ICE调试SYS 实例: 1、启动Soft-ICE for NT。 2、打开Soft-ICE的“Symbol Loader”。 3、用“File”菜单中的“Open Module ...”菜单项打开C:\DDK\LIB\I386CHECKED\LDUNLD.SYS文件。 4、用“Module”菜单中的“Translate”菜单项将SYS文件转换成NMS调试符
号文件,然后用“Load”菜单项装载调试符号文件。 5、Ctrl+D激活Soft-ICE,输入SYM命令检查调试符号,选择合适的调试符号
拦截,这里用“BPX LdUnldOpen”拦截。 6、运行GETHNDL.EXE,马上被Soft-ICE拦截下来,并显示出源程序供调试。 7、用“SRC”命令可以在源程序、源程序—汇编代码混合和汇编代码三种显
示方式之间切换,“BC”命令清除全部断点,Ctrl+D退出调试。--
我们万众一心,冒着微软的炮火,前进......Homepage:http://www.whict.edu.cn/tbsoft※ 修改:.TBsoft 于 May 26 20:27:52 修改本文.[FROM: 210.42.24.31]
※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 210.42.24.31]
发信人: kingchurch (老人与海~沙漠海), 信区: programming
标 题: 95 ddk安装指南
发信站: bbs 水木清华站 (wed apr 22 14:14:00 1998)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\ 95 ddk 安装指南 \
\ by kingchurch \
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一、前言:
总看到有网友在programming版上问关于95 ddk的安装问题,在这里做
一介绍,希望能对大家有帮助。
需要澄清的是,这里介绍的不是如何“自动”安装ddk,我想只要会
点鼠标的人就会运行那个setup.exe, 而问题就在于99%的人都没法直接运行
它,我想说一下手动安装的过程。
二、所需软件:
1)95ddk (不需要全板,ftp上那个17m的东东就够了,全板里主要多个
compatiblity test, 一般人没啥用)
2)95sdk (实际上只需要binw16下那个16位rc就可以了)
3)vc5 (偶用的是这个环境,用别的版本的c编译器也大同小异)
4)masm6.11
三、安装过程
1、拷贝95ddk:
把你的95ddk的文件(如果是ftp上down的zip,当然要先解包了)拷到
e:\95ddk(注:文中所用的具体目录都是我所使用的,主要是便于叙述,当然可
以装在别的路径,下同)
2、安装masm6.11c:
把宏汇编masm6.11安装到e:\masm611,把e:\95ddk\masm611c的内容
覆盖到e:\masm611\bin
3、安装vc5到e:\devstudio
4、拷贝95sdk:
把sdk的mstools\binw16下的程序拷到e:\95sdk\binw16下
5、设置path和环境
在你的config.sys中加入下面语句来扩大环境空间
shell=c:\command.com c:\ /e:4096 /p
在你的autoexec.bat中加入
path=e:\devstudio\vc\bin;e:\masm611\bin;e:\95ddk\bin
6、编辑ddk设置批处理:
在e:\95ddk\bin\下建立下面2个批文件
1) ddkenv.bat:
set ddkroot=e:\95ddk
set include=%include%;%ddkroot%\inc32;%ddkroot%\inc16
set lib=%lib%;%ddkroot%\lib
(注:我的ddk里面没有ddkenv.bat的批处理,也懒得找了,所以
自己建的,请注意保存ddk自带的ddkenv.bat,如果你的ddk是cd版的)
2) ddksetup.bat:
set sdkroot=e:\95sdk
call new-vars.bat (masm611的环境)
call ddkenv.bat (ddk环境)
call vcvars32.bat (vc5的环境)
四、编译例子:
我们以e:\95ddk\base\samples\asyncw32下的例子为例,这个
例子里同时有.c, .asm, 以及包含在makefile中的.rc和.def, 因此
通过了这个例子比较能够测试ddk安装的正确性。
如果你按照上述的过程安装了95ddk,那么在重新启动计算机
之后:
1) 进入dos prompt
2)运行ddksetup.bat
3) cd e:\95ddk\base\samples\asyncw32
4) 运行nmake
然后就应该在bin目录下出现你想要的结果,一个加载vxd的con_aw32.exe
和一个asyncw32.vxd, 运行con_aw32.exe可体会一下(很无聊的一个东东:)
五、后话:
能够安装95ddk我想只是学习vxd的第一步,希望大家不要满足于
仅仅用nmake搞定几个例子,最好再进一步研究一下makefile是怎么写的,
实际上一般的vxd构造过程都涉及:
1)用ml编译asm模块
2)用cl编译.c/.c++模块
3)用rc编译.rc资源
4)偶尔写一个.def文件
5)用link把1)--4)各步产生的.obj,.res,.def连同作为wrapper的
vxdwraps.clb连接到一起,得到一个.vxd文件
这个过程中个命令行的参数如何设置在makefile中都有详细表述,如果
都能够搞明白,那么就算自己手敲命令构造一个vxd也不是什么难事,当然了,
如果你感兴趣的话,也可以把上述过程“定制”到某个集成环境中去,那样
点2下鼠标就可以干活喽(要是搞定了的话,别忘了给我一份啊:)
p.s. 请不要问我在哪里下栽ddk,sdk,masm等问题,到以前的文章去找找吧。
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o o 在路那边的茅棚里,老头儿又睡着了,他依旧脸朝下睡着,
o / ~~~ 孩子坐在一旁守护他。 老头儿正在梦见狮子。
<:=={ ~~ ----------
\ kingchurch(老人与海):[email protected]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
设计开发好自己的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,这样就可以安装成功。
NT DDK的安装以及设备驱动程序的编译
作者:程序员客栈
NT DDK的安装以及设备驱动程序的编译
--By 程序员客栈 经常有人问及如何安装DDK,如何编译第一个设备驱动程序以及如何消除掉编译驱动程序
时出现的大量错误信息. 其实, DDK的安装和驱动程序的编译是很简单的. 为了编译驱动程
序, 你必须首先打开一个DOS窗口, 并正确设置好所需的全部环境变量. 本文假定你将要
安装NT DDK 4.0, 并且在安装NT DDK之前,VC已经被安装在 C:\vcdev\vc\bin\目录下(尽量使
用短的VC路径名称,不要用长的路径命名格式). 可按如下方法安装NT DDK( 其实就是进行一些环境变量的设置), NT DDK的安装并不需要
SDK--如果你已经安装好了VC的话. 1. 从微软或其他站点下载NT
DDK(http://download.microsoft.com/download/winntwks40/Install/1998/NT4/EN-US/nt4ddk.zip),
将其安装在硬盘上(本文假定DDK安装目录为c:\ddk). 2. 用任何文本编辑器打开c:\ddk\bin\目录下的setenv.bat文件, 在此文件的第三行(不含空白
行)之后加入如下一行并保存: call C:\vcdev\vc\bin\vcvars32.bat, 具体示例: @echo off
if "%1"=="" goto usage
rem This will put the SDK headers & libs first in the search path. call C:\vcdev\vc\bin\vcvars32.bat if "%BASEDIR%"=="" goto setbasedir
if NOT "%BASEDIR%"=="%1" goto setbasedir
... 3. 完成步骤1和2之后, 你就可以开始编译第一个设备驱动程序了(本文假定驱动程序选为
checked类型): 顺次进入Programs->Windows NT DDK(Common)->Checked Build
Enviroment, 出现一个 DOS窗口. 使用cd命令进入c:\ddk\src\general\simple\sys目录, 键入
build -c命令即可编译, 然后编译器提示已经成功编译好 ldunld.sys文件并已将此文件拷到
c:\ddk\lib\i386\checked目录中. 运行build命令只编译需要重新编译的文件, 而build -c命令则
强迫编译器重新编译所有的文件. 4.使用cd命令进入c:\ddk\src\general\simple\exe目录, 在DOS提示符下键入NMAKE -f
GETHNDL.MAK 即可在当前目录下生成Win32 控制台程序gethndl.exe,此程序用于调用并测
试在第3步中所生成的ldunld.sys设备驱动程序. 5. 从OSR下载OSR driver load(V2.2), 地址如下: http://www.osr.com/files/osrloaderv22.zip, 然
后进行解压缩, 并将osrloader.exe文件拷贝到c:\ddk\bin 目录中. 运行osrloader, 在 driver
path中敲入C:\DDK\lib\i386\checked\ldunld.sys (或用Browse选取), 点击Register Service按钮,
然后点击Start service按钮, 如能顺利完成这些步骤, 就意味着 ldunld.sys已经被成功注册及
加载了.
6. 从OSR下载OSR debug monitor, 地址如下: http://www.osr.com/files/dbgmon_v3.zip, 然后进
行解压缩, 并将dbggui.exe文件拷贝到c:\ddk\bin 目录中. 运行dbggui, 选中local mode选项. 7. 切换到DOS 窗口, 转入到 c:\ddk\src\general\simple\exe目录, 运行gethndl, 显示:
Wow - it really worked!!!. 祝贺你,你已经成功地编译并运行第一个设备驱动程序了. 此时在
dbggui中也会出现一些KdPrint()提示信息! 8. 在osrloader中先点击Stop service, 然后再点击Unregister service即可卸载ldunld.sys. 一些注意事项;
1. 如编译DDK中的示范程序时编译器提示缺少哪个文件, 可用Windows或VC的搜索工具先
找到这个文件, 然后将此文件拷入示范程序所在目录再行编译. 也可对示范程序目录中的
Sources文件进行修改以便使所缺失的路径被包括进来.
2 . 用build命令时出现的一些错误或警告信息, 有时可用build -c命令消除掉.
3. 如遇到last line incomplete错误,可下载一个叫lastline.exe的工具来解决
(http://grwy.online.ha.cn/dzhang/lastline.exe).
4. 为了使build能正确运行, 在需被编译的源文件目录下面必须有两个文件: SOURCES和
DIRS, 注意这两个文件没有后缀名. SOURCES的文件格式: TARGETNAME=drivername , 本参数用于指定生成的设备驱动程序名称(不需后缀名),所产
生的文件为drivername.sys. TARGETPATH=.\lib, 本参数用于指定生成的设备驱动程序所存放的路径. 一般采用.\lib.
TARGETTYPE=DRIVER, build能够生成许多不同的目标对象,设备驱动程序一般选用
DRIVER.
INCLUDES=path1;path2;..., 本参数是可选的, 用于指定其他的#include文件的搜索路径.
TARGETLIBS=lib1;lib2;..., 本参数是可选的, 用于指定其他的lib库文件的搜索路径.
SOURCES=file1.c file2.c ..., 本参数用于指定需被编译的全部源文件名称, 后缀名不能省
略,文件名之间用空格分开. DIRS文件格式:
DIRS文件用于指定在当前目录下必须创建的子目录。DIRS文件的内容由一系列用空格分
开的目录名组成, \可用于表示对上一行的继续.
DIRS = \
subdir1 \
subdir2 \
subdir3 当前目录下如果只有DIRS文件而没有SOURCES, 则表示没有任何源文件需要编译,但需在
当前目录下创建子目录, 只有SOURCES文件而没有DIRS则表示有源文件需要编译但不需
创建子目录. 二者都有则表示有源文件需要编译且需创建子目录. 5. BUILD在编译时将会在TARGETPATH和当前目录下创建子目录或文件. 对于一般的
Intel平台, 以c:\ddk\src\general\simple\sys为例说明, 编译完后Build在sys目录下创建子目录
obj\i386\用于存放ldunld.obj. 在c:\ddk\lib\i386\checked保存编译好的ldunld.sys文件. 6. 如果你将设备驱动程序的类型从checked转到free, 则第一次编译源文件的free类型驱动
程序时你必须使用build 的-c选项来编译.
7. 可以使用regedit或regedit32来在注册表中加入驱动程序的表项, ldunld.ini的内容: \registry\machine\system\currentcontrolset\services\Ldunld
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000003
Group = Extended base
ErrorControl = REG_DWORD 0x00000001 运行regini ldunld.ini即可加入相应的注册表项. 7. 在ddk的src目录下有许多示范程序可供参考. 8. 经过一些繁琐的设置,也可以在VC中直接编译驱动程序
(http://grwy.online.ha.cn/dzhang/insider17.pdf和
http://www.computerworld.com.cn/99/tips/9904/040601_03.asp).
发信人: TBsoft (TBsoft), 信区: WinDrvProgram
标 题: NT DDK安装以及SYS编译调试经验点滴
发信站: 武汉白云黄鹤站 (Wed May 26 20:08:49 1999), 站内信件 一、NTDDK的安装 准备下列软件: WIN32SDK或者PLATFORM SDK,NTDDK,Visual C++ 5.0 1、安装Win32SDK或者PLATFORM SDK到C:\MSTOOLS。 2、如果是安装PLATFORM SDK,安装完成后请修改注册表: HKEY_CURRENT_USER\Environment 添加一个“MSTOOLS”字符串,值为C:\MSTOOLS。 3、安装Visual C++ 5.0。 4、安装NT DDK到C:\NTDDK即可。 二、SYS的编译 实例: 1、建立C:\DDK\USER\SIMPLE目录。 2、将C:\DDK\SRC\GENERAL\SIMPLE目录下的文件拷贝到C:\DDK\USER\SIMPLE
目录。 3、进入Checked编译环境,转入C:\DDK\USER\SIMPLE目录,运行BULID 命令
编译,警告不必理会。 4、将生成的C:\DDK\LIB\I386\CHECKED\LDUNLD.SYS 文件拷贝到C:\WINNTSYSTEM32\DRIVERS,然后在C:\DDK\USER\SIMPLE\SYS目录下运行REGINI LDUNLD.
INI命令注册驱动程序。 5、重新启动计算机。 6、用“控制面板”中的“设备”安装LDUNLD.SYS。 7、进入MS-DOS方式,转入C:\DDK\USER\SIMPLE\EXE 目录,运行 NMAKE /F
GETHNDL.MAK编译GETHNDL.C文件(也可以在VC集成环境下编译),生成GETHNDL.
EXE文件。 8、运行GETHNDL.EXE,结果应该正确。 三、用Soft-ICE调试SYS 实例: 1、启动Soft-ICE for NT。 2、打开Soft-ICE的“Symbol Loader”。 3、用“File”菜单中的“Open Module ...”菜单项打开C:\DDK\LIB\I386CHECKED\LDUNLD.SYS文件。 4、用“Module”菜单中的“Translate”菜单项将SYS文件转换成NMS调试符
号文件,然后用“Load”菜单项装载调试符号文件。 5、Ctrl+D激活Soft-ICE,输入SYM命令检查调试符号,选择合适的调试符号
拦截,这里用“BPX LdUnldOpen”拦截。 6、运行GETHNDL.EXE,马上被Soft-ICE拦截下来,并显示出源程序供调试。 7、用“SRC”命令可以在源程序、源程序—汇编代码混合和汇编代码三种显
示方式之间切换,“BC”命令清除全部断点,Ctrl+D退出调试。--
我们万众一心,冒着微软的炮火,前进......Homepage:http://www.whict.edu.cn/tbsoft※ 修改:.TBsoft 于 May 26 20:27:52 修改本文.[FROM: 210.42.24.31]
※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 210.42.24.31]
发信人: kingchurch (老人与海~沙漠海), 信区: programming
标 题: 95 ddk安装指南
发信站: bbs 水木清华站 (wed apr 22 14:14:00 1998)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\ 95 ddk 安装指南 \
\ by kingchurch \
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一、前言:
总看到有网友在programming版上问关于95 ddk的安装问题,在这里做
一介绍,希望能对大家有帮助。
需要澄清的是,这里介绍的不是如何“自动”安装ddk,我想只要会
点鼠标的人就会运行那个setup.exe, 而问题就在于99%的人都没法直接运行
它,我想说一下手动安装的过程。
二、所需软件:
1)95ddk (不需要全板,ftp上那个17m的东东就够了,全板里主要多个
compatiblity test, 一般人没啥用)
2)95sdk (实际上只需要binw16下那个16位rc就可以了)
3)vc5 (偶用的是这个环境,用别的版本的c编译器也大同小异)
4)masm6.11
三、安装过程
1、拷贝95ddk:
把你的95ddk的文件(如果是ftp上down的zip,当然要先解包了)拷到
e:\95ddk(注:文中所用的具体目录都是我所使用的,主要是便于叙述,当然可
以装在别的路径,下同)
2、安装masm6.11c:
把宏汇编masm6.11安装到e:\masm611,把e:\95ddk\masm611c的内容
覆盖到e:\masm611\bin
3、安装vc5到e:\devstudio
4、拷贝95sdk:
把sdk的mstools\binw16下的程序拷到e:\95sdk\binw16下
5、设置path和环境
在你的config.sys中加入下面语句来扩大环境空间
shell=c:\command.com c:\ /e:4096 /p
在你的autoexec.bat中加入
path=e:\devstudio\vc\bin;e:\masm611\bin;e:\95ddk\bin
6、编辑ddk设置批处理:
在e:\95ddk\bin\下建立下面2个批文件
1) ddkenv.bat:
set ddkroot=e:\95ddk
set include=%include%;%ddkroot%\inc32;%ddkroot%\inc16
set lib=%lib%;%ddkroot%\lib
(注:我的ddk里面没有ddkenv.bat的批处理,也懒得找了,所以
自己建的,请注意保存ddk自带的ddkenv.bat,如果你的ddk是cd版的)
2) ddksetup.bat:
set sdkroot=e:\95sdk
call new-vars.bat (masm611的环境)
call ddkenv.bat (ddk环境)
call vcvars32.bat (vc5的环境)
四、编译例子:
我们以e:\95ddk\base\samples\asyncw32下的例子为例,这个
例子里同时有.c, .asm, 以及包含在makefile中的.rc和.def, 因此
通过了这个例子比较能够测试ddk安装的正确性。
如果你按照上述的过程安装了95ddk,那么在重新启动计算机
之后:
1) 进入dos prompt
2)运行ddksetup.bat
3) cd e:\95ddk\base\samples\asyncw32
4) 运行nmake
然后就应该在bin目录下出现你想要的结果,一个加载vxd的con_aw32.exe
和一个asyncw32.vxd, 运行con_aw32.exe可体会一下(很无聊的一个东东:)
五、后话:
能够安装95ddk我想只是学习vxd的第一步,希望大家不要满足于
仅仅用nmake搞定几个例子,最好再进一步研究一下makefile是怎么写的,
实际上一般的vxd构造过程都涉及:
1)用ml编译asm模块
2)用cl编译.c/.c++模块
3)用rc编译.rc资源
4)偶尔写一个.def文件
5)用link把1)--4)各步产生的.obj,.res,.def连同作为wrapper的
vxdwraps.clb连接到一起,得到一个.vxd文件
这个过程中个命令行的参数如何设置在makefile中都有详细表述,如果
都能够搞明白,那么就算自己手敲命令构造一个vxd也不是什么难事,当然了,
如果你感兴趣的话,也可以把上述过程“定制”到某个集成环境中去,那样
点2下鼠标就可以干活喽(要是搞定了的话,别忘了给我一份啊:)
p.s. 请不要问我在哪里下栽ddk,sdk,masm等问题,到以前的文章去找找吧。
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o o 在路那边的茅棚里,老头儿又睡着了,他依旧脸朝下睡着,
o / ~~~ 孩子坐在一旁守护他。 老头儿正在梦见狮子。
<:=={ ~~ ----------
\ kingchurch(老人与海):[email protected]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
设计开发好自己的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,这样就可以安装成功。
解决方案 »
- VC 多文档多视图关闭视图文档时不弹出提示保存对话框?
- ADO问题,网上的方法有限也无法解决
- 关于CString的Left用法
- 用JMP方法拦截API函数在WIN98下面不能用吗?
- 请问vc6里面怎么把程序编译成发行版的?请写出详细设置。(我很菜)
- 想用vc在ie中画个图表。
- CMainFrame 的窗口句柄怎么得到
- 含有非模态对话框的SDI界面在最小化后,点击任务栏上的按钮后非模态对话框首先显示出来了,而不能恢复整个Frame?
- 请教:hello world 的程序居然也会出问题?谢谢!
- 请教一个小问题,分不够再添
- 有谁读过<<Windows操作系统原理>>? 我怎么觉得它不如随便一本<<操作系统原理>>加一本<<Windows核心编程>>.
- 创建数据源?
简单吧!如果装了driverstudio那么在设置了环境变量后,build lib库!
然后直接编译就可以了:)简单吧:)
http://www.csdn.net/develop/read_article.asp?id=10729