设置存储类驱动程序的设备扩展

在存储类驱动程序创建的每个设备对象的 设备扩展 中,该驱动程序为它用于管理设备的 I/O 请求的任何驱动程序确定数据提供存储,例如指向传递给 AddDevice 的 PDO 的指针、指向 IoAttachDeviceToDeviceStack 返回的设备对象的指针(指向其自己的设备对象的后退指针) 等等。

大多数存储类驱动程序还为以下信息提供存储:

  • 特定于设备类型的超时值

    类驱动程序可以将发送到端口驱动程序的 SRB 中的超时值传递给端口驱动程序,SRB_FUNCTION_EXECUTE_SCSI请求 (代表每个类驱动程序查看 SCSI_REQUEST_BLOCK) 。 如果端口驱动程序将请求发送到基础驱动程序和请求完成之间的间隔超过指定的超时值,端口驱动程序将返回 SRB,其 SrbStatus 成员设置为 SRB_STATUS_TIMEOUT。

  • 指向类驱动程序的错误处理例程的指针

    有关存储类驱动程序中的错误处理的详细信息,请参阅存储类驱动程序 的 IoCompletion 例程

  • 驱动程序维护设备上的总线协议错误的计数

  • 指向感知数据的驱动程序分配缓冲区的指针

    类驱动程序必须为从缓存对齐的非分页池返回的感知数据分配内存。 有关为驱动程序缓冲区分配内存的详细信息,请参阅 分配System-Space内存

  • 类驱动程序在 SRB 中设置的 SrbFlag 的 驱动程序确定的默认值

  • 如果驱动程序为其分配的 SRB 设置了查找列表,则指向查找列表标头的指针

    有关详细信息 ,请参阅使用 Lookaside 列表

  • 指向 IRP 和 SRB 的指针,这些指针分配并保留为即使在内存不足的情况下也必须成功的请求、分页操作以及错误恢复操作 ((例如 由存储类驱动程序的 ReleaseQueue 例程 执行)

  • 指向端口驱动程序从 HBA 收集的 STORAGE_ADAPTER_DESCRIPTORSTORAGE_DEVICE_DESCRIPTOR 数据的指针

    有关类驱动程序如何获取和使用此数据的信息,请参阅 存储类驱动程序的 GetDescriptor 例程

  • 指示以前和当前 PnP 状态的标志,用于管理设备上的状态之间的转换

  • 指示当前设备电源状态的标志,以避免处理冗余电源请求时的额外工作

  • 基于驱动程序接收的分页通知请求(如果有)设备上的系统分页文件计数, (IRP_MJ_PNP IRP_MN_DEVICE_USAGE_NOTIFICATION)

如果不使用 IoAttachDeviceToDeviceStack 返回并由驱动程序的 AddDevice 例程存储在设备扩展中的设备对象指针,存储类驱动程序无法通过存储端口驱动程序向其设备发送请求。