Реализация драйвера виртуального мини-порта Storport
На этой странице представлены общие сведения о реализации драйвера виртуального мини-порта Storport (VMiniport). Интерфейс VMiniport определен в storport.h.
Рекомендации по проектированию уникальны для различных VMiniports, поэтому здесь не рассматриваются особенности реализации.
Интерфейс VMiniport
В этом разделе перечислены наиболее заметные функции, обратные вызовы и структуры, которые VMiniport реализует или использует. Требуются некоторые функции и обратные вызовы; необязательные обратные вызовы уникальны для структуры VMiniport.
DriverEntry — первая подпрограмма, вызываемая операционной системой после загрузки VMiniport. Эта подпрограмма является обязательной.
HW_INITIALIZATION_DATA, которая представляет собой выделенную и инициализированную структуру Vminiport, которую VMiniport передает в Storport во время инициализации. VMiniport предоставляет указатели на функции обратного вызова в этой структуре.
Требуются следующие процедуры обратного вызова:
HwResetBus. Значение "bus" может быть определено разработчиком VMiniport.
HwFreeAdapterResources. Эта подпрограмма вызывается при удалении виртуального адаптера, чтобы VMiniport смог освободить все ресурсы, выделенные во время инициализации.
Следующие процедуры обратного вызова являются необязательными, хотя VMiniport может реализовать некоторые из них в зависимости от его уникальной архитектуры:
HwCleanupTracing. Эта подпрограмма требуется, если HwInitializeTracing указывает на подпрограмму обратного вызова; В противном случае эта подпрограмма является необязательной и уникальной для VMiniport.
HwProcessServiceRequest. Эта подпрограмма получает IRP обратного вызова, которое будет завершено, когда VMiniport обновит вызывающий объект (например, приложение в пользовательском режиме или драйвер режима ядра) или потребует от вызывающего объекта выполнить какие-либо действия от имени VMiniport.
HwCompleteServiceIrp. Эта подпрограмма является обязательной, если HwProcessServiceRequest указывает на подпрограмму обратного вызова; В противном случае эта подпрограмма является необязательной и уникальной для VMiniport. HwCompleteServiceIrp вызывается при удалении виртуального адаптера, чтобы VMiniport мог завершить любые запросы обратного обратного вызова IRP, которые могут находиться в состоянии ожидания.
VMiniport также должен задать следующие элементы структуры HW_INITIALIZATION_DATA :
Задайте для HwInitializationDataSizeзначение sizeof(HW_INITIALIZATION_DATA).
Задайте для свойства AdapterInterfaceType значение Internal , что указывает storport на то, что это виртуальный адаптер.
Задайте для HwBuildIo значение NULL.
Драйвер Vminiport задает другие поля по мере необходимости. Неиспользуемые поля должны иметь нулевое значение.
PORT_CONFIGURATION_INFORMATION, которая является структурой, выделенной Storport. Storport инициализирует некоторые элементы PORT_CONFIGURATION_INFORMATION , а затем передает их обратному вызову HwFindAdapter VMiniport, где VMiniport завершает инициализацию. Так как эта структура предварительно инициализирована Storport, HWFindAdapter не должен обнулять структуру. VMiniport должен задать для VirtualDevice значение TRUE.
Инициализация VMiniport
VMiniport имеет три этапа инициализации.
На первом этапе подпрограмма DriverEntry VMiniport вызывает StorPortInitialize с указателем на инициализированную HW_INITIALIZATION_DATA структуру.
Storport вызывает обратный вызов HwFindAdapter VMiniport с выделенной storport и частично инициализированной структурой PORT_CONFIGURATION_INFORMATION . Основная функция HwFindAdapter — завершить инициализацию PORT_CONFIGURATION_INFORMATION, в том числе задать для элемента VirtualDevice значение TRUE.
После успешного возврата HwFindAdapter Storport вызывает обратный вызов HwInitialize VMiniport для завершения инициализации VMiniport.
VMiniport I/O
Storport вызывает обратный вызов HwStartIo VMiniport, чтобы инициировать запрос ввода-вывода. В Storport запрос ввода-вывода описывается с помощью SCSI_REQUEST_BLOCK или STORAGE_REQUEST_BLOCK (стандартный или расширенный SRB соответственно).
В отличие от физического драйвера мини-порта, Storport не вызывает HwBuildIo в Vminiport перед вызовом HwStartIo.
Перед вызовом HwStartIo блокировки не удерживаются. Длина очереди по умолчанию для каждой логической единицы, предоставляемой через интерфейс виртуального мини-порта, составляет 250.