Сетевые драйверы Сетевые драйверы можно разделить на две категории: драйверы TDI (интерфейс транспортного драйвера) и драйверы NDIS (спецификация интерфейса сетевого драйвера).
Драйверы TDI — это драйверы высокого уровня, например, SMB-клиент, SMB-сервер, оболочки SMB (NFFS, MSFS) и т. д. Мы рассмотрим драйверы NDIS. NDIS — это специальный драйвер (соответствующий файлу ndis.sys), который содержит функции, используемые сетевыми драйверами низкого уровня.
NDIS как бы обволакивает низкоуровневые сетевые драйверы и является посредником в их общении друг с другом и с оборудованием.
Фактически NDIS можно считать третьим ядром Windows. Чтобы более наглядно понять, что такое NDIS, можно посмотреть на следующую картинку:
Как видно из этой иллюстрации, драйверы NDIS бывают трех типов:
- Драйверы минипортов (драйверы адаптеров)
- Промежуточные драйверы (например, psched.sys)
- Драйверы протоколов (например, tcpip.sys)
Драйверы минипорта
Каждое сетевое оборудование имеет свой собственный драйвер минипорта.Драйвер минипорта получает некоторые команды через NDIS. Функции драйвера минипорта можно описать следующим образом:
- инициализирует свое устройство (адаптер)
- создание/включение/отключение/удаление сетевых подключений
- выдача клиенту или изменение параметров адаптера
- отправка посылок
- получение посылок
- уведомление ОС о состоянии адаптера
- перезагрузитесь и остановите адаптер
NDIS экспортирует около 150 функций для использования драйверами минипорта.
Драйверы минипорта могут быть «без установления соединения» (например, драйвер адаптера Ethernet) и «ориентированными на соединение» (например, драйвер модема).
Драйверы, ориентированные на соединение, имеют немного более сложную систему обратного вызова; в него входят обработчики событий, связанные с подключением к каналу связи, отключением от канала, выбором канала (для беспроводных адаптеров) и т. д. Для некоторых операций драйверы, ориентированные на соединение, вызывают специальные функции NDIS, отличающиеся префиксом «Co» в названии.
(например, вместо NdisMINdicateReceivePacket драйвер, ориентированный на соединение, должен вызывать NdisMColndicateReceivePacket).
Каждый обратный вызов выполняет свою задачу: выдачу информации, отправку данных, получение данных и т. д. Подробнее можно прочитать в справке по WDK (DDK).
Там вы можете получить полную информацию об обратных вызовах.
Драйверы протокола могут делегировать драйверу минипорта (при условии, что драйвер минипорта может это делать — либо сам, либо адаптер может это делать на аппаратном уровне) некоторые свои функции (например, определять контрольную сумму или цифровую подпись IP-пакета или решить, как фрагментировать большой TCP-пакет).
Это значительно повышает производительность сети.
Существуют также различные дополнительные расширенные интерфейсы, которые может поддерживать драйвер минипорта, например:
- LBFO (Load Balancing and Fail Over) — позволяет понимающим это адаптерам распределять между собой исходящий трафик и исправлять ошибки друг друга.
Однако это имеет смысл только на магистральных маршрутизаторах (центральных маршрутизаторах крупных сетей), на которых редко устанавливается Windows.
- FFP (Fast Forwarding Path) — позволяет понимающим его адаптерам маршрутизировать/фильтровать пакеты чисто аппаратно, вообще без участия ОС и без загрузки основных процессоров компьютера.
Водители среднего уровня
Промежуточный драйвер виден сверху как драйвер минипорта (см.картинку), т.е.
как виртуальный адаптер, а снизу — как драйвер протокола (еще раз посмотрите на картинку), как виртуальный протокол.
В частном случае возможно, что промежуточный драйвер виден только сверху.
Водители среднего уровня обычно выполняют одно из следующих действий:
- организовать «честный» доступ разных клиентских программ к адаптерам, чтобы программы не мешали друг другу
- фильтровать и перехватывать трафик
- маршрутизировать пакеты из одной сети в другую, если эти сети разные (например, Ethernet и WI-FI)
Промежуточные драйверы могут располагаться друг над другом, если виртуальный протокол одного промежуточного драйвера привязан к виртуальному адаптеру другого промежуточного драйвера.
Но это делается редко, поскольку снижает производительность.
Драйверы протоколов
Драйверы протоколов представляют собой высший уровень спецификации NDIS. Эти драйверы отвечают за выделение ресурсов соответствующим пакетам, копирование данных приложения в пакеты и передачу их драйверам более низкого уровня.Драйверы протоколов также предоставляют интерфейс для получения пакетов от базовых драйверов.
Драйверы протоколов также включают драйверы транспорта, реализующие стек сетевых протоколов, например TCP/IP (tspip.sys).
Если пост представляет интерес для читателей, то в следующих постах вы можете написать свой промежуточный драйвер типа сниффера на примере или также описать, как написать каждый тип драйвера (минипорт, промежуточный или протокольный).
Спасибо за внимание.
Теги: #драйверы #NDIS #программирование
-
Интернет-Магазин Apple Store
19 Oct, 24 -
Победитель Imaginecup В Беларуси.
19 Oct, 24 -
Замечательная Вещь Всего За 271 Рубль.
19 Oct, 24 -
Как Работает Один Python-Разработчик
19 Oct, 24