4

这只是一个中途编程问题。首先,我有一张 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 位打印机驱动程序中。

4

3 回答 3

3

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

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

有件事让我很反感:当我第一次编写这个 COM 服务器时(是的,我也不得不忍受许多不眠之夜才知道这个技巧)我只构建了 32 位版本的(自动生成的) ) 代理/存根 dll。在我知道解决方案之前,又是一阵不眠之夜:为 32 位和 64 位构建代理/存根 dll。32 位端处理 32 位端(在您的情况下是应用程序),64 位端处理 64 位端(驱动程序)。COM 管理代理/存根的不同版本如何相互通信。哦,请务必在您的系统上注册服务器。容易,对吧?

于 2009-03-02T15:57:37.160 回答
3

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

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

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

于 2009-03-02T16:41:26.337 回答
1

我认为驱动程序的全部意义在于抽象出硬件的实际工作,并为软件提供一个通用接口。在这种情况下,PCIe 驱动程序需要是 64 位的,这样它才能充当 Windows 和硬件的中间人,但我认为 32 位应用程序可以毫无问题地访问设备。

您所读到的不兼容意味着 32 位和 64 位程序集不能属于同一个应用程序 - 应用程序必须针对其中一个或另一个,尽管 32 位应用程序通常可以在 Windows x64 上使用WoW64,它只是充当翻译器。

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

于 2009-03-02T15:00:52.053 回答