Здравствуйте. Сел фильтром на USB диск. Необходимо сделать его доступным только для чтения. Перехватываю команды SCSI_WRITE (отвергаю со статусом SCSI_SENSE_DATA_PROTECT и SCSI_ADSENSE_WRITE_PROTECT). В случае с FAT - диск доступен. Но периодически вываливается MessageBox "Ошибка отложенной записи". В случае с NTFS - винда ругается на то, что диск недоступен. Что я делаю не так ?
Разумеется. Ты забываешь про кэшированную запись. Что такое кэшированная запись? Это операция, которая выполнена успешно ещё до того, как данные реально ушли на диск. Соответственно, если файловая система сказала наверх, что запись успешна, а дисковое устройство потом сказало менеджеру кэша "иди-ка ты в жопу", то чему же ты удивляешься? Всё, данные пропали. По поводу NTFS точно не скажу, но по-моему это by it's design. Уровень не тот, надо файловым фильтром садиться на FSD и фильтровать это там.
А как тогда работают SD карточки с включённым переключателем Lock ? ps. Пытался смотреть карточки, но все карточки, которые у меня есть, не реагируют на переключатель Lock.
Если я правильно понимаю, то при включённом Lock запрещена запись на диск. Проверил на телефоне - при копировании на защищённый диск выдаётся ошибка записи. При работе с кард-ридером система игнорирует переключатель Lock и всегда производит запись. Про карточки SD я для примера сказал. Есть же и флешки с переключателем (к сожалению мои не относятся к этому виду флешек
Вероятно, сие сильно зависит от драйверов устройств класса storage. Какие-то из них поддерживают lock-перемычки, какие-то нет. Драйверу достаточно выставить флаг FILE_READ_ONLY_DEVICE в поле Characteristics структуры DEVICE_OBJECT девайса-тома и завершать запросы на запись с кодом STATUS_MEDIA_WRITE_PROTECTED. Если он этого не делает, значит скорее всего lock-перемычки ему по-барабану и ничего с этим не поделаешь (ну или драйвера обновить можно попробовать). На абсолютную истину не претендую, но очень похоже на то.
Можно завершить запрос IRP_MJ_DEVICE_CONTROL с ctl code IOCTL_DISK_IS_WRITABLE со статусом STATUS_MEDIA_WRITE_PROTECTED. Только возможны некоторые особенности поведения с вышележащими файловыми системами: например, NTFS на Windows 2000 не поддерживает режим только для чтения, т.е не смонтируется.