Введение
NDISwrapper – это бесплатная программа-оболочка для драйверов, позволяющая использовать драйверы сетевых устройств Windows XP (для таких устройств, как PCI-карты, USB-модемы и маршрутизаторы) в операционных системах Linux. NDISwrapper работает, реализуя ядро Windows и API NDIS и динамически связывая сетевые драйверы Windows с этой реализацией. В результате он функционирует только на системах, основанных на архитектурах командных наборов, поддерживаемых Windows, а именно IA-32 и x86-64. Собственные драйверы для некоторых сетевых адаптеров недоступны в Linux, поскольку некоторые производители используют проприетарные интерфейсы и не разрабатывают кроссплатформенные драйверы. NDISwrapper позволяет использовать драйверы Windows, которые доступны практически для всех современных сетевых адаптеров для ПК.
NDISwrapper is a free software driver wrapper that enables the use of Windows XP network device drivers (for devices such as PCI cards, USB modems, and routers) on Linux operating systems. NDISwrapper works by implementing the Windows kernel and NDIS APIs and dynamically linking Windows network drivers to this implementation. As a result, it only works on systems based on the instruction set architectures supported by Windows, namely IA 32 and x86 64. Native drivers for some network adapters are not available on Linux as some manufacturers maintain proprietary interfaces and do not write cross platform drivers. NDISwrapper allows the use of Windows drivers, which are available for virtually all modern PC network adapters.
Использование
Есть три шага: создание драйвера 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 (файл драйвера).
0000:0000. conf, which contains information extracted from the inf file
mydriver. inf (the original inf file)
mydriver. sys (the driver file)
Графические фронтенды
Существуют графические оболочки для 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.