woodoar
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1525回复:6

CDB的问题

楼主#
更多 发布于:2004-09-09 10:55
我把filter加到disk.sys下面,只能截到IRP_MJ_INTERNAL_DEVICE_CONTROL,但听说可以通
过访问cdb[0]来得知是否是读写IRP,是这样吗?那我应该在filter里如何访问到cdb[0]呢?它在IRP的哪个域呢?
多谢指点!
Leopard
驱动老牛
驱动老牛
  • 注册日期2001-07-13
  • 最后登录2021-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望53点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
  • 忠实会员
沙发#
发布于:2004-09-09 12:42
cdb[0]
???
woodoar
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-09 19:22
是CDB[0]
piggy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-24
  • 最后登录2012-01-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-09 23:36
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
woodoar
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-10 10:01
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
 



太感谢了!!!
woodoar
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-13 20:20
    PCDB cdb;
    PSCSI_REQUEST_BLOCK srb;
    srb = currentIrpStack->Parameters.Scsi.Srb;
    cdb = srb->Cdb; 这条赋值语句好像类型不匹配吧?
    我做了如下的声明
    UCHAR cdb[16];
    然后再赋值,这样的话u盘插上时filter加载系统重启,我在
softice中看到:Break due to page fault(0Eh) fault=0000
    这是什么原因呢?
    多谢啊!!

还有一个softice的使用问题:
比如我在e盘build生成一个驱动程序,之后我把它考到c盘drivers目录下,然后我再调用softice的symbol loader 打开这个驱动,然后translate,然后ctrl+d,输入file,为什么显示no symbol table呢?我也选中package source with symbol table 了。
是不是它找不到源文件的路径了呢?可我看到有关的使用说明说如果是check版本的就不用另外指定源文件路径了阿?
大家帮忙啊!!!无法找到源文件是不是就意味着无法设置断点了呢?

[编辑 -  9/13/04 by  woodoar]

[编辑 -  9/13/04 by  woodoar]
piggy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-24
  • 最后登录2012-01-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-09-14 22:52
类型不匹配,强制转换一下就可以了。
cdb = (PCDB)srb->Cdb;
您老不会声明了UCHAR cdb[16]后,还用cdb = srb->Cdb吧?
请仔细看看scsi.h和srb.h中关于SCSI_REQUEST_BLOCK和CDB的定义。

关于那个SOFTICE的问题,你在TRANSLATE以后要把你的SYMBOL TABLE加载一下的。SYMBOL LOADER不会给你自动加载的
游客

返回顶部