存储类驱动程序的 GetDescriptor 例程

对于数据传输操作,存储类驱动程序需要每个 HBA 的配置信息,这些 HBA 驱动其设备连接到它们的总线。 若要获取此信息,类驱动程序调用内部 GetDescriptor 例程或在 StartDevice 例程中实现相同的功能。 (有关 StartDevice 的信息,请参阅 处理存储类驱动程序中的 PnP 启动。)

GetDescriptor 例程构建并设置查询属性请求(IRP_MJ_DEVICE_CONTROLIOCTL_STORAGE_QUERY_PROPERTY),用于端口驱动程序以检索设备和适配器描述符,这些描述符存储在类驱动程序的设备扩展中。 类驱动程序还可以根据返回的描述符数据在设备扩展中设置驱动程序编写器确定的标志。

类驱动程序检查返回 的STORAGE_DEVICE_DESCRIPTOR 数据,以确定设备功能(SCSI 查询数据或非 SCSI 等效项),例如 SCSI 设备类型、设备的媒体(如果有)是可移动的(可移动媒体)、设备是否支持多个未完成的命令(CommandQueueing)和各种 ID 字符串。 类驱动程序检查返回 STORAGE_ADAPTER_DESCRIPTOR 数据以确定适配器功能,包括:

  • 特定 HBA 可以在单个作中传输的最大字节数(MaximumTransferLength)。

  • 如果 HBA 可以传输由非连续物理页支持的缓冲数据(换句话说,如果支持分散/聚集),每次传输操作中每个缓冲区可以管理多少不连续的物理页数(MaximumPhysicalPages)。

  • HBA 的传输对齐要求是为了便于类驱动程序在其设备对象(AlignmentMask)中正确设置 AlignmentRequirement 字段。

    发送 IOCTL_SCSI_PASS_THROUGH 请求的应用程序也可以使用此字段。

    有关在设备对象中设置 AlignmentRequirement 的详细信息,请参阅 初始化设备对象

  • HBA 是否支持 SCSI 标记队列和/或按逻辑单元的内部队列功能(CommandQueueing)。

  • HBA 是否支持同步传输(AcceleratedTransfer)。

  • HBA 是否在内部缓存数据(CachesData)。

类驱动程序应将此信息存储在 FDO 的设备扩展中,以便其调度例程可确保发送到存储端口驱动程序的所有请求都符合基础 HBA 的大小、物理中断数和对齐要求。 有关类驱动程序调度例程的详细信息,请参阅 存储类驱动程序的 Dispatch 例程。 有关设置设备扩展的详细信息,请参阅 设置存储类驱动程序的设备扩展