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

Запросы к сетевым адаптерам

Среда 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)]; }

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