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


Уведомление файловой системы о возможных изменениях мультимедиа

Драйвер устройства со съемным носителем должен гарантировать, что носитель не изменяется для устройства, представленного DeviceObject (входные данные для каждой подпрограммы драйвера, которая отправляет IRP), всякий раз, когда драйвер обрабатывает IRP, запрашивающий передачу на носитель или с носителя, или операцию управления вводом-выводом устройства, которая влияет на носитель. Наилучшее время для проверка для измененного носителя — это сразу после перехода из состояния отсутствия носителя в состояние "Присутствует мультимедиа", если физическое устройство всегда уведомляет драйвер об этих изменениях состояния.

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

  1. Убедитесь, что том подключен, проверив флаг VPB_MOUNTED в VPB. (Если том не подключен, драйвер не должен задавать бит DO_VERIFY_VOLUME. Драйвер должен задать для Параметра IoStatus.Status значение STATUS_IO_DEVICE_ERROR, задать для Параметра IoStatus.Information значение 0 и вызвать IoCompleteRequest с IRP.)

  2. Установите флаги в deviceObject by ORing Flags с помощью DO_VERIFY_VOLUME.

  3. Задайте для блока IoStatus в IRP следующее:

    • Для состояния задано значение STATUS_VERIFY_REQUIRED
    • Для сведений задано значение 0
  4. Перед завершением любого IRP с блоком IoStatus , в котором для поля Status не задано значение STATUS_SUCCESS, драйвер должен вызвать IoIsErrorUserInduced, который возвращает логическое значение TRUE для любого из следующих значений Состояния :

    • STATUS_VERIFY_REQUIRED
    • STATUS_NO_MEDIA_IN_DEVICE
    • STATUS_WRONG_VOLUME
    • STATUS_UNRECOGNIZED_MEDIA
    • STATUS_MEDIA_WRITE_PROTECTED
    • STATUS_IO_TIMEOUT
    • STATUS_DEVICE_NOT_READY

    Если IoIsErrorUserInduced возвращает значение TRUE, драйвер должен вызвать IoSetHardErrorOrVerifyDevice , чтобы FSD открыл диалоговое окно для пользователя, который затем может указать правильный носитель, повторить исходный запрос или отменить запрошенную операцию.