Могу ли я писать драйверы Windows с помощью Delphi 2010?
Я всегда слышал, что Delphi может делать почти все, что может сделать С++... кроме записи драйверов Windows. Это правильно, и если да, то почему?
Недавно я прочитал сообщение в блоге в Интернете, которое может указать возможное решение для написания драйверов с Delphi, но ему 3 года, и я не знаю, t знать, насколько точна эта информация.
Итак, с последней версией Delphi (2010), было бы технически возможно написать драйвер Windows?
Ответы
Ответ 1
Возможно, будет возможно написать некоторые драйверы с Delphi, но, насколько общий ответ, я бы сказал: вы не можете легко писать драйверы с Delphi.
Во-первых, существует разница между драйверами user-mode (UMDF) и режимом ядра (KMDF). Драйверы UMDF должны быть возможны с Delphi. Драйверы KMDF не всегда возможны, потому что
1) Компонент Delphi не может произвести их и
2) Формат объектного файла Delphi отличается от формата COFF, который использует компоновщик Microsoft по умолчанию.
3) Delphi RTL делает предположение, что он живет в пользовательском режиме и может делать определенные вещи, которые не следует делать в ядре ядра (я думаю, например, о том, как обрабатываются исключения, а также о разном управлении памятью), поэтому вы 'd должны быть очень осторожны, какие функции RTL безопасны в использовании. Также есть проблемы с системами и SysInit (см. Комментарий Ritsaert Hornstra к другому ответу здесь).
Я не говорю, что это не проблемы, которые невозможно преодолеть (ср. сообщение, на которое вы ссылаетесь), если вы действительно посвящены, но это будет непросто.
Во-вторых, драйверы KMDF (я не знаю о UMDF, на самом деле - может кто-нибудь комментировать?) для Win64 должны быть в 64-битном коде. Поскольку в настоящее время не существует 64-битного Delphi-компилятора, запись их - это нет-нет.
Ответ 2
Вы можете написать драйвер Windows на любом языке, который компилируется до DLL в формате PE, который не имеет внешних зависимостей (кроме тех, которые одобрены для загрузки в ядре), может вызывать функции с привязкой STDCALL и экспортировать функции с помощью STDCALL.
Не-несанкционированные внешние зависимости будут сложной частью, о которой я думаю.:)
Ответ 3
Я согласен с обоими предыдущими ответами.
Я действительно сделал это в специальном случае: монитор печати. Это особый случай драйвера, который работает в пользовательском режиме, и я мог бы написать его в Delphi. Определенные преимущества в использовании Delphi там были.
Но последняя ошибка, о которой я еще не упоминал (я думаю), заключается в том, что вам нужно перевести zillions сложных структур и макросов из файлов заголовков DDK. Перевод некоторых запутанных макросов, в частности, может быть очень сложным.
Ответ 4
Я нашел несколько ссылок, которые могут вам помочь: