首页
社区
课程
招聘
[求助]有关scsi硬盘的io扇区问题
发表于: 2009-1-2 11:20 6115

[求助]有关scsi硬盘的io扇区问题

2009-1-2 11:20
6115
看到这次360的第一题很多人都是用机械狗的方法io硬盘,比如:
   srb->SrbFlags |= SRB_FLAGS_DISABLE_AUTOSENSE;
    srb->TimeOutValue = (srb->DataTransferLength >> 10) + 1;
    srb->QueueSortKey = DiskPos;
    srb->CdbLength = 10;
    srb->Cdb[0] = 2 *((UCHAR)MajorFunction + 17);
    srb->Cdb[1] = srb->Cdb[1] &0x1F | 0x80;
    srb->Cdb[2] = (unsigned char)(DiskPos >> 0x18) &0xFF; //
    srb->Cdb[3] = (unsigned char)(DiskPos >> 0x10) &0xFF; //
    srb->Cdb[4] = (unsigned char)(DiskPos >> 0x08) &0xFF; //
    srb->Cdb[5] = (UCHAR)DiskPos; //填写sector位置
    srb->Cdb[7] = (UCHAR)BlockCount >> 0x08;
    srb->Cdb[8] = (UCHAR)BlockCount;
用的是发送srb的方式。这里DiskPos表示逻辑扇区号。不过这个方式有个问题,就是
DiskPos是32位的,只能操作4g的空间。如果想操作更大的空间该怎么填充cdb呢?
我找了《scsi程序员指南》等书,也只是提及了通用的cdb的填充,没涉及到具体io扇区的
填充。
请大牛们帮助,或者提供点文档资料也行

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
把CDB10换成CDB16
2009-1-2 11:32
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
struct _CDB16 {
        UCHAR OperationCode;
        UCHAR Reserved1        : 3;
        UCHAR ForceUnitAccess  : 1;
        UCHAR DisablePageOut   : 1;
        UCHAR Protection       : 3;
        UCHAR LogicalBlock[8];
        UCHAR TransferLength[4];
        UCHAR Reserved2;
        UCHAR Control;
    } CDB16;

        UCHAR LogicalBlock[8];

这样的SectorOffset是LARGE_INTEGER型

不过Srb里面的这些数字的顺序跟windows是相反的,听lightning说叫什么大尾小尾来着。
2009-1-2 11:34
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
但是呢。。
DiskPos是32位的,只能操作4g的空间
其实是4G*512
因为SectorSize是512,而DiskPos是SectorOffset而不是ByteOffset
2009-1-2 11:35
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
哦!明白一些了。多谢炉子兄弟~~
具体也是填充
    srb->Cdb[2] = (unsigned char)(DiskPos >> 0x18) &0xFF;
    srb->Cdb[3] = (unsigned char)(DiskPos >> 0x10) &0xFF;
    srb->Cdb[4] = (unsigned char)(DiskPos >> 0x08) &0xFF;
等 这几个字段吗?
2009-1-2 11:41
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
嗯,但是srb->CdbLength = 10;要改成srb->CdbLength = 16;
CdbLength是Cdb[]数组中实际使用的长度。或者说是srb->function所需要的参数的长度。
还有就是srb->cdb[xxx]中的xxx,也就是偏移量,要根据结构修改。
2009-1-2 11:43
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
呵呵,再麻烦一下,srb->cdb[xxx]中的哪几个xxx是填充扇区号的?根据 UCHAR LogicalBlock[8];这个字段吗?
2009-1-2 11:58
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
嗯。LogicalBlock就是SectorOffset
2009-1-2 12:02
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
哈哈,差不多明白了~~多谢多谢,刚才根据你的结构发现是ros里的,看了看,很受益!
2009-1-2 12:10
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
再问问,TransferLength这个字段怎么填?
  struct _CDB10 {
    UCHAR  OperationCode;
    UCHAR  RelativeAddress : 1;
    UCHAR  Reserved1 : 2;
    UCHAR  ForceUnitAccess : 1;
    UCHAR  DisablePageOut : 1;
    UCHAR  LogicalUnitNumber : 3;
    UCHAR  LogicalBlockByte0;
    UCHAR  LogicalBlockByte1;
    UCHAR  LogicalBlockByte2;
    UCHAR  LogicalBlockByte3;
    UCHAR  Reserved2;
    UCHAR  TransferBlocksMsb;
    UCHAR  TransferBlocksLsb;
    UCHAR  Control;
  } CDB10, *PCDB10;
莫非是对应着   
   UCHAR  TransferBlocksMsb;
    UCHAR  TransferBlocksLsb;这两个吗?
明白了,CDB10 下只能填2个字节,CDB16填4个字节的长度,应该是这样
2009-1-2 13:34
0
雪    币: 236
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了一下io直接读写硬盘扇区,发现不能实现写入,读取文件内容正常,有高人出现解释一下。
2009-4-14 16:38
0
雪    币: 236
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
再顶一下,希望高人指点一下。
2009-4-14 21:04
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
是的呢...过不了还原软件..没有办法写了
2009-9-27 16:32
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你可以找一下BLOCK COMMAND。官网的太慢,资料太多。
2009-9-27 23:25
0
游客
登录 | 注册 方可回帖
返回
//