Эмуляция открытия/закрытия лотка CD-ROM

Тема в разделе "WASM.NT.KERNEL", создана пользователем vasalvit, 22 дек 2008.

  1. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Здравствуйте.

    Есть драйвер-фильтр, перехватывающий запись на 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'е был извлечён ?
     
  2. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Сесть нижним фильтром класс-драйвера. Перехватывать IRP_MJ_SCSI(он же IRP_MJ_INTERNAL_DEVICE_CONTROL).

    По разу ответить на SCSIOP_READ_CAPACITY и SCSIOP_TEST_UNIT_READY
    все. для виндов диск извлечен.
     
  3. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Спасибо. Буду пробовать.
     
  4. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Выдумал еще вариант - только он, в отличие от первого, не проверен. Если у тебя уже есть верхний фильтр класс-драйвера, можно попробовать следующее:
    1. вызвать на диск ф-ю IoRequestDeviceEject(device_object) - вроде так назавается. Она равносильна нажатию кнопки Извлечь в меню по щелчку пкм по диску.
    2. тебе придет IOCTL_STORAGE_EJECT_MEDIA. Ты на него говоришь успех, но не шлешь вниз по стеку.

    Удачи.
     
  5. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Сейчас другой проект, но необходимо добиться, чтобы система считала что диск поменялся.

    Мой драйвер является нижним фильтром класса. По событию (от приложения) он работает с диском. На этом этапе система не должна иметь доступ к диску. После окончания работы - система должна поверить, что диск извлечён.

    Отвеча как вы указали. Но иногда SCSIOP_READ_CAPACITY просто не приходит. Сразу приходят запросы на чтение.

    Как завтавить систему прислать SCSIOP_READ_CAPACITY ?