- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •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
Запросы к сетевым адаптерам
Среда NDIS может посылать минипорт-драйверам и драйверам фильтров, имеющим интерфейс минипорт-драйвера, запросы о статистике работы, текущих параметрах и установленных режимах сетевого адаптера, о состоянии физической среды, а также устанавливать параметры и режимы работы. Для обслуживания таких запросов, минипорт-драйвер через поля QueryInformationHandler и SetInformationHandler структуры NDIS_MINIPORT_CHARACTERISTICS предоставляет функции, определенные следующим образом:
NDIS_STATUS MiniportQueryInformation( // адрес пользовательской структуры, // связанной с сетевым адаптером при его открытии IN NDIS_HANDLE MiniportAdapterContext, // код запроса IN NDIS_OID Oid // буфер данных запроса IN PVOID InformationBuffer, // размер буфера данных IN ULONG InformationBufferLength, // объем данных, записанных в буфер OUT PULONG BytesWritten, // требуемый объем буфера, // если переданный буфер мал OUT PULONG BytesNeeded );
NDIS_STATUS MiniportSetInformation( // адрес пользовательской структуры, // связанной с сетевым адаптером при его открытии IN NDIS_HANDLE MiniportAdapterContext, // код запроса IN NDIS_OID Oid // буфер данных запроса IN PVOID InformationBuffer, // размер буфера данных IN ULONG InformationBufferLength, // объем данных, записанных в буфер OUT PULONG BytesRead, // требуемый объем буфера, // если переданный буфер мал OUT PULONG BytesNeeded );
В среде NDIS определено множество стандартных кодов запросов, например:
OID_GEN_HARDWARE_STATUS – запрос о текущем состоянии аппаратуры адаптера; в ответ на запрос минипорт-драйвер может возвратить предопределенную константу NdisHardwareStatusReady или NdisHardwareStatusNotReady или другое предопределенное значение;
OID_GEN_LINK_SPEED – максимальная скорость передачи данных, поддерживаемая адаптером;
OID_GEN_MAXIMUM_FRAME_SIZE – при запросе, минипорт-драйвер должен сообщить максимально возможный размер кадра, который поддерживается адаптером; при установке – запомнить предельный размер кадра, который может быть обработан вышележащим протоколом (если адаптер получит более длинный кадр, то перед передачей данных вышележащему протоколу, минипорт-драйвер должен разбить этот кадр на два или более кадров допустимого размера);
OID_GEN_MEDIA_CONNECT_STATUS – запрос о наличии подключения сетевого адаптера к физическому каналу;
OID_GEN_RCV_OK – запрос статистики о количестве кадров, безошибочно принятых из физической среды;
OID_802_11_RSSI – запрос об уровне сигнала на входе беспроводного сетевого адаптера WiFi.
Программы режима ядра могут посылать запросы к сетевым адаптерам посредством вызова функции NdisRequest. Приложения пользовательского режима могут отправлять запросы сетевым адаптерам через интерфейс DeviceIoControl.
Как уже отмечалось, драйверы протокола предоставляют функцию для обработки запросов ввода-вывода типа IRP_MJ_DEVICE_CONTROL. Именно в этой функции драйвера, исполняющейся в режиме ядра, в соответствии с пользовательским запросом вызывается функция ядра NdisRequest.
В Windows определены управляющие коды для системного вызова DeviceIoControl вида IOCTL_NDISUIO_QUERY_OID_VALUE и IOCTL_NDISUIO_SET_OID_VALUE. В качестве входного параметра в системный вызов DeviceIoControl передается указатель на экземпляр структуры NDISUIO_QUERY_OID или NDISUIO_SET_OID, определенные следующим образом:
struct NDIS_Xxx_OID { // код запроса NDIS_OID Oid; // данные запроса, минимум sizeof(ULONG) байтов UCHAR Data[sizeof(ULONG)]; }
Заметим, что фактический размер области данных определяется кодом запроса, при этом непосредственно за экземпляром структуры должен быть выделен дополнительный объем памяти необходимого размера.