Установка 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) здесь.
Подписаться на:
Комментарии к сообщению (Atom)
8 комментариев:
Очень полезная статья, спасибо. А можно рассказать подробнее, какие параметры нужно прописывать в WiX проекте, для того, чтобы достучаться к функциям вашей библиотеки?
Рад что Вам понравилось :)
Для 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 драйвера была нужна, что бы удалять запись из реестра при его деинсталяции.
Спасибо за ответ, я примерно так и сделал, правда по анализу кода нашел еще параметры - 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, который вы приводите в статье. В чем может быть причина?
>> Возникла проблема с тем, что на некторых машинах не работает ни msi ни exe, который вы приводите в статье. В чем может быть причина?
Т.е. вызывается NDISInstallService с параметрами, но драйвер не устанавливается?
А что за машины, ОС ?
Windows XP, SP2, Eng
Выложил пример установщика passthru, проверил на XP32 SP2 Eng, XP64 SP1 Eng:
http://sites.google.com/site/alexanderlototsky/Home/NdisInstallerSample.zip?attredirects=0
Я думаю будет работать. ) Если нет - скажите.
Стало работать, отлично. Вы изменили что-то в библиотеке или это я криво сетап сделал?
В библиотеке ещё ничего не менял. Возможно использовались относительные пути, а сейчас понимаются только абсолютные, надо будет добавить.
Отправить комментарий