我有一个Windows应用程序必须以32位运行(因为其他限制不在我的控制范围内)。然而,我的应用程序需要调用和访问驱动程序,该驱动程序可能是32位或64位,这取决于安装它的系统。
我通过DeviceIoControl()调用访问驱动程序,交换在包含文件中声明的数据结构。数据结构包含声明为"DWORD_PTR"的字段(我也无法控制包含文件)。
我的问题是,在64位系统上,驱动程序希望这些结构包含64位整数(因为DWORD_PTR声明)。但是,我的32位程序将这些DWORD_PTR视为32位整数。然后,我的程序版本的数据结构与驱动程序对这些结构的理解存在数据不匹配。
DeviceIoControl()最终失败,并显示ERROR_INSUFFICIENT_BUFFER(传递给系统调用的数据区域太小)。我确认如果我向驱动程序传递一个64位版本的结构体,则不会出现此错误。
我有一些丑陋的选项可供选择。但是我想知道是否有更好的建议?
解决方案:
1.使用真实的64位数据字段(__int64)声明共享结构的新副本。 2.动态检查操作系统架构(32/64)。 3.为DeviceIoControl()调用使用32位或64位版本的结构。
缺点:
1.我必须手动维护显式的64位结构定义副本。随着时间的推移可能会很痛苦。
我的其他解决方案是这个的变化,但它们始终涉及维护某些结构定义的副本(例如在COM服务器选项的IDL中)。
编辑:这是一个Microsoft驱动程序,似乎它不使用IoIs32bitsProcess(irp)!
我通过DeviceIoControl()调用访问驱动程序,交换在包含文件中声明的数据结构。数据结构包含声明为"DWORD_PTR"的字段(我也无法控制包含文件)。
我的问题是,在64位系统上,驱动程序希望这些结构包含64位整数(因为DWORD_PTR声明)。但是,我的32位程序将这些DWORD_PTR视为32位整数。然后,我的程序版本的数据结构与驱动程序对这些结构的理解存在数据不匹配。
DeviceIoControl()最终失败,并显示ERROR_INSUFFICIENT_BUFFER(传递给系统调用的数据区域太小)。我确认如果我向驱动程序传递一个64位版本的结构体,则不会出现此错误。
我有一些丑陋的选项可供选择。但是我想知道是否有更好的建议?
解决方案:
1.使用真实的64位数据字段(__int64)声明共享结构的新副本。 2.动态检查操作系统架构(32/64)。 3.为DeviceIoControl()调用使用32位或64位版本的结构。
缺点:
1.我必须手动维护显式的64位结构定义副本。随着时间的推移可能会很痛苦。
我的其他解决方案是这个的变化,但它们始终涉及维护某些结构定义的副本(例如在COM服务器选项的IDL中)。
编辑:这是一个Microsoft驱动程序,似乎它不使用IoIs32bitsProcess(irp)!