Во-первых, дисклеймер - всё, что я пишу сюда, я пишу для себя, чтобы не забыть. В сеть - потому что мне так удобнее. Поэтому никаких катов и тд нету. Спасибо.
Собственно, сабж. Разработка драйверов под Windows (а драйверы - это то единственное, что позволяет нам «влезть» в kernel mode маздаевой ОС) - штука довольно-таки неприятная и вязкая. WinAPI и на пользовательском уровне-то радости никакой не вызывает, а на уровне ядра он и вовсе не даёт спать ночами.
А использовать его нужно. Даже необходимо. Можно, конечно, поддаться новомодным веяниям и писать на других языках, но это чревато (см. гугль «С++ windows drivers»).
Посему всенепременнейше встаёт задача как-нибудь это дело упростить или хотя бы сделать более комфортабельным. Написание кода на Си в блокноте с дальнейшей консольной компиляцией - это, конечно, весело, и настоящие программисты оценят, но:
- Документация по апи уровня ядра никакая совершенно. Смотрите в хидеры и обрящете.
- Хидеры большие и запутанные, в традициях целевой платформы.
- Примеров много, но они ещё более большие и запутанные, охватывают далеко не всё, комменты местами писаны на китайском или немецком, а средний файл занимает около 1000 строк ниочём (это всё имхо, конечно).
Вариантов здесь немного, и все они довольно очевидны:
- Использовать нормальный текстовый редактор (да, они есть под windows). Notepad++ например сгодится.
- Использовать то, что предлагает сам микрософт, т.е. Вижуал Студио с определёнными настройками. Скажу честно, глубокие настройки студии местами вводят в ступор, поэтому этот способ даже не опробован.
- Использовать какую-нибудь боле-мене универсальную IDE.
Поскольку этот текст написан не настоящим программистом, а настоящим непингованным ламером, был выбран третий вариант, а в качестве IDE использована Eclipse CDT Ganymede.
Процесс настройки данной проги для работы с DDK я и попытаюсь далее описать.
Итак, первое, что нужно сделать - это создать проект драйвера где-нибудь в дебрях папки src дистрибутива DDK (установка DDK является пунктом номер 0, ага). Создание проекта выглядит так:
- Создаём некую папочку, неким образом её называем.
- Открываем любой драйвер из примеров, копируем оттуда файлы makefile и sources.
- Редактируем файл sources в процессе работы для добавления новых сишных файлов (makefile больше никогда не трогаем).
Второе, что нужно сделать - установить Эклипс. Теперь нам нужно запустить его в контектсте окружения DDK. Самый простой способ сделать это - открыть любую из сред DDK (вероятно, ту, под которую мы пишем драйвер) и ввести туда полный пусть к экзешнику нашей IDE. Более запутанный вариант - пойти в папку /bin/ в директории DDK, найти там файл setenv.bat и поменять в нём строку, отвечающую за назначение переменной PATH, добавив в ней пусть к директории с Эклипсом, в нашем случае это выглядело так:
Было:
set Path=%BASEDIR%\bin;%path%
Стало:
set Path=%BASEDIR%\bin;%path%;G:\eclipse-cpp-ganymede-SR1-win32\eclipse
После сих нехитрых действий мы можем открывать любую среду из меню системы и запускать из неё эклипс простым набором
eclipse
Далее в открытой таким образом среде создаём новый сишный проект (New C Project). На вкладке Select Configurations тыкаем Advanced Settings. Получаем окошко со свойствами проекта. Первым делом идём в раздел C/C++ Build и снимаем галочку у Use default build command. Поле ввода команды становится активным и мы можем вписать туда
build
Так как переменные окружения стоят, эта команда вызовет билдер DDK, причём в уже нужной нам конфигурации.
Далее - раздел C/C++ Generals, подраздел Paths and Symbols. Тыкаем вкладку include и аккуратно перебирая слева все языки, удаляем все имеющиеся папки кнопкой Delete. Потом жмём Add, Variables и находим там переменную DDK_INC_PATH, выбираем галочки для добавления для всех языков и конфигураций. Повторяем всю процедуру для переменной WDM_INC_PATH.
Не выходя из подраздела, тыкаем вкладку Source Location. Нам нужна кнопочка Link Folder. В появившемся окошке щёлкаем галочку, жмём Browse и находим нашу папку с проектом для DDK, созданную несколькими абзацами выше. Теперь везде жмём Apply и Ok. Итак, если всё проделано правильно, имеем проект Eclipse, полностью готовый для написания драйверов под Windows.
Что это даёт:
- Подсказки по коду, code completion, быстрый рефакторинг.
- Вызов компилятора ддк при нажатии build в Эклипсе.
- Ошибки компилятора с номерами строк прекрасно воспринимаются эклипсом и аккуратно подсвечиваются прямо в IDE.
Чего это не даёт:
- «Запустить» драйвер нельзя, что очевидно. Средств отладки тоже не предусмотрено.
- Средства установки вроде INF-файлов всё равно придётся писать как-то ещё (автогенерация, маньяки могут писать ручками).
- Всё вышеуказанное будет работать только при вышеуказанном же способе запуска.
- Добавляя файлы с исходниками в проект через меню Eclipse, их всё равно необходимо руками вписывать в файл sources.
Все недостатки можно было бы побороть разом, написав для CDT достаточно простой плагин. Но, видимо, далеки у нас господа Java-девелоперы от простых системных программистов. Жаль.