当写一个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]
浙公网安备 33010602011771号