在32位程序中使用64位驱动程序。Windows

4
这只是一个半程程序问题。首先,我有一个PCI-Express卡和32/64位驱动程序。目标操作系统必须是Windows 64位系统。我读到,在Vista64下,所有驱动程序都必须是经过认证的64位驱动程序。这是64位操作系统的一般限制吗?这也适用于“XP 64”或任何Linux系统吗?
因此,为简单起见,假设我在Vista64下使用64位驱动程序,并有一堆64位DLL来使用卡的功能。另一方面,有一个需要使用PCIe设备的大型遗留32位exe程序。将程序转换为64位将是一项非常巨大的工作。
那么,如何将32位程序和64位驱动程序结合起来?我读到混合32/64位二进制文件和DLL根本不可能,但我很难相信这一点。我确定您可以从32位应用程序中打印文档,Windows会以某种方式将其包装成64位打印机驱动程序。
3个回答

3
你的32位应用程序是否直接调用驱动程序?(我猜测是驱动程序的模拟器!)唯一的通信方式在32位和64位dll之间是编写一个COM服务器来管理通信(即:在应用程序调用或64位驱动响应之间进行包装)。有一件事让我后悔不已:当我第一次编写这个COM服务器时(是的,我也不得不忍受很多个不眠之夜才知道这个技巧),我只构建了(自动生成的)代理/存根dll的32位版本。接着又经历了一段不眠之夜,才知道解决方案:为32位和64位都构建代理/存根dll。32位处理32位(在你的情况下是应用程序),而64位处理64位(驱动程序)。COM管理代理/存根的不同版本如何相互通信。噢,还要确保将服务器注册到系统中。简单吧?

3
64位认证只在Vista下需要;非Windows平台没有认证机构,我不认为XP或Windows Server会检查认证(不确定,可能取决于您使用的服务包)。
如果您是通过Windows API使用驱动程序,则不应该有任何问题;Windows将在内核中进行32 <-> 64位翻译。如果您尝试在自己的进程中加载驱动程序,则可能无法实现。正如Dirk所说,您必须在其自己的进程中运行它,并通过COM服务器进行通信。如果您必须以更高的特权执行级别运行驱动程序并希望从用户模式进行调用,则不确定需要跳过哪些障碍。
希望您的64位DLL提供32位API,或者Windows提供标准驱动程序接口(如果它是常见的I / O设备,如显示器或网络卡)。

我不直接使用驱动程序,而是通过一组DLL。看起来这些DLL没有32位API,所以我需要使用64位exe,因为它不是标准设备。 - asdrubael

1

我认为驱动程序的整个目的是将硬件的实际工作抽象出来,并向软件呈现一个通用接口。在这种情况下,PCIe驱动程序需要是64位的,以便它可以充当Windows和硬件之间的中介,但我认为32位应用程序可以毫不费力地访问设备。

所谓的不兼容性是指32位和64位程序集不能成为同一应用程序的一部分 - 应用程序必须针对其中之一,尽管32位应用程序通常可以在使用WoW64的Windows x64上正常运行,后者只是充当翻译器。

您目前是否遇到问题,还是只是假设性地提问?


目前我只是在假设,但我希望明天尝试一下。 - asdrubael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接