Controlar eventos PnP y eventos de administración de energía en un controlador de protocolo
Cuando el sistema operativo emite un paquete de solicitud de E/S (PnP) Plug and Play (IRP) o un IRP de administración de energía a un objeto de dispositivo de destino que representa una tarjeta de interfaz de red (NIC), NDIS intercepta el IRP. NDIS indica el evento para cada controlador de protocolo enlazado y cada controlador intermedio enlazado llamando a la función ProtocolNetPnPEvent del controlador. En la llamada a ProtocolNetPnPEvent, NDIS pasa un puntero a un NET_PNP_EVENT_NOTIFICATION que contiene una estructura de NET_PNP_EVENT. La estructura NET_PNP_EVENT describe el evento PnP o el evento de administración de energía que se indica. Para obtener más información sobre la interfaz PnP del controlador de protocolo, consulte Control de notificaciones de eventos PnP en un controlador de protocolo.
La lista siguiente contiene eventos PnP y de administración de energía, como se indica en el código NetEvent de la estructura NET_PNP_EVENT:
NetEventSetPower
Indica una solicitud Establecer energía, que especifica que el adaptador de minipuerto debe pasar a un estado de alimentación determinado. Un controlador de protocolo compatible con la administración de energía siempre debe tener éxito este evento devolviendo NDIS_STATUS_SUCCESS. Un controlador de protocolo antiguo puede devolver NDIS_STATUS_NOT_SUPPORTED para indicar que NDIS debe desenlacerlo desde el adaptador de minipuerto.
Después de emitir la solicitud de alimentación establecida, NDIS pausa la pila del controlador si el adaptador de minipuerto pasa a un estado de bajo consumo. NDIS reinicia la pila de controladores antes de la solicitud set-power si el adaptador de minipuerto pasa al estado de trabajo (D0). Para obtener más información sobre cómo pausar y reiniciar la pila de controladores, consulte Pausar una pila de controladores.
Si el adaptador de minipuerto está en un estado de bajo consumo, el controlador de protocolo no puede emitir ninguna solicitud de OID. Este requisito es una restricción adicional de administración de energía que se agrega a las demás restricciones que se aplican cuando la pila de controladores está en estado Pausado.
Si el adaptador de minipuerto subyacente no tiene en cuenta la administración de energía, el controlador de minipuerto establece el miembro PowerManagementCapabilities de NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES en NULL y NDIS establece el miembro PowerManagementCapabilities de NDIS_BIND_PARAMETERS en NULL.
Nota A partir de NDIS 6.30, después de recibir una notificación de este evento, el controlador de protocolo debe dejar de generar nuevas solicitudes de E/S y no debe esperar a que se completen las solicitudes de E/S pendientes en el contexto de la llamada a ProtocolNetPnPEvent.
Para obtener más información sobre los eventos de configuración de energía, vea Controlar eventos PnP y eventos de administración de energía en un controlador intermedio.
NetEventQueryPower
Indica una solicitud de power de consulta, que consulta si el adaptador de minipuerto subyacente puede realizar una transición a un estado de alimentación determinado. Un controlador de protocolo siempre debe tener éxito en NetEventQueryPower . Después de establecer una conexión activa, un controlador de protocolo puede llamar a PoRegisterSystemState para registrar un estado ocupado continuo. Siempre que el registro de estado esté en vigor, el administrador de energía no intenta poner el sistema en suspensión. Una vez inactiva la conexión, el controlador de protocolo cancela el registro de estado mediante una llamada a PoUnregisterSystemState. Un controlador de protocolo nunca debe intentar evitar que el sistema realice la transición al estado de suspensión mediante un error de NetEventQueryRemoveDevice. Tenga en cuenta que NetEventQueryPower siempre va seguido de NetEventSetPower. Un NetEventSetPower que establece el estado de energía actual del dispositivo en vigor cancela NetEventQueryPower.
Nota A partir de NDIS 6.30, después de recibir una notificación de este evento, el controlador de protocolo no debe esperar a que se completen las solicitudes de E/S pendientes en el contexto de la llamada a ProtocolNetPnPEvent.
NetEventQueryRemoveDevice
Indica una solicitud de eliminación de dispositivo de consulta, que consulta si la NIC se puede quitar sin interrumpir las operaciones. Si un controlador de protocolo no puede liberar un dispositivo (por ejemplo, porque el dispositivo está en uso), debe producir un error en un netEventQueryRemoveDevice devolviendo NDIS_STATUS_FAILURE.
NetEventCancelRemoveDevice
Indica una solicitud Cancelar quitar dispositivo, que cancela la eliminación de una NIC subyacente. El controlador de protocolo siempre debe realizar correctamente este evento devolviendo NDIS_STATUS_SUCCESS.
NetEventReconfigure
Indica que la configuración ha cambiado para un componente de red. Por ejemplo, si un usuario cambia la dirección IP de TCP/IP, NDIS indica este evento en el protocolo TCP/IP con el código NetEventReconfigure . El controlador de protocolo puede, en raras circunstancias, devolver un código de error si no puede aplicar los cambios de configuración indicados y no hay valores predeterminados disponibles. Un intento erróneo de asignar memoria es un ejemplo de un caso en el que el protocolo devuelve un código de error. Devolver un código de error puede provocar que el usuario reinicie el sistema.
Un protocolo debe validar los datos relacionados con NetEventReconfigure pasados a su función ProtocolNetPnPEvent . Para obtener más información sobre estos datos, consulte NET_PNP_EVENT para controladores de protocolo.
NetEventBindList
Indica a un controlador de protocolo que se ha reconfigurado el orden de procesamiento de la lista de enlaces. Esta lista indica un orden relativo que se va a aplicar a los enlaces del protocolo al procesar, por ejemplo, una solicitud de usuario que podría enrutarse a uno de varios enlaces. El búfer pasado con este evento contiene una lista de nombres de dispositivo con formato de cadenas Unicode terminadas en NULL. El formato de cada nombre de dispositivo es idéntico al parámetro DeviceName que se pasa a una llamada a ProtocolBindAdapterEx.
Un protocolo debe validar los datos relacionados con NetEventBindList pasados a su función ProtocolNetPnPEvent . Para obtener más información sobre estos datos, consulte NET_PNP_EVENT para controladores de protocolo.
Un protocolo debe validar los datos relacionados con NetEventBindList pasados a su función ProtocolNetPnPEvent . Para obtener más información sobre estos datos, consulte NET_PNP_EVENT para controladores de protocolo.
NetEventBindsComplete
Indica que un controlador de protocolo se ha enlazado a todas las NIC a las que se puede enlazar. NDIS no indicará más enlaces al controlador de protocolo a menos que, por ejemplo, una NIC PnP esté conectada al sistema.
NetEventPnPCapabilities
Indica que el usuario ha habilitado o deshabilitado las funcionalidades de reactivación del adaptador subyacente. (El parámetro ProtocolBindingContext que NDIS pasa a ProtocolNetPnPEvent especifica el enlace).
NetEventPause
Indica que el enlace de protocolo especificado debe entrar en el estadoPausing. El enlace entrará en el estado Pausado después de que NDIS haya completado todas las solicitudes de envío pendientes para el enlace. Para obtener más información sobre cómo pausar un enlace, consulte Pausar un enlace.
NetEventRestart
Indica que el enlace de protocolo especificado ha entrado en el estado Reinicio. Después de que el controlador de protocolo esté listo para reanudar las operaciones de envío y recepción del enlace, el enlace entra en estado En ejecución. Para obtener más información sobre cómo reiniciar un enlace, vea Reiniciar un enlace.
NetEventPortActivation
Indica la activación de una lista de puertos asociados al enlace especificado. Para obtener más información sobre cómo pausar un enlace, consulte Control del evento PnP de activación de puerto.
NetEventPortDeactivation
Indica la desactivación de una lista de puertos asociados al enlace especificado. Para obtener más información sobre cómo pausar un enlace, consulte Control del evento PnP de desactivación de puertos.
NetEventIMReEnableDevice
Indica que la configuración ha cambiado para un miniporte virtual de un controlador intermedio NDIS 6.0 o posterior. NetEventIMReEnableDevice es similar al evento NetEventReconfigure , salvo que el controlador intermedio recibe este evento para un único miniport virtual y el evento NetEventReconfigure se aplica a todos los miniportes virtuales del controlador intermedio. Por ejemplo, un controlador intermedio recibe el evento NetEventIMReEnableDevice cuando un usuario deshabilita y, a continuación, habilita un único miniport virtual desde el Administrador de dispositivos u otro origen. Para obtener ejemplos de administración intermedia de energía del controlador, consulte el ejemplo de controlador intermedio NDIS MUX y Notificar controlador de objeto disponible en el repositorio de ejemplos de controladores de Windows en GitHub.
El miembro Buffer de la estructura NET_PNP_EVENT apunta a un búfer que contiene información específica del evento que se indica.
Un controlador de protocolo puede completar la llamada a ProtocolNetPnPEvent de forma asincrónica con NdisCompleteNetPnPEvent.