SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3213回复:4

SCSI filter开发 SCSIOP_MODE_SENSE_10 的处理

楼主#
更多 发布于:2004-09-28 11:41
SCSI在处理命令字 SCSIOP_MODE_SENSE 时,它用结构体
    struct _MODE_SENSE10 {
        UCHAR OperationCode;
        UCHAR Reserved1 : 3;
        UCHAR Dbd : 1;
        UCHAR Reserved2 : 1;
        UCHAR LogicalUnitNumber : 3;
        UCHAR PageCode : 6;
        UCHAR Pc : 2;
        UCHAR Reserved3[4];
        UCHAR AllocationLength[2];
        UCHAR Control;
    } MODE_SENSE10, *PMODE_SENSE10;
这时的pagecode是什么意思呢
我现在在做一个scsi disk filter,驱动的堆叠顺序为
disk.sys->filter.sys->aha154x.sys
有几个问题:
1.filter拦截到的 irp_write和irp_read之类的,应该如何转化为scsi的srb呢?
2.在scsi driver中startio是很重要的,那么在filter中如何拦截进入这个startio的全部irp呢?
3.scsi driver中,好像没有irp这个概念?这是为什么?因为scsi是属于legacy driver的原因吗>
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
piggy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-24
  • 最后登录2012-01-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-28 22:38
PageCode的具体意义你可以查阅SCSI-2协议,里面定义的非常清晰。不过如果你是做一个scsi disk filter,为什么要关心这个呢?你的scsi disk filter有什么特殊作用吗?如果只是加密什么的,没必要关心这个。

你要实现的实际上是一个disk lower filter。你需要拦截IRP_MJ_INTERNAL_DEVICE_CONTROL或者IRP_MJ_SCSI。这两个实际上是一个,它们的值是一样的。你可以通过下面的方法得到SRB。

PCDB cdb;
PSCSI_REQUEST_BLOCK srb;
int OpCode;

PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp);

srb = currentIrpStack->Parameters.Scsi.Srb;
cdb = srb->Cdb;
OpCode = Cdb->CDB6GENERIC.OperationCode;

如果OpCode为SCSIOP_READ或SCSIOP_READ6, 读操作
如果OpCode为SCSIOP_WRITE或SCSIOP_WRITE6, 写操作

如果你只filter disk.sys, 一般是SCSIOP_READ和SCSIOP_WRITE

不是很明白你的第二个问题。

关于第三个问题,实际上driver和driver之间的通讯还是通过IRP的。只是在IRP中你要封装SCSI协议的SRB。具体你可以看看DDK中disk class的源代码就完全明白了,其实很简单,因为SCSI是个标准。

希望可以对你有帮助。

SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-01 02:30
谢谢你的解释,
scsi中的startio是用于处理srb的,比如有:
SRB_FUNCTION_IO_CONTROL
SRB_FUNCTION_SHUTDOWN
SRB_FUNCTION_EXECUTE_SCSI

你的意思是在disk filter中拦截IRP_MJ_INTERNAL_DEVICE_CONTROL就可以拦载scsi miniport的 SRB_FUNCTION_EXECUTE_SCSI?

在IRP_MJ_INTERNAL_DEVICE_CONTROL中,其ControlCode可以是下列的值:
IOCTL_SCSI_EXECUTE_IN
IOCTL_SCSI_EXECUTE_OUT
IOCTL_SCSI_EXECUTE_NONE

IOCTL_SCSI_PASS_THROUGH

IOCTL_SCSI_PASS_THROUGH_DIRECT

IOCTL_SCSI_GET_CAPABILITIES
这几个值分别是什么意思?

能给些详细介绍 scsiII的网站或资料吗?

请联系一下我,谢谢

[编辑 -  10/1/04 by  SunMing.Cai]
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
piggy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-24
  • 最后登录2012-01-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-01 09:52
在你的disk filter中拦截IRP_MJ_INTERNAL_DEVICE_CONTROL就可以拦载SRB_FUNCTION_EXECUTE_SCSI。得到SRB后,检查srb->Function是否等于SRB_FUNCTION_EXECUTE_SCSI就可以了。

我不知道你的disk filter是做什么用的,为何要关心那些IOCTL呢?

SCSI-2协议好象本站就有,你找找。
zifzhu
驱动牛犊
驱动牛犊
  • 注册日期2002-07-21
  • 最后登录2008-10-10
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-11 08:15
你要的SPC在www.t10.org
游客

返回顶部