Interfaces del controlador IHV WDI
El miniporte IHV WDI es como cualquier otro controlador de miniporte NDIS y seguiría las prácticas de desarrollo y la documentación de cualquier miniporte NDIS. Las responsabilidades de los controladores NDIS de un controlador WLAN Miniport nativo se dividen entre el componente MS y el controlador IHV WDI. El componente WLAN de Microsoft se encarga de los requisitos de NDIS que son aplicables a todos los minipuertos Wi-Fi para que cada IHV no tenga que rehacer todo ese trabajo. A continuación se describe la asignación de cambios de comportamiento y para los controladores NDIS para el miniporte IHV wlan nativo cuando se aplica a un miniporte IHV WDI.
- Instalación del controlador
- DriverEntry
- MiniportSetOptions
- MiniportInitializeEx
- MiniportHaltEx
- MiniportDriverUnload
- MiniportPause
- MiniportRestart
- MiniportResetEx
- MiniportDevicePnPEventNotify
- MiniportShutdownEx
- MiniportOidRequest
- MiniportCancelOidRequest
- NdisMIndicateStatusEx
- MiniportDirectOidRequest
- MiniportCancelDirectOidRequest
- MiniportSendNetBufferLists
- MiniportCancelSend
- MiniportReturnNetBufferLists
- Controlador WDI: MiniportWdiOpenAdapter
- Controlador WDI: MiniportWdiCloseAdapter
No hay ningún cambio en la forma en que se carga e instala el controlador de miniportE WDI IHV en el sistema. El proceso inf e instalación es similar al de un controlador miniport de IHV Native WLAN. Al igual que los controladores NDIS existentes, cuando el controlador IHV debe cargarse para trabajar con el adaptador WLAN de IHV, el sistema operativo llama a la rutina DriverEntry del controlador de miniport de IHV.
El sistema operativo llama directamente a la rutina DriverEntry del controlador de miniporte IHV WDI. El miniporte IHV sigue la mayoría de las directrices de la rutina DriverEntry de un miniporte NDIS normal. La única excepción es que, en lugar de llamar a NdisMRegisterMiniportDriver, el miniport IHV llama a NdisMRegisterWdiMiniportDriver para indicar al sistema operativo que habilite el componente WLAN de Microsoft.
A continuación se muestran los parámetros clave de NdisMRegisterWdiMiniportDriver.
- NDIS_MINIPORT_DRIVER_CHARACTERISTICS: esta es la estructura NDIS original que usa un miniporte de Wi-Fi nativo para REGISTRARSE con NDIS. Para un modelo WDI, la mayoría de los parámetros de controlador son opcionales. Los únicos controladores necesarios son MINIPORT_OID_REQUEST_HANDLER y MINIPORT_DRIVER_UNLOAD. MINIPORT_OID_REQUEST_HANDLER se usa para pasar mensajes WDI al controlador IHV. Si se especifica cualquier otro controlador, el componente WLAN de Microsoft generalmente llama al controlador después de que haya realizado su propio procesamiento para el controlador.
- NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS: este es el nuevo conjunto de controladores que debe implementar un controlador de miniporte WDI. El controlador IHV lo usa para registrar controladores adicionales para la ruta de acceso de control y el conjunto completo de controladores para la ruta de acceso de datos.
Cuando el miniporte IHV llama a NdisMRegisterWdiMiniportDriver, el componente WLAN de Microsoft actualiza los controladores de NDIS_MINIPORT_DRIVER_CHARACTERISTICS y llama al NdisMRegisterMiniportDriver de NDIS. Las actualizaciones se realizan para que el componente WLAN de Microsoft pueda interceptar los controladores para los que puede proporcionar asistencia o simplificación al controlador de minipuerto WDI IHV.
A continuación se muestra el flujo típico del proceso DriverEntry para el controlador de minipuerto de IHV WDI.
Para obtener más información sobre DriverEntry, vea DriverEntry of NDIS Miniport Drivers.
Como se muestra en el diagrama de DriverEntry anterior, si la miniporte IHV WDI ha registrado el controlador MiniportSetOptions , el sistema operativo llama a esa función en el contexto del controlador de miniport que llama a NdisMRegisterWdiMiniportDriver.
Si el controlador de miniporte IHV registra cualquier controlador de opciones mediante NdisSetOptionalHandlers, es posible que esos controladores no se serialicen a través de la capa WDI por el componente de Microsoft. Por lo tanto, el componente IHV es responsable de controlar los requisitos de sincronización de esos controladores.
El modelo WDI divide el comportamiento de MiniportInitializeEx en varias llamadas de interfaz WDI.
Llame a MiniportWdiAllocateAdapter.
Cuando el sistema operativo encuentra una instancia del hardware IHV, esta es la primera llamada al controlador de miniportE WDI IHV. En esta llamada, el miniporte WDI realiza las acciones necesarias para crear una representación de software (MiniportAdapterContext) del dispositivo. También determina información sobre el dispositivo para rellenar la estructura de NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES . La inicialización real del dispositivo y la pila de Wi-Fi se realiza más adelante cuando el componente de Microsoft envía comandos WDI para realizar inicializaciones específicas.
Con los datos obtenidos del controlador de miniporte de IHV WDI, el componente de Microsoft llama a NdisMSetMiniportAttributes y establece el NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES en NDIS. La mayoría de los campos de NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES se rellenan con los valores predeterminados por el componente de Microsoft. El controlador IHV debe rellenar los campos MiniportAdapterContext e InterfaceType .
Una vez que esta llamada vuelve desde el controlador de miniporte IHV, comienza a recibir comandos WDI a través de su controlador MiniportOidRequest . Durante esta llamada, es posible que el componente de Microsoft no pueda realizar operaciones de restablecimiento o recuperación, por lo que cualquier actividad realizada aquí debe ser rápida y confiable.
Llame a MiniportWdiOpenAdapter.
Después de MiniportWdiAllocateAdapter, el componente de Microsoft llama a MiniportWdiOpenAdapter para cargar el firmware e inicializar el hardware.
Varios comandos WDI mediante MiniportOidRequest.
Después de MiniportWdiOpenAdapter, el componente de Microsoft envía las siguientes tareas, propiedades o llamadas al miniporte IHV.
- Llame a MiniportWdiTalTxRxInitialize para inicializar la ruta de acceso de datos y los controladores de intercambio.
- Llame a OID_WDI_GET_ADAPTER_CAPABILITIES para obtener las funcionalidades del adaptador.
- Llame a OID_WDI_SET_ADAPTER_CONFIGURATION para configurar el adaptador.
- Llame a OID_WDI_TASK_SET_RADIO_STATE para establecer el estado de radio inicial si aún no está en el estado esperado.
- Llame a MiniportWdiTalTxRxStart para configurar la ruta de acceso de datos.
- Llame a OID_WDI_TASK_CREATE_PORT para crear el puerto inicial.
Otros comandos también se pueden enviar al componente IHV como parte del procesamiento MiniportInitializeEx del componente de Microsoft. Sin embargo, hasta que se llame a MiniportWdiStartOperation , el componente de Microsoft no envía ninguna tarea que necesite comunicación inalámbrica. A excepción de OID_WDI_TASK_OPEN siempre se envía primero, el orden de los demás comandos o llamadas puede cambiar.
Con los datos obtenidos del controlador de miniporte de IHV WDI, el componente de Microsoft llama a NdisMSetMiniportAttributes y establece NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES y NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES en NDIS.
Llame a MiniportWdiStartOperation.
Se trata de un controlador de miniport WDI opcional dentro de NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS que el controlador IHV puede usar para realizar cualquier tarea adicional de MiniportInitializeEx. También puede ser utilizado por el miniporte IHV como una sugerencia de que el componente de Microsoft ha terminado de inicializar el miniporte y el miniporte puede iniciar cualquier actividad en segundo plano necesaria.
En el diagrama siguiente se muestra el flujo de MiniportInitializeEx.
Si se produce un error en una operación intermedia, el componente de Microsoft deshace las operaciones anteriores y produce un error en el miniporte. Por ejemplo, si se produce un error en OID_WDI_TASK_CREATE_PORT , se limpia la ruta de acceso de datos, se envía OID_WDI_TASK_CLOSE y se produce un error en la minipuerto.
En un miniporte de native Wi-Fi, miniportHaltEx se usa para indicar al miniporte que detenga las operaciones y limpie la instancia del adaptador. En el modelo WDI, el componente de Microsoft controla la llamada original a MiniportHaltEx y la divide en varias llamadas de interfaz WDI.
Llame a MiniportWdiStopOperation.
Se trata de un controlador de minipuerto WDI opcional dentro de NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS que el controlador IHV puede usar para deshacer las operaciones que realizó en MiniportWdiStartOperation.
Varios comandos WDI mediante MiniportOidRequest.
Después de MiniportWdiStopOperation, el componente de Microsoft envía tareas o propiedades al miniporte IHV para limpiar el estado actual del controlador IHV. Esta limpieza puede incluir lo siguiente.
- Llame a OID_WDI_TASK_DISCONNECT/OID_WDI_TASK_STOP_AP para anular las conexiones existentes.
- Llame a OID_WDI_TASK_DELETE_PORT para eliminar todos los puertos creados.
- Llame a MiniportWdiTalTxRxStop para detener la ruta de acceso de datos.
- Llame a MiniportWdiTalTxRxDeinitialize para inicializar la ruta de acceso de datos.
- Llame a para limpiar el estado del hardware. Esto se envía al IHV mediante el MiniportWdiCloseAdapter registrado por el controlador IHV.
Una vez que se llama a todos los comandos anteriores, el componente de Microsoft llama a MiniportWdiFreeAdapter para que el controlador IHV elimine cualquier estado de software que pueda tener.
En el diagrama siguiente se muestra el flujo de MiniportHaltEx.
El procesamiento de MiniportHaltEx no se realiza si el dispositivo es sorpresa quitado o si el sistema se está apagando. Para la eliminación sorpresa, consulte el comportamiento del controlador MiniportDevicePnPEventNotify . Para el apagado del sistema, consulte el comportamiento del controlador MiniportShutdownEx .
MiniportDriverUnload es el controlador al que se llama antes de que se descargue la miniporte IHV de WDI. El controlador de minipuerto de IHV WDI llama al componente de Microsoft para anular el registro. El componente de Microsoft llama a NdisMDeregisterMiniportDriver.
En el diagrama siguiente se muestra el flujo de MiniportDriverUnload.
El componente de Microsoft controla los requisitos de MiniportPause de NDIS. Como parte de MiniportPause, el componente de Microsoft detiene la ruta de acceso de datos y espera a que se limpie. La miniporte IHV de WDI puede registrarse opcionalmente para una devolución de llamada MiniportWdiPostAdapterPause a la que llama el componente de Microsoft después de finalizar la limpieza de la ruta de acceso de datos.
En el diagrama siguiente se muestra el flujo de MiniportPause.
El componente de Microsoft controla los requisitos de MiniportRestart de NDIS. Como parte de MiniportRestart, el componente de Microsoft deshace el trabajo de pausa de la ruta de acceso de datos que realizó como parte de MiniportPause. La miniporte IHV de WDI puede registrarse opcionalmente para una devolución de llamada MiniportWdiPostAdapterRestart a la que llama el componente de Microsoft después de que termine de reiniciar la ruta de acceso de datos.
En el diagrama siguiente se muestra el flujo de MiniportRestart.
El componente de Microsoft no controla MiniportResetEx. La miniporte IHV WDI puede registrarse opcionalmente para una devolución de llamada MiniportResetEx a la que llama el componente de Microsoft.
MiniportDevicePnPEventNotify se usa para notificar a un controlador NDIS eventos PNP, como la eliminación sorpresa de un dispositivo. Cuando NDIS envía esta notificación, primero se reenvía al miniporte de IHV de WDI para su procesamiento. Una vez que el componente IHV haya terminado de procesarlo, el componente de Microsoft realiza el procesamiento adecuado para este evento. La llamada que se reenvía al componente IHV no se serializa con otras tareas y devoluciones de llamada.
En el diagrama siguiente se muestra el flujo de MiniportDevicePnPEventNotify.
MiniportShutdownEx se usa para notificar a un controlador NDIS los eventos de apagado del sistema. Cuando NDIS envía esta notificación, primero se controla mediante el componente de Microsoft. Una vez que el componente de Microsoft termine de procesarlo, pasa el evento a la miniporte de IHV de WDI para su procesamiento.
En el diagrama siguiente se muestra el flujo de MiniportShutdownEx.
El controlador MiniportOidRequest es un controlador necesario que debe implementar el miniporte IHV de WDI. El componente de Microsoft lo usa para enviar comandos WDI al miniporte de IHV. También se usa para reenviar OID que el componente de Microsoft no controla el miniporte de IHV.
La llamada MiniportOidRequest al miniporte IHV de WDI debe considerarse como el mensaje M1 para un comando WDI. La finalización del OID (ya sea a través de NdisMOidRequestComplete o a través de una devolución no pendiente desde MiniportOidRequest) debe considerarse como el mensaje M3 para una tarea o comando WDI.
Para cada comando WDI, hay dos campos potenciales en los que se puede devolver un código de NDIS_STATUS para la operación: el código de estado de la llamada MiniportOidRequest (o NdisMOidRequestComplete) y el código de estado del campo WDI_MESSAGE_HEADER (ya sea en la finalización del OID o a través de NdisMIndicateStatusEx). El componente de Microsoft siempre examina el NDIS_STATUS de la finalización del OID antes de examinar el campo WDI_MESSAGE_HEADERStatus . Las expectativas del componente IHV para el procesamiento de OID de WDI son las siguientes.
- Los OID de WDI se envían al componente IHV mediante un NDIS_OID_REQUESTRequestType de NdisRequestMethod y la longitud del mensaje y el mensaje correspondientes están en data . METHOD_INFORMATION. InformationBuffer y DATA. METHOD_INFORMATION. Campos InputBufferLength respectivamente.
- El componente IHV notifica un error en la finalización del OID si hay un error al procesar el comando y establece el campo Estado del WDI_MESSAGE_HEADER en no correcto si tiene un error de nivel de Wi-Fi.
- En el caso de las tareas y propiedades, el número de puerto de la solicitud se encuentra en el campo WDI_MESSAGE_HEADERPortId . El valor de PortNumber del NDIS_OID_REQUEST siempre se establece en 0.
- Para completar el OID, es aceptable que MiniportOidRequest devuelva NDIS_STATUS_PENDING y complete el OID más adelante (sincrónica o asincrónicamente) con NdisMOidRequestComplete.
- Si el componente IHV completa el OID con NDIS_STATUS_SUCCESS, debe rellenar el campo BytesWritten de la solicitud OID con el número adecuado de bytes, incluido el espacio para el WDI_MESSAGE_HEADER.
- Si el componente IHV no tiene suficiente espacio en data . METHOD_INFORMATION. OutputBufferLength campo para rellenar la respuesta, completa el OID con NDIS_STATUS_BUFFER_TOO_SHORT y rellena los datos. METHOD_INFORMATION. Campo BytesNeeded . El componente de Microsoft puede intentar asignar un búfer del tamaño solicitado y enviar una nueva solicitud al IHV.
- Si es una tarea, la M4 de la tarea (NdisMIndicateStatusEx) solo debe indicarse si la tarea se informó como iniciada correctamente: la finalización del OID se realizó correctamente y el estado del WDI_MESSAGE_HEADER en la finalización del OID se realizó correctamente.
En el diagrama siguiente se muestra un ejemplo de una solicitud OID de NDIS que se asigna a un único comando WDI. Cuando el sistema operativo envía la solicitud OID, el componente de Microsoft lo convierte en una solicitud de OID WDI y envía la solicitud OID de WDI a la miniporte IHV. Cuando la miniporte IHV completa el OID, el componente de Microsoft completa correctamente la solicitud de OID original.
Si originalOidRequest se asigna a varios WDI OidRequests y se produce un error en una de las solicitudes WDI, también se produce un error en OriginalOidRequest. Si ya ha finalizado un subconjunto de las operaciones intermedias, el componente de Microsoft intenta deshacer las operaciones que admiten la limpieza.
En el diagrama siguiente se muestra un ejemplo de una solicitud OID de NDIS que el componente de Microsoft controla. Cuando el sistema operativo envía la solicitud OID, el componente de Microsoft procesa y completa el OID. Este OID no se pasa al miniporte IHV de WDI.
Los OID que el componente de Microsoft no entiende se reenvía directamente al componente IHV para su procesamiento.
El comportamiento de MiniportOidRequest no cambia para el controlador de minipuerto de IHV WDI (en comparación con un miniporte nativo de Wi-Fi). Las llamadas se serializan y la minipuerto IHV puede completarla de forma sincrónica o asincrónica con una llamada a NdisMOidRequestComplete.
Se trata de un controlador opcional que usa un miniporte IHV WDI que necesita controlar los OID que no están asignados a los mensajes WDI. Este controlador no se usa para los OID de WDI. Los OID de WDI deben completarse rápidamente y no es necesario que el controlador de miniporte IHV intente cancelar un OID pendiente. La cancelación de tareas WDI se controla mediante la solicitud de OID de tarea de cancelación adecuada. En el caso de los OID no asignados, el comportamiento esperado se define mediante NDIS.
NdisMIndicateStatusEx se usa en la miniporte IHV de WDI para enviar indicaciones al componente de Microsoft. Las indicaciones pueden ser indicaciones no solicitadas, como errores mic de TKIP, o indicaciones solicitadas para la finalización (M4) de una tarea.
En el diagrama siguiente se muestra un ejemplo de una indicación de WDI que tiene una indicación de Wi-Fi nativa o NDIS correspondiente. Cuando el miniporte IHV envía la indicación al componente de Microsoft, el componente de Microsoft lo convierte en una indicación existente y la reenvía al sistema operativo.
En el diagrama siguiente se muestra un ejemplo de una indicación de WDI que no tiene ninguna indicación de NDIS/Native Wi-Fi correspondiente. Esto se controla mediante el componente de Microsoft.
En el diagrama siguiente se muestra una indicación de que el componente de Microsoft no reconoce. La indicación se reenvía tal cual al sistema operativo.
El comportamiento de NdisMIndicateStatusEx no cambia para el controlador de minipuerto de IHV de WDI (en comparación con un miniporte de Wi-Fi nativo).
Se trata de un controlador opcional registrado por un controlador de miniporte de IHV WDI si necesita controlar los OID directos que no están asignados a los mensajes WDI. Todos los OID directos existentes para Wi-Fi Direct se asignan a los mensajes WDI, por lo que este controlador no es necesario para admitir esa funcionalidad. El componente de Microsoft no serializa los OID directos no admitidos.
Se trata de un controlador opcional que usa un miniporte IHV WDI que necesita controlar los OID directos que no están asignados a los mensajes WDI. En el caso de los OID no asignados, el comportamiento esperado se define mediante NDIS.
Este controlador no se usa en un controlador de minipuerto de IHV WDI y no debe proporcionarse. El componente de Microsoft usa los controladores de ruta de acceso de datos registrados a través de NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS para enviar paquetes al miniporte de IHV.
Este controlador no se usa en un controlador de minipuerto de IHV WDI y no debe proporcionarse.
Este controlador no se usa en un controlador IHV Miniport WDI y no debe proporcionarse. El componente de Microsoft usa los controladores de ruta de acceso de datos registrados a través de NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS para devolver paquetes recibidos a la miniporte IHV.
El componente de Microsoft usa el controlador MiniportWdiOpenAdapter para iniciar la operación Abrir tarea en el controlador IHV. Esta llamada debe completarse rápidamente y si la operación de apertura se ha iniciado correctamente, el IHV debe devolver NDIS_STATUS_SUCCESS en esta llamada y llamar al controlador OpenAdapterComplete que se pasa al parámetro NDIS_WDI_INIT_PARAMETERS de MiniportWdiAllocateAdapter.
El componente de Microsoft usa el controlador MiniportWdiCloseAdapter para iniciar la operación Cerrar tarea en el controlador IHV. Esta llamada debe completarse rápidamente y si la operación de apertura se ha iniciado correctamente, el IHV debe devolver NDIS_STATUS_SUCCESS en esta llamada y llamar al controlador CloseAdapterComplete que se pasa al parámetro NDIS_WDI_INIT_PARAMETERS del MiniportWdiAllocateAdapter.