Compartir a través de


Filtrado de solicitudes de OID en un controlador de filtro NDIS

Los controladores de filtro pueden procesar solicitudes de OID originadas por controladores excesivos. NDIS llama a la función FilterOidRequest para procesar cada solicitud de OID. Los controladores de filtro pueden reenviar solicitudes de OID a controladores subyacentes mediante una llamada a la función NdisFOidRequest .

NDIS puede llamar a la función FilterCancelOidRequest del controlador de filtro para cancelar una solicitud de OID. Cuando NDIS llama a FilterCancelOidRequest, el controlador de filtro debe intentar llamar a la función NdisFOidRequest lo antes posible.

En la ilustración siguiente se muestra una solicitud de OID filtrada.

Diagrama que ilustra el proceso de una solicitud de OID filtrada.

El controlador de filtro puede completar la solicitud OID de forma sincrónica o asincrónica devolviendo NDIS_STATUS_SUCCESS o NDIS_STATUS_PENDING, respectivamente, desde FilterOidRequest. FilterOidRequest también puede completarse sincrónicamente con un estado de error.

Un controlador de filtro que controle correctamente una solicitud de conjunto de OID debe establecer el miembro SupportedRevision en la estructura de NDIS_OID_REQUEST tras la devolución de la solicitud de conjunto de OID. El miembro SupportedRevision notifica al iniciador de la solicitud de OID sobre qué revisión admite el controlador. Para obtener más información sobre la información de versión en estructuras NDIS, vea Especificar información de versión de NDIS.

Si FilterOidRequest devuelve NDIS_STATUS_PENDING, debe llamar a la función NdisFOidRequestComplete después de completar la solicitud OID. En este caso, el controlador pasa los resultados de la solicitud en el parámetro OidRequest de NdisFOidRequestComplete. El controlador pasa el estado final de la solicitud en el parámetro Status de NdisFOidRequestComplete.

Si FilterOidRequest devuelve NDIS_STATUS_SUCCESS, devuelve los resultados de una solicitud de consulta en la estructura NDIS_OID_REQUEST en el parámetro OidRequest . En este caso, el controlador no llama a la función NdisFOidRequestComplete .

Para reenviar una solicitud de OID a los controladores subyacentes, un controlador de filtro llama a la función NdisFOidRequest . Si una solicitud no se debe reenviar a los controladores subyacentes, un controlador de filtro puede completar la solicitud inmediatamente. Para completar la solicitud sin reenviar, el controlador puede devolver NDIS_STATUS_SUCCESS (o un estado de error) desde FilterOidRequest, o puede llamar a NdisFOidRequestComplete después de devolver NDIS_STATUS_PENDING.

Nota Antes de que el controlador llame a NdisFOidRequest, el controlador debe asignar una estructura NDIS_OID_REQUEST y transferir la información de solicitud a la nueva estructura llamando a NdisAllocateCloneOidRequest.

La solicitud reenviada continúa igual que una solicitud iniciada por un controlador de filtro. Para obtener más información, consulte Generación de solicitudes de OID a partir de un controlador de filtro NDIS.

Después de que los controladores subyacentes completen una solicitud reenviada, el controlador de filtro puede modificar la respuesta, si es necesario, y pasarla a los controladores de forma excesiva.

Un controlador de filtro puede recibir solicitudes de OID de controladores demasiado excesivos cuando se encuentra en el estado Reinicio, En ejecución, Pausa o Pausado .

Nota Al igual que los controladores de minipuerto, los controladores de filtro solo pueden recibir una solicitud de OID a la vez. Dado que NDIS serializa las solicitudes que se envían a un módulo de filtro, no se puede llamar a un controlador de filtro en FilterOidRequest antes de completar la solicitud anterior.

A continuación se muestra un ejemplo de un controlador de filtro que modifica una solicitud de OID:

  • Un controlador de filtro agrega un encabezado. En este caso, después de que el controlador reciba una respuesta a una consulta para OID_GEN_MAXIMUM_FRAME_SIZE de los controladores subyacentes, el filtro resta el tamaño de su encabezado de la respuesta. El controlador resta su tamaño de encabezado porque el controlador inserta un encabezado delante de cada paquete enviado y quita el encabezado de cada paquete recibido.