Проблема с написанием RamDisk
От: Blitskrieg  
Дата: 04.05.08 20:00
Оценка:
Привет всем!
В качестве курсового проекта я пишу драйвер виртуального рамдиска.
Я создал устройство (сам диск) с именем \\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 запросы (у меня не приходят никакие)?
Надо ли вешать на него какие-либо интерфейсы (Хотя они на него не вешаются)? И что можно почитать по такой специфичной теме?

Заранее спасибо!
Re: Проблема с написанием RamDisk
От: Maxim S. Shatskih Россия  
Дата: 05.05.08 06:37
Оценка:
Надо написать PnP bus driver, в котором разделы будут "детками" основного диска. Всего-то.

Disk.sys/ClassPnP.sys так и сделан.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: Проблема с написанием RamDisk
От: Blitskrieg  
Дата: 05.05.08 12:57
Оценка:
Здравствуйте, 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 драйвером, т.е. быть драйвером жесткого диска (виртуального).
Re[4]: Проблема с написанием RamDisk
От: Blitskrieg  
Дата: 05.05.08 13:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Он должен быть storage miniport драйвером, т.е. быть драйвером жесткого диска (виртуального).


Вы не правы, посмотрите чем являются коммерческие подобные драйверы — class disk драйвер.
Re[3]: Проблема с написанием RamDisk
От: Maxim S. Shatskih Россия  
Дата: 05.05.08 13:52
Оценка:
B>с нужным именем (например \Device\Harddisk1\DP(1)0x7e00-0x1f58a00+0), чтобы активировался системный драйвер FtDisk для

1) Устройство раздела обязано быть PnP PDO
2) Оно обязано быть childом устройства "диск".
3) Никто из них не должен иметь флажка FILE_REMOVABLE_MEDIA

B>на этот вопрос — за кучей навернутых абстракций теряется вся суть.


читать сорцы — тоже умение, а навернутых абстракций в кернеле нет, там все в лоб и конкретно.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[4]: Проблема с написанием RamDisk
От: Blitskrieg  
Дата: 05.05.08 16:32
Оценка:
Здравствуйте, 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 при я обнаружил, что при создании устройства-раздела ничего такого, что сообщало бы системе об этой связи родитель-потомок не производится.
Всего лишь они заносят друг друга в свои расширения устройства — эта информация системе нафиг не сдалась — она только для нашего использования..
Re[5]: Проблема с написанием RamDisk
От: Maxim S. Shatskih Россия  
Дата: 05.05.08 17:17
Оценка:
B>У меня были выполнены 1 и 3 условия. Но вот что подразумевается под "Оно обязано быть childом устройства "диск"?

Диск его должен в BusRelations возвращать.

B>В хелпе к ДДК есть красивая картинка дерева дисковых устройств, где из устройства FDO "диск" выходят ветви к многим PDO "раздел", но разве

B>такая связь где-то задается в системе?

Да, в ответе диска на BusRelations.

PartMgr на самом деле всего-то корчит из себя мини-PnP, шлет диску вниз BusRelations, а потом нотифицирует о приезде разделов (PDO из ответа на BusRelations) все volume managers, что зарегистрированы там с верхнего края.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[4]: Проблема с написанием RamDisk
От: Maxim S. Shatskih Россия  
Дата: 05.05.08 17:18
Оценка:
А>Он должен быть storage miniport драйвером, т.е. быть драйвером жесткого диска (виртуального).

Так тоже можно, только там проблемы с тем, что функции минипорта зовутся в хитром контексте под локами, и из них ничто больше не позовешь, кроме ScsiPortNotification и обращений к железке.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[6]: Проблема с написанием RamDisk
От: Blitskrieg  
Дата: 08.05.08 18:51
Оценка:
Здравствуйте, 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...
Re[7]: Проблема с написанием RamDisk
От: Blitskrieg  
Дата: 08.05.08 18:53
Оценка:
Обработчик кстати выглядит так:

case IRP_MN_QUERY_DEVICE_RELATIONS: 
        {    
            DEVICE_RELATION_TYPE type =
                irpStack->Parameters.QueryDeviceRelations.Type;

            PDEVICE_RELATIONS deviceRelations = NULL;

            deviceRelations = ExAllocatePoolWithTag(PagedPool, sizeof(DEVICE_RELATIONS), 'Rels');
            RtlZeroMemory(deviceRelations, sizeof(DEVICE_RELATIONS));
            deviceRelations->Count = 1;
            deviceRelations->Objects[0] = devExt->Partition;

            status = ObReferenceObjectByPointer(devExt->Partition, 0, NULL, KernelMode);

            if (!NT_SUCCESS(status))
            {
                KdPrint(("Плохо\n"));
                                COMPLETE_REQUEST(Irp, status, 0);
            }
            else
            {
                KdPrint(("Хорошо\n"));
                COMPLETE_REQUEST(Irp, status, (ULONG_PTR)deviceRelations);
            }
            
            
            
            break;
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.