В статье рассматриваются вопросы, связанные с выпуском драйверов для 64-битных версий Windows. Приводятся типовые проблемы и пути их решения, а также рассматриваются инструменты, упрощающие процесс разработки драйверов.
Выход в 2005 году первой версии операционной системы Windows для 64-битных процессоров AMD64 поставил перед разработчиками драйверов новую задачу - выпуск драйверов и для 32-битных, и для 64-битных систем. В то время многие производители оказались не готовы к поддержке драйверов для двух систем, поэтому многие устройства так и не получили обновленных драйверов. Тогда это было оправдано, поскольку 64-битные системы были в новинку и не так уж много пользователей их оценило. Однако с выходом Windows Vista x64 ситуация резко изменилась. Теперь и домашние пользователи хотят иметь 64-битную операционную систему, и разработчикам уже необходимо в обязательном порядке задуматься о выпуске 64-битных версий драйверов.
Прежде всего, возникает вопрос: Нужно ли разрабатывать 64-битные драйверы для 64-битных версий Windows? Ответ однозначен: "Да, нужно!". Дело в том, что использовать 32-битные драйверы на 64-битной системе в режиме ядра невозможно.
При разработке драйверов для 64-битных систем нужно учесть некоторые особенности, игнорирование которых впоследствии может привести к долгим попыткам понять, почему те или иные вещи работают не так, как раньше. MSDN достаточно полно освещает вопрос разработки 64-битных драйверов. Однако, иногда информация оказывается слишком разрозненной. Поэтому в данной статье представлен обзор основных проблем и направлений для дальнейшего изучения вопроса.
При разработке драйверов для Win64 обычно желательно использовать тот же самый исходный код, что и для Win32. Различия в коде стоит выносить в отдельные секции под условной компиляцией.
Перечислим несколько наиболее важных положений, касающихся 64-битных драйверов:
Необходимо заметить, что Microsoft максимально возможно обеспечивает разработчиков руководствами по переносу кода в новых версиях Windows DDK.
Список потенциальных проблем при переносе кода приведен в [1, 2]. Однако, там лишь названы эти проблемы, мы же подробно рассмотрим варианты их решения.
Итак, MSDN рекомендует нам использовать:
Особое внимание следует обращать на:
Для проверки работоспособности драйверов рекомендуется использовать соответствующие инструменты. Помимо включения максимального уровня диагностики в компиляторе (/W4 или даже /Wall) обязательно необходимо использовать другие возможности.
Прежде всего, посмотрите на бесплатный инструмент от Microsoft - анализатор PREfast, если Вы еще с ним не знакомы. Это статический анализатор кода, который обнаруживает некоторые классы ошибок, которые часто встречаются как в драйверах, так и в обычных C и C++ программах.
Статический анализатор кода общего назначения Gimpel Software PC-lint обнаруживает, помимо некоторых из перечисленных ошибок, еще и огромное количество ошибок, встречающихся в обычных программах.
Другой статический анализатор кода Viva64 предназначен для поиска ошибок в C++ программах, проявляющихся при переносе кода с 32-битных на 64-битные системы.
Как видите, ничего страшного в разработке 64-битных драйверов нет и инструменты, облегчающие этот процесс, доступны. А значит откладывать это больше не стоит.