Знаю, что подобный топик уже подымался на форуме, но всё же рискну его поднять ещё раз с другими условиями.
Пишу фильтр-драйвер файловой системы, при монтировании новых 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 нет смысла, хочется синхронности. Также не помогает перебор символических ссылок в глобальном каталоге (описал почему).