вторник, 16 сентября 2008 г.

Условная компиляция драйверов

Возникла задача линковать драйвер с разными сборками библиотеки в зависимости от целевой системы и типа сборки. Вопрос был решен добавлением в source файл следующего содержания:


!if !defined(DDK_TARGET_OS) || "$(DDK_TARGET_OS)"=="WinLH"

C_DEFINES=$(C_DEFINES) -DNDIS60=1

!if "$(DDKBUILDENV)" != "chk"

! if $(386)
TARGETLIBS=$(TARGETLIBS) #path
! else
TARGETLIBS=$(TARGETLIBS) #path
! endif

!else

! if $(386)
TARGETLIBS=$(TARGETLIBS) #path
! else
TARGETLIBS=$(TARGETLIBS) #path
! endif

!endif

!else

C_DEFINES=$(C_DEFINES) -DNDIS40=1

!if "$(DDKBUILDENV)" != "chk"

! if $(386)
TARGETLIBS=$(TARGETLIBS) #path
! else
TARGETLIBS=$(TARGETLIBS) #path
! endif

!else

! if $(386)
TARGETLIBS=$(TARGETLIBS) #path
! else
TARGETLIBS=$(TARGETLIBS) #path
! endif

!endif

!endif


Удобная всё же штука, make файлы )

суббота, 13 сентября 2008 г.

WLK и NDIS IM Logo Testing

Пребываючи в умиленном настроении и чудном здравии, улучшаемом последние пол часа отечественным оболонем, подумалось мне рассказать о выпавшем давеча "счастье" столкнуться с тестированием своих любимейших драйверочков при помощи чуднАго Windows Logo Kit 1.1 - 1.2 (пока этой ерундой занимался уже даже версия поменялась).

Сразу оговорюсь что тестирование NDIS LWF это вообще иной разговор, поэтому только пару слов об Intermediate NDIS drivers.

Признаться удивление постигло меня, когда не нашел я описание сего процесса в хелпе WLK. Хммм. Ну что ж. На тот момент это был уже мой далеко не первый опыт использования этого милого продукта с характером, поэтому быстро бросил удивляться и полез в уже ставший таки родным Гугел-Мугел (кстати, думаю никогда в жизни я столько не гуглил, до встречи с ЛогоКитом). Не то что бы он завалил меня результатами, но на ресурсе http://ndis.blogspot.com/ встретилось упоминание что Miscrosoft забило на тестирование NDIS IM драйвером и теперь они рассматриваються как Unclassified.

Как мило, наиболее распространненый на сегодняшний день тип сетевых драйверов оказывается уже канул в лету, и Miscrosoft уже совершенно не заботиться об качестве сиих от сторонних производителей. Я в шоке!

Ну да ладно, баба з возу - кобыла в курсе дела. Чем меньше тестов, тем проще их пройти.... Да? .... Фиг там...

Погнали. Набор типичных тестов в submission а ля PnP tests, Stress I/O, Sleep etc. Отлично, спустя неколько часиков имеем результат, 2 fails:
1. INF test
2. Plug And Play test

INF test - уже давно нагуглил, это проблема WLK, которая почему то не исправляется, но если применить последние фильтры с errata, то в репорте всё видется как ОК ю а зе бест и всё такое.

Plug And Play test - прополоскал мне моск основательно. Нашел человека, искавшего безуспешно ответ на сей вопрос и наследившего по всему интернету. Тот оказался добрым человеком и с удовольствием поделился советами по апдейту до последней версии, установки последних фиксов, фильтров. Что ни у него ни у меня ни к чему не привело.

К счастью, отыскалась переписка между PCAUSA и благодарным клиентом, которому всё никак не удавалось пройти всю эту верификацию. Причина оказалась в некорекной обработке unnamed devices. Другими словами снова баг WLK, фикситься приложением к репорту инфы "эй парни это Ваш баг, этот тест не считается".

В итоге имеем на 6 не самых актуальных тестов верификации качества сторонних драйверов, 2 нерабочих. Вот потом и жалуйтесь что подавлающее количество крешей происходит изза 3rd party drivers.

Я понимаю WLK - продукт гигантский, и, наверняка, не самый приоритетный и парни, скорее всего, не справляются с верификацией программы для верификации :) . Но ё-моё, это мягко говоря, самое сырое что я видел от этой компании, всё же было бы неплохо уделить ему больше внимания.

От так от. Может будет время и настроение, я немного раскажу о приключениях WLK с LWF и немного их похвалю :).

пятница, 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) здесь.