Un usuario desconecta un dispositivo

Mientras se ejecuta un sistema, un usuario puede quitar un dispositivo de una de estas dos maneras: mediante la eliminación ordenada, lo que significa que el usuario informa al sistema de que el dispositivo está a punto de quitarse (por ejemplo, mediante el programa Desenchufar o expulsar hardware); o por eliminación sorpresa, lo que significa que el usuario desconecta el dispositivo sin informar al sistema. Si el autobús admite la eliminación sorpresa (por ejemplo, USB), los controladores del dispositivo deben ser capaces de controlar la desaparición repentina del dispositivo.

Eliminación ordenada

El usuario solicita la eliminación mediante el programa Desconectar o expulsar hardware del sistema, deshabilitando el dispositivo mediante Administrador de dispositivos, o insertando el botón de expulsión de un dispositivo expulsable. El marco permite que el dispositivo se quite o deshabilite, a menos que el controlador tenga:

Para cada función y controlador de filtro que admita el dispositivo, el marco hace lo siguiente, en secuencia, un controlador a la vez, empezando por el controlador que es más alto en la pila de controladores:

  1. Si el controlador usa E/S autoadministrado, el marco llama a la función de devolución de llamada EvtDeviceSelfManagedIoSuspend del controlador.

  2. El marco detiene todas las colas de E/S administradas por energía del controlador.

  3. Si el hardware y el controlador admiten DMA, el marco llama a las funciones de devolución de llamada EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush y EvtDmaEnablerDisable del controlador para cada canal DMA que se creó.

  4. El marco llama a la función de devolución de llamada EvtDeviceD0ExitPreInterruptsDisabled del controlador (si existe) y, a continuación, llama a la función de devolución de llamada EvtInterruptDisable del controlador (si existe) para cada interrupción para que el controlador pueda deshabilitar las interrupciones del dispositivo.

  5. El marco llama a la función de devolución de llamada EvtDeviceD0Exit del controlador (si existe).

  6. El marco llama a la función de devolución de llamada EvtDeviceReleaseHardware del controlador (si existe), pasando la lista de recursos de hardware que el administrador de PnP ha asignado al dispositivo.

  7. Si el controlador usa E/S autoadministrado, el marco llama a la función de devolución de llamada EvtDeviceSelfManagedIoFlush del controlador.

  8. Si el controlador usa E/S autoadministrado, el marco llama a la función de devolución de llamada EvtDeviceSelfManagedIoCleanup del controlador.

El controlador de autobús es el controlador de la pila que se llama por última vez. Cuando el marco llama a la función de devolución de llamada EvtDeviceD0Exit del controlador de bus, la función de devolución de llamada establece el estado de alimentación del dispositivo (un dispositivo secundario del bus) en D3. El controlador de bus puede controlar cuándo el marco llama a su función de devolución de llamada EvtDeviceReleaseHardware llamando a WdfDeviceInitSetReleaseHardwareOrderOnFailure.

Eliminación sorpresa

Un usuario desconecta un dispositivo de forma inesperada. El controlador de autobús del bus del dispositivo detecta que falta el dispositivo y llama a WdfChildListUpdateChildDescriptionAsMissing.

Para cada función y controlador de filtro que admita el dispositivo, el marco hace lo siguiente, en secuencia, un controlador a la vez, empezando por el controlador que es más alto en la pila de controladores:

  1. El marco llama a la función de devolución de llamada EvtDeviceSurpriseRemoval del controlador (si existe).
  2. Si el dispositivo estaba en su estado de funcionamiento (D0) cuando estaba desconectado:
    1. El marco detiene todas las colas de E/S administradas por energía del controlador.
    2. Si el controlador usa E/S autoadministrado, el marco llama a la función de devolución de llamada EvtDeviceSelfManagedIoSuspend del controlador.
    3. Si el hardware y el controlador admiten DMA, el marco llama a las funciones de devolución de llamada EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush y EvtDmaEnablerDisable del controlador para cada canal DMA que se creó.
    4. El marco llama a las funciones de devolución de llamada EvtDeviceD0ExitPreInterruptsDisabled y EvtInterruptDisable del controlador (si existen) para que el controlador pueda deshabilitar las interrupciones del dispositivo.
    5. El marco llama a la función de devolución de llamada EvtDeviceD0Exit del controlador (si existe).
  3. El marco llama a la función de devolución de llamada EvtDeviceReleaseHardware del controlador (si existe), pasando la lista de recursos de hardware que el administrador de PnP ha asignado al dispositivo.
  4. Si el controlador usa E/S autoadministrado, el marco llama a la función de devolución de llamada EvtDeviceSelfManagedIoFlush del controlador.
  5. Si el controlador usa E/S autoadministrado, el marco llama a la función de devolución de llamada EvtDeviceSelfManagedIoCleanup del controlador.

Tenga en cuenta que un dispositivo se puede quitar inesperadamente en cualquier momento. Por lo tanto, el marco podría llamar a la función de devolución de llamada EvtDeviceSurpriseRemoval del controlador en un momento distinto del que se muestra en los pasos anteriores. Por ejemplo, si un usuario desconecta inesperadamente el dispositivo mientras entra en un estado de baja potencia, el marco podría llamar a la función de devolución de llamada EvtDeviceSurpriseRemoval después de llamar a la función de devolución de llamada EvtDeviceReleaseHardware . No debe codificar una función de devolución de llamada EvtDeviceSurpriseRemoval de una manera que suponga que se llama a ella y a otras funciones de devolución de llamada en una secuencia determinada.

Además, el marco no sincroniza la función de devolución de llamada EvtDeviceSurpriseRemoval de un dispositivo con cualquiera de las funciones de devolución de llamada enumeradas en los pasos anteriores para ese dispositivo. Por lo tanto, la función de devolución de llamada EvtDeviceSurpriseRemoval podría ejecutarse mientras que otra de las funciones de devolución de llamada enumeradas anteriormente también se está ejecutando.