пятница, 12 сентября 2008 г.

Мультиплатформенная установка NDIS драйверов из MSI (Wix)

Установка NDIS драйверов это вообще отдельная песня. Microsoft предлагает нам использовать для этого INetCfg API и приводит примеры его использование в WDK, но, к сожалению, ни сервис менеджер, ни инсталяторы, ни даже Driver Install Framework не умеют устанавливать NDIS драйвера. Правда, если погуглить, то можно найти информацию о том, что версия difx 1.x это делать умела, и в 2.х сохранилась недокументированная возможность, но она ведь недокументирована, а в нашем деле это жирный минус.

Итак что мы имеем:
1. Недокументированная возможность Difx.
2. Samples из DDK, использующие INetCfg (snetcfg и bindview).
3. Поделки использующие INetCfg наподобие моей.

В общем весь фокус этой несложной поделки в одалживании кода работы с INetCfg (да не шарахнет молнией меня Microsoft, все права сохранены) небольшого редактирования под свои нужды (наверное таки шарахнет) и оформления в виде dllки для MSI.

В итоге очень удобно получилось ибо теперь:
1. Можно устанавливать и удалять NDIS IM и NDIS LWF из MSI.
2. Делать это и под x86 и под x64 из под одного и того же MSIника.

P.S. Кстати прикрутил туда возможность установки и обычных драйверов. Знаю что не комильфо, но очень уж понравилась мне мысль использовать один и тот же MSI для разных платформ.

Пример использования это счастья (ставим passthru) здесь.

8 комментариев:

Unknown комментирует...

Очень полезная статья, спасибо. А можно рассказать подробнее, какие параметры нужно прописывать в WiX проекте, для того, чтобы достучаться к функциям вашей библиотеки?

Alexander Lototsky комментирует...

Рад что Вам понравилось :)

Для NDISInstallService нужно указать 2 параметра:

"INF" = "[TEMPLOCATION]NDISDriver.inf"

"INFM" = "[TEMPLOCATION]NDISDriver_m.inf"

Для NDISUninstallService :

"PNPID" = "YourPNPID"

Вот кусок WiX (http://sites.google.com/site/alexanderlototsky/Home/NdisInstallerWixSample.txt?attredirects=0), который у меня устанавливает параметры, и вызывает функции. Вся эта игра с UninstallDriver для NDIS драйвера была нужна, что бы удалять запись из реестра при его деинсталяции.

Unknown комментирует...

Спасибо за ответ, я примерно так и сделал, правда по анализу кода нашел еще параметры - PATH и DRVNAME:



^Property Id="PATH" Value="[TEMPLOCATION]filter.sys"^^/Property^

^Property Id="INF" Value="D:[TEMPLOCATION]Filter.inf"^^/Property^

^Property Id="INFM" Value="[TEMPLOCATION]Filter_m.inf"^^/Property^

^Property Id="PNPID" Value="ms_passthru"^^/Property^
^Property Id="DRVNAME" Value="filter"^^/Property^


и, упрощенно, деинсталляция:


^InstallExecuteSequence>

^Custom Action='InstallDriver' After='InstallFiles'^Not Installed^/Custom>

^Custom Action='NDISInstallService' After='InstallFiles'^Not Installed^/Custom>
^/InstallExecuteSequence^





Имеется в виду, что драйвер называется filter.sys и при компиляции лежит в [TEMPLOCATION].


Возникла проблема с тем, что на некторых машинах не работает ни msi ни exe, который вы приводите в статье. В чем может быть причина?

Alexander Lototsky комментирует...

>> Возникла проблема с тем, что на некторых машинах не работает ни msi ни exe, который вы приводите в статье. В чем может быть причина?

Т.е. вызывается NDISInstallService с параметрами, но драйвер не устанавливается?

А что за машины, ОС ?

Unknown комментирует...

Windows XP, SP2, Eng

Alexander Lototsky комментирует...

Выложил пример установщика passthru, проверил на XP32 SP2 Eng, XP64 SP1 Eng:

http://sites.google.com/site/alexanderlototsky/Home/NdisInstallerSample.zip?attredirects=0

Я думаю будет работать. ) Если нет - скажите.

Unknown комментирует...

Стало работать, отлично. Вы изменили что-то в библиотеке или это я криво сетап сделал?

Alexander Lototsky комментирует...

В библиотеке ещё ничего не менял. Возможно использовались относительные пути, а сейчас понимаются только абсолютные, надо будет добавить.