学习windows驱动(32位与64位兼容)

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_
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值