У меня есть приложение для Windows, которое ДОЛЖНО работать как 32-разрядный (из-за других ограничений, которые я не контролирую). Однако мое приложение должно вызывать и обращаться к драйверу, который может быть 32-разрядным или 64-разрядным в зависимости от системы, в которой он установлен.
Я обращаюсь к драйверу через вызовы DeviceIoControl (), обмениваясь структурами данных, объявленными во включаемом файле. Структуры данных содержат поля, объявленные как «DWORD_PTR» (включаемый файл, который я тоже не контролирую).
Моя проблема в том, что в 64-битной системе драйвер ожидает, что структуры содержат 64-битное целое число (из-за объявления DWORD_PTR). Тем не менее, моя 32-битная программа видит эти DWORD_PTR как 32-битные целые числа. Затем у меня возникает несоответствие данных между моей программной версией структур данных и пониманием этих структур драйвером.
В результате DeviceIoControl () завершается с ошибкой ERROR_INSUFFICIENT_BUFFER (область данных, переданная системному вызову, слишком мала). Я подтвердил, что не получаю эту ошибку, если передаю 64-битную версию структур в драйвер.
У меня есть несколько ужасных вариантов из этого беспорядка. Но мне интересно, есть ли у кого-нибудь более приятные предложения?
Решение:
- Объявить новую копию общих структур с РЕАЛЬНЫМИ 64-битными полями данных (__int64)
- Динамическая проверка архитектуры ОС (32/64)
- Используйте 32-битную или 64-битную версию структур для вызовов DeviceIoControl ().
Недостатки:
- Я должен поддерживать явную 64-битную копию объявления структур вручную. Со временем это может быть болью.
Мои другие решения являются вариацией этого, но они ВСЕГДА включают поддержку некоторой копии определения структур (например, в опции IDL для COM-серверов).
Редактировать: Это драйвер Microsoft, и, похоже, он не использует IoIs32bitsProcess (irp)!