Вопрос про виртуальные диски
От: bazis1 Канада  
Дата: 22.10.09 08:03
Оценка:
В свое время написал простенький драйвер виртуальных дисков, создающий блочные устройства и регистрирующий GUID_DEVINTERFACE_VOLUME. На XP все работало отлично, но прогнав под Win7, обнаружилась интересная особенность: read-only диски работают столь же отлично, но вот в read-write режиме NTFS монтируется от 30 секунд до нескольких минут. Отладчик показывает рандомные exception-ы внутри NTFS в разных местах.
Под Win7 виртуальные диски реализуются элементарно через Virtual Storport Miniport, но в XP этой функции нет; есть только scsiport. Соответственно, вопрос: есть-ли какой-нибудь универсальный способ?
Пробовал навскидку SCSIPORT с интерфейсом Internal, выдает STATUS_NO_SUCH_DEVICE. Пробовал регистрировать GUID_DEVINTERFACE_STORAGE_PORT для обычного PnP устройства, приходит IRP_MJ_SYSTEM_CONTROL (WMI) с Minor=0xFF и больше ничего. Кто как решал задачу?
Re: Вопрос про виртуальные диски
От: eagersh  
Дата: 23.10.09 23:00
Оценка:
Здравствуйте, bazis1, Вы писали:

B>В свое время написал простенький драйвер виртуальных дисков, создающий блочные устройства и регистрирующий GUID_DEVINTERFACE_VOLUME. На XP все работало отлично, но прогнав под Win7, обнаружилась интересная особенность: read-only диски работают столь же отлично, но вот в read-write режиме NTFS монтируется от 30 секунд до нескольких минут. Отладчик показывает рандомные exception-ы внутри NTFS в разных местах.

B>Под Win7 виртуальные диски реализуются элементарно через Virtual Storport Miniport, но в XP этой функции нет; есть только scsiport. Соответственно, вопрос: есть-ли какой-нибудь универсальный способ?
B>Пробовал навскидку SCSIPORT с интерфейсом Internal, выдает STATUS_NO_SUCH_DEVICE. Пробовал регистрировать GUID_DEVINTERFACE_STORAGE_PORT для обычного PnP устройства, приходит IRP_MJ_SYSTEM_CONTROL (WMI) с Minor=0xFF и больше ничего. Кто как решал задачу?
Class disk driver аналогично disk.sys.
Решение работает для все версий Windows хотя для Windows 7 еще не отлаженно до конца.
Re[2]: Вопрос про виртуальные диски
От: bazis1 Канада  
Дата: 25.10.09 08:10
Оценка:
Здравствуйте, eagersh, Вы писали:

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


B>>В свое время написал простенький драйвер виртуальных дисков, создающий блочные устройства и регистрирующий GUID_DEVINTERFACE_VOLUME. На XP все работало отлично, но прогнав под Win7, обнаружилась интересная особенность: read-only диски работают столь же отлично, но вот в read-write режиме NTFS монтируется от 30 секунд до нескольких минут. Отладчик показывает рандомные exception-ы внутри NTFS в разных местах.

B>>Под Win7 виртуальные диски реализуются элементарно через Virtual Storport Miniport, но в XP этой функции нет; есть только scsiport. Соответственно, вопрос: есть-ли какой-нибудь универсальный способ?
B>>Пробовал навскидку SCSIPORT с интерфейсом Internal, выдает STATUS_NO_SUCH_DEVICE. Пробовал регистрировать GUID_DEVINTERFACE_STORAGE_PORT для обычного PnP устройства, приходит IRP_MJ_SYSTEM_CONTROL (WMI) с Minor=0xFF и больше ничего. Кто как решал задачу?
E>Class disk driver аналогично disk.sys.
E>Решение работает для все версий Windows хотя для Windows 7 еще не отлаженно до конца.

Смотрел. Думал. Рассматривал. Увы, такое решение будет раза в 3-4 более громоздкое чем даже связка из Volume для XP и Storport для 7. А реализовать свой полноценный SCSI-порт (не минипорт) Вы не пробовали? Все упирается в тяжелую реализацию WMI, или есть другие решения?
Re[3]: Вопрос про виртуальные диски
От: IakovK  
Дата: 26.10.09 12:33
Оценка:
B>А реализовать свой полноценный SCSI-порт (не минипорт) Вы не пробовали? Все упирается в тяжелую реализацию WMI, или есть другие решения?

Я пробовал. Но только для дисков. И без WMI. Не очень сложно получилось. Работает вроде.
Re[4]: Вопрос про виртуальные диски
От: bazis1 Канада  
Дата: 26.10.09 12:36
Оценка:
Здравствуйте, IakovK, Вы писали:

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


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

Хм. Тогда вопрос, что я делаю не так? После регистрации GUID_DEVINTERFACE_STORAGEPORT (unnamed device) приходит WMI IRP и больше ничего. Ваша реализация что-нибудь дополнительное далала кроме вызова IoRegisterDeviceInterface()?
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ы моему драйверу. Я их обрабатываю как надо, и все работает.
Re[6]: Вопрос про виртуальные диски
От: bazis1 Канада  
Дата: 26.10.09 13:18
Оценка:
Хе-хе. А слона-то я и не приметил. Совсем забыл про этот способ. Спасибо, попробую.

<...excess quoted lines suppressed...>
Re[3]: Вопрос про виртуальные диски
От: eagersh  
Дата: 27.10.09 02:00
Оценка:
Здравствуйте, bazis1, Вы писали:

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


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


B>>>В свое время написал простенький драйвер виртуальных дисков, создающий блочные устройства и регистрирующий GUID_DEVINTERFACE_VOLUME. На XP все работало отлично, но прогнав под Win7, обнаружилась интересная особенность: read-only диски работают столь же отлично, но вот в read-write режиме NTFS монтируется от 30 секунд до нескольких минут. Отладчик показывает рандомные exception-ы внутри NTFS в разных местах.

B>>>Под Win7 виртуальные диски реализуются элементарно через Virtual Storport Miniport, но в XP этой функции нет; есть только scsiport. Соответственно, вопрос: есть-ли какой-нибудь универсальный способ?
B>>>Пробовал навскидку SCSIPORT с интерфейсом Internal, выдает STATUS_NO_SUCH_DEVICE. Пробовал регистрировать GUID_DEVINTERFACE_STORAGE_PORT для обычного PnP устройства, приходит IRP_MJ_SYSTEM_CONTROL (WMI) с Minor=0xFF и больше ничего. Кто как решал задачу?
E>>Class disk driver аналогично disk.sys.
E>>Решение работает для все версий Windows хотя для Windows 7 еще не отлаженно до конца.

B>Смотрел. Думал. Рассматривал. Увы, такое решение будет раза в 3-4 более громоздкое чем даже связка из Volume для XP и Storport для 7. А реализовать свой полноценный SCSI-порт (не минипорт) Вы не пробовали? Все упирается в тяжелую реализацию WMI, или есть другие решения?

Не сильно громоздко. Я думаю что проще чем legacy SCSI-port . Это решение было разработанно для Win2000 и поддержанно для следующих версий Windows.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.