Использование 64-битного драйвера в 32-битной программе.Окна

StackOverflow https://stackoverflow.com/questions/602587

  •  03-07-2019
  •  | 
  •  

Вопрос

Это лишь половина вопроса программирования.Прежде всего, у меня есть карта PCI-Express и 32/64-битные драйверы.Целевая операционная система должна быть 64-разрядной системой Windows.Я читал, что под Vista64 все драйвера должны быть сертифицированы как 64-битные.Является ли это общим ограничением для 64-битных операционных систем и применимо ли это также к «XP 64» или любой системе Linux?

Итак, для простоты предположим, что я использую 64-битный драйвер для своей карты PCIe под Vista64 и имею кучу 64-битных DLL для использования функций карты.С другой стороны, есть большая устаревшая 32-битная exe-программа, которой необходимо использовать устройство PCIe.Преобразование программы в 64-битную версию потребует огромных усилий.

Так что же можно сделать, чтобы объединить эту 32-битную программу и 64-битный драйвер?Я читал, что смешивать 32/64-битные двоичные файлы и библиотеки DLL вообще невозможно, но мне в это трудно поверить.Я уверен, что вы можете распечатать документ под Vista64 из 32-битного приложения, и Windows каким-то образом перенесет это на 64-битный драйвер принтера.

Это было полезно?

Решение

64-битная сертификация требуется только для Vista;для платформ, отличных от Windows, нет центра сертификации, и я не верю, что XP или Windows Server проверяют сертификацию (хотя я не уверен, и это может зависеть от того, какой пакет обновлений вы используете).

Если вы используете драйвер через Windows API, проблем возникнуть не должно;Windows будет выполнять 32<->64-битные преобразования в ядре.Если вы пытаетесь загрузить драйвер внутри своего процесса, это, вероятно, будет невозможно.Как говорит Дирк, вам придется запустить его внутри собственного процесса и взаимодействовать через COM-сервер.Я не уверен, через какие препятствия вам придется пройти, если вам нужно запустить драйвер на более высоком уровне выполнения и вы хотите вызывать его из пользовательского режима.

Будем надеяться, что ваши 64-битные библиотеки DLL предлагают 32-битный API, или Windows предлагает стандартный интерфейс драйвера (если это обычное устройство ввода-вывода, такое как дисплей или сетевая карта).

Другие советы

Ваше 32-битное приложение напрямую вызывает драйвер?(Я предполагаю, что это симулятор водителя!)

Единственный способ взаимодействия между 32-битными и 64-битными библиотеками DLL — это написать COM-сервер, который управляет связью (читай:оберните ЛИБО вызовы приложений ИЛИ ответы 64-битного драйвера) между ними.

Одна вещь, которая меня снова укусила:Когда я впервые написал этот COM-сервер (да, мне тоже пришлось пережить много бессонных ночей, прежде чем я узнал об этом трюке), я создал только 32-битную версию (автоматически сгенерированной) прокси/заглушки dll.Прежде чем я узнал о решении, последовал еще один приступ бессонных ночей:Создайте dll прокси/заглушки как для 32-битной, так и для 64-битной версии.32-битная сторона имеет дело с 32-битной стороной (в вашем случае приложением), а 64-битная — с 64-битной стороной (драйвером).COM управляет тем, как разные версии прокси/заглушки взаимодействуют друг с другом.И да, обязательно зарегистрируйте сервер в вашей системе.Легко, правда?

Я думаю, что весь смысл драйвера заключается в том, чтобы абстрагироваться от фактической работы оборудования и предоставить программному обеспечению общий интерфейс.В этом случае драйвер PCIe должен быть 64-битным, чтобы он мог выступать в качестве посредника между Windows и оборудованием, но я думаю, что 32-битное приложение могло бы тогда получить доступ к устройству без каких-либо проблем.

Под этой несовместимостью, о которой вы читали, подразумевается, что 32- и 64-битные сборки не могут быть частью одного и того же приложения — приложение должно ориентироваться либо на одну, либо на другую, хотя 32-битное приложение будет в целом нормально работать в Windows x64 с использованием WoW64, который действует просто как переводчик.

Испытываете ли вы сейчас проблемы или просто спрашиваете гипотетически?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top