Поделиться через


Отправка данных из драйвера фильтра

Драйверы фильтра могут инициировать отправку запросов или фильтровать запросы отправки, которые инициируют более входящие драйверы. Когда драйвер протокола вызывает функцию NdisSendNetBufferLists , NDIS отправляет указанную структуру NET_BUFFER_LIST в самый верхний модуль фильтра в стеке драйверов.

Отправка запросов, инициированных драйвером фильтра

На следующем рисунке показана операция отправки, инициированная драйвером фильтра.

Схема, показывающая операцию отправки, инициированную драйвером фильтра с функцией NdisFSendNetBufferLists.

Драйверы фильтров вызывают функцию NdisFSendNetBufferLists для отправки сетевых данных, определенных в списке NET_BUFFER_LIST структур.

Драйвер фильтра должен задать члену SourceHandle каждой создаваемой структуры NET_BUFFER_LIST значение, которое передается параметру NdisFilterHandleобъекта NdisFSendNetBufferLists. Драйверы NDIS не должны изменять член SourceHandle для NET_BUFFER_LIST структур, которые не были созданы драйвером.

Перед вызовом NdisFSendNetBufferLists драйвер фильтра может задать сведения, сопровождающие запрос на отправку с помощью макроса NET_BUFFER_LIST_INFO . Базовые драйверы могут получить эти сведения с помощью макроса NET_BUFFER_LIST_INFO.

Как только драйвер фильтра вызывает NdisFSendNetBufferLists, он откажется от владения NET_BUFFER_LIST структурами и всеми связанными ресурсами. NDIS может обрабатывать запрос на отправку или передавать запрос базовым драйверам.

NDIS вызывает функцию FilterSendNetBufferListsComplete для возврата структур и данных в драйвер фильтра. NDIS может собирать структуры и данные из нескольких запросов на отправку в один связанный список NET_BUFFER_LIST структур, прежде чем передать список в FilterSendNetBufferListsComplete.

Пока NDIS не вызовет FilterSendNetBufferListsComplete, текущее состояние запроса на отправку неизвестно. Драйвер фильтра никогда не должен пытаться изучить NET_BUFFER_LIST структуры или связанные с ними данные, прежде чем NDIS вернет структуры в FilterSendNetBufferListsComplete.

FilterSendNetBufferListsComplete выполняет любую постобработку, необходимую для завершения операции отправки.

Когда NDIS вызывает FilterSendNetBufferListsComplete, драйвер фильтра восстанавливает права владения всеми ресурсами, связанными с NET_BUFFER_LIST структурами, заданными параметром NetBufferLists . FilterSendNetBufferListsComplete может освободить эти ресурсы (например, путем вызова функций NdisFreeNetBuffer и NdisFreeNetBufferList ) или подготовить их к повторному использованию в последующем вызове NdisFSendNetBufferLists.

NDIS всегда отправляет предоставленные фильтром сетевые данные в базовые драйверы в порядке, определяемом драйвером фильтра, который передается в NdisFSendNetBufferLists. Однако после отправки данных в указанном порядке базовые драйверы могут возвращать буферы в любом порядке.

Драйвер фильтра может запрашивать замыкания на себя для исходящих запросов на отправку. Чтобы запросить замыкания на себя, драйвер устанавливает флаг NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK в параметре SendFlagsобъекта NdisFSendNetBufferLists. NDIS указывает на полученный пакет, содержащий отправляемые данные.

Примечание Драйвер фильтра должен отслеживать исходящие запросы на отправку и убедиться, что он не вызывает функцию NdisFSendNetBufferListsComplete по завершении таких запросов.

Фильтрация запросов на отправку

На следующем рисунке показана фильтрация запроса на отправку, инициированного драйвером overlying.

Схема: процесс фильтрации запроса на отправку, инициированного драйвером overlying с помощью функции FilterSendNetBufferLists.

NDIS вызывает функцию FilterSendNetBufferLists драйвера фильтра для фильтрации запроса на отправку вышестоящему драйверу.

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

Драйвер фильтра может фильтровать данные и отправлять отфильтрованные данные базовым драйверам. Для каждой NET_BUFFER структуры, отправленной в FilterSendNetBufferLists, драйвер фильтра может выполнять следующие действия:

  • Передайте буфер следующему базовому драйверу, вызвав функцию NdisFSendNetBufferLists . NDIS гарантирует доступность контекстного пространства (см . NET_BUFFER_LIST_CONTEXT структуру) для драйверов фильтров. Драйвер фильтра может изменять содержимое буфера перед вызовом NdisFSendNetBufferLists. Обработка отфильтрованных данных выполняется так же, как и операция отправки, инициированная драйвером фильтра.

  • Удалите буфер, вызвав функцию NdisFSendNetBufferListsComplete .

  • Помещайте буфер в локальную структуру данных для последующей обработки. Архитектура драйвера фильтра определяет, что заставляет драйвер обрабатывать буфер в очереди. Некоторые примеры включают обработку после истечения времени ожидания или обработку после получения определенного буфера.

    Примечание Если в очередях драйвера отправляются запросы на более позднюю обработку, он должен поддерживать отправку запросов на отмену. Дополнительные сведения об отправке запросов на отмену см. в разделе Отмена запросов на отправку в драйвере фильтра.

  • Скопируйте буфер и создайте запрос на отправку с копией. Операция отправки похожа на запрос на отправку, инициированный драйвером фильтра. В этом случае драйвер должен вернуть исходный буфер в вышестоящему драйверу, вызвав функцию NdisFSendNetBufferListsComplete .

Завершение запросов на отправку выполняется в стеке драйверов. Когда драйвер мини-порта вызывает функцию NdisMSendNetBufferListsComplete , NDIS вызывает функцию FilterSendNetBufferListsComplete для модуля фильтра с наименьшим превышением.

После завершения операции отправки драйвер фильтра отменяет изменения дескрипторов буфера вышестоящему драйвера, внесенные драйвером фильтра в FilterSendNetBufferLists. Драйвер вызывает функцию NdisFSendNetBufferListsComplete , чтобы вернуть связанный список NET_BUFFER_LIST структур в вышестоящие драйверы и вернуть окончательное состояние запроса на отправку.

Когда самый верхний модуль фильтра вызывает NdisFSendNetBufferListsComplete, NDIS вызывает функцию ProtocolSendNetBufferListsComplete исходного драйвера протокола.

Драйвер фильтра, который не предоставляет функцию FilterSendNetBufferLists , по-прежнему может инициировать запрос на отправку. Если такой драйвер инициирует запрос на отправку, он должен предоставить функцию FilterSendNetBufferListsComplete и не должен передавать полное событие в стек драйверов.

Драйвер фильтра может передавать или фильтровать запрос замыкания на себя выше справа от драйвера. Чтобы передать запрос замыкания на себя, если NDIS NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK в параметре SendFlagsfilterSendNetBufferLists, драйвер фильтра задает NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK в параметре SendFlags при вызове NdisFSendNetBufferLists. NDIS указывает на полученный пакет, содержащий отправляемые данные.

Как правило, если драйвер фильтра изменяет любое поведение таким образом, что NDIS не может предоставить стандартную службу (например, замыкания на себя), драйвер фильтра должен предоставить такую службу для NDIS. Например, драйвер фильтра, который изменяет запрос на адрес оборудования (см . OID_802_3_CURRENT_ADDRESS), должен обрабатывать замыкания буферов, направленных на новый аппаратный адрес. В этом случае NDIS не может предоставить службу замыкания на себя, так как фильтр изменил адрес. Кроме того, если драйвер фильтра задает неизвестный режим (см . OID_GEN_CURRENT_PACKET_FILTER), он не должен передавать дополнительные данные, которые он получает, в драйверы с превышением.