Фильтрация запросов OID в драйвере фильтра NDIS
Драйверы фильтров могут обрабатывать запросы OID, создаваемые вышестоящими драйверами. NDIS вызывает функцию FilterOidRequest для обработки каждого запроса OID. Драйверы фильтров могут пересылать запросы OID в базовые драйверы, вызвав функцию NdisFOidRequest.
NDIS может вызывать функцию драйвера фильтра FilterCancelOidRequest для отмены запроса OID. Когда NDIS вызывает FilterCancelOidRequest, драйвер фильтра должен попытаться вызвать функцию NdisFOidRequest как можно скорее.
На следующем рисунке показан отфильтрованный запрос 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. В этом случае драйвер передает результаты запроса в параметре OidRequestNdisFOidRequestComplete. Драйвер передает окончательное состояние запроса в параметре состояния функции 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 от базовых драйверов, фильтр вычитает размер своего заголовка из ответа. Драйвер вычитает его размер заголовка, так как драйвер вставляет заголовок перед каждым отправленным пакетом и удаляет заголовок в каждом полученном пакете.