Partilhar via


Filtrando solicitações OID em um driver de filtro NDIS

Os drivers de filtro podem processar solicitações OID originadas por drivers superiores. O NDIS chama a função FilterOidRequest para processar cada solicitação OID. Os drivers de filtro podem chamar a função NdisFOidRequest para encaminhar solicitações OID para drivers subjacentes.

O NDIS pode chamar a função FilterCancelOidRequest de um driver de filtro para cancelar uma solicitação OID. Quando o NDIS chama FilterCancelOidRequest, o driver de filtro deve tentar chamar a função NdisFOidRequest o mais rápido possível.

A figura a seguir ilustra uma solicitação OID filtrada.

Diagrama ilustrando o processo de uma solicitação OID filtrada.

O driver de filtro pode concluir a solicitação OID de forma síncrona ou assíncrona retornando NDIS_STATUS_SUCCESS ou NDIS_STATUS_PENDING, respectivamente, de FilterOidRequest. FilterOidRequest também pode ser concluída de forma síncrona com um status de erro.

Um driver de filtro que lida com êxito com uma solicitação de conjunto OID deve definir o membro SupportedRevision na estrutura NDIS_OID_REQUEST após o retorno da solicitação de conjunto OID. O membro SupportedRevision notifica o iniciador da solicitação OID sobre qual revisão o driver suportava. Para obter mais informações sobre informações de versão em estruturas NDIS, consulte Especificando informações de versão do NDIS.

Se FilterOidRequest retornar NDIS_STATUS_PENDING, ele deverá chamar a função NdisFOidRequestComplete depois de concluir a solicitação OID. Nesse caso, o driver passa os resultados da solicitação no parâmetro OidRequest do NdisFOidRequestComplete. O driver passa o estado final do pedido no parâmetro Status de NdisFOidRequestComplete.

Se o FilterOidRequest retornar NDIS_STATUS_SUCCESS, ele irá devolver os resultados de uma solicitação de consulta na estrutura NDIS_OID_REQUEST no parâmetro OidRequest. Nesse caso, o driver não chama a função NdisFOidRequestComplete.

Para encaminhar uma solicitação OID para drivers subjacentes, um driver de filtro chama a função NdisFOidRequest. Se uma solicitação não deve ser encaminhada para os drivers subjacentes, um driver de filtro pode concluir a solicitação imediatamente. Para concluir a solicitação sem encaminhar, o driver pode retornar um valor de status, como NDIS_STATUS_SUCCESS (ou um status de erro) de FilterOidRequest, ou pode chamar NdisFOidRequestComplete depois de retornar NDIS_STATUS_PENDING.

Nota Antes de o driver chamar NdisFOidRequest, o driver deve alocar uma estrutura de NDIS_OID_REQUEST e transferir as informações da solicitação para a nova estrutura chamando NdisAllocateCloneOidRequest.

A solicitação encaminhada prossegue da mesma forma que uma solicitação iniciada por um driver de filtro. Para obter mais informações, consulte Gerando solicitações OID de um driver de filtro NDIS.

Depois que os drivers subjacentes concluírem uma solicitação encaminhada, o driver de filtro poderá modificar a resposta, se necessário, e passá-la para os drivers sobrepostos.

Um driver de filtro pode receber solicitações OID de drivers sobrepostos quando estiver no estado de Reiniciando, Executando, Pausandoou Pausado.

Observação Como os drivers de miniporta, os drivers de filtro podem receber apenas uma solicitação OID de cada vez. Como o NDIS serializa solicitações enviadas para um módulo de filtro, um driver de filtro não pode ser chamado em FilterOidRequest antes de concluir a solicitação anterior.

A seguir está um exemplo de um driver de filtro modificando uma solicitação OID:

  • Um driver de filtro adiciona um cabeçalho. Nesse caso, depois que o driver recebe uma resposta a uma consulta de OID_GEN_MAXIMUM_FRAME_SIZE dos drivers subjacentes, o filtro subtrai o tamanho de seu cabeçalho da resposta. O driver subtrai o seu tamanho de cabeçalho porque o driver adiciona um cabeçalho à frente de cada pacote enviado e remove o cabeçalho em cada pacote recebido.