(Rtl)IoVolumeDeviceToDosName bug?

Home Forums Discussions General Discussion (Rtl)IoVolumeDeviceToDosName bug?

This topic contains 1 reply, has 1 voice, and was last updated by  Asterisk 11 years, 11 months ago.

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #4959

    Asterisk
    Participant

    Знаю, что подобный топик уже подымался на форуме, но всё же рискну его поднять ещё раз с другими условиями.

    Пишу фильтр-драйвер файловой системы, при монтировании новых Volume делаю вызов XXXVolumeDeviceToDosName, дабы получить букву смонтированного диска.
    Всё было бы хорошо для обычных разделов, но столкнулся с такой историей:
    1. Диск E смонтирован в папку на диске D (пути к файлам D:DiskEfile.ext);
    2. Во время обработки IRP_MJ_CREATE запрос на букву диска отрабатывает;
    3. При попытке получить имя диска для DeviceHarddiskVolume3 (D:DiskE), сразу после монтирования происходит подвисание системы (с вероятностью 50%).

    Что удалось отресёрчить:
    1. В IDA нашел функцию ядра, она использует эвент и запрос к DeviceObject драйвера, ждёт сигнальности эвента и потом делает парсинг символических ссылок;
    2. Монтирование происходит в контексте winlogon-а;
    3. Подобные диски монтируются репарс-поинтом, т.е. не имеют ??DiskE символического имени.
    4. Вероятнее всего подвисает KeWaitForSingleObject сразу после IoCallDriver.

    Помогите, кто сталкивался с подобным, как я понимаю оформлять такой запрос в WorkItem нет смысла, хочется синхронности. Также не помогает перебор символических ссылок в глобальном каталоге (описал почему).

    #5849

    Asterisk
    Participant

    проблему решил и решил поделиться причиной:
    Когда идёт монтирование диска, то этого события ожидает несколько драйверов, в том числе и Mount Manager. Которому и посылается запрос на идентификацию буквы. Т.к. это происходит в контексте одного потока, то IoManager не передаёт IRP пакет, потому как занят завершением текущей IPR операции, соответственно не сигналит Event которого ждёт Mount Manger (его синхронизация).
    Что интересно, если оправить WorkItem собирать информацию, то его можно дождаться в контексте текущей обработки IRP. Т.е. это и есть workarround данной ситуации.

    PS: всем спасибо, кто попытался вопрос изучить. Задача была решена давно, буквально через день после поста проблемы. Но написал только сейчас, becouse был занят 🙂
    PSS: Жаль, что ручками парсить такое достаточно трудоёмкое занятие – репарс-поинты NTFS это страшная страшность, так бы отказался от использования данной функции 🙂

Viewing 2 posts - 1 through 2 (of 2 total)

You must be logged in to reply to this topic.