实现 Storport 虚拟微型端口驱动程序
本页提供 Storport 虚拟微型端口驱动程序 (VMiniport) 的高级实现信息。 VMiniport 接口在 storport.h 中定义。
设计注意事项对各种 VMiniport 都是独一无二的,因此此处不包含实现细节。
VMiniport 接口
本部分列出了 VMiniport 实现/使用的更突出的函数、回调和结构。 某些函数和回调是必需的;可选回调对于 VMiniport 的设计是唯一的。
DriverEntry,这是操作系统在加载 VMiniport 后调用的第一个例程。 此例程是必需的。
HW_INITIALIZATION_DATA,它是 VMiniport 在 初始化期间传递给 Storport 的 Vminiport 分配和初始化结构。 VMiniport 在此结构中提供指向其回调函数的指针。
需要以下回调例程:
HwResetBus。 “bus”的含义可由 VMiniport 开发人员定义。
HwFreeAdapterResources。 删除虚拟适配器时会调用此例程,以便 VMiniport 可以释放初始化期间分配的任何资源。
以下回调例程是可选的,但 VMiniport 可能必须根据其独特的体系结构实现其中一些例程:
HwCleanupTracing。 当 HwInitializeTracing 指向回调例程时,需要此例程;否则,此例程是可选的,并且对于 VMiniport 是唯一的。
HwProcessServiceRequest。 当 VMiniport 更新调用方 ((例如用户模式应用程序或内核模式驱动程序)) 或要求调用方代表 VMiniport 执行某些操作时,此例程将接收“反向回调”IRP。
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 成员,然后将其传递到 VMiniport 的 HwFindAdapter 回调,VMiniport 在其中完成初始化。 由于此结构由 Storport 预先初始化, 因此 HWFindAdapter 不得将结构归零。 VMiniport 必须将 VirtualDevice 设置为 TRUE。
VMiniport 初始化
VMiniport 有三个阶段的初始化。
在第一阶段,VMiniport 的 DriverEntry 例程使用指向其初始化HW_INITIALIZATION_DATA结构的指针调用 StorPortInitialize。
Storport 使用 Storport 分配并部分初始化的 PORT_CONFIGURATION_INFORMATION 结构调用 VMiniport 的 HwFindAdapter 回调。 HwFindAdapter 的主要功能是完成PORT_CONFIGURATION_INFORMATION的初始化,包括将 VirtualDevice 成员设置为 TRUE。
HwFindAdapter 成功返回后,Storport 调用 VMiniport 的 HwInitialize 回调以完成 VMiniport 的初始化。
VMiniport I/O
Storport 调用 VMiniport 的 HwStartIo 回调来启动 I/O 请求。 在 Storport 中,I/O 请求分别使用 SCSI_REQUEST_BLOCK 或 STORAGE_REQUEST_BLOCK (标准或扩展 SRB 描述) 。
与物理微型端口驱动程序不同,Storport 在调用 HwStartIo 之前不会在 Vminiport 中调用 HwBuildIo。
在调用 HwStartIo 之前,不会保留任何锁。 通过虚拟微型端口接口公开的每个逻辑单元的默认队列深度为 250。