Re[5]: Вопрос про виртуальные диски
От: IakovK  
Дата: 26.10.09 12:56
Оценка: 10 (1)
Здравствуйте, bazis1, Вы писали:

B>Здравствуйте, IakovK, Вы писали:


IK>>А реализовать свой полноценный SCSI-порт (не минипорт) Вы не пробовали? Все упирается в тяжелую реализацию WMI, или есть другие решения?


IK>>Я пробовал. Но только для дисков. И без WMI. Не очень сложно получилось. Работает вроде.

B>Хм. Тогда вопрос, что я делаю не так? После регистрации GUID_DEVINTERFACE_STORAGEPORT (unnamed device) приходит WMI IRP и больше ничего. Ваша реализация что-нибудь дополнительное далала кроме вызова IoRegisterDeviceInterface()?

Я GUID_DEVINTERFACE_STORAGEPORT не регистрирую. Моя реализация основана на коде busenum из комплекта <WDKDIR>\src\general\toaster. Реализация достаточно простая и незатейливая:
1. Создаем PDO в ответ на соответствующий IOCTL;
2. В ответ на соответствующие запросы от PnP manager выдаем правильный Device Id, а именно:
#define BUS_HARDWARE_IDS L"SCSI\\DiskVDSoft  VirtualDisk     0001\0" \
                         L"SCSI\\DiskVDSoft  VirtualDisk     \0" \
                         L"SCSI\\DiskVDSoft  \0" \
                         L"SCSI\\VDSoft  VirtualDisk     1\0" \
                         L"VDSoft  VirtualDisk     1\0" \
                         L"GenDisk\0"
#define BUS_HARDWARE_IDS_LENGTH sizeof (BUS_HARDWARE_IDS)

//#define BUS_DEVICE_ID L"scsi\\Disk&ven_DiskVendor&prod_VirtualDisk&rev_1.0"
#define BUS_DEVICE_ID L"SCSI\\DiskVDSoft  VirtualDisk     0001"
#define BUS_DEVICE_ID_LENGTH sizeof (BUS_DEVICE_ID)

#define BUSENUM_COMPATIBLE_IDS L"GenDisk\0"
#define BUSENUM_COMPATIBLE_IDS_LENGTH sizeof(BUSENUM_COMPATIBLE_IDS)

В результате к моему PDO подключается disk.sys, который в свою очередь посылает IOCTLы моему драйверу. Я их обрабатываю как надо, и все работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.