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

Промежуточные драйверы

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

Промежуточный драйвер предоставляет два интерфейса: интерфейс минипорт-драйвера на верхней границе и интерфейс драйвера протокола на нижней. Таким образом, промежуточный драйвер выглядит как минипорт-драйвер для вышележащих компонентов, и как протокол для нижележащих.

Промежуточный драйвер может соединяться с произвольным количеством нижележащих минипорт-драйверов и вышележащих протоколов. Таким образом, могут быть реализованы варианты соединения 1-на-1, 1-на-N, N-на-1 и N-на-M, где первое число – связи с вышележащими протоколами.

Драйвер 1-на-1 может реализовать систему шифрации, блокировать прием или передачу пакетов по указанным адресам, вести статистику соединения, управлять очередями QoS.

Драйвер 1-на-N может реализовывать систему автоматического резервирования, переключая поток пакетов на тот или иной сетевой адаптер. При этом факт переключения окажется скрытым от вышележащих приложений и не повлияет на их работу. В другом случае, такой драйвер может автоматически выбирать для передачи специфических пакетов (пакетов определенного типа, например, VoIP, или пакетов с определенным адресом) наиболее выгодное подключение.

Драйвер N-на-1 обычно реализует на базе одного реального сетевого адаптера несколько виртуальных адаптеров, доступных вышележащим приложениям. Для каждого такого виртуального адаптера можно настроить собственный стек протоколов при использовании единственного физического соединения с сетью.

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

Структура ndis пакета

NDIS драйверы работают с информационными блоками, заключенными в стандартный контейнер – пакет NDIS. Общая структура пакета NDIS показана на рис. .23.

Рис.23. Структура пакета NDIS

Пакет NDIS представлен структурой NDIS_PACKET. Данные пакета хранятся отдельно и могут быть фрагментированы. Пакет NDIS ссылается на свои данные через список экземпляров структуры NDIS_BUFFER, каждая из которых ссылается на область данных в неподкачиваемом пуле.

Отметим некоторые поля в объявлении этих структур.

Структура NDIS_PACKET:

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

  • UCHAR MacReserved[4*sizeof(PVOID)] – зарезервированная область данных, которую может по своему усмотрению использовать минипорт-драйвер, создавший данный пакет;

  • UCHAR ProtocolReserved[1] – зарезервированная область данных, которую может по своему усмотрению использовать драйвер протокола, создавший данный пакет, при этом (так как это последнее поле в структуре NDIS_PACKET) фактически выделенный объем зарезервированной области может быть больше 1 байта (необходимый размер зарезервированной памяти, доступной через поле ProtocolReserved, является свойством пула пакетов и указывается при создании пула).

Рассмотрим теперь структуру NDIS_BUFFER. На самом деле NDIS_BUFFER является просто альтернативным именем для структуры MDL, описывающей связь виртуальных адресов с физическими. Отметим некоторые поля этой структуры:

  • struct MDL *Next – указатель на следующий буфер данных;

  • PVOID StartVa – базовый виртуальный адрес блока данных, выровненный на размер страницы;

  • ULONG ByteOffset – смещение от адреса StartVa до фактического начала блока данных;

  • ULONG ByteCount – размер блока данных;

Информация о физических страницах, сопоставленных с данным блоком памяти в виртуальном адресном пространстве располагается непосредственно за экземпляром структуры MDL, и должна трактоваться как массив ULONG.

Таким образом, блоки данных пакета NDIS можно прямо задействовать в операциях ПДП с сетевыми адаптерами.