Re[11]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: assad Россия  
Дата: 09.05.09 07:18
Оценка:
Здравствуйте, Ulin, Вы писали:
да в общем случае требуется доступ на запись

U>Если операции импортирования избежать никак нельзя (я так понимаю, проблема будет при любом способе эмуляции диска, даже с минипортом?), то это может действительно стать проблемой для кастомера. Кстати, импортирование требует write-доступа к диску? У нас сейчас используется строго read-only, и не факт, что доступ к образу на запись будет вообще.
Re[11]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: assad Россия  
Дата: 09.05.09 07:21
Оценка:
Здравствуйте, eagersh, Вы писали:

я конечно не очень уверен в словах но по моему pdo для дин дисков создает dmio.sys

Излишнее цитирование. См. правила и потом не удивляйся действиям модератора! — Модератор
Re[15]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: IakovK  
Дата: 10.05.09 19:57
Оценка: 2 (1)
Здравствуйте, Ulin, Вы писали:

U>Непосредственно образ диска полностью абстрактный — я просто форварджу все IO в user-mode, где их обрабатывает один из динамически подключаемых плагинов.

Я тоже.

U>Насколько я понял, покопавшись еще немного в этой теме, получив от bus'а PDO для очередного замонтированного диска, мне достаточно создать такой FDO, к которому PnP подключит сверху storage class driver (disk.sys).

Неверно. Ваша забота — создать PDO для вашего диска. И только (в смысле — никаких других DO не нужно).
U>Где-то еще выше станет PartitionManager. Соответственно, disk.sys начнет выполнять всю грязную работу по распознаванию партишенов, посылая моему девайсу некоторые IOCTL (вроде GET_DISK_GEOMETRY, но не GET_DRIVE_LAYOUT), и пачку запросов на чтение (я так понимаю, уже в виде SRB, а не как IRP). Соответственно, моей основной заботой с этого момента станет обработка read/write. Поправьте меня, плиз, если я где-то в этой общей схеме не прав.
Остальное верно. Можно добавить только, что SRB тоже приходят как IRP (IRP_MJ_SCSI aka IRP_MJ_INTERNAL_DEVICE_CONTROL).
U>В общем, теперь возникает вопрос, как собственно заставить PnP manager'а прицепить ко мне наверх disk.sys. Просмотр msdn пока ничего не дает на эту тему. Этот момент (именно касательно disk.sys, или в виде какого-то шаблона, из которого можно вывести мой случай) вообще где-то документирован?
А что именно вас интересует "именно касательно disk.sys". В обсуждаемом отношении у него нет никакой специфики.

U>Все, что я пока нашел, это один пост на osronline, из которого я понял, что мой PDO должен иметь некий специфический HardwareId (GenDisk вроде бы).

Один только? Дайте ссылку, пожалуйста.
U>А подключаемый в стек новый девайс должен иметь тип MASS_STORAGE
Вообще-то, все это делается так:
1. Создаем PDO:

    status = IoCreateDevice(FdoData->Self->DriverObject,
                sizeof (PDO_DEVICE_DATA),
                NULL,
                FILE_DEVICE_MASS_STORAGE,
                FILE_AUTOGENERATED_DEVICE_NAME |FILE_DEVICE_SECURE_OPEN,
                FALSE,
                &pdo);
    if (!NT_SUCCESS (status))
    {
        return status;
    }

    pdoData = (PPDO_DEVICE_DATA) pdo->DeviceExtension;

    //
    // Copy the hardware IDs
    //

    pdoData->HardwareIDs =
            ExAllocatePoolWithTag (NonPagedPool, BUS_HARDWARE_IDS_LENGTH, BUSENUM_POOL_TAG);

    if (NULL == pdoData->HardwareIDs) {
        IoDeleteDevice(pdo);
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    RtlCopyMemory (pdoData->HardwareIDs, BUS_HARDWARE_IDS, BUS_HARDWARE_IDS_LENGTH);
    pdoData->SerialNo = AddDisk->handle;
    status = Bus_InitializePdo (pdo, FdoData, AddDisk);
    if (!NT_SUCCESS (status))
    {
        return status;
    }

    //
    // Device Relation changes if a new pdo is created. So let
    // the PNP system now about that. This forces it to send bunch of pnp
    // queries and cause the function driver to be loaded.
    //

    IoInvalidateDeviceRelations (FdoData->UnderlyingPDO, BusRelations);


То есть, вызываем IoCreateDevice, а затем IoInvalidateDeviceRelations. В ответ на IoInvalidateDeviceRelations ваш драйвер получит кучу запросов IRP_MJ_PNP, в частности, IRP_MN_QUERY_ID. Именно в ответ на этот запрос вы должны выдать DeviceID и прочее. На основе этой информации система найдет драйвер для FDO. Вам нужно сформировать такие IDы, чтобы этим драйвером оказался disk.sys, то есть, попросту говоря, чтобы система подумала, что это у вас диск. По этому поводу см. Identifiers for SCSI Devices (это ссылка на локально установленный WDK 6000). Поэтому,
2. Обрабатывем IRP_MN_QUERY_ID:

    switch (stack->Parameters.QueryId.IdType) {

    case BusQueryDeviceID:
///////////////
        break;

    case BusQueryInstanceID:
///////////////
        break;


    case BusQueryHardwareIDs:
///////////////
        break;


    case BusQueryCompatibleIDs:
///////////////
        break;

    default:

        status = Irp->IoStatus.Status;

    }

(у меня этот код целиком взят из toaster, так что тексты обработчиков выбросил для ясности). Единственное, что я изменил, это строки, возвращаемые драйвером, потому что нужно, чтобы это был не тостер, а диск.
Re[16]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: Ulin США  
Дата: 11.05.09 07:37
Оценка:
Здравствуйте, IakovK, Вы писали:

IK>А что именно вас интересует "именно касательно disk.sys". В обсуждаемом отношении у него нет никакой специфики.


Я имел в виду те специфичные ID, благодаря которым подцепится именно disk. Собственно, я так понял вы на них ссылку ниже и приводите.
Эти же ID упоминались и в том посте, про который я говорил. Только там Maxim Shatskih немного не такую картинку дает, как в MSDN написано.

В общем, попробовал я и как Максим писал, и как в MSDN:

DeviceId: L"SCSI\\DiskVENDORX_XXX_____________0004"

HardwareIds: L"SCSI\\DiskVENDORX_XXX_____________\0" \
L"SCSI\\DiskVENDORX_\0" \
L"SCSI\\DiskVENDORX_XXX_____________0\0" \
L"VENDORX_XXX_____________0\0\0" \

InstanceId: L"00&00&01" // encode Path/Target/Lun in hex, separated with &.

CompatibleIDs: L"GenDisk"

Результат, в принципе, одинаковый — в списке устройств в категории DiskDrives появляется новый диск. Правда, с восклицательным знаком.
По логам видно следующее:

PDO IRP_MN_QUERY_RESOURCE_REQUIREMENTS
PDO IRP_MN_QUERY_BUS_INFORMATION
PDO IRP_MN_QUERY_RESOURCES
PDO IRP_MN_REMOVE_DEVICE

DeviceTree от OSRONLINE показывает мой новый PDO с выставленными мной IDs — с виду все гуд.

Я так понимаю, теперь проблема в том, что не обрабатываются уже какие-то disk-specific запросы? Или я где-то что-то недоговорил PnP manager'у (вроде resources)?
Re[17]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: Ulin США  
Дата: 11.05.09 07:43
Оценка:
U>DeviceTree от OSRONLINE показывает мой новый PDO с выставленными мной IDs — с виду все гуд.

небольшое уточнение — PDO в этом дереве никто не подхватил — ниже уже никто не attached
Re[17]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: Ulin США  
Дата: 11.05.09 10:39
Оценка:
Здравствуйте, Ulin, Вы писали:

U>Я так понимаю, теперь проблема в том, что не обрабатываются уже какие-то disk-specific запросы? Или я где-то что-то недоговорил PnP manager'у (вроде resources)?


Все, кажется, разобрался сам — действительно, начали сыпаться IRP_MJ_SCSI. После обработки самых первых (типа SRB_FUNCTION_CLAIM_DEVICE и SRB_FUNCTION_EXECUTE_SCSI) к моему PDO успешно приаттачилось все, что нужно.

Еще раз всем спасибо!
Re[17]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: IakovK  
Дата: 12.05.09 07:24
Оценка:
Здравствуйте, Ulin, Вы писали:

U>Только там Maxim Shatskih немного не такую картинку дает, как в MSDN написано.

Я так понял, что это то же самое

U>В общем, попробовал я и как Максим писал, и как в MSDN:


U>DeviceId: L"SCSI\\DiskVENDORX_XXX_____________0004"


U>HardwareIds: L"SCSI\\DiskVENDORX_XXX_____________\0" \

U> L"SCSI\\DiskVENDORX_\0" \
U> L"SCSI\\DiskVENDORX_XXX_____________0\0" \
U> L"VENDORX_XXX_____________0\0\0" \

U>InstanceId: L"00&00&01" // encode Path/Target/Lun in hex, separated with &.


U>CompatibleIDs: L"GenDisk"

InstanceId необязательно

U>Результат, в принципе, одинаковый — в списке устройств в категории DiskDrives появляется новый диск.

Ну, все правильно. Первый шаг сделан.
U>Правда, с восклицательным знаком.
А это означает, что после первого шага нужны другие: Disk.sys загружается, вызывается его AddDevice с вашим PDO; пытается с ним что-то делать и не получается — возвращает код ошибкию Отсюда и IRP_MN_REMOVE_DEVICE.
U>По логам видно следующее:

U>PDO IRP_MN_QUERY_RESOURCE_REQUIREMENTS

U>PDO IRP_MN_QUERY_BUS_INFORMATION
U>PDO IRP_MN_QUERY_RESOURCES
Это нормально — при добавлении девайса
U>PDO IRP_MN_REMOVE_DEVICE
А это — результат неудачи в disk.sys!AddDevice

U>DeviceTree от OSRONLINE показывает мой новый PDO с выставленными мной IDs — с виду все гуд.

хорошо
U>Я так понимаю, теперь проблема в том, что не обрабатываются уже какие-то disk-specific запросы?
Именно так
U>Или я где-то что-то недоговорил PnP manager'у (вроде resources)?
Чтобы разобраться, можно скомпилировать отладочные версии disk.sys и classpnp.sys и посмотреть в отладчике, что происходит.
Re[12]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: Аноним  
Дата: 12.05.09 09:03
Оценка:
Здравствуйте, assad, Вы писали:

A>я конечно не очень уверен в словах но по моему pdo для дин дисков создает dmio.sys

DMIO I/O operations
Disk class driver на рисунке — это disk.sys.
Re[18]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: eagersh  
Дата: 13.05.09 17:55
Оценка:
Здравствуйте, IakovK, Вы писали:

Правила форума нарушены.
— оверквотинг
Правила можно найти в разделе FAQ данного форума и\или ресурса.
Нарушение правил может повлечь за собой санкции, описанные там же — модератор
IK>Чтобы разобраться, можно скомпилировать отладочные версии disk.sys и classpnp.sys и посмотреть в отладчике, что происходит.

Можно также attach upper class filter который будет переxватывать все PnP, Power и IOCTL Irps и посмотреть какие запросы приходят на реальный hard drive. Это вы увидите все что приходит перед disk.sys. И посмотреть все что идет после
disk.sys attach lower class filter. Example is in toaster sample directory of WDK.

У меня вопрос. Какой type of driver вы используете для Object bus driver? MASS_STORAGE, FILE_CONTROLLER или FILE_DEVICE_UNKNOWN?
Re[19]: Поддержка Dynamic Disks для VirtualDiskDriver.
От: IakovK  
Дата: 13.05.09 19:46
Оценка:
E>У меня вопрос. Какой type of driver вы используете для Object bus driver? MASS_STORAGE, FILE_CONTROLLER или FILE_DEVICE_UNKNOWN?
FILE_DEVICE_MASS_STORAGE
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.