我有一个Windows应用程序,它可以作为32位运行(由于我的控制之外的其他限制)。但是,我的应用程序必须调用和访问可能是32位或64位的驱动程序,具体取决于安装它的系统。
我通过DeviceIoControl()调用访问驱动程序,交换在include文件中声明的数据结构。数据结构包含声明为“DWORD_PTR”的字段(我不控制的包含文件)。
我的问题是在64位系统上,驱动程序期望结构包含64位整数(因为DWORD_PTR声明)。但是,我的32位程序将那些DWORD_PTR视为32位整数。然后,我的数据结构的程序版本与驱动程序对这些结构的理解之间的数据不匹配。
的DeviceIoControl()结束-了ERROR_INSUFFICIENT_BUFFER失败(传递给系统调用的数据区域太小)。我确认如果我将64位版本的结构传递给驱动程序,我不会收到此错误。
我有一些丑陋的选择。但我想知道是否有人有更好的建议?
解决方案:
缺点:
我的其他解决方案是这一个变体中,但是它们的 ALWAYS 涉及维持(在IDL例如用于COM服务器选项)结构定义的一些拷贝。
编辑:这是一个Microsoft驱动程序,似乎它不使用IoIs32bitsProcess(irp)!
答案 0 :(得分:5)
您维护32位和64位版本的结构,并通过设备驱动程序IoIs32BitProcess(irp)
处理程序中的DEVICE_CONTROL
函数实现特殊处理,并在需要时将其转换为64位结构。这是做到这一点的常用方法。
这是good amount of documentation about it on MSDN.
由于您后来提到您无法控制驱动程序源代码,我建议您在64位上维护自己的32位变体,并发送正确的检查OS体系结构的变体。看起来结构声明没有为驱动程序正确完成。
答案 1 :(得分:0)
当包含带有结构defs的头文件以便你总是使用64位定义时,有没有办法操作#define?这对我来说似乎是最好的选择(如果可能的话)。
如果没有,我会在我自己的代码中隐藏64位结构 - 这样只有一个结构def需要注意,而不是一堆if32bit / if64bit的东西洒在整个 - 似乎更多容易出错。也许你可以这样做:
_ASSERT(sizeof(myStruct) == sizeof(64bitStruct))
在你的应用程序开始时,如果你有新的标题,第一次运行你的应用程序会提醒你需要同步。