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


Реагирование на запросы Check-Verify из файловой системы

По своему усмотрению файловая система может отправлять IRP в точку входа Dispatch драйвера устройства для IRP_MJ_DEVICE_CONTROL запросов с параметрами Parameters.DeviceIoControl.IoControlCode в расположении стека ввода-вывода, установленным следующим образом:

IOCTL_XXX_CHECK_VERIFY
где XXX — это тип устройства, например DISK, TAPE или CDROM.

Тип DISK включает как несекционируемые (гибкие), так и секционируемые съемные носители.

Если базовый драйвер устройства определяет, что носитель не изменился, драйвер должен завершить IRP, возвращая блок IoStatus со следующими значениями:

Состояние

Задайте значение STATUS_SUCCESS

Информация

Задать нулевое значение

Кроме того, если тип устройства — DISK или CDROM, а вызывающий объект указал выходной буфер, драйвер возвращает счетчик изменений мультимедиа в буфере по адресу Irp-AssociatedIrp.SystemBuffer> и устанавливает для параметра Irp-IoStatus.Information>значение sizeof(ULONG). Возвращая это число, драйвер дает вызывающей стороне возможность определить, изменился ли носитель с его точки зрения.

Если базовый драйвер устройства определяет, что носитель изменился, он выполняет различные действия в зависимости от того, подключен ли том. Если том подключен (флаг VPB_MOUNTED установлен в VPB), драйвер должен сделать следующее:

  1. Задайте флаги в deviceObject by ORing Flags с помощью DO_VERIFY_VOLUME.

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

    • Для состояния задано значение STATUS_VERIFY_REQUIRED
    • Для сведений задано значение 0
  3. Вызовите IoCompleteRequest с входным IRP.

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