调用 ScsiPortInitialize

如果微型端口驱动程序的 HBA 可以在多种类型的 I/O 总线上连接,则微型端口驱动程序必须为每个总线类型调用 ScsiPortInitialize ,并且对于每种总线类型可以有不同的 HwScsiFindAdapter 例程。

每次调用 ScsiPortInitialize 后,此类微型端口驱动程序必须:

  • 修改 AdapterInterfaceType 成员。

  • 如果微型端口驱动程序针对该总线类型具有不同的 HwScsiFindAdapter 例程, 请修改 HW_INITIALIZATION_DATA (SCSI) 中的 HwScsiFindAdapter 成员。

  • 修改微型端口驱动程序为新总线类型提供的上下文数据。

  • 为支持的 HBA 可能连接的每种总线类型调用 ScsiPortInitialize。

如果微型端口驱动程序是不支持即插即用的旧驱动程序,则 ScsiPortInitialize 在将控制权返回到微型端口驱动程序的 DriverEntry 例程之前,会一次或多次调用微型端口驱动程序的 HwScsiFindAdapter 例程。 所有 HwScsiFindAdapter 调用都是在微型端口驱动程序的 DriverEntry 例程的上下文中进行的,其顺序为 DriverEntry 名为 ScsiPortInitialize

如果微型端口驱动程序支持 即插即用,ScsiPortInitialize 将存储初始化数据以供将来使用,并将STATUS_SUCCESS返回到微型端口驱动程序的 DriverEntry 例程。 在即插即用管理器检测到微型端口驱动程序注册为服务的 HBA 之前,端口驱动程序不会调用微型端口驱动程序的 HwScsiFindAdapter 例程。

对于即插即用和旧微型端口驱动程序,端口驱动程序在调用微型端口驱动程序的 HwScsiFindAdapter 例程之前会执行以下所有操作:

  • 检查HW_INITIALIZATION_DATA的有效性。

  • 收集和存储其创建的用于表示 HBA 的设备对象的设备扩展中的相关信息。

  • 为 分配内存,并使用零初始化请求大小的设备扩展,微型端口驱动程序可在其中存储驱动程序确定的有关 HBA 的信息。

  • 大小 为 (PORT_CONFIGURATION_INFORMATION) 的配置 信息缓冲区分配内存。

  • 在配置信息缓冲区中,使用来自微型端口驱动程序提供的HW_INITIALIZATION_DATA和其他源(例如旧微型端口驱动程序的注册表或即插即用微型端口驱动程序的即插即用管理器)中,尽可能多地填充有关特定 I/O 总线上的 HBA 的配置信息PORT_CONFIGURATION_INFORMATION结构。

有关微型端口驱动程序的 HwScsiFindAdapter 例程的详细信息,请参阅 SCSI 微型端口驱动程序的 HwScsiFindAdapter 例程

如果微型端口驱动程序的 DriverEntry 例程在HW_INITIALIZATION_DATA中设置了特定的 AdapterInterfaceType 值,但计算机中没有该类型的总线,则端口驱动程序将返回特定于操作系统的状态值,指示当前计算机中不存在此类 HBA。 它不会为该总线类型调用驱动程序提供的 HwScsiFindAdapter 例程。

如果计算机没有由微型端口驱动程序的 DriverEntry 例程指定的 () 类型的 I/O 总线,则微型端口驱动程序不会保持加载状态。

对于旧版微型端口驱动程序,请注意,在将控制权返回到旧版微型端口驱动程序的 DriverEntry 例程之前,ScsiPortInitialize 还负责以下事项:

  • 设置所有必要的系统对象。

  • 从获取配置信息并在注册表中设置配置信息。

  • 代表微型端口驱动程序分配系统资源,包括微型端口驱动程序指定的 DeviceExtensionSizeSpecificLuExtensionSize 和/或 SrbExtensionSize 指示的内存量,其中微型端口驱动程序可以分别维护 HBA 特定的状态、每个逻辑单元状态和/或每个请求的状态。

对于即插即用微型端口驱动程序,端口驱动程序在微型端口驱动程序的 HwScsiFindAdapter 例程返回后以及端口驱动程序调用微型端口驱动程序的 HwScsiInitialize 例程之前执行这些操作。

每个 SCSI 微型端口驱动程序定义其设备扩展的内部结构和内容,逻辑单元扩展 ((如果有任何) )和 SRB 扩展 ((如果有任何) )。 指向 HBA 特定设备扩展的指针是指向除 DriverEntry 以外的每个系统定义的微型端口驱动程序例程的输入参数。 许多 ScsiPortXxx 例程都需要此指针作为参数。

只能从微型端口驱动程序的 DriverEntry 例程调用 ScsiPortInitialize。 有关详细信息,请参阅 HW_INITIALIZATION_DATA (SCSI) ScsiPortInitialize