Controlar el estado de un destino de E/S general

Puede visualizar objetos de destino de E/S como tener dos puertas: una puerta de entrada y una puerta de salida. Los controles out-gate cuando el marco entrega una solicitud al objeto de dispositivo de destino, mientras que los controles en la puerta cuando se permite que una solicitud entre en el destino de E/S en absoluto.

El marco define los siguientes estados para los destinos de E/S generales:

Comenzó
Ambas puertas del objeto de destino de E/S están abiertas. El controlador puede enviar solicitudes de E/S a la cola de destino de E/S y el marco entrega las solicitudes al controlador adecuado.

Detenido
La puerta de entrada del destino de E/S está abierta, pero la puerta de salida está cerrada. El marco deja de entregar solicitudes al controlador adecuado. Para enviar solicitudes de E/S al destino de E/S, el controlador debe establecer WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE o WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET en la estructura WDF_REQUEST_SEND_OPTIONS de cada solicitud.

Purgado
Ambas puertas del objeto de destino de E/S están cerradas. El controlador no puede enviar solicitudes de E/S al destino de E/S a menos que establezca WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE o WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET. Además, el marco cancela las solicitudes no procesadas en la cola interna del objeto de destino de E/S. Este estado está disponible a partir de la versión 1.11 de KMDF.

Cerrado para Query-Remove
Un destino de E/S remoto se cierra temporalmente porque es posible que su dispositivo se quite pronto.

Cerrado
El destino de E/S está cerrado y no se puede iniciar ni detener.

Eliminado
Se ha quitado el dispositivo del destino de E/S.

La enumeración WDF_IO_TARGET_STATE define los valores que representan estos estados. El controlador puede llamar a WdfIoTargetGetState para obtener el estado de un destino de E/S.

Estados de destino de E/S locales

El marco se abre automáticamente e inicia los destinos de E/S locales.

Si es necesario, el controlador puede llamar a WdfIoTargetStop para detener temporalmente un destino de E/S local y llamar a WdfIoTargetStart para reiniciarlo. Por ejemplo, el controlador podría detener un destino de E/S local si detecta una condición de error temporal y, a continuación, reiniciar el destino de E/S si se corrige la condición de error.

En la versión 1.11 y posteriores de KMDF, el controlador puede llamar a WdfIoTargetPurge para evitar temporalmente que las solicitudes de E/S se envíen a un destino de E/S local y para cancelar las solicitudes sin procesar en la cola del destino. Por ejemplo, como parte de la limpieza del identificador de archivos, un controlador podría purgar un destino de E/S local para asegurarse de que se cancelan todas las solicitudes enviadas al controlador.

Si se quita el dispositivo de un destino de E/S local, el marco se detiene y cierra automáticamente el destino de E/S y cancela todas las solicitudes de E/S que se encuentran en la cola del destino. El marco notifica al controlador que el dispositivo ya no está disponible mediante una llamada a funciones de devolución de llamada de eventos de objeto de dispositivo. Para obtener más información sobre estas funciones de devolución de llamada, consulte Escenarios de administración de energía y PnP.

Estados de destino de E/S remotos

Los controladores deben llamar a WdfIoTargetOpen para abrir destinos de E/S remotos. Cuando un controlador abre un destino de E/S remoto, el marco inicia automáticamente el destino de E/S.

Si es necesario, el controlador puede llamar a WdfIoTargetStop para detener temporalmente un destino de E/S remoto y llamar a WdfIoTargetStart para reiniciarlo.

En la versión 1.11 y posteriores de KMDF, el controlador puede llamar a WdfIoTargetPurge para impedir temporalmente que las solicitudes de E/S se envíen a un destino de E/S remoto y cancelar las solicitudes sin procesar en la cola del destino.

Si se quita el dispositivo del destino de E/S remoto, el marco se detiene y cierra automáticamente el destino de E/S y cancela todas las solicitudes de E/S que se encuentran en la cola del destino, a menos que el controlador registre las siguientes funciones de devolución de llamada de eventos:

EvtIoTargetQueryRemove
Informa al controlador de que se podría quitar un dispositivo de destino de E/S remoto. El controlador debe llamar a WdfIoTargetCloseForQueryRemove si desea que el controlador permita la eliminación del dispositivo.

EvtIoTargetRemoveComplete
Informa al controlador de que se ha quitado un dispositivo de destino de E/S remoto. Esta función de devolución de llamada debe llamar a WdfIoTargetClose.

EvtIoTargetRemoveCanceled
Informa al controlador de que se ha cancelado un intento de quitar un dispositivo de destino de E/S remoto. Esta función de devolución de llamada debe llamar a WdfIoTargetOpen y el controlador suele llamar a WDF_IO_TARGET_OPEN_PARAMS_INIT_REOPEN para inicializar su función de WDF_IO_TARGET_OPEN_PARAMS_INIT.

Si un controlador ha terminado de usar un destino de E/S remoto y no volverá a usar el destino, y el destino no tiene objetos de solicitud secundarios que todavía están pendientes, el controlador puede llamar a WdfObjectDelete sin llamar primero a WdfIoTargetClose. Si el destino tiene objetos de solicitud secundarios que todavía están pendientes, el controlador debe llamar a WdfIoTargetClose antes de que pueda llamar de forma segura a WdfObjectDelete.