scsi设备扫描特征分析
2016-07-21 15:58
1436 查看
当驱动发现一个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+0x1e
807dc448 88f624e9 storport!RaidAdapterPostScatterGatherExecute+0x184
807dc458 88f6ff44 storport!RaidAdapterExecuteXrb+0x2d
807dc478 88f6748b storport!RaUnitStartIo+0xbf
807dc4b8 88f6da13 storport!RaidStartIoPacket+0x10c
807dc4d8 88f7067f storport!RaidUnitSubmitRequest+0x4e
807dc4f8 88f665a7 storport!RaUnitScsiIrp+0x114
807dc514 83e4a593 storport!RaDriverScsiIrp+0x60
807dc52c 88f6c22d nt!IofCallDriver+0x63
807dc548 88f64e29 storport!RaSendIrpSynchronous+0x3b
807dc5b8 88f6553f storport!RaidBusEnumeratorIssueSynchronousRequest+0x72
807dc5e8 88f65789 storport!RaidBusEnumeratorGenericInquiry+0x61
807dc640 88f65ae7 storport!RaidBusEnumeratorProbeLunZero+0x41
807dc698 88f625af storport!RaidBusEnumeratorGetLunList+0x50
807dc7d8 88f62685 storport!RaidAdapterEnumerateBus+0xbd
807dc874 88f9616f storport!RaidAdapterRescanBus+0x55
807dc898 88f96837 storport!RaidAdapterQueryDeviceRelationsIrp+0x90
807dc8b4 88f96d86 storport!RaidAdapterPnpIrp+0x94
807dc8d0 83e4a593 storport!RaDriverPnpIrp+0x71
807dc8e8 83fd26f8 nt!IofCallDriver+0x63
807dc904 83fd262f nt!PnpAsynchronousCall+0x92
807dc964 83fd23b1 nt!PnpQueryDeviceRelations+0xc5
807dc9a8 83fd0fe1 nt!PipEnumerateDevice+0xf9
807dcba4 83fd1da5 nt!PipProcessDevNodeTree+0x32c
807dcbd8 83e27ce0 nt!PiProcessReenumeration+0x74
807dcc00 83e90aab nt!PnpDeviceActionWorker+0x224
807dcc50 8401cf5e nt!ExpWorkerThread+0x10d
807dcc90 83ec4219 nt!PspSystemThreadStartup+0x9e
00000000 00000000 nt!KiThreadStartup+0x19
我们配置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+0x1e
807dc448 88f624e9 storport!RaidAdapterPostScatterGatherExecute+0x184
807dc458 88f6ff44 storport!RaidAdapterExecuteXrb+0x2d
807dc478 88f6748b storport!RaUnitStartIo+0xbf
807dc4b8 88f6da13 storport!RaidStartIoPacket+0x10c
807dc4d8 88f7067f storport!RaidUnitSubmitRequest+0x4e
807dc4f8 88f665a7 storport!RaUnitScsiIrp+0x114
807dc514 83e4a593 storport!RaDriverScsiIrp+0x60
807dc52c 88f6c22d nt!IofCallDriver+0x63
807dc548 88f64e29 storport!RaSendIrpSynchronous+0x3b
807dc5b8 88f6553f storport!RaidBusEnumeratorIssueSynchronousRequest+0x72
807dc5e8 88f65789 storport!RaidBusEnumeratorGenericInquiry+0x61
807dc640 88f65ae7 storport!RaidBusEnumeratorProbeLunZero+0x41
807dc698 88f625af storport!RaidBusEnumeratorGetLunList+0x50
807dc7d8 88f62685 storport!RaidAdapterEnumerateBus+0xbd
807dc874 88f9616f storport!RaidAdapterRescanBus+0x55
807dc898 88f96837 storport!RaidAdapterQueryDeviceRelationsIrp+0x90
807dc8b4 88f96d86 storport!RaidAdapterPnpIrp+0x94
807dc8d0 83e4a593 storport!RaDriverPnpIrp+0x71
807dc8e8 83fd26f8 nt!IofCallDriver+0x63
807dc904 83fd262f nt!PnpAsynchronousCall+0x92
807dc964 83fd23b1 nt!PnpQueryDeviceRelations+0xc5
807dc9a8 83fd0fe1 nt!PipEnumerateDevice+0xf9
807dcba4 83fd1da5 nt!PipProcessDevNodeTree+0x32c
807dcbd8 83e27ce0 nt!PiProcessReenumeration+0x74
807dcc00 83e90aab nt!PnpDeviceActionWorker+0x224
807dcc50 8401cf5e nt!ExpWorkerThread+0x10d
807dcc90 83ec4219 nt!PspSystemThreadStartup+0x9e
00000000 00000000 nt!KiThreadStartup+0x19
相关文章推荐
- 学习笔记- AVFoundation Programming Guide - Playback
- 多线程和多进程
- 17. Letter Combinations of a Phone Number
- Android 动画 Animation
- 问题:加入导航条后webView的UIWebBrowserView位置偏移
- linux信号量实现线程读写同步
- detached entity passed to persist:
- 获取tomcat当天访问频率高的ip并排序
- Lock wait timeout exceeded; try restarting transaction
- C++ STL容器迭代器失效
- 击鼓传花
- C++语法——static关键字
- Java基本语法-----java运算符的优先级与结合性
- Java基本语法-----java运算符的优先级与结合性
- 随手记一次利用webbowser控件打开网页后cookie读取与设置
- 线性代数的几何意义
- 名词解释
- OpenCV学习笔记(六):绘制几何图形
- Hive入门--1.简介与环境搭建
- mysql视图