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


Фильтрация запросов OID в драйвере фильтра NDIS

Драйверы фильтров могут обрабатывать запросы OID, созданные из-за превышения драйверов. NDIS вызывает функцию FilterOidRequest для обработки каждого запроса OID. Драйверы фильтров могут пересылать запросы OID к базовым драйверам, вызывая функцию NdisFOidRequest .

NDIS может вызывать функцию FilterCancelOidRequest драйвера фильтра для отмены запроса OID. Когда NDIS вызывает FilterCancelOidRequest, драйвер фильтра должен попытаться как можно скорее вызвать функцию NdisFOidRequest .

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

Схема, иллюстрирующая процесс отфильтрованного запроса OID.

Драйвер фильтра может выполнять запрос OID синхронно или асинхронно, возвращая NDIS_STATUS_SUCCESS или NDIS_STATUS_PENDING соответственно из FilterOidRequest. FilterOidRequest также может выполняться синхронно с состоянием ошибки.

Драйвер фильтра, который успешно обрабатывает запрос на набор OID, должен задать элемент SupportedRevision в структуре NDIS_OID_REQUEST по возвращении из запроса на набор OID. Участник SupportedRevision уведомляет инициатор запроса OID о том, какая редакция поддерживается драйвером. Дополнительные сведения о версиях в структурах NDIS см. в разделе Указание сведений о версии NDIS.

Если FilterOidRequest возвращает NDIS_STATUS_PENDING, он должен вызвать функцию NdisFOidRequestComplete после завершения запроса OID. В этом случае драйвер передает результаты запроса по параметру OidRequestдля NdisFOidRequestComplete. Драйвер передает окончательное состояние запроса в параметре Statusобъекта NdisFOidRequestComplete.

Если FilterOidRequest возвращает NDIS_STATUS_SUCCESS, он возвращает результаты запроса в структуре NDIS_OID_REQUEST в параметре OidRequest . В этом случае драйвер не вызывает функцию NdisFOidRequestComplete .

Чтобы перенаправить запрос OID базовым драйверам, драйвер фильтра вызывает функцию NdisFOidRequest . Если запрос не должен пересылаться базовым драйверам, драйвер фильтра может немедленно завершить запрос. Чтобы выполнить запрос без переадресации, драйвер может вернуть NDIS_STATUS_SUCCESS (или состояние ошибки) из FilterOidRequest или вызвать NdisFOidRequestComplete после возврата NDIS_STATUS_PENDING.

Примечание Прежде чем драйвер вызовет NdisFOidRequest, драйвер должен выделить NDIS_OID_REQUEST структуру и передать сведения о запросе в новую структуру, вызвав NdisAllocateCloneOidRequest.

Перенаправленный запрос выполняется так же, как запрос, инициированный драйвером фильтра. Дополнительные сведения см. в разделе Создание запросов OID из драйвера фильтра NDIS.

После того как базовые драйверы завершают переадресованный запрос, драйвер фильтра может при необходимости изменить ответ и передать его в драйверы с превышением.

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

Примечание Как и драйверы минипорта, драйверы фильтров могут одновременно получать только один запрос OID. Так как NDIS сериализует запросы, отправляемые в модуль фильтра, драйвер фильтра не может быть вызван в FilterOidRequest до завершения предыдущего запроса.

Ниже приведен пример драйвера фильтра, изменяющего запрос OID:

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