Всем привет! Есть фильтр файловых систем, который вешается на все файловые системы и монтированные тома (подобно примеру из IFS: sfilter). Есть такая задача: при монтировании нового тома, т.е при получении IRP_MJ_FILE_SYSTEM_CONTROL : IRP_MN_MOUNT_VOLUME нужно при определённых условиях тут же демонтировать том, т.е сначала надо убедиться что том действительно смонтирован, а потом его демонтировать. Чтобы это сделать прямо из обработчика этого IRP нужно послать сначала IRP_MJ_CREATE файловой системе, которая лежить ниже по стеку, т.е открыть объект том, получить его FILE_OBJECT, затем используя этот FILE_OBJECT нужно послать IRP_MJ_FILE_SYSTEM_CONTROL : IRP_MN_USER_FS_REQUEST и выставить IrpSp->Parameters.FileSystemControl.FsControlCode = FSCTL_DISMOUNT_VOLUME. Чтобы послать IRP_MJ_CREATE нижележащей файловой системе я вызываю IoCreateFileSpecifyDeviceObjectHint с DeviceObject = объекту нижележащей файловой системы, как и указано в документации, но в результате получается дедлок. Не могу понять почему это происходит, ведь том уже смонтирован нижележащей файловой системой, значит уже можно открывать на него хэндл и более того, я же шлю IRP не на верхушку стека, а только туда куда надо, дедлоков быть не должно. Попробовал поотлаживать всё это дело отладчиком ядра, всё виснет когда IoCreateFileSpecifyDeviceObjectHint вызывает внутри IoCreateFile, но ведь IoCreateFile шлёт IRP на верхушку стека!! Что за ерунда получается, мой хинт просто проигнорировали ? Конечно, есть и альтернативный вариант решения этой проблемы, сохранять допустим имя устройства, создавать working item или в отдельном потоке производить демонтирование нужных томов, но как-то это криво, мне почему-то кажется что IoCreateFileSpecifyDeviceObjectHint должен работать. У кого есть какие сображения по данному вопросу ? Буду рад выслушать.
Проблема решена. Дело в том что из MOUNT'а нельзя вызывать даже IoCreateFileSpecifyDeviceObjectHint, т.к эта функция хотя и посылает IRP_MJ_CREATE пакет нужному драйверу, обращается перед этим к объектному менеджеру чтобы распарсить имя файла (т.е вызывает IopParseDevice) а это приводить к повторному запросу MOUNT, т.к устройство ещё не смонтировано, в результате - deadlock. Единственный способ открыть файл из MOUNT'а, это сделать так называемый direct volume open, а потом через него слать DISMOUNT (не знаю получится ли так) но в MSDN сказано: В Vista есть функция IoCreateFileEx, о ней написано: Но это только в висте, в XP похоже нет (или я просто ещё не нашёл) нормального документированного способа работать с томом из MOUNT'а...