刚开始利用ddk开发驱动程序的时候采用的是ultraedit编辑工具,然后编译安装驱动程序.
参考www.USBSOLUTION.COM,现在介绍在vc中开发驱动程序的配置方法.
一. 准备工作
1.首先创建一个你的驱动工程文件目录。这个目录下用来放置你的各个驱动工程文件夹。(比如我在D盘创建了一个MyDrivers文件夹作为我的驱动工程文件目录)
2.然后添加两个用户环境变量,一个是DDKROOT,他的值应该是你所安装DDK的根目录。(比如在安装DDK时安装到了d:/WINDDK/2600,那么 DDKROOT的值应该为d:/WINDDK/2600),另外一个变量是WORKPATH,这个变量的值就应该是你第一步所创建的驱动工程目录的路径。(若按本文,WORKPATH的值应该是D:/MyDrivers ),这两个变量会在我们接下来的工程配置中要用到,当然既然是变量,他们的名称是随你的喜欢了。
//这里要注意的是,如果以后你创建了一个新的工程之后,这里需要改动
3.最后在D:/MyDrivers下创建一个名称为DIRS的无扩展名的文件。用记事本打开它,写上 DIRS=Driver1。Driver1是你的驱动文件所在的文件夹名.
如果以后有新的工程也要把工程名称添加到这里
DIRS= /
irda /
config /
ndis /
wshsmple /
modem
也就是 在本目录下面有 irda config ndis wshsmple modem这 几个工程
//MakeDriver.bat应该放在工程目录下面
4.写一个MakeDriver.bat批处理文件.如下.(直接copy,不用修改)
@echo off
if "%1"=="" goto usage1
if "%3"=="" goto usage2
if not exist %1/bin/setenv.bat goto usage3
call %1/BIN/setenv %1 %4
%2
cd %3
build -b -w %5 %6 %7 %8
goto ok
:usage1
echo Error: the first parameter is NULL!
goto exit
:usage2
echo Error: the third parameter is NULL!
goto exit
:usage3
echo Error: %1/bin/setenv.bat not exist!
goto exit
:ok
echo MakeDriver %1 %2 %3 %4
:exit
二.建立一个Makefile工程
下面我将要建立一个Driver1的工程。他的路径将是D:/MyDrivers/Driver1
1.打开vc6.0,建立一个Makefile的新工程,输入工程名(比如:Driver1)及路径(我们要选择你所创建的驱动工程文件目录D:/MyDrivers)。
2.在Debug配置对话框中输入如下:
//红色的D:应该特别注意,不然的话不能成功哦
Build Command Line: MakeDriver %DDKROOT% D: %WORKPATH% CHECKED
注意:D: %WORKPATH% CHECKED ,如果你的驱动工程文件的目录为E:/myDrivers
则应该修改为
Build Command Line: MakeDriver %DDKROOT% E: %WORKPATH% CHECKED
这个地方曾经出错,调试了半天,haha
Rebuild all optines: -nmake/a
Output file name: 改为sys扩展文件( 比如: Driver1.sys )
3.在Release配置对话框中输入如下:
Build Command Line: MakeDriver %DDKROOT% D: %WORKPATH% FREE
Rebuild all optines: -nmake/a
Output file name: 改为sys扩展文件( 比如: Driver1.sys )
4.工程配置结束,选择Finish按钮
这时我们可以看到我们的驱动工程文件目录中已经有了一个Driver1的工程文件夹,我们的驱动程序就放在这个文件夹下面。
三.还需要两个文件
还有两个文件是必须的 makefile和sources,将他们拷贝到工程文件夹,也就是D:/MyDrivers/Driver1中,但sources文件一般需要我们改写,makefile直接从ddk目录中拷贝来一个放在工程文件夹下就行了。
在sources文件中一般需要改写的部分如下:
TARGETNAME=DRIVER1
INCLUDES=$(DDKROOT)/inc; /
$(DDKROOT)/inc/DDK
TARGETLIBS=$(DDK_LIB_PATH)/usbd.lib /
$(DDK_LIB_PATH)/ntoskrnl.lib
SOURCES = driver1.cpp
TARGETNAME 的值是你驱动程序的名字,比如我的会输出DRIVER1.SYS
INCLUDES 将所有你所用到的内核函数,他们所在的头文件的路径添加进来。
TARGETLIBS 将所有你所用到的内核函数,他们所在的库文件的路径添加进来。
SOURCES 就是你工程文件夹需要编译的所有文件名,包括.CPP,.C,.RC文件
好了,基本上可以编写驱动程序了.
然后你就可以编写windows程序一样,写驱动程序.
如果编译成功的话,就会在./objchk/i386下面生成 *.sys了
注:
这里的方法和 ./驱动开发学习笔记.doc中所述的方法稍微有点差别,本篇文章所使用的方法是静态的方法,自己手动添加用户变量,但是./驱动开发学习笔记.doc所说的方法是让setenv.bat去设置环境变量,
另外一种配置方法:
1. 然后添加两个用户环境变量,一个是DDKROOT,他的值应该是你所安装DDK的根目录。(比如在安装DDK时安装到了d:/WINDDK/2600,那么 DDKROOT的值应该为d:/WINDDK/2600),另外一个变量是WORKPATH,这个变量的值就应该是你第一步所创建的驱动工程目录的路径。(若按本文,WORKPATH的值应该是D:/MyDrivers ),这两个变量会在我们接下来的工程配置中要用到,当然既然是变量,他们的名称是随你的喜欢了。
2. 写一个批处理文件 built.bat(内容不变)
@echo off
rem -----------------------------------------------------------
rem usage:
rem build.bat [
rem -----------------------------------------------------------
if exist *.sys
if exist ./objchk/i386/*.pdb
if exist ./objfre/i386/*.pdb
if exist ./objchk/i386/*.sys
if exist ./objfre/i386/*.sys
:start
set DDKOPT=%1
if "%DDKOPT%" == "" set DDKOPT=free
pushd .
if not exist %DDKROOT%/bin/setenv.bat goto :SetenvNotFound
call %DDKROOT%/bin/setenv.bat %DDKROOT% %DDKOPT%
popd
if exist %DDKROOT%/bin/x86/build.exe goto :start
%DDKROOT%/bin/build.exe
:start
%DDKROOT%/bin/x86/build.exe
if "%DDKOPT%" == "checked" goto :CopyChecked
if "%DDKOPT%" == "chk" goto :CopyChecked
if "%DDKOPT%" == "free" goto :CopyFree
if "%DDKOPT%" == "fre" goto :CopyFree
goto :exit
:CopyChecked
if exist ./objchk/i386/*.sys move ./objchk/i386/*.sys .
goto :exit
:CopyFree
if exist ./objfre/i386/*.sys move ./objfre/i386/*.sys .
goto :exit
:SetenvNotFound
echo Can't found Setenv.bat.
goto :exit
:exit
set DDKOPT=
pause
3. 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
4. Sources (更改两处)
TARGETNAME=HelloWorld2 (生成的.sys名称)
TARGETPATH=obj
TARGETTYPE=DRIVER
# $(DDK_LIB_PATH)/ndis.lib
MSC_WARNING_LEVEL=-W3 -WX
MSC_OPTIMIZATION=/Odi
INCLUDES=
C_DEFINES= $(C_DEFINES) -DUNICODE -D_UNICODE
C_DEFINES=$(C_DEFINES) -DNDIS50_MINIPORT=1
C_DEFINES=$(C_DEFINES) -DNDIS50=1
SOURCES = HelloWorld.c (源文件)