В свое время написал простенький драйвер виртуальных дисков, создающий блочные устройства и регистрирующий 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 и больше ничего. Кто как решал задачу?
Здравствуйте, 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 еще не отлаженно до конца.
Здравствуйте, 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, или есть другие решения?
Здравствуйте, IakovK, Вы писали:
IK>А реализовать свой полноценный SCSI-порт (не минипорт) Вы не пробовали? Все упирается в тяжелую реализацию WMI, или есть другие решения?
IK>Я пробовал. Но только для дисков. И без WMI. Не очень сложно получилось. Работает вроде.
Хм. Тогда вопрос, что я делаю не так? После регистрации GUID_DEVINTERFACE_STORAGEPORT (unnamed device) приходит WMI IRP и больше ничего. Ваша реализация что-нибудь дополнительное далала кроме вызова IoRegisterDeviceInterface()?
Здравствуйте, 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, а именно:
Здравствуйте, 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.