Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000377.doc
Скачиваний:
29
Добавлен:
30.04.2022
Размер:
2.52 Mб
Скачать

3.8. Среда сетевых драйверов ndis

Модель драйвера WDM является универсальной и позволяет реализовать драйвер для любого внешнего устройства. Однако платой за универсальность является громоздкость и относительная сложность интерфейса WDM. В этой связи для драйверов типовых устройств, таких как драйверы видео или сетевых адаптеров, Windows предоставляет специализированный интерфейс, скрывающий универсальный интерфейс WDM. Для драйверов сетевых адаптеров такой интерфейс реализует среда NDISNetwork Driver Interface Specification.

Использование среды NDIS не только упрощает разработку драйверов, но и позволяет писать драйверы, независимые от операционной системы. NDIS переопределяет все необходимые функции интерфейса режима ядра операционной системы, например, NdisAllocateMemory можно вызывать вместо функции диспетчера памяти Windows MmAllocateMemory, NdisAllocateSpinLock – вместо KeInitializeSpinLock и т.п. В результате драйвер (по крайней мере, на уровне исходного кода) может быть перенесен в любую операционную систему, поддерживающую NDIS, например, в Linux.

В среде NDIS представлено три типа драйверов: драйверы протоколов, минипорт-драйверы сетевых адаптеров и промежуточные драйверы. Для каждого типа драйверов предусмотрен интерфейс взаимодействия с NDIS. Также существует возможность прямого взаимодействия промежуточных драйверов и драйверов сетевых адаптеров с диспетчером ввода-вывода Windows (а через диспетчер ввода-вывода и с пользовательскими программами) в рамках интерфейса WDM с использованием специально созданного виртуального устройства (но при этом будет потеряна переносимость, т.к. драйвер будет привязан к специфическому интерфейсу Windows).

Архитектура среды NDIS показана на рис. .22.

Рис.22. Архитектура среды NDIS

Драйверы среды ndis Минипорт-драйверы сетевых адаптеров

Минипорт-драйвер сетевого адаптера является обязательным драйвером в сетевом стеке. Он всегда один в стеке и он всегда самый нижний драйвер в стеке.

Минипорт-драйверы управляют сетевыми адаптерами, обеспечивая передачу через них информационных пакетов в физическую среду и прием полученных пакетов из физической среды. NDIS предоставляет минипорт-драйверу функции для доступа к регистрам сетевого адаптера, для обмена данными с использованием метода ПДП, для выделения памяти в подкачиваемом и неподкачиваемом пулах, для синхронизации и т.п. Таким образом, среда NDIS максимально изолирует драйверы даже от особенностей операционной системы, что позволяет делать их полностью переносимыми. В идеале, если среда NDIS будет реализована не в Windows, а в какой-то другой операционной системе, драйвер должен работать.

В свою очередь, среда NDIS обращается к функциям драйвера, чтобы передать пакет данных в сетевой адаптер, запросить или изменить параметры или режим работы адаптера, чтобы обслужить прерывание от сетевого адаптера. Минипорт-драйвер экспортирует функции в NDIS через структуру NDIS_MINIPORT_CHARACTERISTICS, поля которой инициализируются адресами экспортируемых функций.

Минимально необходимо, чтобы минипорт-драйвер инициализировал адресами своих функций следующие поля структуры NDIS_MINIPORT_CHARACTERISTICS:

  • InitializeHandler – функция инициализации сетевого адаптера;

  • QueryInformationHandler – функция для запроса параметров, статистики и режима работы сетевого адаптера или параметров физической среды;

  • SetInformationHandler – функция для установки параметров и режима работы сетевого адаптера;

  • SendPacketsHandler – функция для передачи пакетов сетевому адаптеру;

  • ReturnPacketHandler – функция обратного вызова, через которую NDIS уведомляет минипорт-драйвер о том, что ему возвращен контроль над пакетом данных, который драйвер передавал вышележащему протоколу;

  • HaltHandler – функция остановки (завершения работы) сетевого адаптера;

  • ISRHandler – обработчик прерываний сетевого адаптера.

Драйвер инициализирует экземпляр структуры NDIS_MINIPORT_CHARACTERISTICS в функции DraiverEntry, после чего вызывает функцию NdisMRegisterMiniport из библиотеки NDIS, передавая в нее указатель на инициализированный экземпляр структуры NDIS_MINIPORT_CHARACTERISTICS.

Минипорт-драйвер может создать объект-устройство посредством вызова функции NdisMRegisterDevice, указав в качестве одного из ее аргументов имя устройства. Этот объект устройство может быть открыт по имени из программы пользовательского режима и через него можно вести прямое взаимодействие с минипорт-драйвером сетевого адаптера из пользовательского режима, используя системны вызовы ReadFile, WriteFile и DeviceIoControl.