Когда я снова возвращаюсь к теме использования компилятора и компоновщика Visual Studio для создания драйверов Windows, мне приходят в голову две вещи:

  • Официально он не поддерживается. Действительно, в Интернете все согласны с тем, что правильный способ создания драйверов для Windows - это использовать компилятор, компоновщик и инструмент BUILD, входящие в состав Windows Driver Kit. Однако Visual Studio 2008 включает параметр компоновщика / DRIVER, который описывается следующим образом: Use the /DRIVER linker option to build a Windows NT kernel mode driver. Что он делает? Почему он был включен в Visual Studio, если его не рекомендуется использовать для сборки драйверов?

  • Это работает. Я почти боюсь сказать это вслух, чтобы не навлечь на себя гнев праведных разработчиков ядра, но правда в том, что драйверы, созданные с помощью Visual Studio, действительно работают. Мы строили их таким образом в течение многих лет на моем рабочем месте, созданные двоичные файлы были развернуты на сотнях машин, и не было никаких проблем. Однако я знаю, что отсутствие доказательств не является доказательством отсутствия, и что отсутствие каких-либо проблем до сих пор не означает, что сборка драйверов с VS безопасна.

Что меня действительно беспокоит, так это отсутствие информации. В Интернете есть несколько сообщений от людей, которые используют VS для создания своих драйверов, которые неизменно вызывают один и тот же ответ - он не поддерживается, не делайте этого, интегрируйте WDK с VS с помощью проекта make-файла, если вы действительно хотите используйте VS IDE. Однако я не нашел ни одного ответа, который указывал бы на конкретную причину, по которой вам не следует создавать драйверы с VS.

Итак, кто-нибудь знает, что произойдет, если вы воспользуетесь VS для сборки драйверов? Что может пойти не так? При каких обстоятельствах? Я знаю, что вы должны сами установить все параметры компилятора и компоновщика, и все в порядке, но что произойдет, если я установлю их неправильно? Будет ли драйвер скомпилирован, или он не сможет связать, или, если он будет правильно собран, он выйдет из строя сразу или только тогда, когда звезды будут выровнены правильно? Почему он это сделал, что его вызывает? Есть ли какая-то причина прекратить создавать наши драйверы с VS, который годами работал как шарм, кроме того факта, что он официально не поддерживается? Если он официально не поддерживается, зачем ставить переключатель / DRIVER в VS?

2
Neno Ganchev 17 Мар 2011 в 18:07

2 ответа

Лучший ответ

Причина, по которой это здравый смысл, заключается в том, что возникающие в результате недостатки могут быть незаметными. По большей части это был культ карго ... с тех пор, как возникла настоящая проблема. И если я правильно помню, это было до 2005 года (т.е. первые DDK, вообще содержащие компилятор). Поправьте меня если я ошибаюсь.

Как правило, я не вижу ничего, что говорило бы против использования компилятора VS. Для компоновщика вам также необходимо установить правильное значение подсистемы (т.е. нет) и так далее ... это просто утомительно.

Однако имейте в виду, что компиляторы и инструменты WDK обычно опережают таковые в последних версиях VS в любой момент времени. Подумайте вот о чем: то, что содержит WDK, максимально приближено к тому, что используется для создания самой Windows. Следовательно, предпочтение отдается инструментам из WDK.

Технически это возможно. Но если вы опубликуете сообщение в группе новостей и упомянете этот факт, не удивляйтесь, если вы сначала услышите урок по этой теме, а не ваш настоящий вопрос;)

1
0xC0000022L 17 Мар 2011 в 18:17
С тех пор, как возникла актуальная проблема? Вот что меня больше всего интересовало - известная проблема или случай, когда что-то пошло не так. Можете ли вы предоставить дополнительную информацию по этому поводу?
 – 
Neno Ganchev
21 Мар 2011 в 12:33
Ганчев: IIRC, это было связано с маркировкой страниц результирующего двоичного файла для разбиения на страницы или нет и т. Д.
 – 
0xC0000022L
21 Мар 2011 в 13:57

Если он официально не поддерживается, зачем ставить переключатель / DRIVER в VS?

Дело не во включении переключателя в VS, а в его отключении.

Компилятор / компоновщик C ++, поставляемый с WDK и VS, построен из одной и той же исходной базы (возможно, из разных веток и в разные моменты времени, но из одной исходной базы) одной и той же командой внутри Microsoft. Могут ли они настроить свои сборки так, чтобы переключатель /DRIVER не отображался в компоновщике, поставляемом с VS? Конечно. Стоит ли поддерживать отдельную конфигурацию сборки и проверять, что правильные варианты сборки поставляются с WDK и VS соответственно? Возможно нет.

Что касается того, почему он вообще официально не поддерживается ... Экспертиза валидации набора инструментов для разработки драйверов принадлежит команде Windows, а не команде VS. Последнее, что хочет сделать команда Windows, - это быть на крючке, чтобы квалифицировать выпуск VS для разработки драйверов (который Windows в конечном итоге также должна будет поддерживать), когда этот выпуск идет по графику, который не соответствует графику. с Windows.

Добавьте к этому тот факт, что разработка драйверов нацелена на относительно небольшую аудиторию, а создание драйверов с помощью IDE открывает дополнительные функции и сценарии тестирования, и для меня очень неудивительно, что это официально не поддерживается.

0
Andrew Brown 17 Мар 2011 в 18:34
Что ж, да, я могу понять это с организационной точки зрения, но это просто наводит меня на мысль, что нет известных проблем с использованием VS для создания ваших драйверов, просто он не был протестирован и могут быть неизвестные проблемы. , так что они просто перестраховываются. Мне больше любопытно, есть ли какие известные проблемы, о которых я не знаю.
 – 
Neno Ganchev
21 Мар 2011 в 12:38
Ганчев: В этом случае, скорее всего, MS тоже не знает об этих проблемах. Насколько я знаю, это в основном "традиция", передаваемая новым разработчикам. Но, учитывая историю WDK, эта традиция не может быть слишком старой. Например, Windows 2000 DDK не содержал драйверов. IIRC, XP DDK был первым, кто их включил ... вот, должно быть, это и произошло.
 – 
0xC0000022L
21 Мар 2011 в 13:59