Поделиться через


Последовательность Surprise-Removal

Если пользователь удаляет устройство без предупреждения, просто отключив его без использования диспетчера устройств или служебной программы безопасного удаления оборудования, устройство считается "неожиданно удаленным". В этом случае платформа следует немного другой последовательности удаления. Это также происходит по процедуре неожиданного удаления в случае, если другой драйвер вызывает IoInvalidateDeviceState на устройстве, даже если устройство всё ещё физически присутствует. В последовательности сюрпризного удаления фреймворк сначала вызывает обратный вызов EvtDeviceSurpriseRemoval перед вызовом любого из других обратных вызовов в последовательности удаления. По завершении последовательности платформа уничтожает объект устройства. Драйверы для всех съемных устройств должны гарантировать, что обратные вызовы в путях завершения работы и запуска могут обрабатывать сбои, особенно сбои, вызванные удалением оборудования. Любые попытки доступа к оборудованию не должны ждать бесконечно, а должны быть подвержены таймаутам или сторожевому таймеру.

На следующей схеме продемонстрированы обратные вызовы, участвующие в удалении без предупреждения.

Блок-схема, иллюстрирующая последовательность неожиданного удаления в драйверах устройств.

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