Реагирование на запросы 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), драйвер должен сделать следующее:
Задайте флаги в deviceObject by ORing Flags с помощью DO_VERIFY_VOLUME.
Задайте для блока IoStatus в IRP следующее:
- Для состояния задано значение STATUS_VERIFY_REQUIRED
- Для сведений задано значение 0
Вызовите IoCompleteRequest с входным IRP.
Если том не подключен, драйвер не должен задавать бит DO_VERIFY_VOLUME. Драйвер должен задать для параметра IoStatus.Status значение STATUS_IO_DEVICE_ERROR, задать для Параметра IoStatus.Information значение 0 и вызвать IoCompleteRequest с IRP.