Перенести драйвер Windows в Linux/BSD вполне реально! Для этого даже не потребуется его исходный код. Достаточно лишь написать тонкий и несложный "переходник" между драйвером и операционной системой, принимающий запросы и транслирующий их по всем правилами "этикета", а также перенести библиотеку функций, необходимых драйверу для работы. Конечно, для этого необходимо уметь программировать! Для простых пользователей такой рецепт совершенно не годится, но тут уж ничего не поделаешь. Тем не менее, перенести готовый драйвер намного проще, чем переписать его с нуля. Нам не потребуется проводить кропотливую работу по дизассемблированию оригинального кода, заменяющую собой поиск технической документации (которая либо совсем отсутствует, либо отдается только под подписку о неразглашении, зачастую запрещающую открытое распространение исходных текстов). Наконец, при выходе новых версий драйвера Windows процедура его переноса в Linux/BSD проста до тривиальности — достаточно скопировать новый файл поверх старого файла. Однако все это лишь сухая теория. Перейдем к деталям.
Модель ядра Windows NT и всех производных от нее операционных систем (включая Windows 2000, XP, 2003, Longhorn) достаточно проста (рис. 8.3). С "внешним" миром ядро связывает
Рис. 8.3. Архитектура систем из семейства Windows NT
Что же касается портов ввода-вывода, то, например, дизассемблированный текст функции READ_PORT_UCHAR
, читающий из данного порта беззнаковый байт, выглядит, как показано в листинге 8.1.
Листинг 8.1. Дизассемблированный листинг функции READ_PORT_UCHAR
, выдернутой из HAL
.text:80015A2C
.text:80015А2С public READ_PORT_UCHAR
.text:80015A2C READ_PORT_UCHAR proc near
; CODE XREF: HalGetEnvironmentVariable+2C↑p
.text:80015A2C ; HalSetEnvironmentVariable+3D↑p
.text:80015A2C
.text:80015A2C arg_0 = dword ptr 4
.text:80015A2C
.text:80015A2C xor eax, eax
.text:80015A2E mov edx, [esp+arg_0]
.text:80015A32 in al, dx
.text:80015A33 retn 4
.text:80015A33 READ_PORT_UCHAR endp
Иначе говоря, если заставить NTOSKRNL.EXE работать в чужеродной среде Linux или BSD, мы получим возможность запускать любые драйверы Windows NT без какой-либо доработки их двоичного кода. Это не только упрощает задачу переноса, но и снимает проблему авторских прав. Любой обладатель лицензионной копии Windows (или другой программы) вправе вызывать готовый драйвер откуда угодно без каких бы то ни было разрешений и без выплаты дополнительного вознаграждения, но вот модифицировать двоичный код ему позволят едва ли.