看到这次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扇区的
填充。
请大牛们帮助,或者提供点文档资料也行
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!