Здравствуйте. Есть драйвер-фильтр, перехватывающий запись на CD/DVD. Нужно чтобы по окончании записи (при получении события о извлечении диска) получить список файлов/каталогов на CD-ROM. Мой драйвер получает событие о извлечении и информирует пользовательское приложение. Само событие игнорируется (диск не извлекается). Приложение, при помощи FindFirstFile/CreateFile ... пытается получить содержимое диска. Тестирую на explorer'е. После окончания записи пытаюсь просмотреть содержимое - explorer не может получить доступ к диску. Возникла идея эмулировать открытие/закрытие лотка CD-ROM'а. Пытался следующее: 1. открывать и сразу закрывать лоток. Этот способ работает, но он увы не подходит. 2. пытался работать с флагом DO_VERIFY_VOLUME (у себя и на устройстве) - сообщения IOCTL_*_CHECK_VERIFY никуда не приходят 3. блокировал/снимал блокировку при помощи IOCTL_CDROM_EXCLUSIVE_ACCESS - на XP эти сообщения не опознаются 4. использовал FsRtlNotifyVolumeEvent с FSRTL_VOLUME_DISMOUNT и FSRTL_VOLUME_MOUNT - не помогло. Как ещё можно заставить систему думать, что диск в CD-ROM'е был извлечён ?
Сесть нижним фильтром класс-драйвера. Перехватывать IRP_MJ_SCSI(он же IRP_MJ_INTERNAL_DEVICE_CONTROL). По разу ответить на SCSIOP_READ_CAPACITY и SCSIOP_TEST_UNIT_READY все. для виндов диск извлечен.
Выдумал еще вариант - только он, в отличие от первого, не проверен. Если у тебя уже есть верхний фильтр класс-драйвера, можно попробовать следующее: 1. вызвать на диск ф-ю IoRequestDeviceEject(device_object) - вроде так назавается. Она равносильна нажатию кнопки Извлечь в меню по щелчку пкм по диску. 2. тебе придет IOCTL_STORAGE_EJECT_MEDIA. Ты на него говоришь успех, но не шлешь вниз по стеку. Удачи.
Сейчас другой проект, но необходимо добиться, чтобы система считала что диск поменялся. Мой драйвер является нижним фильтром класса. По событию (от приложения) он работает с диском. На этом этапе система не должна иметь доступ к диску. После окончания работы - система должна поверить, что диск извлечён. Отвеча как вы указали. Но иногда SCSIOP_READ_CAPACITY просто не приходит. Сразу приходят запросы на чтение. Как завтавить систему прислать SCSIOP_READ_CAPACITY ?