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

时间:2009-03-02 14:48:09

标签: 64-bit 32-bit

这只是一个中途编程问题。首先,我有一个PCI-Express卡和32/64位驱动程序。目标操作系统必须是Windows 64位系统。我在Vista64下看到所有驱动程序都必须经过64位驱动程序认证。这是64位操作系统下的一般限制,这是否也适用于“XP 64”或任何Linux系统?

所以为了简单起见,我假设我在Vista64下为我的PCIe卡使用了64位驱动程序,并且有一堆64位DLL来使用这些卡功能。另一方面,有一个大型的传统32位exe程序需要使用PCIe设备。将程序转换为64位将是一项非常巨大的努力。

那么如何将32位程序和64位驱动程序结合在一起呢?我读到混合32/64位二进制文​​件和DLL根本不可能,但这对我来说很难相信。我相信你可以在32位应用程序中打印Vista64下的文档,而Windows会以某种方式将它包装到64位打印机驱动程序中。

3 个答案:

答案 0 :(得分:3)

您的32位应用程序是否直接调用驱动程序? (我猜的是司机的模拟器!)

在32位和64位dll之间进行通信的唯一方法是编写一个COM服务器来管理通信(读取:包装应用程序调用或64位驱动程序响应)。

回过头来咬我的一件事:当我第一次写这个COM服务器时(是的,在我开始知道这个技巧之前我也不得不承受许多不眠之夜)我只构建了32位版本的(自动生成的)代理/存根dll。在我开始知道解决方案之前,又发生了另一场不眠之夜:为32位和64位构建代理/存根dll。 32位端处理32位端(在您的情况下是应用程序)和64位与64位端(驱动程序)。 COM管理代理/存根的不同版本如何相互通信。哦,确实要在您的系统上注册服务器。容易,对吗?

答案 1 :(得分:3)

仅在Vista下需要64位认证;没有非Windows平台的认证机构,我不相信XP或Windows Server会检查认证(不确定,它可能取决于您所使用的服务包)。

如果您通过Windows API使用驱动程序,那么应该没有任何问题; Windows将在内核中执行32 - 64位转换。如果您尝试在自己的进程中加载​​驱动程序,则可能无法实现。正如Dirk所说,你必须在自己的进程中运行它并通过COM服务器进行通信。如果你必须在更高权限的执行级别运行你的驱动程序并想要从用户模式调用它,我不确定你必须跳过什么箍。

希望您的64位DLL提供32位API,或Windows提供标准驱动程序接口(如果它是常见的I / O设备,如显示器或网卡)。

答案 2 :(得分:1)

我认为驱动程序的重点是抽象出硬件的实际工作方式,并为软件提供一个通用接口。在这种情况下,PCIe驱动程序需要是64位,以便它可以充当Windows和硬件的中间人,但我认为32位应用程序可以随后访问设备而不会有任何麻烦。

您阅读的不兼容性的含义是32位和64位程序集不能属于同一个应用程序 - 应用程序必须以一个或另一个为目标,尽管32位应用程序通常 使用WoW64在Windows x64上正常运行,它只是一个翻译器。

您目前是否遇到问题,或者您只是假设问?