Введение

NDISwrapper – это бесплатная программа-оболочка для драйверов, позволяющая использовать драйверы сетевых устройств Windows XP (для таких устройств, как PCI-карты, USB-модемы и маршрутизаторы) в операционных системах Linux. NDISwrapper работает, реализуя ядро Windows и API NDIS и динамически связывая сетевые драйверы Windows с этой реализацией. В результате он функционирует только на системах, основанных на архитектурах командных наборов, поддерживаемых Windows, а именно IA-32 и x86-64. Собственные драйверы для некоторых сетевых адаптеров недоступны в Linux, поскольку некоторые производители используют проприетарные интерфейсы и не разрабатывают кроссплатформенные драйверы. NDISwrapper позволяет использовать драйверы Windows, которые доступны практически для всех современных сетевых адаптеров для ПК.

Использование

Есть три шага: создание драйвера Linux, его установка и использование. NDISwrapper состоит из двух основных частей: утилиты командной строки, используемой во время установки, и подсистемы Windows, используемой при обращении приложения к подсистеме Wi-Fi. Поскольку результатом установки NDISwrapper должен быть драйвер Linux, позволяющий работать с приложениями Linux, первым действием пользователя является "компиляция" пары или более файлов Windows и версии Windows DDK для NDISwrapper в модуль ядра Linux. Это выполняется с помощью утилиты с именем "ndiswrapper". Полученный драйвер Linux затем устанавливается (часто вручную) в операционную систему. После этого приложение Linux может отправлять запросы этому драйверу Linux, который автоматически выполняет необходимые преобразования для вызова своего – теперь – внутреннего драйвера Windows и DDK. Для выполнения этой "компиляции" NDISwrapper требует как минимум файлы ".inf" и ".sys", которые неизменно поставляются в составе драйвера Windows. Например, если драйвер называется "mydriver" и включает файлы mydriver.inf и mydriver.sys, а также идентификатор vendorid:productid 0000:0000, то NDISwrapper устанавливает драйвер в /etc/ndiswrapper/mydriver/. Этот каталог содержит три файла:
0000:0000.conf, содержащий информацию, извлеченную из файла .inf,
mydriver.inf (исходный файл .inf),
mydriver.sys (файл драйвера).

Графические фронтенды

Существуют графические оболочки для NDISwrapper, такие как Ndisgtk и NdisConfig, которые позволяют установить NDISwrapper, используя графический пользовательский интерфейс вместо командной строки.

Как это работает

Ndiswrapper использует INF-файлы Windows. Когда приложение Linux обращается к устройству, зарегистрированному в Linux как устройство Ndiswrapper, Ndiswrapper определяет, какой драйвер Windows является целевым. Затем он преобразует запрос Linux в формат, понятный Windows, вызывает драйвер Windows, ожидает результат и переводит его обратно в формат Linux, после чего отправляет результат приложению Linux. Возможность вызова драйвера Windows из драйвера Linux (Ndiswrapper является драйвером Linux) обусловлена тем, что они оба выполняются в одном адресном пространстве (том же, что и ядро Linux). Если драйвер Windows состоит из слоёв драйверов (например, Ethernet над USB), вызывается драйвер верхнего уровня, который, в свою очередь, генерирует новые запросы (IRP в терминологии Windows), обращаясь к "mini ntoskrnl". Следовательно, "mini ntoskrnl" должен знать о существовании других драйверов и предварительно зарегистрировать их в своей внутренней базе данных, прочитав INF-файлы Windows.

Подобные программы

DriverLoader — коммерческий инструмент, разработанный компанией Linuxant для Linux, который, по всей видимости, предоставляет ту же функциональность, что и NDISwrapper. Независимо от, но примерно в то же время, что и проект NDISwrapper, Билл Пол из Wind River Systems разработал аналогичную систему, известную как Project Evil или The NDISulator, для FreeBSD. Впоследствии она была портирована на DragonFly BSD и NetBSD.

Ограничения

NDISwrapper использует устаревшие "беспроводные расширения" для обеспечения доступа приложений к Wi-Fi. Поскольку NDISwrapper полагается на драйверы Windows, он поддерживает только архитектуры i386 и x86-64. NDISwrapper пока не реализует NDIS 6 (версия Windows Vista), что ограничивает поддержку драйверов версиями для Windows XP. По состоянию на 2013 год, ветка кода на сайте проекта находится в разработке с 2006 года, но запрос функции от 2009 года остаётся без назначения. Хотя это не является серьёзной проблемой для архитектуры x86 из-за популярности 32-битной Windows XP x86, многие производители предпочитают выпускать 64-битные версии драйверов исключительно для Windows Vista, что означает, что Linux-системы с архитектурой x86-64 не могут использовать такие сетевые устройства (они не могут использовать 32-битные NDIS5 драйверы для XP x86 из-за своей 64-битной архитектуры, и не могут использовать 64-битные NDIS6 драйверы, поскольку не поддерживают NDIS6). Всё ещё возможно использовать 64-битные драйверы Windows XP, реализующие NDIS5, однако, их доступно меньше, чем 32-битных драйверов для XP (NDIS5/32 бит). С 2006 года большинство драйверов Windows соответствуют Windows Driver Foundation (WDF), которую NDISwrapper не поддерживает. Это делает NDISwrapper устаревшим, поскольку он поддерживает только предыдущую структуру драйверов WDM.