AddDevice фильтра тома и виртуальное устройство FILE_DEVICE_DISK

Тема в разделе "WASM.NT.KERNEL", создана пользователем ronDonand, 14 окт 2011.

  1. ronDonand

    ronDonand New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2010
    Сообщения:
    6
    Подскажите пожалуйста следующее. Требуется установить фильтр между драйвером файловой системы и драйвером тома. Собственно, сам фильтр - это драйвер DiscCryptor'a, выполняющий шифрование содержимого тома. Для физических устройств объект-устройство данного драйвера встраивается в стек драйвера тома при вызове диспетчером PnP функции AddDevice, после чего он перехватывает все обращения драйвера ФС к драйверу тома. Однако, мне необходимо сделать так, чтобы DiscCryptor встраивался в стек драйвера виртуального диска. При этом нет никакого физического устройства, при появлении котрого в системе была бы вызвана функция AddDevice, поэтому DiskCryptor не подключается к созданному драйвером виртуального диска объекту-устройству FILE_DEVICE_DISK. Подскажите, какие есть пути решения данной задачи: обеспечить подключение подобного драйвера-фильтра тома к виртуальному объекту-устройству, не имеющему никакого PDO, для которого была бы вызвана функция AddDevice. Возможно есть какой-то способ создать в драйвере виртуального диска такой объект, чтобы сработала функция AddDevice DiskCryptor'a? Или для этого необходимо дописать некоторый код в DiskCryptor? Сам виртуальный диск это пока filedisk, взятый отсюда vdisks.
     
  2. tchunya

    tchunya New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    29
    Необходимо знать механизм создания виртуального тома, например, если виртуальный том создается по запросу, то сесть на этот запрос и после его успешного выполнения, сесть поверх созданного устройства
     
  3. ronDonand

    ronDonand New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2010
    Сообщения:
    6
    tchunya, спасибо, этот вариант вполне подходит мне. Хотелось бы обобщить - получается в Windows не существуют механизмы, позволяющие уведомлять о появлении в системе виртуальных дисковых устройств? Т.е., как, например, уведомления о появлении новой файловой системы, или о появлении нового физического устройства (от PnP диспетчера).
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
  5. tchunya

    tchunya New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    29
    Проблема в том, что для создания виртуального тома может использоваться несколько различных методик: например BestCrypt создает виртуальную шину, и потом создает дочерние устройства этой шины. Можно также руками создать объект устройства и напрямую уведомить MountManager для отображения буковки в user-mode. Поэтому общей методики для решения этой задачи нет :dntknw:
     
  6. ronDonand

    ronDonand New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2010
    Сообщения:
    6
    знаю функцию DefineDosDevice, которая сопоставляет устройство с буквой раздела. А уведомить для отображения буквы - можно по-подробней? В этом случае том будет доступен при перечислении томов, например, с помощью FindFirstVolume/FindNextVolume?
     
  7. tchunya

    tchunya New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    29
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff561593(v=VS.85).aspx, IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION, например
     
  8. ronDonand

    ronDonand New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2010
    Сообщения:
    6
    tchunya, спасибо. Воспользовался этим IOCTL, после него отправляю IOCTL_MOUNTMGR_CREATE_POINT. Когда указываю конкретное значение буквы диска, в виде символьной ссылки, типа "\\DosDevices\\X:", то возвращает STATUS_INVALID_PARAMETER. Если указываю то же имя, но без двоеточия в конце, как и любое другое в \\DosDevices - то ссылка создается, но без имени в виде \\?\Volume{GUID}\. Если просто "\\DosDevices\\", например, или любое другое имя ссылки, являющееся неправильным - то создаются и ссылка с произвольной буквой и ссылка вида \\?\Volume{GUID}\. Хотелось бы узнать, как в этой ситуации конкретно задавать имя ссылки, чтобы возвращался статус 0, а не STATUS_OBJECT_NAME_INVALID. А то в WDK что-то не нашел именно этого.
    А так же другой вопрос - при создании буквы тома, она не отображается в том же explorer. Как я понял, следует вызывать для этого функцию BroadcastSystemMessage, чтобы уведомить систему о появлении нового устройства?
     
  9. ronDonand

    ronDonand New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2010
    Сообщения:
    6
    С предыдущими вопросами разобрался. Надо просто передать пустую строку, и тогда mount manager присвоит свободную букву и вернет STATUS_SUCCESS. С вызовом BroadcastSystemMessage тоже все нормально и том с присвоенной mount manager'ом буквой появляется в explorer. Однако при попытке открытия его, выдается сообщение "X:\ ссылается на недоступное место...". Хотя при вызове той же DefineDosDevice том появляется в системе и доступ к нему происходит без всяких проблем. Символьная ссылка, созданная mount manager'ом при вызове IOCTL_MOUNTMGR_CREATE_POINT, указывает на то же устройство, с которым сопоставляется буква диска при вызове DefineDosDevice. Есть какие нибудь идеи по поводу того, в чем может заключаться проблема?

    Собственно именно таким способом я пытаюсь добавить диск, т.к. просто вызов DefineDosDevice, не обеспечивает доступность тома при перечислении томов с помощью FindFirstVolume/FindNextVolume. Насколько я понял, эти функции используют GUID перечисляемых томов, и , возможно, при создании буквы с помощью mount manager'a виртуальный том станет доступен при перечислении с помощью вышеназванных функций.