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

Драйверы протоколов

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

Драйверы протоколов реализуют управление передачей в соответствии с принятым протоколом передачи, например, TCP/IP. Драйверы протоколов не зависят от физической среды и типа сетевого адаптера, от которых их изолируют минипорт-драйверы. Драйверы протоколов формируют пакеты данных для передачи и передают их среде NDIS, которая автоматически передает пакет соответствующему минипорт-драйверу сетевого адаптера или фильтру в составе сетевого стека.

Драйвер протокола предоставляет среде NDIS два интерфейса: стандартный интерфейс драйвера протокола на своей нижней границе, обращенной к сетевому адаптеру, и интерфейс WDM на своей верхней границе.

Драйвер протокола экспортирует функции интерфейса протокола через структуру NDIS_PROTOCOL_CHARACTERISTICS, поля которой инициализируются адресами экспортируемых функций.

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

  • BindAdapterHandler – вызывается на этапе создания сетевого стека для связывания драйвера протокола с соответствующим сетевым адаптером, при этом один и тот же драйвер протокола (протокол) может быть связан сразу с несколькими адаптерами;

  • UnbindAdapterHandler – вызывается при исключении протокола из сетевого стека;

  • ReceivePacketHandler – вызывается NDIS, когда получен пакет от сетевого адаптера, связанного с данным протоколом;

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

  • RequestCompleteHandler – если ранее был сделан запрос к связанному сетевому адаптеру (запрошен режим работы, статистика, параметры адаптера, состояние физической среды, если изменен режим работы или параметры сетевого адаптера), NDIS автоматически вызывает эту функцию драйвера протокола для передачи ответа вышележащим компонентам операционной системы;

  • SendCompleteHandler – если ранее драйвером протокола была запрошена передача пакета данных, NDIS автоматически вызывает эту функцию драйвера протокола для уведомления его о завершении передачи;

  • StatusHandler – NDIS автоматически вызывает эту функцию драйвера протокола, если минипорт-драйвер связанного с ним адаптера сообщит об изменении своего состояния, например, об отключении сетевого кабеля;

  • StatusCompleteHandler – если драйвер протокола индицировал изменение состояния связанного с ним адаптера вышележащим компонентам операционной системы, NDIS вызывает эту функцию драйвера протокола, индицируя ему, что отправленное уведомление доставлено;

  • PnPEventHandler – NDIS вызывает эту функцию драйвера протокола для уведомления его об изменениях конфигурации связанных с ним адаптеров, например, эта функция вызывается при подключении к драйверу протокола нового адаптера, при отключении или при изменении состояния энергопотребления связанного адаптера.

На своей верхней границе, драйверы протоколов через диспетчерские функции WDM взаимодействуют с TDI-клиентами (TDI – Transport Driver Interface). Интерфейс TDI по своей функциональности подобен сокетам.

Драйвер протокола должен предоставить диспетчерские функции для обработки следующих запросов:

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

  • IRP_MJ_DEVICE_INTERNAL_CONTROL – используется для взаимодействия с TDI клиентами в режиме ядра; при этом в поле MinorFunction структуры IO_STACK_LOCATION указывается код операции в виде предопределенной константы вида TDI_Xxx, например TDI_SEND, TDI_RECEIVE, TDI_CONNECT, TDI_LISTEN, TDI_ACCEPT;

  • IRP_MJ_DEVICE_CONTROL – используется для взаимодействия с приложениями пользовательского режима, например, для передачи запросов минипорт-драйверам;

  • IRP_MJ_CLEANUP – вызывается при закрытии объекта файл, через который шло сетевое взаимодействие;

  • IRP_MJ_CLOSE – вызывается, когда удаляется последняя ссылка на объект файл, через который шло сетевое взаимодействие.