Control de solicitudes para detener un dispositivo

Hay dos circunstancias en las que, antes de pedir a los controladores de un dispositivo que detengan un dispositivo, el administrador de PnP pregunta a los controladores si detener el dispositivo es una buena idea:

Hay varias maneras en las que un controlador puede controlar estas situaciones:

  • Si el controlador ha llamado a WdfDeviceSetSpecialFileSupport porque un dispositivo admite un archivo especial y si un archivo especial está abierto en el dispositivo, el marco no permitirá que el dispositivo se detenga.

  • Para evitar temporalmente todas las paradas durante un período de tiempo relativamente corto, el controlador puede llamar a WdfDeviceSetStaticStopRemove.

  • Para evaluar y procesar cada intento de detención individualmente, el controlador puede proporcionar funciones de devolución de llamada EvtDeviceQueryStop y EvtDeviceQueryRemove .

Si el dispositivo no admite archivos especiales y si detener o quitar un dispositivo nunca es un problema para el controlador o dispositivo, el controlador no proporciona las funciones de devolución de llamada EvtDeviceQueryStop y EvtDeviceQueryRemove y nunca llama a WdfDeviceSetStaticStopRemove. En este caso, el administrador de PnP siempre detiene el dispositivo sin comprobar primero si el controlador lo permite.

Redistribuir recursos

A veces, el administrador de PnP debe redistribuir los recursos de hardware del sistema. Normalmente, esta redistribución se produce porque un controlador de autobús ha informado de que se ha conectado un nuevo dispositivo y el nuevo dispositivo requiere recursos ya asignados. Los dispositivos deben detenerse antes de reasignar los recursos.

Si es necesario que el controlador impida a veces que el administrador de PnP detenga un dispositivo ocupado, el controlador puede proporcionar una función de devolución de llamada EvtDeviceQueryStop . Si la función de devolución de llamada EvtDeviceQueryStop del controlador devuelve un valor de estado de error, el administrador de PnP no detendrá el dispositivo.

Si el controlador determina que es seguro detener el dispositivo, la función de devolución de llamada devuelve STATUS_SUCCESS. Si ninguno de los otros controladores del dispositivo impide la detención, el administrador de PnP detiene temporalmente el dispositivo.

Para obtener información sobre el orden en el que el marco llama a las funciones de devolución de llamada de eventos de un controlador cuando el administrador de PnP detiene un dispositivo para redistribuir recursos, consulte Los recursos del sistema de PnP Manager Redistributes.

Un usuario quita o deshabilita un dispositivo

Un usuario puede quitar o deshabilitar algunos dispositivos. Por ejemplo:

  • Si el controlador ha establecido el miembro extraíble (y no el miembro SurpriseRemovalOK ) de la estructura de WDF_DEVICE_PNP_CAPABILITIES del dispositivo, el usuario puede ejecutar el programa Desenchufar o expulsar hardware y, a continuación, desconectar o expulsar el dispositivo.

  • Si el controlador no ha establecido el miembro NotDisableable de la estructura de WDF_DEVICE_STATE del dispositivo, el usuario puede usar Administrador de dispositivos para deshabilitar el dispositivo.

En tales casos, el administrador de PnP intenta detener el dispositivo antes de que el usuario lo quite.

Si es necesario que el controlador evite a veces la eliminación de un dispositivo ocupado, el controlador puede proporcionar una función de devolución de llamada EvtDeviceQueryRemove . Si la función de devolución de llamada EvtDeviceQueryRemove de algún controlador devuelve un valor de estado de error, el administrador de PnP no detendrá el dispositivo.

Si el controlador determina que es seguro que el usuario quite el dispositivo, la función de devolución de llamada devuelve STATUS_SUCCESS. Si ninguno de los otros controladores del dispositivo impide la eliminación, el administrador de PnP detiene el dispositivo.

Para obtener información sobre el orden en el que el marco llama a las funciones de devolución de llamada de eventos de un controlador al detener un dispositivo para su eliminación, consulte Un usuario Desconecta un dispositivo.