Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O miniporto WDI IHV é como qualquer outro driver de miniporto NDIS e seguiria as práticas de desenvolvimento e a documentação de qualquer miniporto NDIS. As responsabilidades de um driver Miniport WLAN nativo para os gerenciadores NDIS são divididas entre o Componente MS e o driver IHV do WDI. O componente WLAN da Microsoft cuida dos requisitos do NDIS aplicáveis a todos os miniportos Wi-Fi para que cada IHV não precise refazer todo esse trabalho. O mapeamento e as alterações de comportamento para os manipuladores de NDIS para o miniporto IHV da WLAN nativa, quando aplicados a um miniporto IHV WDI, são descritos abaixo.
- Driver installation
- DriverEntry
- MiniportSetOptions
- MiniportInitializeEx
- MiniportHaltEx
- MiniportDriverUnload
- MiniportPause
- MiniportRestart
- MiniportResetEx
- MiniportDevicePnPEventNotify
- MiniportShutdownEx
- MiniportOidRequest
- MiniportCancelOidRequest
- NdisMIndicateStatusEx
- MiniportDirectOidRequest
- MiniportCancelDirectOidRequest
- MiniportSendNetBufferLists
- MiniportCancelSend
- MiniportReturnNetBufferLists
- Manipulador WDI: MiniportWdiOpenAdapter
- Manipulador WDI: MiniportWdiCloseAdapter
Driver installation
Não há alterações na maneira como o driver de miniporto WDI IHV é carregado e instalado no sistema. O INF e o processo de instalação são semelhantes ao de um driver de miniporto WLAN nativo de um IHV. Assim como os drivers NDIS existentes, quando o driver IHV precisa ser carregado para trabalhar com o adaptador WLAN do IHV, o sistema operacional chama a rotina DriverEntry do driver de miniporto IHV.
DriverEntry
O sistema operacional chama diretamente a rotina DriverEntry do driver de miniport WDI IHV. O miniporto IHV segue a maioria das diretrizes da rotina DriverEntry de um miniporto NDIS normal. A única exceção é que, em vez de chamar NdisMRegisterMiniportDriver, o miniporto IHV chama NdisMRegisterWdiMiniportDriver para informar ao sistema operacional para habilitar o componente do Microsoft WLAN.
Veja a seguir os principais parâmetros do NdisMRegisterWdiMiniportDriver.
- NDIS_MINIPORT_DRIVER_CHARACTERISTICS: esta é a estrutura NDIS original que um miniporto nativo Wi-Fi usa para registrar-se no NDIS. Para um modelo WDI, a maioria dos parâmetros do manipulador são opcionais. Os únicos manipuladores necessários são MINIPORT_OID_REQUEST_HANDLER e MINIPORT_DRIVER_UNLOAD. MINIPORT_OID_REQUEST_HANDLER é usado para passar mensagens WDI para o driver IHV. Se qualquer outro manipulador for especificado, o componente WLAN da Microsoft geralmente chamará o manipulador depois de executar seu próprio processamento para o manipulador.
- NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS: esse é o novo conjunto de manipuladores que um driver de miniporto WDI deve implementar. Ele é usado pelo driver IHV para registrar manipuladores adicionais para o caminho de controle e o conjunto completo de manipuladores para o caminho de dados.
Quando o miniporto IHV chama NdisMRegisterWdiMiniportDriver, o componente WLAN da Microsoft atualiza os handlers de NDIS_MINIPORT_DRIVER_CHARACTERISTICS e chama o NdisMRegisterMiniportDriver do NDIS. As atualizações são feitas para que o componente WLAN da Microsoft possa interceptar os manipuladores para os quais ele pode fornecer assistência/simplificação para o driver de miniporto WDI IHV.
Abaixo está o fluxo típico do processo DriverEntry para o driver de miniporto WDI IHV
Para obter mais informações sobre DriverEntry, consulte DriverEntry of NDIS Miniport Drivers.
MiniportSetOptions
Conforme mostrado no diagrama de DriverEntry acima, se o miniporto WDI IHV tiver registrado o manipulador MiniportSetOptions , o sistema operacional chamará essa função no contexto do driver de miniporto chamando NdisMRegisterWdiMiniportDriver.
Se o driver de miniporto IHV registrar qualquer manipulador de opção usando NdisSetOptionalHandlers, esses manipuladores poderão não ser serializados por meio da camada WDI pelo componente da Microsoft. Portanto, o componente IHV é responsável por lidar com todos os requisitos de sincronização para esses manipuladores.
MiniportInitializeEx
O modelo WDI divide o comportamento MiniportInitializeEx em várias chamadas de interface WDI.
Call MiniportWdiAllocateAdapter.
Quando o sistema operacional encontra uma instância do hardware IHV, essa é a primeira chamada para o driver de miniporto WDI IHV. Nesta chamada, o miniporto WDI executa as ações necessárias para criar uma representação de software (MiniportAdapterContext) do dispositivo. Ele também determina informações sobre o dispositivo para preencher a estrutura NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES. A inicialização real do dispositivo e da pilha de Wi-Fi é feita posteriormente quando o componente da Microsoft envia comandos WDI para executar inicializações específicas.
Usando dados obtidos do driver de miniporto WDI IHV, o componente da Microsoft chama NdisMSetMiniportAttributes e define o NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES no NDIS. A maioria dos campos de NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES são preenchidos com padrões pelo componente da Microsoft. O driver IHV deve preencher os campos MiniportAdapterContext e InterfaceType .
Depois que essa chamada retorna do driver de miniporto IHV, ela começa a receber comandos WDI por meio de seu manipulador MiniportOidRequest . Durante essa chamada, o componente da Microsoft pode não ser capaz de executar operações de redefinição/recuperação, portanto, qualquer atividade executada aqui deve ser rápida e confiável.
Call MiniportWdiOpenAdapter.
Depois de MiniportWdiAllocateAdapter, o componente da Microsoft chama MiniportWdiOpenAdapter para carregar o firmware e inicializar o hardware.
Vários comandos WDI usando MiniportOidRequest.
Após MiniportWdiOpenAdapter, o componente da Microsoft envia as seguintes tarefas/propriedades/chamadas para o miniporto IHV.
- Chame MiniportWdiTalTxRxInitialize para inicializar o caminho de dados e os manipuladores de troca.
- Chame OID_WDI_GET_ADAPTER_CAPABILITIES para obter os recursos do adaptador.
- Chame OID_WDI_SET_ADAPTER_CONFIGURATION para configurar o adaptador.
- Chame OID_WDI_TASK_SET_RADIO_STATE para definir o estado de rádio inicial se ele ainda não estiver no estado esperado.
- Chame MiniportWdiTalTxRxStart para configurar o caminho de dados.
- Chame OID_WDI_TASK_CREATE_PORT para criar a porta inicial.
Outros comandos também podem ser enviados para o componente IHV como parte do processamento do MiniportInitializeEx do Componente Microsoft. No entanto, até MiniportWdiStartOperation ser chamado, o componente da Microsoft não enviará nenhuma tarefa que precise de comunicação over-the-air. Exceto por OID_WDI_TASK_OPEN sempre sendo enviados primeiro, a ordem dos outros comandos/chamadas pode ser alterada.
Usando dados obtidos do driver de miniporto WDI IHV, o componente da Microsoft chama NdisMSetMiniportAttributes e define NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES e NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES no NDIS.
Call MiniportWdiStartOperation.
Esse é um manipulador de miniporto WDI opcional dentro NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS que o driver IHV pode usar para executar quaisquer tarefas adicionais do MiniportInitializeEx. Ele também pode ser utilizado pelo miniporto IHV como um indicativo de que o componente da Microsoft concluiu a inicialização do miniporto e o miniporto pode iniciar as atividades necessárias em segundo plano.
O diagrama abaixo mostra o fluxo de MiniportInitializeEx.
Se uma operação intermediária falhar, o componente da Microsoft desfaz as operações anteriores e falha na ativação do miniporto. Por exemplo, se OID_WDI_TASK_CREATE_PORT falhar, o caminho de dados será limpo, OID_WDI_TASK_CLOSE será enviado e o miniporto falhará.
MiniportHaltEx
Em um miniporto nativo Wi-Fi, MiniportHaltEx é usado para instruir o miniporto a interromper as operações e limpar a instância do adaptador. No modelo WDI, o componente da Microsoft manipula a chamada miniportHaltEx original e a divide em várias chamadas de interface WDI.
Call MiniportWdiStopOperation.
Esse é um manipulador de miniporto WDI opcional dentro NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS que o driver IHV pode usar para desfazer as operações executadas em MiniportWdiStartOperation.
Vários comandos WDI usando MiniportOidRequest.
Após MiniportWdiStopOperation, o componente Microsoft envia tarefas/propriedades ao miniport IHV para limpar o estado atual do driver IHV. Essa limpeza pode incluir o seguinte.
- Chame OID_WDI_TASK_DISCONNECT/OID_WDI_TASK_STOP_AP para derrubar todas as conexões existentes.
- Chame OID_WDI_TASK_DELETE_PORT para excluir todas as portas criadas.
- Chame MiniportWdiTalTxRxStop para interromper o caminho de dados.
- Chame MiniportWdiTalTxRxDeinitialize para desinitializar o caminho de dados.
- Chame para limpar o estado do hardware. Isso é enviado para o IHV usando o MiniportWdiCloseAdapter que foi registrado pelo driver IHV.
Depois que todos os comandos acima forem chamados, o componente da Microsoft chamará MiniportWdiFreeAdapter para que o driver IHV exclua qualquer estado de software que possa ter.
O diagrama abaixo mostra o fluxo de MiniportHaltEx.
O processamento MiniportHaltEx não será executado se o dispositivo for removido de surpresa ou se o sistema estiver sendo desligado. Para a remoção surpresa, consulte o comportamento do manipulador MiniportDevicePnPEventNotify. Para o desligamento do sistema, consulte o comportamento do manipulador MiniportShutdownEx .
MiniportDriverUnload
MiniportDriverUnload é o manipulador que é chamado antes do miniporto WDI IHV ser descarregado. O driver de miniporto WDI IHV chama o componente da Microsoft para se desregistrar. O componente da Microsoft chama NdisMDeregisterMiniportDriver.
O diagrama abaixo mostra o fluxo de MiniportDriverUnload.
MiniportPause
Os requisitos do NDIS MiniportPause são tratados pelo componente da Microsoft. Como parte do MiniportPause, o componente da Microsoft interrompe o caminho de dados e aguarda que ele seja limpo. Opcionalmente, o miniporto IHV do WDI pode registrar-se para um callback MiniportWdiPostAdapterPause, que é acionado pelo componente Microsoft após concluir a limpeza do caminho de dados.
O diagrama abaixo mostra o fluxo de MiniportPause.
MiniportRestart
Os requisitos do NDIS MiniportRestart são tratados pelo componente da Microsoft. Como parte do MiniportRestart, o componente da Microsoft desfaz o trabalho de pausa do caminho de dados executado como parte do MiniportPause. Opcionalmente, o miniporto IHV do WDI pode se registrar para um retorno de chamada MiniportWdiPostAdapterRestart chamado pelo componente da Microsoft depois que ele terminar de reiniciar o caminho de dados.
O diagrama abaixo mostra o fluxo de MiniportRestart.
MiniportResetEx
MiniportResetEx não é tratado pelo componente da Microsoft. Opcionalmente, o miniporto IHV do WDI pode registrar-se para um callback MiniportResetEx que é chamado pelo componente da Microsoft.
MiniportDevicePnPEventNotify
MiniportDevicePnPEventNotify é usado para notificar um driver NDIS de eventos PNP, como a remoção surpresa de um dispositivo. Quando o NDIS envia essa notificação, ele é encaminhado pela primeira vez para o miniporto WDI IHV para processamento. Depois que o componente IHV terminar de processá-lo, o componente da Microsoft executará o processamento apropriado para esse evento. A chamada encaminhada para o componente IHV não é serializada com outras tarefas e retornos de chamada.
O diagrama abaixo mostra o fluxo de MiniportDevicePnPEventNotify.
MiniportShutdownEx
MiniportShutdownEx é usado para notificar um driver NDIS sobre eventos de desligamento do sistema. Quando o NDIS envia essa notificação, ela é manipulada pela primeira vez pelo componente da Microsoft. Depois que o componente da Microsoft terminar de processá-lo, ele passa o evento para o miniporto WDI IHV para processamento.
O diagrama abaixo mostra o fluxo de MiniportShutdownEx.
MiniportOidRequest
O manipulador MiniportOidRequest é um manipulador necessário que o miniporto WDI IHV deve implementar. Ele é usado pelo componente da Microsoft para enviar comandos WDI para o miniporto IHV. Ele também é usado para encaminhar OIDs que não são gerenciados pelo componente Microsoft para o miniporto IHV.
A chamada MiniportOidRequest para o miniporto WDI IHV deve ser considerada como a mensagem M1 para um comando WDI. A conclusão do OID (por meio de NdisMOidRequestComplete ou por meio de um retorno não PENDENTE de MiniportOidRequest) deve ser considerada como a mensagem M3 para uma tarefa/comando WDI.
Para cada comando WDI, há dois campos potenciais em que um código NDIS_STATUS pode ser retornado para a operação: o código de status da chamada MiniportOidRequest (ou NdisMOidRequestComplete) e o código de status no campo WDI_MESSAGE_HEADER (na conclusão do OID ou por meio de NdisMIndicateStatusEx). O componente da Microsoft sempre verifica o NDIS_STATUS da conclusão do OID antes de examinar o campo WDI_MESSAGE_HEADERStatus. As expectativas do componente IHV para o processamento de OID WDI são as seguintes.
- Os OIDs do WDI são enviados para o componente IHV usando um NDIS_OID_REQUESTRequestType de NdisRequestMethod, e a mensagem e o comprimento da mensagem correspondentes estão nos campos DATA.METHOD_INFORMATION.InformationBuffer e DATA.METHOD_INFORMATION.InputBufferLength, respectivamente.
- O componente IHV relatará um erro na conclusão do OID se houver um erro durante o processamento do comando e definirá o campo Status do WDI_MESSAGE_HEADER como sem êxito se ele tiver uma falha no nível Wi-Fi.
- Para tarefas e propriedades, o número da porta da solicitação está no campo WDI_MESSAGE_HEADERPortId. O PortNumber no NDIS_OID_REQUEST é sempre definido como 0.
- Para a conclusão do OID, é aceitável que o MiniportOidRequest retorne NDIS_STATUS_PENDING e conclua o OID posteriormente (de forma síncrona ou assíncrona) com NdisMOidRequestComplete.
- Se o componente IHV concluir a OID com NDIS_STATUS_SUCCESS, ele deverá preencher o campo BytesWritten da solicitação OID com o número apropriado de bytes, incluindo espaço para o WDI_MESSAGE_HEADER.
- Se o componente IHV não tiver espaço suficiente no campo DATA.METHOD_INFORMATION.OutputBufferLength para preencher a resposta, ele conclui o OID com NDIS_STATUS_BUFFER_TOO_SHORT e preenche o campo DATA.METHOD_INFORMATION.BytesNeeded. O componente da Microsoft pode tentar alocar um buffer do tamanho solicitado e enviar uma nova solicitação para o IHV.
- Se for uma tarefa, o M4 da tarefa (NdisMIndicateStatusEx) só deverá ser indicado se a tarefa tiver sido relatada como iniciada com êxito-- a conclusão do OID é bem-sucedida e o Status no WDI_MESSAGE_HEADER na conclusão do OID foi bem-sucedido.
O diagrama a seguir mostra um exemplo de uma solicitação OID do NDIS que é mapeada para um único comando WDI. Quando a solicitação OID é enviada pelo sistema operacional, o componente da Microsoft a converte em uma solicitação OID do WDI e envia a solicitação OID do WDI para o miniporto IHV. Quando o miniporto IHV conclui o OID, o componente da Microsoft conclui adequadamente a solicitação OID original.
Se o OriginalOidRequest for mapeado para vários WDI OidRequests e uma das solicitações WDI falhar, o OriginalOidRequest também falhará. Se um subconjunto das operações intermediárias já tiver sido concluído, o componente da Microsoft tentará desfazer as operações que dão suporte à limpeza.
O diagrama abaixo mostra um exemplo de uma solicitação OID do NDIS que é tratada e concluída pelo componente da Microsoft. Quando a solicitação OID é enviada pelo sistema operacional, o componente da Microsoft processa e conclui a OID. Este OID não é passado para o miniporto WDI IHV.
Os OIDs que não são compreendidos pelo componente da Microsoft são encaminhados diretamente para o componente IHV para processamento.
O comportamento de MiniportOidRequest é inalterado para o driver de miniporto WDI IHV (em comparação com um miniporto de Wi-Fi nativo). As chamadas são serializadas e o miniporto IHV pode completá-lo de forma síncrona ou assíncrona com uma chamada para NdisMOidRequestComplete.
MiniportCancelOidRequest
Este é um manipulador opcional usado por um miniporto IHV WDI que necessita lidar com OIDs que não são mapeados para mensagens WDI. Esse manipulador não é usado para os OIDs do WDI. Os OIDs do WDI devem ser concluídos rapidamente, e não há necessidade de o driver de miniporto do IHV tentar cancelar um OID pendente. O cancelamento de tarefas WDI é tratado usando a solicitação apropriada de OID para cancelamento de tarefa. Para OIDs não mapeados, o comportamento esperado é definido pelo NDIS.
NdisMIndicateStatusEx
NdisMIndicateStatusEx é usado pelo miniporto WDI IHV para enviar indicações ao componente da Microsoft. As indicações podem ser indicações não solicitadas, como falhas de MIC TKIP ou indicações solicitadas para a conclusão (M4) de uma tarefa.
O diagrama abaixo mostra um exemplo de uma indicação WDI, que tem uma correspondente indicação NDIS/Native Wi-Fi. Quando a indicação é enviada pelo miniporto IHV para o componente da Microsoft, o componente da Microsoft converte-o em uma indicação existente e encaminha-o para o sistema operacional.
O diagrama abaixo mostra um exemplo de uma indicação WDI que não tem nenhuma indicação correspondente de NDIS/Native Wi-Fi. Isso é tratado pelo componente da Microsoft.
O diagrama a seguir mostra uma indicação que não é reconhecida pelo componente da Microsoft. A indicação é encaminhada as-is para o sistema operacional.
O comportamento de NdisMIndicateStatusEx é inalterado para o driver de miniporto WDI IHV (em comparação com um miniporto Nativo Wi-Fi).
MiniportDirectOidRequest
Esse é um manipulador opcional que é registrado por um driver de miniporto WDI IHV se precisar lidar com OIDs Diretos que não são mapeados para mensagens WDI. Todos os OIDs Diretos existentes para Wi-Fi Direct são mapeados para mensagens WDI, portanto, esse manipulador não é necessário para dar suporte a essa funcionalidade. Os OIDs Diretos sem suporte não são serializados pelo componente da Microsoft.
MiniportCancelDirectOidRequest
Este é um gerenciador opcional usado por um miniporto WDI IHV que precisa lidar com OIDs Diretos que não são associados a mensagens WDI. Para OIDs não mapeados, o comportamento esperado é definido pelo NDIS.
MiniportSendNetBufferLists
Esse manipulador não é usado em um driver de miniporto WDI IHV e não deve ser fornecido. O componente da Microsoft usa os manipuladores de trajetória de dados registrados através de NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS para encaminhar pacotes de envio para o miniporto IHV.
MiniportCancelSend
Esse manipulador não é usado em um driver de miniporto WDI IHV e não deve ser fornecido.
MiniportReturnNetBufferLists
Esse manipulador não é usado em um driver WDI IHV Miniport e não deve ser fornecido. O componente da Microsoft usa os manipuladores de caminho de dados registrados através de NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS para retornar pacotes recebidos ao miniporto IHV.
Manipulador WDI: MiniportWdiOpenAdapter
O manipulador MiniportWdiOpenAdapter é usado pelo componente da Microsoft para iniciar a operação Tarefa Aberta no driver IHV. Essa chamada deve ser concluída rapidamente e, se a operação aberta tiver sido iniciada com êxito, o IHV deverá retornar NDIS_STATUS_SUCCESS nesta chamada e chamar o manipulador OpenAdapterComplete que é passado para o parâmetro NDIS_WDI_INIT_PARAMETERS de MiniportWdiAllocateAdapter.
Manipulador WDI: MiniportWdiCloseAdapter
O manipulador MiniportWdiCloseAdapter é usado pelo componente da Microsoft para iniciar a operação Fechar Tarefa no driver IHV. Essa chamada deve ser concluída rapidamente e, se a operação aberta tiver sido iniciada com êxito, o IHV deverá retornar NDIS_STATUS_SUCCESS nesta chamada e chamar o manipulador CloseAdapterComplete que é passado para o parâmetro NDIS_WDI_INIT_PARAMETERS do MiniportWdiAllocateAdapter.