- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •1.1. Взаимодействие процессора с внешними устройствами
- •1.2. Прямой доступ к памяти
- •Драйверы
- •Роль драйверов в операционной системе
- •Взаимодействие драйверов с компонентами операционной системы и пользовательскими программами
- •Стек обработки запросов ввода-вывода
- •Основы организации и работы подсистемы ввода-вывода unix
- •2.1. Драйверы в операционных системах семейства unix
- •Стратегическая функция драйвера блочного устройства
- •Функция обработки прерывания
- •Функция опроса устройства
- •Другие функции драйверов
- •Буферизация в символьных драйверах
- •Терминальный драйвер
- •2.2. Потоковая подсистема ввода-вывода в unix
- •Архитектура и принципы работы подсистемы streams
- •Архитектура и работа модулей потока
- •Функция модуля put
- •Функция модуля service
- •Структура сообщения
- •Основы организации и работы подсистемы ввода-вывода windows
- •3.1. Классификаций драйверов Windows
- •Драйверы пользовательского режима
- •Драйверы режима ядра
- •3.2. Объекты подсистемы ввода-вывода
- •Объект файл
- •Объект устройство
- •Объект драйвер
- •Объект пакет запроса ввода-вывода
- •Объект блок стека запросов ввода-вывода
- •3.3. Передача данных между пользовательским адресным пространством и пространством ядра
- •Буферизированный ввод-вывод
- •Прямой ввод-вывод
- •Ввод-вывод под управлением драйвера
- •3.4. Обработка запросов ввода-вывода
- •Прохождение запроса ввода-вывода вниз через стек обработки запросов ввода-вывода
- •Обработка прерывания по завершению ввода-вывода
- •Обратное прохождение запроса ввода-вывода вверх через стек запросов ввода-вывода
- •3.5. Буферизация запросов ввода-вывода
- •Системная очередь запросов
- •Очереди запросов под управлением драйвера
- •3.6. Диспетчер Plug-And-Play, установка и запуск драйверов
- •3.7. Диспетчер электропитания
- •3.8. Среда сетевых драйверов ndis
- •Драйверы среды ndis Минипорт-драйверы сетевых адаптеров
- •Драйверы протоколов
- •Промежуточные драйверы
- •Структура ndis пакета
- •Запросы к сетевым адаптерам
- •3.9. Порты завершения ввода-вывода
- •Заключение
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
Драйверы протоколов
Драйвер протокола является обязательным драйвером в сетевом стеке. Он всегда один в стеке и он всегда самый верхний драйвер в стеке.
Драйверы протоколов реализуют управление передачей в соответствии с принятым протоколом передачи, например, 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 – вызывается, когда удаляется последняя ссылка на объект файл, через который шло сетевое взаимодействие.