Как эмулировать устройство SCSI

Давайте нарисуем картину.

Windows предоставляет драйвер порта (шины) SCSI. Драйвер создает FDO для автобуса (FILE_DEVICE_BUS_EXTENDER) а также PDO для каждого устройства, подключенного к шине (FILE_DEVICE_MASS_STORAGE). Мы "подключаем" устройства хранения данных к шинному устройству внутри обработчика запросов PnP.

Windows также предоставляет драйвер класса (для каждого класса устройств), который расположен поверх драйвера порта. Формирует стек устройств с FDO на вершине PDO для каждого дочернего устройства.

Драйвер класса отправляет внутренние ioctl драйверу порта; основной код функции IRP_MJ_SCSI, второстепенный код функции IRP_MN_SCSI_CLASS, SCSI_REQUEST_BLOCK структура заполняется специфичной для запроса информацией.

Драйвер порта управляет связью с устройством (переносит данные из SRB на устройство / переносит данные с устройства на SRB) и завершает запрос.

Теперь представьте, что мы хотим эмулировать SCSI-устройство. Нам нужно разработать драйвер "виртуального порта SCSI (шины)". Этот драйвер создаст FDO для автобуса (FILE_DEVICE_BUS_EXTENDER) а также PDO для каждого устройства, которое мы создадим (FILE_DEVICE_MASS_STORAGE). Мы будем обрабатывать внутренние ioctl, выполнять управление очередями IRP, перемещать данные в / из SRB и т. Д.

Я хочу понять, какое "условие" должно быть выполнено, чтобы заставить Windows "думать", что устройство SCSI реально (так, чтобы оно появлялось внутри проводника и т. Д.). Будет ли драйвер класса автоматически отправлять внутренние ioctl, как только мы создадим устройство, или нам также нужно будет эмулировать эти запросы?

Мои вопросы могут быть глупыми, но мне нужно понять, что происходит, чтобы понять больше. Спасибо за помощь.

1 ответ

Так что это кажется простым.

IRP_MN_QUERY_DEVICE_RELATIONS запрос (отправлен в автобус FDO) обработчик "соединяет" ребенка PDO в автобус FDO,

IRP_MN_QUERY_ID запрос (отправлено ребенку PDO) обработчик сообщает идентификаторы устройства, включая тип устройства. См. https://docs.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-scsi-devices

Теперь Windows может выбрать подходящий драйвер класса, чтобы поставить его поверх. Таким образом, стек будет выглядеть так:

{User App}

[File System Driver]

[Class Driver]

[Bus Driver]

{Physical/Virtual Device}

Затем драйвер класса отправит внутренние ioctl нашему водителю автобуса. Мы все еще можем отправлять этот ioctl самостоятельно, например, обходить драйвер класса. Увидеть IOCTL_SCSI_PASS_THROUGH а также IOCTL_SCSI_PASS_THROUGH_DIRECT управляющие коды документов; это дает понять, что мы можем обойти драйвер класса.

Другие вопросы по тегам