Привет всем!
В качестве курсового проекта я пишу драйвер виртуального рамдиска.
Я создал устройство (сам диск) с именем \\Device\\HarddiskN\\DR0 (N вычисляется),
две символьные ссылки на него: \\Device\\HarddiskN\\Partition0 и \\??GLOBAL\\PhysicalDriveN, также я зарегистрировал интерфейс
с гуидом GUID_DEVINTERFACE_DISK и написал обработчики всех приходящих IOCTL-ов. После сих действий система увидела мой диск в
диспетчере томов и правильно определила все его параметры. Но возникла следующая проблема — как уведомить систему о том, что
на моем диске есть разделы? На запрос IOCTL_DISK_GET_DRIVE_LAYOUT_EX, который приходит сразу после загрузки драйвера я
возвращаю таблицу разделов, первый из которых содержит нужные мне параметры, также я создаю объект устройство
с именем \\Device\\HarddiskN\\DP(M)K-L+P (M, K, L вычисляются). Система в диспетчере томов видит этот раздел, как созданный, но
не форматированный и выдает ошибку, что он не задействован — это верно, поскольку системный драйвер FtDisk не создал
устройство \\Device\\HarddiskVolumeR. Но вот как заставить FtDisk сделать это? В Соломоне&Руссиновиче написано что-то вроде
"PartMgr.sys" по закрытому интерфейсу должен уведомить его, когда драйвер создаст объект-устройство-раздел
(\\Device\\HarddiskN\\DP(M)K-L+P). Но, как я понимаю, никакх уведомлений не приходит. Какие действия еще нужно выполнить?
Какого типа должно быть это устройство? На него должны приходить какие-либо IOCTL запросы (у меня не приходят никакие)?
Надо ли вешать на него какие-либо интерфейсы (Хотя они на него не вешаются)? И что можно почитать по такой специфичной теме?
Здравствуйте, Maxim S. Shatskih, Вы писали:
MSS>Надо написать PnP bus driver, в котором разделы будут "детками" основного диска. Всего-то.
MSS>Disk.sys/ClassPnP.sys так и сделан.
Да, я понимаю какого типа драйвер я пишу, но вопрос в том, что должен сделать мой драйвер, кроме создания устройства
с нужным именем (например \Device\Harddisk1\DP(1)0x7e00-0x1f58a00+0), чтобы активировался системный драйвер FtDisk для
создания устройства \Device\HarddiskVolumeN и связанных с ним символьных ссылок? Пример из ДДК с Disk.sys не отвечает
на этот вопрос — за кучей навернутых абстракций теряется вся суть.
Re[3]: Проблема с написанием RamDisk
От:
Аноним
Дата:
05.05.08 13:07
Оценка:
Он должен быть storage miniport драйвером, т.е. быть драйвером жесткого диска (виртуального).
B>с нужным именем (например \Device\Harddisk1\DP(1)0x7e00-0x1f58a00+0), чтобы активировался системный драйвер FtDisk для
1) Устройство раздела обязано быть PnP PDO
2) Оно обязано быть childом устройства "диск".
3) Никто из них не должен иметь флажка FILE_REMOVABLE_MEDIA
B>на этот вопрос — за кучей навернутых абстракций теряется вся суть.
читать сорцы — тоже умение, а навернутых абстракций в кернеле нет, там все в лоб и конкретно.
Здравствуйте, Maxim S. Shatskih, Вы писали:
B>>с нужным именем (например \Device\Harddisk1\DP(1)0x7e00-0x1f58a00+0), чтобы активировался системный драйвер FtDisk для
MSS>1) Устройство раздела обязано быть PnP PDO MSS>2) Оно обязано быть childом устройства "диск". MSS>3) Никто из них не должен иметь флажка FILE_REMOVABLE_MEDIA
B>>на этот вопрос — за кучей навернутых абстракций теряется вся суть.
MSS> читать сорцы — тоже умение, а навернутых абстракций в кернеле нет, там все в лоб и конкретно.
У меня были выполнены 1 и 3 условия. Но вот что подразумевается под "Оно обязано быть childом устройства "диск"?
В хелпе к ДДК есть красивая картинка дерева дисковых устройств, где из устройства FDO "диск" выходят ветви к многим PDO "раздел", но разве
такая связь где-то задается в системе? Ведь в стек устройств эти устройства-разделы не заносятся (ибо они сами PDO). Посмотрев исходники
Disk.sys при я обнаружил, что при создании устройства-раздела ничего такого, что сообщало бы системе об этой связи родитель-потомок не производится.
Всего лишь они заносят друг друга в свои расширения устройства — эта информация системе нафиг не сдалась — она только для нашего использования..
B>У меня были выполнены 1 и 3 условия. Но вот что подразумевается под "Оно обязано быть childом устройства "диск"?
Диск его должен в BusRelations возвращать.
B>В хелпе к ДДК есть красивая картинка дерева дисковых устройств, где из устройства FDO "диск" выходят ветви к многим PDO "раздел", но разве B>такая связь где-то задается в системе?
Да, в ответе диска на BusRelations.
PartMgr на самом деле всего-то корчит из себя мини-PnP, шлет диску вниз BusRelations, а потом нотифицирует о приезде разделов (PDO из ответа на BusRelations) все volume managers, что зарегистрированы там с верхнего края.
А>Он должен быть storage miniport драйвером, т.е. быть драйвером жесткого диска (виртуального).
Так тоже можно, только там проблемы с тем, что функции минипорта зовутся в хитром контексте под локами, и из них ничто больше не позовешь, кроме ScsiPortNotification и обращений к железке.
Здравствуйте, Maxim S. Shatskih, Вы писали:
B>>У меня были выполнены 1 и 3 условия. Но вот что подразумевается под "Оно обязано быть childом устройства "диск"?
MSS>Диск его должен в BusRelations возвращать.
B>>В хелпе к ДДК есть красивая картинка дерева дисковых устройств, где из устройства FDO "диск" выходят ветви к многим PDO "раздел", но разве B>>такая связь где-то задается в системе?
MSS>Да, в ответе диска на BusRelations.
MSS>PartMgr на самом деле всего-то корчит из себя мини-PnP, шлет диску вниз BusRelations, а потом нотифицирует о приезде разделов (PDO из ответа на BusRelations) все volume managers, что зарегистрированы там с верхнего края.
Добавил я после создания устройства IoInvalidateDeviceRelations, чтобы инициировать запрос IRP_MN_QUERY_DEVICE_RELATIONS,
сделал обработчик этого запроса, возвращающий единственную связь. Только вот система не разделила моего оптимизма, все стало
заканчиваться синими экранами NO_MORE_IRP_STACK_LOCATIONS...