使用32位应用程序的64位驱动程序

Phi*_*sse 3 windows 64-bit winapi driver

我有一个Windows应用程序,它可以作为32位运行(由于我的控制之外的其他限制).但是,我的应用程序必须调用和访问可能是32位或64位的驱动程序,具体取决于安装它的系统.

我通过DeviceIoControl()调用访问驱动程序,交换在include文件中声明的数据结构.数据结构包含声明为"DWORD_PTR"的字段(我不控制的包含文件).

我的问题是在64位系统上,驱动程序期望结构包含64位整数(因为DWORD_PTR声明).但是,我的32位程序将那些DWORD_PTR视为32位整数.然后,我的数据结构的程序版本与驱动程序对这些结构的理解之间存在数据不匹配.

DeviceIoControl()以ERROR_INSUFFICIENT_BUFFER结束失败(传递给系统调用的数据区域太小).我确认如果我将64位版本的结构传递给驱动程序,我不会收到此错误.

我有一些丑陋的选择.但我想知道是否有人有更好的建议?


解:

  • 使用REAL 64位数据字段(__int64)声明共享结构的新副本
  • 动态检查OS体系结构(32/64)
  • 使用32位或64位版本的结构进行DeviceIoControl()调用.

缺点:

  • 我必须手动维护结构声明的显式64位副本.随着时间的推移可能会很痛苦.

我的其他解决方案是这个的变体,但它们总是涉及维护结构定义的一些副本(例如,在COML for COM服务器选项中).

编辑:这是一个Microsoft驱动程序,似乎它不使用IoIs32bitsProcess(irp)!

Sed*_*glu 5

您可以维护32位和64位版本的结构,并通过IoIs32BitProcess(irp)设备驱动DEVICE_CONTROL程序处理程序中的函数实现特殊处理,并在需要时将其转换为64位结构.这是做到这一点的常用方法.

以下是MSDN上有关它的大量文档.

由于您后来提到您无法控制驱动程序源代码,我建议您在64位上维护自己的32位变体并发送正确的检查OS体系结构的变体.看起来结构声明没有为驱动程序正确完成.