Разработка драйверов на C #?
Вопрос
Прежде чем я с головой окунусь в C #...
Я всегда считал, что C, или, может быть, C ++, лучше всего подходит для разработки драйверов под Windows.Я не в восторге от идеи разработки драйвера на компьютере с .NET.
Но .NET, похоже, является тем путем, которым MS движется в разработке приложений, и поэтому мне сейчас интересно:
- Используют ли люди C # для разработки драйверов?
- Вам нужно делать много перехватов API, или у C # есть средства для взаимодействия с ядром без особого взлома?
- Может ли кто-нибудь рассказать о надежности и безопасности запуска программы на C # ближе к Ring 0, чем это было бы в обычном случае?
Я хочу, чтобы мои устройства можно было использовать на C #, и если разработчик драйверов на C # является зрелым, это, очевидно, правильный путь, но я не хочу тратить много усилий, если это не рекомендуется.
- Какие есть хорошие ресурсы для начала, скажем, разработки простого драйвера виртуального последовательного порта?
-Адам
Решение
Вы не можете создавать драйверы устройств в режиме ядра на C #, поскольку среда выполнения не может быть безопасно загружена в ring0 и работать должным образом.
Кроме того, C # не создает двоичные файлы, подходящие для загрузки в качестве драйверов устройств, особенно в отношении точек входа, которые драйверы должны предоставлять.Зависимость от среды выполнения для перехода, анализа и JIT двоичного файла во время загрузки запрещает прямой доступ, необходимый подсистеме драйвера для загрузки двоичного файла.
Однако ведется работа по переводу некоторых драйверов устройств в пользовательский режим, вы можете посмотреть интервью здесь совместно с Питером Виландом из команды UDMF (User Mode Driver Framework).
Драйверы пользовательского режима гораздо больше подошли бы для управляемой работы, но вам придется немного погуглить, чтобы узнать, будут ли C # и .NET поддерживаться напрямую.Все, что я знаю, это то, что драйверы уровня ядра выполнимы не только в C #.
Однако вы, вероятно, можете создать драйвер C / C ++ и службу C # (или аналогичную) и заставить драйвер взаимодействовать с управляемым кодом, если вам абсолютно необходимо написать много кода на C #.
Другие советы
Это должно вам в какой-то мере помочь: Комплект драйверов для Windows
Это не прямой ответ на ваш вопрос, но если вам интересно, вы могли бы взглянуть на Проект сингулярности.
Может ли кто-нибудь рассказать о надежности и безопасности запуска программы на C # ближе к Ring 0, чем это было бы в обычном случае?
C # выполняется на виртуальной машине .NET, вы не можете переместить ее ближе к кольцу 0, чем виртуальную машину, и виртуальная машина работает в пользовательском пространстве.
Если вы готовы попробовать использовать проприетарный фреймворк, Инструментарий WindRiver от Jungo поддерживает разработку драйверов в пользовательском режиме (даже в виде управляемого кода) для устройств USB, PCI и PCI-E.
У Microsoft есть ряд исследовательских проектов в области создания ОС с управляемым кодом, другими словами, kill с помощью Win32 API.
Смотрите статью Мэри Джо Фоули: Восстановление наследия
Написание драйверов устройств в .net не имеет смысла для текущих версий Windows.
<speculation>
Ходят слухи, что MS вкладывает много денег в то, чтобы вывести Singularity на новый уровень.Просто поищи Мидори.Но это 2015 год +
</speculation>
Если я правильно помню, то Проект " Докан " является драйвером файловой системы пользовательского режима, который также позволяет .СЕТЕВОЙ код должен выполняться системным драйвером: https://github.com/dokan-dev/dokan-dotnet.
Итак, вы могли бы разработать "драйвер" C # (на самом деле приложение пользовательского режима), который затем вызывается драйвером режима ядра C ++.Драйвер ядра мог бы просто передавать все вместе, не манипулируя данными, и действовать как простая оболочка.
Излишне упоминать, что это очень небезопасно, и вы, скорее всего, закончите с BSOD (я пробовал это).
Слабо связанный:
Тот Самый Космический проект это операционная система с открытым исходным кодом, которая разработана на C # и работает
"драйверы (ядра)" и приложения пользовательского уровня, полностью написанные на C #/F #/VB.NET/...
Хотя технически это драйверы уровня ядра, операционная система больше не Windows, а ваша собственная, поэтому я предполагаю, что это неправильный ответ ......