处理 SCSI 传递请求
生成 IOCTL_SCSI_PASS_THROUGH 请求或 IOCTL_SCSI_PASS_THROUGH_DIRECT 请求的类驱动程序负责以下事项:
将 Parameters.DeviceIoControl.InputBufferLength 中的用户缓冲区的长度设置为至少 size of (SCSI_PASS_THROUGH) 或 size of (SCSI_PASS_THROUGH_DIRECT)
照常设置存储端口驱动程序的 I/O 堆栈位置
将 IRP 中的 MinorFunction 设置为IRP_MJ_DEVICE_CONTROL,这会将请求标记为已由存储类驱动程序处理。
收到来自更高级别驱动程序的IOCTL_SCSI_PASS_THROUGH或IOCTL_SCSI_PASS_THROUGH_DIRECT请求后,存储类驱动程序的 DispatchDeviceControl 例程负责检查嵌入式 SCSI 命令 (CDB) 的有效性,如果命令对其设备有效,则向存储端口驱动程序发送请求。
如果IOCTL_SCSI_PASS_THROUGH或IOCTL_SCSI_PASS_THROUGH_DIRECT请求的端口驱动程序的 I/O 堆栈位置未使用 IRP_MJ_DEVICE_CONTROL 设置其 MinorFunction 字段,则端口驱动程序假定请求直接来自应用程序,并且目标设备类型不存在类驱动程序。 将此类请求直接发送到存储类驱动程序声明的设备的端口驱动程序是应用程序错误。
端口驱动程序不会检查此类直通请求中嵌入的 SCSI 命令的有效性。