Здравствуйте, 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ы моему драйверу. Я их обрабатываю как надо, и все работает.