Eliminación de un dispositivo en un controlador de bus
Al quitar un dispositivo secundario (PDO secundario), el controlador de bus primario debe deshacer las operaciones que ha realizado para agregar e iniciar el dispositivo.
Un controlador de autobús quita un dispositivo secundario con un procedimiento como el siguiente en su rutina DispatchPnP :
¿El controlador ha controlado una solicitud de IRP_MN_SURPRISE_REMOVAL anterior para este PDO?
Si es así, realice cualquier limpieza restante y vaya al paso 4.
Normalmente, un controlador mantiene una marca en la extensión del dispositivo que indica si el controlador ha controlado una solicitud de IRP_MN_SURPRISE_REMOVAL para el dispositivo.
Complete las solicitudes en cola en el controlador.
Quite la energía del dispositivo, si el controlador del bus es capaz de hacerlo y notifique al administrador de energía mediante una llamada a PoSetPowerState.
El controlador de autobús apaga el dispositivo secundario, si es posible, y notifica al administrador de energía del cambio del dispositivo en estado de alimentación. El conductor del autobús lo hace en respuesta a la solicitud de IRP_MN_REMOVE_DEVICE ; El propietario de la directiva de energía del dispositivo no envía una solicitud de IRP_MN_SET_POWER cuando se quita el dispositivo. Para obtener más información, consulte Administración de energía.
Si el controlador de autobús notificó este dispositivo en su respuesta más reciente a una solicitud de IRP_MN_QUERY_DEVICE_RELATIONS para BusRelations, el dispositivo sigue estando físicamente presente en la máquina. En este caso, el conductor del autobús:
Conserva el PDO para el dispositivo hasta que el dispositivo se haya quitado físicamente.
Establece Irp-IoStatus.Status> en STATUS_SUCCESS.
Completa el IRP con IoCompleteRequest.
Devuelve de la rutina DispatchPnP .
El controlador de bus debe seguir notificando este dispositivo en enumeraciones posteriores (IRP_MN_QUERY_DEVICE_RELATIONS para BusRelations) hasta que el dispositivo se quite físicamente. El administrador de PnP realiza un seguimiento de si se ha agregado e iniciado un dispositivo enumerado.
Si el dispositivo no se incluyó en la respuesta más reciente del controlador de autobús a una solicitud de IRP_MN_QUERY_DEVICE_RELATIONS para BusRelations, el controlador de autobús considera que el dispositivo se va a quitar físicamente de la máquina. En este caso, el conductor del autobús hace lo siguiente:
Limpia asignaciones específicas del dispositivo, memoria, eventos, etc.
Establece Irp-IoStatus.Status> en STATUS_SUCCESS.
Completa el IRP con IoCompleteRequest.
Libera el PDO con IoDeleteDevice.
El controlador de autobús debe eliminar el PDO si el controlador omite el dispositivo de su lista de BusRelations más reciente. Si un usuario vuelve a conectar el dispositivo a la máquina, el controlador de bus debe crear un nuevo PDO en respuesta a la siguiente consulta de BusRelations . Si un controlador de bus reutiliza el mismo PDO para una nueva instancia de un dispositivo, la máquina no funcionará correctamente.
Devuelve de la rutina DispatchPnP .
Si el dispositivo sigue presente cuando el administrador de PnP envía la solicitud de IRP_MN_REMOVE_DEVICE , el controlador de autobús conserva el PDO. Si, en algún momento posterior, el dispositivo se quita físicamente del bus, el administrador de PnP envía otro IRP_MN_REMOVE_DEVICE. Después de recibir el IRP de eliminación posterior, el controlador de autobús elimina el PDO del dispositivo.
Un controlador de autobús debe poder controlar un IRP_MN_REMOVE_DEVICE para un dispositivo que ya se ha quitado y cuyo PDO está marcado para su eliminación. En respuesta a este TIPO de IRP, el controlador de autobús puede realizar correctamente el IRP o devolver STATUS_NO_SUCH_DEVICE. El PDO del dispositivo aún no se ha eliminado en este caso, a pesar de la llamada anterior del controlador de bus a IoDeleteDevice, porque algún componente todavía tiene una referencia al objeto . Por lo tanto, el controlador de autobús puede acceder al PDO mientras controla el segundo IRP de eliminación. El controlador de autobús no debe llamar a IoDeleteDevice una segunda vez para el PDO; El sistema de E/S elimina el PDO cuando su recuento de referencias alcanza cero.
Un controlador de bus no quita sus estructuras de datos para un dispositivo secundario hasta que recibe una solicitud de IRP_MN_REMOVE_DEVICE para el dispositivo. Un controlador de bus podría detectar que se ha quitado un dispositivo y llamar a IoInvalidateDeviceRelations, pero no debe eliminar el PDO del dispositivo hasta que el administrador de PnP envíe una solicitud de IRP_MN_REMOVE_DEVICE .