当写一个32位及64位驱动通用代码时,应该注意什么

一,有时候,在64位系统中只会有64位驱动的存在,那么如果你在驱动中要处理进程的一些东西时,最好分清楚上面是WOW的32位还是64的。

IoIs32bitProcess()

二,64位系统不只是X86_64,也就是AMD64,还有安腾。

_WIN64 在针对任何 64 位版本的 Windows(包括 Itanium 版)编译时定义。
#ifdef _M_AMD64
//AMD64代码
#elif defined (_M_IX86)
//X86代码
#else
//_M_IX64 Itanium代码
#error 错误,没有为 Itanium 开发代码
#endif

 

当然,如果想在 sources 文件中写,你可以这样。

!if "$(_BUILDARCH)"=="IA64"
TARGETNAME=xfrmi64
C_DEFINES=$(C_DEFINES) -DXGE_OS_PLATFORM_64BIT
!else
!if "$(_BUILDARCH)"=="AMD64"
TARGETNAME=xfrmx64
C_DEFINES=$(C_DEFINES) -DXGE_OS_PLATFORM_64BIT
!else
TARGETNAME=xfrmi86
C_DEFINES=$(C_DEFINES) -DXGE_OS_PLATFORM_32BIT
!endif
!endif

 

三,编码时,请注意以下问题。

1.不要将指针强制转换为int,long,dword等类型,而应该使用UINT_PTR,INT_PTR。
2.使用PtrToUlong和PtrToLong来截断指针。
3.不要将存储在int或ULONG中的指针地址重新合并为一个新的指针地址。
4.小心16进制常量和无符号整数
dword i = 0;
32:p[i - 1] = p[0xffffffff] == p[-1]
64:p[i - 1] = p[0x00000000ffffffff] != p[-1]

 

posted on 2014-03-27 15:56  emissary  阅读(923)  评论(0)    收藏  举报

导航