scsi设备扫描特征分析

来源:互联网 发布:linux 列出网卡ip 编辑:程序博客网 时间:2024/06/05 17:31

   当驱动发现一个scsi适配器后,会扫描与其连接的scsi设备。每一个scsi设备的路径可以通过(PathId,TargetId,Lun)表示,当存储miniport驱动收到scsi指令SCSIOP_INQUIRY后,需要判断当前的查询路径上是否有scsi设备连接。

   我们配置scsi适配器时会设置其支持的最大总线数(NumberOfBuses)、最大对应ID设备(MaximumNumberOfTargets)及每一ID设备支持的最大逻辑单元数量(MaximumNumberOfLogicalUnits)。当发现scsi适配器或者调用StorPortNotification(BusChangeDetected, ..., ...)时,Port驱动会向miniport驱动发送SCSIOP_INQUIRY指令,指示miniport驱动重新枚举其上的scsi驱动。在枚举每一个ID设备之前,会先向此ID设置发送SCSIOP_REPORT_LUNS指令。若不支持此指令,再枚举此ID设备上面的逻辑单元。

  我发现响应SCSIOP_INQUIRY指令时,若一个ID设备的Lun 0返回失败,则对这个ID设备的其它的Lun不再发送SCSIOP_INQUIRY指令。若Lun 0返回成功,不管其后的Lun是否枚举成功,都会接受到SCSIOP_INQUIRY指令。与返回的SRB status错误码无关。

PS: 前段文字说Port驱动会向miniport驱动发送SCSIOP_INQUIRY指令,我感觉这说的不准确,因为Port及Miniport驱动组成了一个完整的驱动,当调用StorPortNotification(BusChangeDetected, ..., ...)时,函数内部应该调用IoInvalidateDeviceRelations通知pnp管理器设备发生了变化,而后pnp管理器发送IRP_MN_QUERY_DEVICE_RELATIONS查询设备,Port驱动再处理此IRP时向miniport驱动发送SCSIOP_INQUIRY指令。

807dc3a8 a206c812 OsrSVMStor!tdvdisk_ScsiOpInquiry+0x1c [d:\td\newframe\tdvdisk\tdvdisk\tdvmscsi.c @ 82]807dc3e8 a206d842 OsrSVMStor!tdvdisk_VmExecuteScsi+0x152 [d:\td\newframe\tdvdisk\tdvdisk\tdvmscsi.c @ 38]807dc410 88f60635 OsrSVMStor!HwStorStartIo+0xa2 [d:\td\newframe\tdvdisk\tdvdisk\tdvdisk.c @ 257]807dc420 88f6226b storport!RaCallMiniportStartIo+0x1e807dc448 88f624e9 storport!RaidAdapterPostScatterGatherExecute+0x184807dc458 88f6ff44 storport!RaidAdapterExecuteXrb+0x2d807dc478 88f6748b storport!RaUnitStartIo+0xbf807dc4b8 88f6da13 storport!RaidStartIoPacket+0x10c807dc4d8 88f7067f storport!RaidUnitSubmitRequest+0x4e807dc4f8 88f665a7 storport!RaUnitScsiIrp+0x114807dc514 83e4a593 storport!RaDriverScsiIrp+0x60807dc52c 88f6c22d nt!IofCallDriver+0x63807dc548 88f64e29 storport!RaSendIrpSynchronous+0x3b807dc5b8 88f6553f storport!RaidBusEnumeratorIssueSynchronousRequest+0x72807dc5e8 88f65789 storport!RaidBusEnumeratorGenericInquiry+0x61807dc640 88f65ae7 storport!RaidBusEnumeratorProbeLunZero+0x41807dc698 88f625af storport!RaidBusEnumeratorGetLunList+0x50807dc7d8 88f62685 storport!RaidAdapterEnumerateBus+0xbd807dc874 88f9616f storport!RaidAdapterRescanBus+0x55807dc898 88f96837 storport!RaidAdapterQueryDeviceRelationsIrp+0x90807dc8b4 88f96d86 storport!RaidAdapterPnpIrp+0x94807dc8d0 83e4a593 storport!RaDriverPnpIrp+0x71807dc8e8 83fd26f8 nt!IofCallDriver+0x63807dc904 83fd262f nt!PnpAsynchronousCall+0x92807dc964 83fd23b1 nt!PnpQueryDeviceRelations+0xc5807dc9a8 83fd0fe1 nt!PipEnumerateDevice+0xf9807dcba4 83fd1da5 nt!PipProcessDevNodeTree+0x32c807dcbd8 83e27ce0 nt!PiProcessReenumeration+0x74807dcc00 83e90aab nt!PnpDeviceActionWorker+0x224807dcc50 8401cf5e nt!ExpWorkerThread+0x10d807dcc90 83ec4219 nt!PspSystemThreadStartup+0x9e00000000 00000000 nt!KiThreadStartup+0x19


0 0