使用的64位驾驶员从32-位应用程序
题
我有一个Windows的应用程序已运行,作为32位(因为其他限制出我的控制)。然而,我应用程序有电话和访问的一个驱动程序,这可能是32位或64位根据该系统,它是安装。
我访问的驱动程序通过DeviceIoControl()话,交换数据的结构宣布一个包括文件。数据结构中包含的领域宣布为"DWORD_PTR"(包括文件我不控制或者)。
我的问题是,在64位系统、司机预计的结构,以包含64位整数(因为DWORD_PTR宣言》).然而,我的32位的程序看到那些DWORD_PTR为32位整数。然后,我有一个数据之间的不匹配我的程序版本的数据结构和驾驶员理解这些结构。
DeviceIoControl()结束了失败,ERROR_INSUFFICIENT_BUFFER(区域的数据传递给一个系统调用太小)。我证实,我没有得到这一错误,如果我通过一个有64位版本的结构的驱动程序。
我有几个丑陋的选择了这个烂摊子。但我不知道,如果任何人有一些好建议吗?
方案:
- 申报的新副本的共享结构与实64位的数据字段(__int64)
- 动态检查操作系统体系结构(32/64)
- 使用的32位或64位版本的结构DeviceIoControl()电话。
缺点:
- 我必须保持明确的64位的复制的结构宣言》。它可以是一个痛苦的时间。
我其他的解决方案是变化中的这一个,但他们 总是 涉及维持一些复制的结构定义(例如在一个IDL COM服务器选项)。
编辑:这是一个微软驱动程序,它似乎不会使用IoIs32bitsProcess(irp)!
解决方案
你保持这两个32位和64位的结构和执行特别处理通过 IoIs32BitProcess(irp)
功能的设备驾驶员 DEVICE_CONTROL
处理程序并将它转换至64位的结构,每当需要。这是常见的方式这样做。
这里是一个 好的文件数量约在MSDN。
因为你说你不能控制的驱动程序的源代码,我建议你们保持自己变为32位上的64位和发送正确的一个检查OS架构。它看起来像结构的声明是不正确的驱动程序。
其他提示
有没有一种方法,操纵一个#定义时包括标题的结构定义这样,你总是使用的64位的定义?这似乎是最好的选择对我的(如果可能)。
如果没有,我会影64位结构,在我自己的代码-那种方式,只有一个strucuture def以看出来,而不是一堆if32bit/if64bit的东西洒在整个--这似乎更多的错误倾向。也许你可以做一些事情,如:
_ASSERT(sizeof(myStruct) == sizeof(64bitStruct))
在开始应用程序,所以如果你有机会更新的标题,第一次运行的程序会提醒你,你需要保持同步。