Файлы .INF и NCF_HAS_UI: как написать .dll для отображения вкладки дополнительных свойств сетевого драйвера? - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть драйвер NDIS, который отображается как в списке установленных элементов свойств подключения, так и в диспетчере устройств;вопрос в том, как мне написать расширение, которое будет использоваться для управления свойствами драйвера, и как его установить?

Конечно, простая программа с графическим интерфейсом может связываться с драйвером, устанавливать свойства, получать номера версийи другая статистическая информация и т. д., для этого существует DeviceIoControl;но означает ли это, что не существует выделенного интерфейса для информирования водителя об изменениях конфигурации?

NDIS driver configuration screenshot

Было бы приятно, если бы кто-то мог переслать этот вопрос в eggheadcafe / osrсписки ntdev.

1 Ответ

5 голосов
/ 22 ноября 2011

Если вы хотите, чтобы ваш сетевой драйвер имел некоторый пользовательский интерфейс в диалоговом окне «Свойства локальной сети», то вам нужно выполнить следующие действия:

Создать объект NotifyObject (если у вас его еще нет)

NotifyObject - это, по сути, COM-объект, связанный с вашим драйвером. Чтобы сделать один,

  1. Создайте DLL, которая может создать ваш новый класс COM. (Если вы используете фабрику классов ATL , это всего лишь пара строк кода. Я настоятельно рекомендую использовать ATL для реализации COM-объектов. Это выходит за рамки графического интерфейса пользователя LAN Properties, но вам следует поискать DllGetClassObject, класс C ++, который наследует от CComObjectRoot и CComCoClass, вызов OBJECT_ENTRY_AUTO и BEGIN_COM_MAP, если вы новичок в COM.)
  2. Свяжите свой COM-объект с драйвером, введя ClsId={guid} и ComponentDll=filename в INF.

Реализация INetCfgComponentPropertyUi в вашем COM-объекте

  1. Ключевой метод - MergePropPages. В этом методе вы выделяете страницы собственной таблицы и объединяете их в свойства адаптера. Эта операция выглядит примерно так: псевдокод:

    HPROPSHEETPAGE *psharray = CoTaskMemAlloc(NUMBER_OF_PAGES * sizeof(HPROPSHEETPAGE);
    for (i = 0; i < NUMBER_OF_PAGES; i++)
        psharray[i] = CreatePropertySheetPage(&psp);
    
  2. API предназначен для транзакций. Обязательно примените любые изменения в методе ApplyProperties и (если применимо) отмените их в CancelProperties.

  3. Вам не нужно ничего делать в QueryPropertyUi или SetContext, хотя вам может потребоваться сохранить контекст, если вам нужно получить местоположение раздела реестра.

Проверьте ваши изменения

Если все пойдет хорошо, то ваш новый Notify Object будет загружаться каждый раз, когда происходят какие-либо изменения конфигурации сети. Если отображается графический интерфейс, Windows запросит у вашего класса интерфейс INetCfgComponentPropertyUi и вызовет MergePropPages.

Я считаю полезным поместить жестко запрограммированные точки останова в мою DLL в ключевых местах, а затем подключить отладчик ядра, чтобы я всегда мог найти DLL, независимо от того, какой процесс ее загружает. (В Windows 7 вы будете загружены в файл drvinst.exe, который может быть трудно найти с помощью отладчика пользовательского режима.)

...