Desactivación de un puerto NDIS
Para desactivar los puertos NDIS, un controlador de minipuerto envía un evento de desactivación de puertos Plug and Play (PnP) a NDIS. Después de que un controlador de minipuerto active correctamente un puerto, el controlador debe desactivar el puerto para que pueda liberar el puerto. Además, el controlador puede desactivar un puerto por motivos específicos de la aplicación. Un puerto se puede reactivar después de desactivarlo, pero no se puede reactivar un puerto si se libera.
Para enviar un evento PnP de desactivación de puertos, los controladores de minipuerto usan el código de evento PnP de NetEventPortDeactivation en la llamada a la función NdisMNetPnPEvent . Para desactivar los puertos, el controlador de minipuerto debe establecer los miembros de la estructura de NET_PNP_EVENT_NOTIFICATION en la que apunta el parámetro NetPnPEvent de NdisMNetPnPEvent de la siguiente manera:
Númerodepuerto
Puerto de origen de la notificación de eventos. Establezca este miembro en cero porque los números de puerto se proporcionan en el miembro Buffer de la estructura que especifica el miembro NetPnPEvent .
NetPnPEvent
Estructura NET_PNP_EVENT que describe el evento de desactivación de puertos. Establezca los miembros de esta estructura de la siguiente manera:
NetEvent
Código de evento que describe el evento. Establezca este miembro en NetEventPortDeactivation.
Búfer
Puntero a una matriz de elementos con tipo NDIS_PORT_NUMBER. La matriz contiene los números de puerto de todos los puertos que el controlador de miniporte está desactivando.
BufferLength
Número de bytes especificados en Buffer . Establezca BufferLength en el tamaño de la matriz a la que apunta buffer . Para obtener el número de elementos de la matriz, divida el valor en BufferLength por el tamaño del tipo de datos NDIS_PORT_NUMBER.
Otros miembros
Establezca los miembros restantes de NET_PNP_EVENT en NULL.
Un controlador de minipuerto puede proporcionar una matriz con una lista de puertos que se van a desactivar. Sin embargo, si el puerto predeterminado de un adaptador de minipuerto es el destino de un evento PnP NetEventPortDeactivation , el puerto predeterminado debe ser el único puerto especificado en la matriz.
Los controladores miniport pueden desactivar los puertos activos en cualquier momento. Sin embargo, antes de que un controlador de miniporte desactive un puerto, debe asegurarse de que no haya indicaciones de estado pendientes ni de recibir indicaciones asociadas a ese puerto. Una vez que el controlador de miniporte envía el evento PnP de desactivación de puertos, no debe iniciar ningún estado ni recibir indicaciones asociadas a los puertos desactivados.
Un controlador de minipuerto también puede reactivar un puerto. Para obtener más información sobre cómo activar puertos NDIS, consulte Activación de puertos NDIS.
Cuando un controlador de minipuerto desactiva los puertos, NDIS notifica a todos los controladores de protocolo que están enlazados al controlador de minipuerto con el evento PnP NetEventPortDeactivation . Este evento PnP enumera los puertos que han cambiado al estado asignado y no incluyen ningún puerto que ya esté desactivado. Para obtener más información sobre el control de eventos de desactivación de puertos en un controlador de protocolo, consulte Control del evento PnP de desactivación de puertos.
Antes de que un controlador de miniporte asigne un puerto NDIS, el controlador debe llamar a la función NdisMSetMiniportAttributes para establecer los atributos de registro en la estructura de NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES . Los controladores de miniport pueden controlar la activación del puerto predeterminado estableciendo la marca de atributo NDIS_MINIPORT_CONTROLS_DEFAULT_PORT cuando llaman a NdisMSetMiniportAttributes. Si un controlador de minipuerto asume la responsabilidad de activar el puerto predeterminado y el controlador de minipuerto activado el puerto predeterminado, debe desactivar el puerto predeterminado antes de volver de la función MiniportHaltEx .
Todos los puertos especificados por la matriz de NDIS_PORT_NUMBER elementos deben estar en estado activado. Un controlador de minipuerto no debe intentar desactivar un puerto que ya se haya desactivado.
Si NDIS no desactiva ningún puerto de la matriz de puertos, ninguno de los puertos de la matriz de puertos cambiará de estado. Si se produce un error en la desactivación porque algunos de los puertos especificados no existen, la función NdisMNetPnPEvent devuelve el valor devuelto NDIS_STATUS_INVALID_PORT. Si se produce un error en la desactivación porque algunos de los puertos no están en estado activado, NdisMNetPnPEvent devuelve el valor devuelto NDIS_STATUS_INVALID_PORT_STATE.
Hasta que se devuelva la llamada a NdisMNetPnPEvent , no se desactiva un puerto y los controladores de miniporte deben poder controlar las solicitudes OID y enviar solicitudes asociadas a ese puerto.
Cuando un controlador de minipuerto desactiva el puerto predeterminado, NDIS cierra todos los enlaces entre los controladores de protocolo excesivo y el adaptador de minipuerto. Si un controlador de miniporte intenta desactivar el puerto predeterminado y el puerto predeterminado ya está desactivado, NdisMNetPnPEvent produce un error y devuelve el valor devuelto NDIS_STATUS_INVALID_PORT_STATE. Si un controlador de minipuerto intenta desactivar el puerto predeterminado y el puerto predeterminado no es el único puerto especificado en la matriz de elementos NDIS_PORT_NUMBER, se produce un error en NdisMNetPnPEvent y devuelve el valor devuelto NDIS_STATUS_INVALID_PORT. Si un controlador de minipuerto establece el miembro Buffer en NULL o bufferLength en cero, NDIS produce un error en la llamada a NdisMNetPnPEvent y devuelve el valor devuelto NDIS_STATUS_INVALID_PARAMETER.
Después de desactivar correctamente un puerto, el puerto se encuentra en el estado asignado. Los controladores miniport no pueden indicar los datos recibidos ni el estado del puerto en el estado asignado.