热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用32位应用程序的64位驱动程序-Using64-bitsdriverfrom32-bitsapplication

IhaveaWindowsapplicationthatHAStorunas32-bits(becauseofotherlimitationsoutofmycont

I have a Windows application that HAS to run as 32-bits (because of other limitations out of my control). However, my application has to call and access a driver which may be 32-bits or 64-bits depending on the system where it is installed.

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

I access the driver through DeviceIoControl() calls, exchanging data structures declared in an include file. Data structures contains fields declared as "DWORD_PTR" (the include file I don't control either).

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

My problem is that on a 64-bits system, the driver expects the structures to contain 64-bits integer (because of DWORD_PTR declaration). However, my 32-bits program sees those DWORD_PTR as 32-bits integers. I then have a data mismatch between my program version of the data structures and the driver understanding of those structures.

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

DeviceIoControl() ends-up failing with ERROR_INSUFFICIENT_BUFFER (The data area passed to a system call is too small). I confirmed that I don't get this error if I pass a 64-bits version of the structs to the driver.

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

I have a few ugly options out of this mess. But I wonder if anyone has some nicer suggestions?

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


Solution:

  • Declare a new copy of the shared structures with REAL 64-bits data fields (__int64)
  • 使用REAL 64位数据字段(__int64)声明共享结构的新副本

  • Dynamically check the OS architecture (32/64)
  • 动态检查OS体系结构(32/64)

  • Use the 32-bits or 64-bits version of the structures for the DeviceIoControl() calls.
  • 使用32位或64位版本的结构进行DeviceIoControl()调用。

Drawbacks:

  • I have to maintain an explicit 64-bits copy of the structures declaration manually. It can be a pain over time.
  • 我必须手动维护结构声明的显式64位副本。随着时间的推移可能会很痛苦。


My other solutions are variation of this one, but they ALWAYS involve maintaining some copy of the structures definition (for example in an IDL for COM servers option).

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

Edit: This is a Microsoft driver and it seems it does not use IoIs32bitsProcess(irp)!

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

2 个解决方案

#1


You maintain both 32-bit and 64-bit version of structures and implement special handling via IoIs32BitProcess(irp) function in device driver DEVICE_CONTROL handler and convert it to 64-bit structure whenever needed. This is the common way of doing it.

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

Here is a good amount of documentation about it on MSDN.

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

Since you later mentioned you don't have control over driver source code, I suggest you to maintain your own variant for 32-bit on 64-bit and send the right one checking the OS architecture. It looks like structure declarations are not done properly for the driver.

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

#2


Is there a way to manipulate a #define when including the header with the structure defs such that you're always using the 64-bit definition? That seems like the best option to me (if possible that is).

有没有办法在包含结构defs的头文件时操作#define,以便你总是使用64位定义?这对我来说似乎是最好的选择(如果可能的话)。

If not, I'd shadow the 64-bit structure in my own code -- that way there is only a strucuture def to watch out for, rather than a bunch of if32bit/if64bit stuff sprinkled throughout -- that seems more bug prone. Perhaps you could do something like:

如果没有,我会在我自己的代码中隐藏64位结构 - 这样只需要注意一个结构def,而不是一堆if32bit / if64bit的东西 - 这似乎更容易出错。也许你可以这样做:

_ASSERT(sizeof(myStruct) == sizeof(64bitStruct)) 

at the start of your app, so if you ever get newer headers, the first run of your app will remind you that you need to sync.

在你的应用程序的开头,所以如果你有更新的标题,你的应用程序的第一次运行将提醒你需要同步。


推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
dmcm0008
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有