Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1463828
  • 博文数量: 267
  • 博客积分: 3010
  • 博客等级: 少校
  • 技术积分: 3089
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-05 17:09
个人简介

尊天命,尽人事

文章分类

全部博文(267)

文章存档

2017年(6)

2015年(4)

2014年(27)

2013年(52)

2012年(59)

2011年(120)

分类: 嵌入式

2011-11-26 11:29:04

 准备

DDK版本:Windows DDK 3790

IDEVisual Studio 2005

 DDK环境编译驱动

       这种编译驱动的办法是DDK文档中所提倡的办法。此种方法需要编写一个编译脚本文件,在这个脚本中描述了DDK驱动程序的源文件、用到的lib文件和include路径名、编译输出的目录和文件名等信息。编写此类脚本对于Windows程序员可能比较陌生,尤其是当源文件较多时,编写脚本文件可能显得更如麻烦。在源程序的相同目录下创建两个文件makefileSources,这两个文件都是文本文件,内容如下。

 

Makefile这个文件不要修改

  1. #
  2. # DO NOT EDIT THIS Edit .\sources. if you want to add a new source
  3. # file to this component. This file merely indirects to the real make file
  4. # that is shared by all the driver components of the Windows NT DDK
  5. #

  6. !INCLUDE $(NTMAKEENV)\makefile.def

Sources这个文件参考实际情况修改
  1. !if "$(DDK_TARGET_OS)"=="Win2K"
  2. TARGETNAME=Passthru_2000
  3. !elseif "$(DDK_TARGET_OS)"=="WinXP"
  4. TARGETNAME= Passthru _XP
  5. !elseif "$(DDK_TARGET_OS)"=="WinNET"
  6. TARGETNAME= Passthru _03Server
  7. !endif
  8. TARGETPATH=obj
  9. TARGETTYPE=DRIVER

  10. C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1


  11. !if !defined(DDK_TARGET_OS) || "$(DDK_TARGET_OS)"=="Win2K"
  12. #
  13. # The driver is built in the Win2K build environment
  14. #
  15. C_DEFINES=$(C_DEFINES) -DNDIS40_MINIPORT=1
  16. C_DEFINES=$(C_DEFINES) -DNDIS40=1
  17. !else
  18. #
  19. # The driver is built in the XP or .NET build environment
  20. # So let us build NDIS 5.1 version.
  21. #
  22. C_DEFINES=$(C_DEFINES) -DNDIS51_MINIPORT=1
  23. C_DEFINES=$(C_DEFINES) -DNDIS51=1
  24. !endif

  25. # Uncomment the following to build for Win98/SE/WinMe
  26. # This causes several APIs that are not present in Win9X to be
  27. # ifdef'ed out.
  28. # C_DEFINES=$(C_DEFINES) -DWIN9X=1

  29. PRECOMPILED_INCLUDE=precomp.h
  30. PRECOMPILED_PCH=precomp.pch
  31. PRECOMPILED_OBJ=precomp.obj

  32. !if !defined(DDK_TARGET_OS) || "$(DDK_TARGET_OS)"=="Win2K"
  33. TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib \
  34. $(DDK_LIB_PATH)\ntstrsafe.lib
  35. !else
  36. TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib
  37. !endif

  38. USE_MAPSYM=1

  39. INCLUDES=

  40. SOURCES=\
  41.     miniport.c \
  42.     passthru.c \
  43.     passthru.rc \
  44.     protocol.c \
  45.     PTEXTEND.C \
  46.     filter.c

 

7行说明此驱动的名称,这里用到了宏来控制不同操作系统版本的编译所需的文件,$(DDK_TARGET_OS)是从外面的命令行传递进来的。
9行指明此驱动的类型为NT型驱动。
接着是一些宏定义。

TARGETLIBS是编译时要链接的库
INCLUDES
是附加的包含目录。
SOURCES
指定源文件。
编写完这两个脚本后,在Windows的开始菜单中选择“Windows XP Checked Build Environment”(或者其它操作系统)编译环境。一般驱动可以编译出两种版本,Checked版本和Free版本。两者的区别类似于Win32程序开发的Debug版本和Release版本。

 

 IDE环境编译驱动

       首先准备一个脚本(我这里命名为MakeDrv.bat),内容如下:

@echo off

rem -----------------------------------------------------------

rem usage:

rem MakeDrv.bat [] []

rem -----------------------------------------------------------

 

if exist *.sys del *.sys

 

set DDKOPT=%1

if "%DDKOPT%" == "" set DDKOPT=fre

 

set DDKOS=%2

if "%DDKOS%" == "" set DDKOS=WXP

 

pushd .

if not exist c:\winddk\bin\setenv.bat goto SetenvNotFound

call c:\winddk\bin\setenv.bat c:\winddk %DDKOPT% %DDKOS%

popd

if not exist c:\winddk\bin\x86\build.exe goto NoBuildExe

 

c:\winddk\bin\x86\build.exe

if "%DDKOPT%" == "chk" goto :CopyChecked

if "%DDKOPT%" == "fre" goto :CopyFree

goto exit

 

:CopyChecked

if "%DDKOS%" == "WXP" (

if exist .\objchk_wxp_x86\i386\*.sys move .\objchk_wxp_x86\i386\*.sys .\Debug\

)

if "%DDKOS%" == "WNET" (

if exist .\objchk_wnet_x86\i386\*.sys move .\objchk_wnet_x86\i386\*.sys .\Debug\

)

if "%DDKOS%" == "W2K" (

if exist .\objchk_w2k_x86\i386\*.sys move .\objchk_w2k_x86\i386\*.sys .\Debug\

)

goto exit

 

:CopyFree

if "%DDKOS%" == "WXP" (

if exist .\objfre_wxp_x86\i386\*.sys move .\objfre_wxp_x86\i386\*.sys .\Release\

)

if "%DDKOS%" == "WNET" (

if exist .\objfre_wnet_x86\i386\*.sys move .\objfre_wnet_x86\i386\*.sys .\Release\

)

if "%DDKOS%" == "W2K" (

if exist .\objfre_w2k_x86\i386\*.sys move .\objfre_w2k_x86\i386\*.sys .\Release\

)

goto exit

 

:SetenvNotFound

echo Can't found Setenv.bat.

goto exit

 

:NoBuildExe

echo Can't found build.exe

goto exit

 

:exit

del *.log

pause

MakeDrv.bat拷到驱动源目录下(与源文件同目录)

说明:

1. c:\winddk\bin\setenv.bat,这个是驱动自带的,c:\winddk是我驱动安装目录(需要根据实际情况配置),你也可以设置环境变量。

2. 这个脚本的实质还是调用驱动自带的build.exe来编译,只不过在这里我们把需要的参数封装了下。

3. 编译完毕后,我们会把生成的sys文件拷贝到DebugRelease目录,中间文件还是放在类似objfre_w2k_x86\i386这种目录下。

 

       现在打开VS2005,新建一个makefile项目(中文版的叫“生成文件项目”,在vc++——常规)下,保证解决方案同源码及MakeDrv.bat处于同一目录。

在向导的“设置调试配置”中,如下图所示填写:

在“设置发布配置”,不要选择“与调试配置相同”,如下图所示填写:

单击“完成”,便新建了一个工程(当然是空的),你可以把已有的代码添加进来,编译后就会生成驱动文件了。

IDE可以快速定位错误,以后编辑也很方便,默认是编译xp checked版本的驱动,你可以通过项目的配置里(项目-项目属性),选择“配置熟悉”-NMake,生成命令行修改一下,如希望生成2003 fre版本的驱动,则改成MakeDrv.bat fre WNET

以上是两种介绍编译驱动的方法,原理都是调用DDK自带的工具的了,大家应该可以快速的构建自己的编译环境,有什么不懂我们可以再讨论。

下面介绍第三种方法,是“Windows驱动开发技术详解”中介绍的,摘抄如下:(希望没侵犯版权^_^

VC集成开发环境编译HelloDDK1
初次学习编写Windows驱动程序的开发人员,大部分是熟悉VC IDE开发环境的Windows程序员。他们可能不喜欢用编辑脚本来描述一个工程,而是更希望在熟悉的VC IDE环境下编译,并且利用VC IDE可以方便快速地对代码进行交叉索引等操作。本节将向读者介绍此种方法。
1)用VC建立一个新工程。在VC IDE环境中选择“File”|“New”,弹出“New”对话框。在该对话框中,选择“Project”选项卡。在“Project”选项卡中,选择Win32 Application(因为VC并没有提供驱动程序的工程,所以在Win32工程的基础上进行修改)。工程名为“DriverDev”,如图1-5所示。单击“OK”按钮,进入下一个对话框。在该对话框中,选择一个空的工程,如图1-6所示。

1-5  添加新工程

 

1-6  创建新工程


2)将两个源文件Driver.hDriver.cpp拷贝到工程目录中,并添加到工程中,如图1-7所示。

1-7  添加新文件到工程


3)增加新的编译版本,去掉DebugRelease版本,如图1-8和图1-9所示。

1-8  配置编译版本

 

1-9  修改后的check版本

 

1.3.2  VC集成开发环境编译HelloDDK2
4)修改工程属性。选择“Project”|“Setting”,或者直接按下Alt+F7键,弹出“Project Settings”对话框。在对话框中,选择“General”选项卡。将Intermediate filesOutput files改为MyDriver_Check,如图1-10所示。

1-10  修改输出目录

选择C/C++选项卡,将原有的Project Options内容全部删除,替换成如下内容,如图1-11所示。

/nologo /Gz /MLd /W3 /WX /Z7 /Od /D WIN32=100 
/D _X86_=1 /D WINVER=0x500 /D DBG=1 
/Fo"MyDriver_Check/" /Fd"MyDriver_Check/" /FD /c

 

1-11  修改C++选项卡

选择Link选项卡,将原有的Project Options内容全部删除,替换成如下内容,如图1-12所示。

ntoskrnl.lib /nologo /base:"0x10000" 
/stack:0x400000,0x1000 /entry:"DriverEntry"
/subsystem:console /incremental:no /pdb:"
MyDriver_Check/HelloDDK.pdb" /debug /machine:I386
/nodefaultlib /out:"MyDriver_Check/HelloDDK.sys" 
/pdbtype:sept /subsystem:native /driver 
/SECTION:INIT,D /RELEASE /IGNORE:4078

 

1-12  修改link选项卡

5)修改VClib目录和include目录。在VC中选择“Tools”|“Options”,在弹出的对话框中选择“Directories”选项卡。在“Show directories for”下拉菜单中选择“Include files”菜单。添加“D:\WINDDK\2600.1106\INC\W2K”“D:\WINDDK\2600.1106\INC\DDK\W2K”,并将这两个目录置于最上,如图1-13a)所示。读者可将“D:\WINDDK\ 2600.1106”替换成自己的DDK安装目录。这里应该选择W2K子目录,DDK中还会有相应的XP子目录。因为XP驱动编译时候需要高版本的VC编译器,所以这里用的是W2K子目录,它编译的代码完全可以应用于Windows 2000Windows XP操作系统下。

   

1-13  设置include目录和设置lib目录

“Show directories for”下拉菜单中选择“Library files”菜单,添加目录“D:\WINDDK\ 2600.1106\LIB\W2K\I386”,并置于最上端,如图1-13b)所示。

6)编译。按下F7键,和1.3.2节一样,同样会编译出一个HelloDDK.sys文件。

阅读(2369) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~