Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйверы фильтров могут инициировать сигналы приема или фильтровать сигналы приема от базовых драйверов. Когда мини-драйвер вызывает функцию 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 в параметре ReceiveFlagsNdisFIndicateReceiveNetBufferLists, 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 в параметре ReceiveFlagsFilterReceiveNetBufferLists. В этом случае драйвер фильтра не должен возвращаться из 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 буфер возвращается.