Пользователь отключает устройство

Во время работы системы пользователь может удалить устройство одним из двух способов: путем упорядоченного удаления, что означает, что пользователь сообщает системе о том, что устройство будет удалено (например, с помощью программы "Отключить" или "Извлечь оборудование"). или путем неожиданного удаления, что означает, что пользователь отключает устройство, не информируя систему. Если шина поддерживает неожиданное удаление (например, USB), водители устройства должны быть в состоянии справиться с внезапным исчезновением устройства.

Упорядочение удаления

Пользователь запрашивает удаление с помощью системной программы "Отключить" или "Извлечь оборудование", отключить устройство с помощью диспетчер устройств или нажав кнопку извлечения устройства. Платформа позволяет удалять или отключать устройство, если драйвер не имеет:

Для каждого драйвера функции и фильтра, поддерживающего устройство, платформа последовательно выполняет следующие действия по одному драйверу за раз, начиная с драйвера, который является самым высоким в стеке драйверов:

  1. Если драйвер использует самоуправляемый ввод-вывод, платформа вызывает функцию обратного вызова EvtDeviceSelfManagedIoSuspend драйвера.

  2. Платформа останавливает все очереди ввода-вывода драйвера, управляемые питанием.

  3. Если оборудование и драйвер поддерживают DMA, платформа вызывает функции обратного вызова EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush и EvtDmaEnablerDisable (если они существуют) для каждого созданного канала DMA.

  4. Платформа вызывает функцию обратного вызова EvtDeviceD0ExitPreInterruptsDisabled драйвера (если она существует), а затем вызывает функцию обратного вызова EvtInterruptDisable драйвера (если она существует) для каждого прерывания, чтобы драйвер мог отключить прерывания устройства.

  5. Платформа вызывает функцию обратного вызова EvtDeviceD0Exit драйвера (если она существует).

  6. Платформа вызывает функцию обратного вызова EvtDeviceReleaseHardware драйвера (если она существует), передав ей список аппаратных ресурсов, назначенных диспетчером PnP устройству.

  7. Если драйвер использует самоуправляемый ввод-вывод, платформа вызывает функцию обратного вызова EvtDeviceSelfManagedIoFlush драйвера.

  8. Если драйвер использует самоуправляемый ввод-вывод, платформа вызывает функцию обратного вызова EvtDeviceSelfManagedIoCleanup драйвера.

Водитель автобуса — это водитель в стеке, который называется последним. Когда платформа вызывает функцию обратного вызова EvtDeviceD0Exit водителя шины, функция обратного вызова устанавливает состояние питания устройства (дочернего устройства шины) в D3. Драйвер шины может управлять тем, когда платформа вызывает функцию обратного вызова EvtDeviceReleaseHardware , вызывая WdfDeviceInitSetReleaseHardwareOrderOnFailure.

Неожиданное удаление

Пользователь неожиданно отключает устройство. Водитель автобуса для шины устройства обнаруживает, что устройство отсутствует, и вызывает WdfChildListUpdateChildDescriptionAsMissing.

Для каждого драйвера функции и фильтра, поддерживающего устройство, платформа последовательно выполняет следующие действия по одному драйверу за раз, начиная с драйвера, который является самым высоким в стеке драйверов:

  1. Платформа вызывает функцию обратного вызова EvtDeviceSurpriseRemoval драйвера (если она существует).
  2. Если устройство находилось в рабочем (D0) состоянии при отключении:
    1. Платформа останавливает все очереди ввода-вывода драйвера, управляемые питанием.
    2. Если драйвер использует самоуправляемый ввод-вывод, платформа вызывает функцию обратного вызова EvtDeviceSelfManagedIoSuspend драйвера.
    3. Если оборудование и драйвер поддерживают DMA, платформа вызывает функции обратного вызова EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush и EvtDmaEnablerDisable (если они существуют) для каждого созданного канала DMA.
    4. Платформа вызывает функции обратного вызова EvtDeviceD0ExitPreInterruptsDisabled и EvtInterruptDisable (если они существуют), чтобы драйвер мог отключить прерывания устройства.
    5. Платформа вызывает функцию обратного вызова EvtDeviceD0Exit драйвера (если она существует).
  3. Платформа вызывает функцию обратного вызова EvtDeviceReleaseHardware драйвера (если она существует), передавая список аппаратных ресурсов, назначенных диспетчером PnP устройству.
  4. Если драйвер использует самоуправляемый ввод-вывод, платформа вызывает функцию обратного вызова EvtDeviceSelfManagedIoFlush драйвера.
  5. Если драйвер использует самоуправляемый ввод-вывод, платформа вызывает функцию обратного вызова EvtDeviceSelfManagedIoCleanup драйвера.

Обратите внимание, что устройство может быть неожиданно удалено в любое время. Поэтому платформа может вызывать функцию обратного вызова evtDeviceSurpriseRemoval драйвера в то время, которое не показано на предыдущих шагах. Например, если пользователь неожиданно отключает устройство при переходе в состояние с низким энергопотреблением, платформа может вызвать функцию обратного вызова EvtDeviceSurpriseRemoval после вызова функции обратного вызова EvtDeviceReleaseHardware . Не следует кодирует функцию обратного вызова EvtDeviceSurpriseRemoval таким образом, чтобы предполагается, что она и другие функции обратного вызова вызываются в определенной последовательности.

Кроме того, платформа не синхронизирует функцию обратного вызова EvtDeviceSurpriseRemoval устройства с функциями обратного вызова, перечисленными на предыдущих шагах для этого устройства. Таким образом, функция обратного вызова EvtDeviceSurpriseRemoval может выполняться в то время как выполняется другая из перечисленных выше функций обратного вызова.