使用VS2005开发64位驱动程序需要注意的一些问题

1、首先在Autoexec.bat里边设置好 Set WDKDIR=L:/DDK/Vista 64位驱动使用Vista WDK来开发。 Include: $(WDKDIR)/inc/ddk;$(WDKDIR)/inc/api Lib : $(WDKDIR)/lib/wnet/amd64 2、64位驱动,编译时记得设置相应标志: 删除:WIN32,_X86_=1 添加:_AMD64_;_WIN64 更改:_WIN32_WINNT=0x0400 -> _WIN32_WINNT=_WIN32_WINNT_WINXP,只有XP以上才支持64位驱动. 3、编译64位程序,要打开Detect 64 bit Portability Issues,尽量提前 发现兼容性问题。 4、对于64位驱动来说,很多例程都必须通过wdmsec.lib才能连接,所以这个lib 必须添加到项目的lib列表中。 5、对于32位驱动来说,如果是以Free模式连接,会提示无法找到“__SEH_epilog”。 解决方法是从2K3 DKK或者Vista WDK里边拷贝sehupd.lib到2K的DDK LIB目录 并添加到项目的LIB列表中。 如果是User mode程序,则把 /VC/PlatformSDK/Lib/sehprolg.obj 添加到项目中。 6、打开"C/C++/Code Generation/Buffer Security Check"时,还会提示无法找到 ”__SEH_prolog4“、“__Security_Cookie”等符号。 Kernel Mode,这个符号在如下文件里边: BufferOverflowk.lib User Mode,这个符号在如下文件里边: BufferOverflowu.dll L:/VSNET2005ENG/VC/crt/src/intel/dll_lib/sehsupp.obj L:/VSNET2005ENG/VC/crt/src/intel/dll_lib/sehprolg4.obj L:/VSNET2005ENG/VC/crt/src/intel/mt_lib/sehprolg4.obj L:/VSNET2005ENG/VC/crt/src/intel/mt_lib/sehsupp.obj L:/VSNET2005ENG/VC/crt/src/intel/xdll_lib/sehprolg4.obj 要么把这个选项关掉,要么就把上面的文件加入项目中。 7、出现警告syntax option: “debugmode:full(mininal)”时,说明Linker 出现了额外的选项,在“Linker/Command Line”里边把多余的选项删除掉。 8、64位驱动不能使用__asm{}内嵌汇编,汇编必须放在独立的ASM文件中编译。 如果需要使用汇编指令又不想使用ASM文件,则可以使用VS2005封装内联 的汇编指令。头文件intrin.h不在DDK/Inc下面,需要从VS2005/VC/Include 下面拷贝过来。 编译时,可能提示: error C2733: second C linkage of overloaded function '_interlockedbittestandset' not allowed L:/DDK/Vista/inc/ddk/intrin.h 912 error C2733: second C linkage of overloaded function '_interlockedbittestandreset' not allowed L:/DDK/Vista/inc/ddk/intrin.h 913 error C2733: second C linkage of overloaded function '_interlockedbittestandset64' not allowed L:/DDK/Vista/inc/ddk/intrin.h 918 error C2733: second C linkage of overloaded function '_interlockedbittestandreset64' not allowed L:/DDK/Vista/inc/ddk/intrin.h 919 到intrin.h里边去,注释掉相关四行代码即可: //__MACHINEI(unsigned char _interlockedbittestandset(long *a, long b)) //__MACHINEI(unsigned char _interlockedbittestandreset(long *a, long b)) //__MACHINEX64(unsigned char _interlockedbittestandset64(__int64 *a, __int64 b)) //__MACHINEX64(unsigned char _interlockedbittestandreset64(__int64 *a, __int64 b)) 上面只是让编译通过,想连接通过,还必须设置编译选项C/C++/Optimiztation: Enable Intrinsic Funcions,勾上。 如果想使用独立的ASM文件,则右击.sln项目,选“Custom Build Rule”,然后使用 “Microsoft Macro Assembler”编译ASM即可。注: (1)、VS2005默认情况下的“Microsoft Macro Assembler”只支持32位汇编,想要编 译64位,必须另外建立一个X64汇编环境,方法是把masm.rules复制一份成masm64.rules, 并更改命令成ml64.exe即可。 (2)、ASM中使用条件编译时,这个条件编译指使必须同时在这个对话框中设置, ASM不使用默认的项目编译条件指示。 (3)、在32位和64位汇编之间进行切换时,先到Custom Build Rule对话框里边切换, 然后再在界面上换到WIN32或者X64,否则VS2005可能不能正常编译(要重启)。 9、为了方便在32位和64位驱动之间进行移植,要注意三个问题: 1、凡是可能涉及到指针转换的,一律使用xxx_PTR,如DWORD_PTR,ULONG_PTR等, 这个类型在64位下面自动扩展成64位。 2、32位程序传递结构到64位驱动时,需要注意结构对齐的问题。 64位下面,指针是8字节对齐的,有时会导致64位结构的大小增长, 而32位传递进去的结构可能偏小,导致内存读取出问题。 3、指针转换成ULONG等类型之后,高32位已经被截断,因此不要再转换成指针类型。 4、打印指针,应该使用“%p”,不应该使用“%08X”。 10、64位不能使用swprintf()例程,要使用_vsnwprintf()例程,如下: int _cdecl swprintf_64(WCHAR* wBuf,int wBufCount,LPCWSTR formatstring, ...) { va_list argsList; va_start(argsList, formatstring); int ret = _vsnwprintf( wBuf, wBufCount, formatstring, argsList); va_end(argsList); return ret; };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值