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


Получение данных в драйвере фильтра

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

Признаки получения, инициированные драйвером фильтра

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

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

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

Если драйвер фильтра задает флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlagsобъекта NdisFIndicateReceiveNetBufferLists, это означает, что драйвер фильтра должен немедленно восстановить права владения структурами NET_BUFFER_LIST . В этом случае NDIS не вызывает функцию FilterReturnNetBufferLists драйвера фильтра для возврата NET_BUFFER_LIST структур. Драйвер фильтра восстанавливает права владения сразу после возврата NdisFIndicateReceiveNetBufferLists .

Если драйвер фильтра не устанавливает флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlagsобъекта NdisFIndicateReceiveNetBufferLists, NDIS возвращает указанные структуры NET_BUFFER_LIST функции FilterReturnNetBufferLists драйвера фильтра. В этом случае драйвер фильтра откажется от владения указанными структурами, пока NDIS не вернет их в FilterReturnNetBufferLists.

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

Фильтрация показаний получения

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

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

NDIS вызывает функцию FilterReceiveNetBufferLists драйвера фильтра для обработки признаков получения, поступающих от базовых драйверов. NDIS вызывает FilterReceiveNetBufferLists после того, как базовый драйвер вызывает функцию индикации получения (например, NdisMIndicateReceiveNetBufferLists), чтобы указать полученные сетевые данные или данные замыкания на себя.

Если флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlagsфильтра FilterReceiveNetBufferLists не задан, драйвер фильтра сохраняет право собственности на структуры NET_BUFFER_LIST , пока не вызовет функцию NdisFReturnNetBufferLists .

Если установлен флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlags , драйвер фильтра не сможет сохранить структуру NET_BUFFER_LIST и связанные ресурсы, выделенные базовым драйвером. Этот флаг может указывать на то, что базовый драйвер работает с нехваткой ресурсов получения. Функция FilterReceiveNetBufferLists должна возвращать как можно быстрее.

Примечание Если флаг NDIS_RECEIVE_FLAGS_RESOURCES установлен, драйвер фильтра должен сохранить исходный набор NET_BUFFER_LIST структур в связанном списке. Например, если этот флаг установлен, драйвер может обработать структуры и указать их в стеке по одному, но перед возвращением функции он должен восстановить исходный связанный список.

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

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

    Драйвер фильтра может изменить состояние, переданное NDIS в FilterReceiveNetBufferLists , или просто передать его в NdisFIndicateReceiveNetBufferLists.

    Примечание Драйвер фильтра может передавать буфер с помощью NdisFIndicateReceiveNetBufferLists , даже если NDIS задает флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlagsэлемента FilterReceiveNetBufferLists. В этом случае драйвер фильтра не должен возвращать данные из FilterReceiveNetBufferLists , пока не восстановит права владения буфером.

  • Удалите буфер. Если NDIS очистил флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlagsобъекта FilterReceiveNetBufferLists, вызовите функцию NdisFReturnNetBufferLists , чтобы отменить буфер. Если NDIS задает флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlagsобъекта FilterReceiveNetBufferLists, не предпринимать никаких действий и возвращать из FilterReceiveNetBufferLists , чтобы отменить буфер.

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

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

Функция NdisFIndicateReceiveNetBufferLists передает указанный список NET_BUFFER_LIST структур в стек драйверов более неположенным драйверам. Операция получения выполняется аналогично операции получения, инициированной драйвером фильтра.

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

Если модуль фильтра нижнего слоя указывает, что выполняется с буфером, NDIS возвращает буфер драйверу мини-порта. Если NDIS снимите флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlagsобъекта FilterReceiveNetBufferLists, драйвер фильтра вызывает NdisFReturnNetBufferLists , чтобы вернуть буфер. Если NDIS задает флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlagsэлемента FilterReceiveNetBufferLists, при возврате из FilterReceiveNetBufferLists возвращается буфер.