32位和64位Windows驱动有什么不同?
怎么兼容32位和64位Windows驱动?
在编程的时候,32位系统跟64位系统数据类型是有些不一样的。
在64位环境下,指针、句柄是64位的, 也就是8个字节长度的。
Windows为64位环境提供了一些指针类型的数据类型。
固定精度的数据类型
类型 定义
DWORD32 32位无符号整数
DWORD64 64位无符号整数
INT32 32位有符号整数
INT64 64位有符号整数
LONG32 32位有符号整数
LONG64 64位有符号整数
UINT32 无符号INT32
UINT64 无符号INT64
LONG32 无符号LONG32
LONG64 无符号LONG64
当需要数据类型的精度随着处理器位数大小变化时,
请使用指针精度类型。这些类型称为”多态“数据类型。
这些类型通常以”_PTR”后缀结尾。
指针精度的数据类型
类型 定义
DWORD_PTR 指针精度的无符号长类型
HALF_PTR 指针大小的一半。用于包含一个指针和两个小型字段的结构
INT_PTR 指针精度的有符号整型
LONG_PTR 指针精度的有符号长类型
SIZE_T 指针可以引用的最大字节数,用于必须跨指针的整个范围
SSIZE_T 有符号SIZE_T
UHALF_PTR 无符号HALF_PTR
UINT_PTR 无符号INT_PTR
ULONG_PTR 无符号LONG_PTR
LPARAM 与LONG_PTR同义词(在Wtypes.h里定义)
WPARAM 与UINT_PTR同义词(在Wtypes.h里定义)
注意:在使用数据保存指针或句柄时,请尽量使用同类型变量,如果因为程序原因不能使用同类型变量时,使用指针精度变量。
编写驱动时,除了要考虑移植驱动本身的问题外,还有一个问题要解决:移植完驱动后,上层应用程序怎么办?一般可以把上层应用改成64位。但是有时不行,比如调用了一个没有源码的第三方库,这时把应用程序移植到64位是不现实的。但需要支持64位操作系统,怎么办?
需要解决32位应用程序与64位驱动配合协作的问题。
1、驱动要支持32位IOCTL
某些IOCTL包含指针的结构,要特别小心地区别对待它,根据被调用者解析结构或者输出结构。
有三种办法可以解决这个问题:
1. 尽量避免使用IOCTL传递包含指针的结构。
2. 通过APIOIs32bitProcess()来判断上层调用者的程序类型。
3. 在64位程序里采用新的IOCTL命令。
/*IOCTL structure in header file*/
typedef struct _IOCTL_PARAMETERS {
PVOID Addr;
SIZE_T Length;
HANDLE handle;
}IOCTL_PARAMETERS, *PIOCTL_PARAMETERS;
/*32-bit IOCTL stucture*/
/*This structure is defined
inside the driver source code*/
typedef struct _IOCTL_PARMETERS_32 {
VOID * POINTER_32 Addr;
INT32 Length;
VOID * POINTER_32 Handle;
}IOCTL_