Здравствуйте, Ulin, Вы писали:
да в общем случае требуется доступ на запись
U>Если операции импортирования избежать никак нельзя (я так понимаю, проблема будет при любом способе эмуляции диска, даже с минипортом?), то это может действительно стать проблемой для кастомера. Кстати, импортирование требует write-доступа к диску? У нас сейчас используется строго read-only, и не факт, что доступ к образу на запись будет вообще.
Re[11]: Поддержка Dynamic Disks для VirtualDiskDriver.
Здравствуйте, 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.
Здравствуйте, IakovK, Вы писали:
IK>А что именно вас интересует "именно касательно disk.sys". В обсуждаемом отношении у него нет никакой специфики.
Я имел в виду те специфичные ID, благодаря которым подцепится именно disk. Собственно, я так понял вы на них ссылку ниже и приводите.
Эти же ID упоминались и в том посте, про который я говорил. Только там Maxim Shatskih немного не такую картинку дает, как в MSDN написано.
В общем, попробовал я и как Максим писал, и как в MSDN:
InstanceId: L"00&00&01" // encode Path/Target/Lun in hex, separated with &.
CompatibleIDs: L"GenDisk"
Результат, в принципе, одинаковый — в списке устройств в категории DiskDrives появляется новый диск. Правда, с восклицательным знаком.
По логам видно следующее:
DeviceTree от OSRONLINE показывает мой новый PDO с выставленными мной IDs — с виду все гуд.
Я так понимаю, теперь проблема в том, что не обрабатываются уже какие-то disk-specific запросы? Или я где-то что-то недоговорил PnP manager'у (вроде resources)?
Re[17]: Поддержка Dynamic Disks для VirtualDiskDriver.
Здравствуйте, Ulin, Вы писали:
U>Я так понимаю, теперь проблема в том, что не обрабатываются уже какие-то disk-specific запросы? Или я где-то что-то недоговорил PnP manager'у (вроде resources)?
Все, кажется, разобрался сам — действительно, начали сыпаться IRP_MJ_SCSI. После обработки самых первых (типа SRB_FUNCTION_CLAIM_DEVICE и SRB_FUNCTION_EXECUTE_SCSI) к моему PDO успешно приаттачилось все, что нужно.
Еще раз всем спасибо!
Re[17]: Поддержка Dynamic Disks для VirtualDiskDriver.
Здравствуйте, 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.
Правила форума нарушены.
— оверквотинг
Правила можно найти в разделе 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.
E>У меня вопрос. Какой type of driver вы используете для Object bus driver? MASS_STORAGE, FILE_CONTROLLER или FILE_DEVICE_UNKNOWN?
FILE_DEVICE_MASS_STORAGE