每个 SCSI 微型端口驱动程序的 DriverEntry 例程都必须使用零初始化,然后填写特定于 OS 的端口驱动程序的相关HW_INITIALIZATION_DATA(SCSI)信息。
语法
typedef struct _HW_INITIALIZATION_DATA {
ULONG HwInitializationDataSize;
INTERFACE_TYPE AdapterInterfaceType;
PHW_INITIALIZE HwInitialize;
PHW_STARTIO HwStartIo;
PHW_INTERRUPT HwInterrupt;
PHW_FIND_ADAPTER HwFindAdapter;
PHW_RESET_BUS HwResetBus;
PHW_DMA_STARTED HwDmaStarted;
PHW_ADAPTER_STATE HwAdapterState;
ULONG DeviceExtensionSize;
ULONG SpecificLuExtensionSize;
ULONG SrbExtensionSize;
ULONG NumberOfAccessRanges;
PVOID Reserved;
BOOLEAN MapBuffers;
BOOLEAN NeedPhysicalAddresses;
BOOLEAN TaggedQueuing;
BOOLEAN AutoRequestSense;
BOOLEAN MultipleRequestPerLu;
BOOLEAN ReceiveEvent;
USHORT VendorIdLength;
PVOID VendorId;
union {
USHORT ReservedUshort;
USHORT PortVersionFlags;
};
USHORT DeviceIdLength;
PVOID DeviceId;
PHW_ADAPTER_CONTROL HwAdapterControl;
} HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
成员
HwInitializationDataSize
指定此结构的大小(以字节为单位),sizeof() 返回。 实际上,此成员指示微型端口驱动程序正在使用的此结构的版本。 微型端口驱动程序的 DriverEntry 例程应为端口驱动程序设置此成员的值。
AdapterInterfaceType
指定 HBA 连接到的 I/O 总线类型,可以是下列类型之一:内部、Isa、Eisa、MicroChannel、TurboChannel或 PCIBus。 但是,将来将支持其他类型的公共汽车。 支持的总线类型的上限始终 MaximumInterfaceType。
如果设置为 PCIBus,则微型端口驱动程序必须提供 VendorIdLength、VendorId、DeviceIdLength以及 DeviceId 成员的值。
HwInitialize
指向微型端口驱动程序 HwScsiInitialize 例程的指针,这是所有微型端口驱动程序所需的入口点。 此例程的原型 PHW_INITIALIZE。
HwStartIo
指向微型端口驱动程序的 HwScsiStartIo 例程的指针,这是所有微型端口驱动程序所需的入口点。 此例程的原型 PHW_STARTIO。
HwInterrupt
指向微型端口驱动程序的 HwScsiInterrupt 例程的指针,这是生成中断的 HBA 的任何微型端口驱动程序所需的入口点。 如果微型端口驱动程序不需要 ISR,则设置为 NULL。 此例程的原型 PHW_INTERRUPT。
HwFindAdapter
指向微型端口驱动程序 HwScsiFindAdapter 例程的指针,这是所有微型端口驱动程序所需的入口点。 此例程的原型 PHW_FIND_ADAPTER。
HwResetBus
指向微型端口驱动程序的 HwScsiResetBus 例程的指针,这是所有微型端口驱动程序所需的入口点。 此例程的原型 PHW_RESET_BUS。
HwDmaStarted
如果微型端口驱动程序的 HwScsiDmaStarted 例程(即系统 DMA 控制器)使用系统 DMA,则指向微型端口驱动程序的指针。 如果 HBA 是总线主数据库或使用 PIO,则设置为 NULL。 此例程的原型 PHW_DMA_STARTED。
HwAdapterState
指向微型端口驱动程序的 HwScsiAdapterState 例程的指针,该例程是 HBA 的微型端口驱动程序的必需入口点,这些驱动程序与依赖于作系统的 x86 平台仅端口驱动程序相关联,这些驱动程序必须在 x86 受保护模式和实际处理器模式之间切换。 如果微型端口驱动程序不需要 HwScsiAdapterState 例程,请将此成员设置为 NULL。 具有 BIOS 的 HBA 的微型端口驱动程序必须具有 HwScsiAdapterState 例程才能与仅限 x86 的端口驱动程序兼容,并且可移植到仅 x86 的作系统环境。 此例程的原型 PHW_ADAPTER_STATE。
DeviceExtensionSize
指定微型端口驱动程序为其每个 HBA 设备扩展所需的大小(以字节为单位)。 微型端口驱动程序使用其设备扩展作为驱动程序确定的 HBA 信息的存储。 特定于 OS 的端口驱动程序使用零初始化它分配的每个设备扩展,并在每次调用微型端口驱动程序时将指针传递给特定于 HBA 的设备扩展,但 DriverEntry 例程除外。 给定的大小不包括每个逻辑单元存储请求的任何微型端口驱动程序,如下所述。
SpecificLuExtensionSize
指定微型端口驱动程序在其每逻辑单元存储(如果有)时所需的大小(以字节为单位)。 微型端口驱动程序可以使用其 LU 扩展作为存储,以存储有关总线上的 SCSI 外围设备的驱动程序确定的逻辑单元信息。 特定于 OS 的端口驱动程序使用零初始化它分配的每个 LU 扩展。 如果微型端口驱动程序不维护需要存储的每个 LU 信息,请将此成员保留为零。 此值基于 HBA 能够接收 32 位地址的假设,无论控制器实际支持什么。 如果在 LUN 或 SRB 扩展中需要额外的空间来处理 64 位地址,则必须在将此值与例程(如 ScsiPortGetUncachedExtension)一起使用之前对其进行适当的调整。
SrbExtensionSize
指定微型端口驱动程序在其每个请求存储(如果有)所需的大小(以字节为单位)。 微型端口驱动程序可以将 SRB 扩展用作驱动程序确定的特定于请求的信息的存储,例如处理特定请求所需的数据。 特定于 OS 的端口驱动程序不会初始化 SRB 扩展,而是在它发送到微型端口驱动程序的每个 SRB 中设置指向此存储的指针。 HBA 硬件可以安全地访问 SRB 扩展。 如果微型端口驱动程序不维护需要存储的每个 SRB 信息,请将此成员保留为零。 此值基于 HBA 能够接收 32 位地址的假设,无论控制器实际支持什么。 如果在 LUN 或 SRB 扩展中需要额外的空间来处理 64 位地址,则必须在将此值与例程(如 ScsiPortGetUncachedExtension)一起使用之前对其进行适当的调整。
NumberOfAccessRanges
指定适配器使用的访问范围。 每个地址都是内存地址或 I/O 端口地址的范围。 典型的 HBA 使用两个范围,一个用于其 I/O 端口,另一个用于其设备内存范围。
Reserved
保留供系统使用,不能供微型端口驱动程序使用。
MapBuffers
指示当 TRUE时,所有数据缓冲区地址都必须映射到虚拟地址,以便微型端口驱动程序访问。 FALSE时,数据缓冲区地址不必映射到虚拟地址。
NeedPhysicalAddresses
指示当 TRUE时,微型端口驱动程序需要根据 HBA 的要求将其设备、任何每 LU 和任何每个 SRB 扩展地址以及 SRB 缓冲区地址转换为物理地址。 FALSE时,这些地址都不必转换为物理地址。
TaggedQueuing
指示当 TRUE时,微型端口驱动程序可以支持 SCSI 标记队列。 FALSE时,微型端口驱动程序不支持 SCSI 标记的队列。
AutoRequestSense
指示当 TRUE时,HBA 可以执行请求感知作,而无需显式请求执行此作。 FALSE时,HBA 需要显式请求,然后才能执行请求感知作。 只有驱动具有内置固件执行请求感知作的 HBA 的微型端口驱动程序才能将此成员设置为 TRUE。
MultipleRequestPerLu
指示当 TRUE时,微型端口驱动程序可以为每个逻辑单元(特别是 HBA 中的多个请求)排队。 FALSE时,微型端口驱动程序无法为每个逻辑单元排队多个请求。 请注意,HBA 必须支持其微型端口驱动程序的自动请求感知才能启用此功能。 如果微型端口驱动程序将此成员设置为 TRUE,则必须将此成员用于此类型的请求的每个 SRB QueueTag 成员,但在SCSI_REQUEST_BLOCK结构的 SrbFlags 成员中未设置SRB_FLAGS_QUEUE_ACTION_ENABLE。
ReceiveEvent
指示当 TRUE时,微型端口驱动程序会驱动支持 SCSI 异步事件的接收事件 SRB 的 HBA。 FALSE时,HBA 不支持 SCSI 异步事件的接收事件 SRB。
VendorIdLength
指定 VendorId 字符串的大小(以字节为单位)。下一步所述。
VendorId
指向标识 HBA 制造商的 ASCII 字节字符串的指针。 此成员与即插即用驱动程序无关。
如果给定的 AdapterInterfaceTypePCIBus,供应商 ID 是 PCI SIG 分配的 USHORT 值,该值必须由微型端口驱动程序转换为字节字符串。 例如,如果分配的 PCI 供应商 ID 值为 1001,则微型端口驱动程序提供的 VendorId 字符串将为 (“1”、“0”、“0”、“1”。
ReservedUshort
保留供系统使用,不能供微型端口驱动程序使用。
PortVersionFlags
DeviceIdLength
指定 DeviceId 字符串的大小(以字节为单位)。接下来介绍。
DeviceId
指向标识微型端口驱动程序支持的 HBA 模型的 ASCII 字节字符串的指针。 此成员与即插即用驱动程序无关。
如果给定的 AdapterInterfaceTypePCIBus,则设备 ID 是由 HBA 制造商分配的 USHORT 值。 微型端口驱动程序必须将 HBA 支持的任何 PCI 设备 ID 值(s)转换为 DeviceId 字节字符串(s),对于 VendorId 成员。 例如,如果微型端口驱动程序可以使用 PCI 设备 ID 8040 和 8050 支持 HBA,则它可能会使用指向字节字符串(“8”、“0”)的指针设置 DeviceId。
HwAdapterControl
指向微型端口驱动程序 HwScsiAdapterControl 例程的指针,这是所有 PnP 微型端口驱动程序所需的入口点。 如果微型端口驱动程序不支持即插即用,则将其设置为 NULL。
言论
每个微型端口驱动程序必须用零初始化HW_INITIALIZATION_DATA结构,然后才能设置此结构中相关成员的值,并调用 ScsiPortInitialize。
Dma64BitAddresses 成员HW_INITIALIZATION_DATA已在 Windows 2000 中消除(请参阅PORT_CONFIGURATION_DATA下的讨论以了解更多详细信息)。
HW_INITIALIZATION_DATA和PORT_CONFIGURATION_INFORMATION都有一对 成员,称为 SpecificLuExtensionSize,SrbExtensionSize 其值处理方式不同于 Windows 2000 之前的两个成员。 微型端口驱动程序必须根据 HBA 能够处理 32 位地址的假设计算 SpecificLuExtensionSize 和 SrbExtensionSize HW_INITIALIZATION_DATA的初始值。 (有关更多详细信息,请参阅PORT_CONFIGURATION_DATA下的讨论。
要求
要求 | 价值 |
---|---|
标头 | srb.h (包括 Srb.h、Strmini.h) |
另请参阅
SCSI 微型端口驱动程序 的 DriverEntry