arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:45029回复:10

楼主#
更多 发布于:2003-09-30 13:12
作者:Arthur Tu
2003年9月28日星期日

标题:用VC++ 6.0来编译WDM驱动(限于2K DDK)

Version 1.02

如果转贴,务必加上以下内容:
***************************************
作者:Arthur Tu
出处:驱动开发网 www.driverdevelop.com
***************************************

内容:
用VC++ 6.0来编辑(不是编译)Driver的源文件是很不错的选择,尤其是搭配用Visual Assist,更方便了。编辑完了,就在VC++里面build,就更方便了。
我在M$的站点参考了些,DS生成的dsw、和build生成的log文件,都有参考。实际上,M$站点上就是根据build的log文件来改VC的Setting的。Me too;)
限于2K DDK,因为XP DDK和2003 DDK不需要VC++6.0了。并且我用VC6来build的时候,会告诉你“Compiler version not supported by Windows DDK”,不过没有进一步去尝试。
DDK自己带了link,98、2K DDK似乎都是VC5的,如果像我这样做,实际上是用VC6的link了。
不考虑source、dir、make文件。

DDK的build,其实算是一个调用nmake工具,而nmake去调相应的文件如cl.exe、link.exe等。
cl的选项设置,主要注意DDK的include路径问题,link的选项,就是要让link去link出一个sys而不是exe,呵呵

预备工作:
1、安装了DDK(呵呵,说句废话)。目录名字最好不要带空格。
2、建立一个workspace,把自己的c、h、rc等文件加进去。
3、Configurations,添加Checked、Free,不要Debug、Release(其实这并没有什么必要,Checked、Debug,看你怎么叫了)。
剩下的就是改各个设置,让VC为你build出一个sys文件了。

我们一个一个的来。所有的改动,都在Project->Setting下面。主要集中在C/C++和Link下。
1、 General,就一个,Not Using MFC;
2、 Debug,没有什么可改的;
3、 C/C++:

1.1 General:
3.1.1 Warning level,用Level3,驱动嘛,稳定压倒一切,而且DDK sample就是warning 3的,Warnings as errors选上;
3.1.2 Optimizations,对checked,我是Disable(Debug),省的用SoftIce的时候会有变量说Watch不了,对Free的,我是Customize,后面会讲到;
3.1.3 Debug Info,Free当然是没有了,你要加上是你的事了,Checked,我用C7;VC默认的Program Database for "Edit & Continue",和link的/driver选项冲突;
3.1.4 Preprocessor definitions,有些我并没有弄清楚,有些可能是DS用的,大概说说。下面是我某个dsw用的。
RDRDBG, SRVDBG, FPO=0, WIN32=100, STD_CALL, CONDITION_HANDLING=1, NT_UP=1, NT_INST=0, _NT1X_=100, WINNT=1, _WIN32_WINNT=0x0400, WIN32_LEAN_AND_MEAN=1, DEVL=1, _DLL=1, _X86_=1, $(CPU)=1, NTVERSION='WDM', WINVER=0x500, NTDEBUG=ntsd,DBG=1

STD_CALL不必说了,driver的函数全部是__stdcall的,其实在其他地方有设置的。
WINVER=0x500,是因为你是for 2K的。XP的是0x501,不过没有用,反正不能用VC6了。
_X86_=1,没有的话,嘿嘿。Alpha等CPU不是这个值了。
DBG,free的话,就不要定义,或为0。
FPO,checked的为0,free的为1。我想应该是指Fram-Pointer Omission吧
NTDEBUG= checked ? ntsd : ntsdnodebug
WIN32_LEAN_AND_MEAN, Exclude rarely-used stuff from Windows headers,non-mfc的,用这个能减少build的时间。多些definitions也没有关系,不影响其他的就好;)
NT_UP,为0表示是MP,多处理器的,1表示你在单处理器用的。
NT_INST, set to turn on instrumentation


根据driver类型,你可能还要加上别的preprocessor definitions,比如NDIS的IMD,就要NDIS50, NDIS_MINIPORT_DRIVER, NDIS50_MINIPORT。
3.1.5 Project Options 你只需要最后添加几个就好了,包括/QIfdiv- /QIf /QI0f,可以在MSDN上查到。值得一提是VC产生的workspace的debug setting,默认有个GZ选项,Catch Release-Build Errors in Debug Build,编译的时候会说error LNK2001: unresolved external symbol __chkesp,去掉就好了。
1.2 C++ Language 没有什么说的,不要RTTI, exception handling看你用没有用了。
1.3 Code Generation 把Calling convention用__stdcall,其余不管了(记得STD_CALL吗);
1.4 Customize 没有什么可说的,我一般是function-level linking,因为加了GF选项,Eliminate duplicate strings我也就不选了;
1.5 Listing Files 就Listing file type可说一下。你要想看汇编代码的话,可以在这里改改;
1.6 Optimizations checked自然是disable了,free的,我选是Full optimization和Frame_Popinter Omission,以及Only __inline,其实这看个人了;
1.7 Precompiled Headers 这个就不说了,看MSDN吧,默认也可以;
1.8 Preprocessor  Preprocessor definitions前面已经说了,重点在Additional include directories上,$(BASEDIR)incddkwdm, $(BASEDIR)incddk, $(BASEDIR)inc, $(BASEDIR)incwin98, ....inc,这是我某个dsw的,所以,BASEDIR的环境变量要设置好,我就顺便用DS的工具来start VC,它恰好帮你设置了,当然你也可以直接写上你的DDK的安装路径。找不到include 路径,会引发一大堆错误,比如WDM.H有错误等。。。是很多人问的问题;

4、 好了,轮到Link了
4.1 General 选Ignore all default libraries,你可以选上generate map file, map文件有时候很有用的;Checked的当然要选上generate debug info, Link incrementally不选;Objects/library modules,添加wdm.lib等,ntoskrnl.lib好像输出了诸如sprintf、strcat等一些函数(注1),根据driver可能还要其他的,比如ndis.lib;别忘了Output file name改成yourname.sys,可不是yourname.exe啊;)
4.2 Debug 就checked要改改,选上Debug info,我是选Both formats的;
4.3 Input 重点之一,Additional lib path,$(BASEDIR)libchki386,这是我的一个dsw用的,checked填checked lib的路径,free填freelib的路径
4.4 Output 在Entry-point symbol,填DriverEntry,或_DriveEntry@8,一样;
根据link的输出来看,Base address应该填0x10000,Stack,Reserve的应该填0x40000,Commit填0x1000;Version Info,自己填吧;
4.5 Project Options,重点,很多选项要直接在这里添加。要添加的包括:
/machine:IX86,CPU相关的
/debug:full,/debugtype:both 根据M$站点的说法,为了使WinDbg能找到你的symbol,这两是都要的,而且还要单独用linker来link一次,VC不认/debug:full,free就没有这个问题了。根据M$的方法,可以这样:写个lnk文件,在Post-build step,再link一次,添加link @yourlnk.lnk,这个lnk文件,可以从log文件提取,如果不用WinDbg,就无所谓了;
/driver,Use this linker option to build a Windows NT kernel mode driver,MSDN说的
/IGNORE:4001,4037,4039,4065,4070,4078,4087,4089,4096,4210 查MSDN
/MERGE:_PAGE=PAGE /MERGE:_TEXT=.text /SECTION:INIT,d,DriverEntry就可以放到INIT section去。
/FULLBUILD
/RELEASE,在文件头添加checksum
/FORCE:MULTIPLE
/OPT:REF /OPT:ICF /align:0x20 /osversion:5.00 /subsystem:native

特别注意/subsystem:native和/driver不要漏了。
一长串的/ignore可以让你即使选warning level 4也能通过:D,warning level 4有点变态的:D


其实上面说的大部分是废话:),大部分选项,你看看build输出的log文件,就能知道了。这样你也可以根据你的driver,自己添加一些必要的选项。

越写越觉得自己无知:(

有什么不对的地方,请指出。

另外还有用个bat文件在VC下build的方法等,不多说了。


注1:2003的DDK带了个ntstrsafe.h,有一些很方便的string函数可以用,而且保证安全,在NT、2K也可以用的,我把它贴上来。用ntoskrnl输出的如strcpy等函数现在就没有必要了。

[编辑 -  4/3/04 by  arthurtu]

[编辑 -  4/4/04 by  arthurtu]

最新喜欢:

murongyumurong... robbieborobbie...
link_bridge
驱动巨牛
驱动巨牛
  • 注册日期2002-11-28
  • 最后登录2011-05-15
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-02 00:00
Arthur Tu
老兄真强,我虽然不懂。
但是我知道是好东东!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-10-10 12:58
关于DbgPrint的一个问题:

我测试驱动的时候碰到蓝屏,用si的stack命令一看,居然是KdPrint引起的,很是ft。DbgPrint调用_vsnprintf,它又调用wctomb,就蓝了,没有记错的话是0xA,IRQL_NOT_LESS_OR_EQUAL。同样的上下文,其他地方多次用KdPrint都没有问题。
我想原因可能在spinlock上。这个DbgPrint在KeAcquireSpinLock和Release之间的。把这个KdPrint注释掉,就好了。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-10-10 22:54
关于浮点运算:
用KeSaveFloatingPointState和KeRestoreFloatingPointState

不过我一直没有机会用 ;)

直到前几天,我用上了。我发现直接用这两函数,会报错,说不能link 外部的__fltused。
同事加了个全局的ulong __fltused = 1;错误没有了,可是结果并不正确。sprintf(\"%3f\",x)不对,x是个float。
后来发现,加上msvcrt.lib就好了,也不用定义全局的变量。


Walt Oney有更全面的解释,哪天贴上来 :D

[编辑 -  11/28/03 by  arthurtu]
wangxin_china
驱动中牛
驱动中牛
  • 注册日期2003-03-28
  • 最后登录2008-09-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-25 09:43
谢谢了,找了好久 :P
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-10-27 20:27
关于一些C的字符处理函数

其实ntoskrnl.exe输出了不少的诸如atoi、sprintf等函数(2K的,XP的没有验证),用dumpbin带exports参数可以看到。
那么至少,这些函数在passive level是可以用的。import lib应该就是ntoskrnl.lib了。

2k ntoskrnl.exe输出的一些函数copy到下面吧 :D能用的函数还是不少的

       1155  482 0005DC88 _itoa
       1156  483 0005DD11 _itow
       1159  486 0005DD3F _snprintf
       1160  487 0005DD90 _snwprintf
       1161  488 0005DE00 _stricmp
       1162  489 0005DE8C _strlwr
       1163  48A 0005DEB0 _strnicmp
       1164  48B 0005DF60 _strnset
       1165  48C 0005DF90 _strrev
       1166  48D 0005DFC0 _strset
       1167  48E 0005DFE0 _strupr
       1168  48F 0005E003 _vsnprintf
       1169  490 0005E053 _wcsicmp
       1170  491 0005E09E _wcslwr
       1171  492 0005E0C8 _wcsnicmp
       1172  493 0005E11D _wcsnset
       1173  494 0005E143 _wcsrev
       1174  495 0005E173 _wcsupr
       1175  496 0005E228 atoi
       1176  497 0005E19D atol
       1177  498 0005E2B1 isdigit
       1178  499 0005E289 islower
       1179  49A 0005E32E isprint
       1180  49B 0005E306 isspace
       1181  49C 0005E261 isupper
       1182  49D 0005E2D9 isxdigit
       1183  49E 0005E35C mbstowcs
       1184  49F 0005E3CF mbtowc
       1185  4A0 0005E410 memchr
       1186  4A1 0005E4C0 memcpy
       1187  4A2 0005E800 memmove
       1188  4A3 0005EB40 memset
       1189  4A4 0005EB98 qsort
       1190  4A5 0005ED64 rand
       1191  4A6 0005ED82 sprintf
       1192  4A7 0005ED5A srand
       1193  4A8 0005EDF0 strcat
       1194  4A9 0005EEE0 strchr
       1195  4AA 0005EFA0 strcmp
       1196  4AB 0005EDE0 strcpy
       1197  4AC 0005F030 strlen
       1198  4AD 0005F0B0 strncat
       1199  4AE 0005F1E0 strncmp
       1200  4AF 0005F220 strncpy
       1201  4B0 0005F320 strrchr
       1202  4B1 0005F350 strspn
       1203  4B2 0005F390 strstr
       1204  4B3 0005F410 swprintf
       1205  4B4 0005F47F tolower
       1206  4B5 0005F4B3 toupper
       1207  4B6 0005F504 towlower
       1208  4B7 0005F51F towupper
       1209  4B8 0005F529 vsprintf
       1210  4B9 0005F57A wcscat
       1211  4BA 0005F5C9 wcschr
       1212  4BB 0005F5F2 wcscmp
       1213  4BC 0005F5A4 wcscpy
       1214  4BD 0005F62B wcscspn
       1215  4BE 0005F66C wcslen
       1216  4BF 0005F689 wcsncat
       1217  4C0 0005F6C9 wcsncmp
       1218  4C1 0005F701 wcsncpy
       1219  4C2 0005F73E wcsrchr
       1220  4C3 0005F77E wcsspn
       1221  4C4 0005F7C0 wcsstr
       1222  4C5 0005F806 wcstombs
       1223  4C6 0005F879 wctomb

[编辑 -  12/18/03 by  arthurtu]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2003-12-15 14:43
那在DDK,中可以使用标准C库函数咯??
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-12-15 16:00
那在DDK,中可以使用标准C库函数咯??

并不是所有的都可以用。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2003-12-18 11:54
把Walt Oney关于浮点运算的一个帖子贴上来吧 :D

From: Walter Oney <waltoney@oneysoft.com>
Subject: Re: Using Floating variable in a WDM driver
Date: 1999/09/22
Message-ID: <37E8B83D.AFA107ED@oneysoft.com>#1/1
Content-Transfer-Encoding: 7bit
References: <7sa8kg$elc$1@news.entreprises.cegetel.fr>
Content-Type: text/plain; charset=us-ascii
X-Complaints-To: abuse@rcn.com
X-Trace: GjGUm2k/h6dchDSW3dAtWL+k38GPA70bhhY4oqkqhG8=
Organization: Walter Oney Software
Mime-Version: 1.0
Reply-To: waltoney@oneysoft.com
NNTP-Posting-Date: 22 Sep 1999 11:08:34 GMT
Newsgroups: comp.os.ms-windows.programmer.drivers,comp.os.ms-windows.programmer.nt.kernel-mode


David BOUYEURE wrote:
> I want to use afloating variable in my driver (98 WDM).
> I have this error at compile time :
>                     \"unresolved external symbol __fltused\"
> I guess I have to link with a special lib, but I haven\'t found wich one.

The problem is worse than just finding the right library, unfortunately. The C compiler\'s floating point support assumes that it will be operating in a an application environment where you can initialize the coprocessor, install some exception handlers, and then blast away. It also assumes that the operating system will take care of saving and restoring each thread\'s coprocessor context as required by all the
thread context switches that occur from then on.

These assumptions aren\'t usually true in a driver. Furthermore, the runtime library support for coprocessor exceptions can\'t work because there\'s a whole bunch of missing infrastructure.

What you basically need to do is write your code in such a way that you initialize the coprocessor each time you want to use it (don\'t forget KeSaveFloatingPointState and KeRestoreFloatingPointState). Set things up so that the coprocessor will never generate an exception, too. Then you
can simply define the symbol __fltused somewhere to satisfy the linker.(All that symbol usually does is drag in the runtime support. You don\'t want that support becuase, as I said, it won\'t work in kernel mode.) You\'ll undoubtedly need some assembly language code for the initialization steps.

If you have a system thread that will be doing all your floating point math, you can initialize the coprocesor once at the start of the thread.
The system will save and restore your state as necessary from then on.

Don\'t forget that you can only do floating point at IRQL <
DISPATCH_LEVEL.

--
Walter Oney
http://www.oneysoft.com



arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2004-04-03 10:31
ntstrsafe.h文件

附件名称/大小 下载次数 最后更新
2004-04-03_ntstrsafe.h (186KB)  465
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2004-04-03 10:32
ntstrsafe.lib文件

附件名称/大小 下载次数 最后更新
2004-04-03_ntstrsafe.lib (840KB)  1364
游客

返回顶部