NDIS a generování kernel modulů z Windows ovladačů

Dnes jsem narazil na situaci, která mne donutila použít řešení, o kterém jsem zatím pouze slyšel. Jedná se o generování kernel modulů pro síťovou kartu z Windows ovladačů. Moc velkou důvěru jsem k tomu neměl, ale zatím systém funguje bezproblémově. Dokonce z něj píši tento popis. Pro generování lze použít dvě cesty. Jedna je více méně manuální, druhá používá script instalovaný jako součást systému. Každý tento postup je popsán níže.



1) Nejprve je nutné provést základní přípravu. Jednak pomocí příkazu pciconf -lv je nutné zjistit, který interface konkrétně chybí, najít pro něj ovladače. V těch je nutné vybrat správné soubory *.inf a *.sys. V příkladu jsou uvedeny jako NIC.inf a NIC.sys. Naštěstí jsem nenarazil na případ, kdy by bylo potřeba více souborů. Nevím, jak bych tento problém řešil.

2) Je nutné vytvořit základní modul pro NDIS:
cd /sys/modules/ndis && make && make install

3) Vybrané soubory NIC.inf a NIC.sys nakopírovat do adresáře /sys/modules/if_ndis. Pak se do tohoto adresáře přepnout:

cd /sys/modules/if_ndis
Zkontrolovat, zda se jedná o ASCII nebo Unicode soubor:
hd NIC.inf | head -5

Pokud to není ASCII soubor, ale soubor ve formátu Unicode, je nutné provést:
iconv -c -f utf-16 -t ascii NIC.inf > NIC.inf.ascii
head -3 NIC.inf.ascii


Čistý ASCII nebo zkonvertovaný Unicode ověřit na netisknutelný znak CR, případně tento soubor zkonvertovat:
cat NIC.inf.ascii | tr \r " " > NIC.inf.ascii.unix

Samozrejmě, před dalším krokem přejmenovat výsledný soubor z některého z předchozích kroků zpět na NIC.inf.

4) Generování
ndiscvt -i NIC.inf -s NIC.sys -o ndis_driver_data.h
make && make.install


5) Pro ověření funkčnosti je pak nutné zadat následující příkazy, které načtou moduly z aktuálního adresáře.
kldload ndis
kldload if_ndis




Podstatně jednodušší metodou je možnost použít příkaz ndisgen. Je podstatně jednodušší a tyto operace automatizuje ....
1) Tento bod je shodný s předchozím postupem.
2) Generování ovladače je podstatně jednodušší:
ndisgen /drivers/NIC.inf /drivers/NIC.sys

3) A následně zase ověření fuknčnosti a načtení modulů:
kldload /sys/modules/if_ndis/NIC_sys.ko



Pokud vše funguje (občas po načtení takto vytvořeného ovladače následuje reboot ....), doporučuji tento interface zatížit a otestovat. Přestože takovéto řešení funguje, moc velkou důvěru v něj nemám. Proste není psané na míru systému a nevím, co od něj mohu očekávat. Po zátěži a ověření funčnosti je možné upravit soubor /boot/loader.conf a přidat zde řádek:
NIC_sys_load=”YES”

Docela by mne zajímaly zkušenosti kohokoliv na toto téma. Zatím úspěšně jsem to provedl na jednom stroji. Z konferencí vím, že občas to funguje, občas ne.
Zdroje:
Howto ndisulate Windows drivers
NDISGEN (FreeBSD 7.0)

Powered by Drupal - Design by artinet