bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
阅读:1770回复:3

大家了解这样一个读写磁盘操作的函数吗?

楼主#
更多 发布于:2007-03-26 12:11
  下面是该函数的一些说明。我想问大家的是该函数对磁盘的读写是否经过了文件系统层,还是直接磁盘IO?用过的或者了解该函数的大侠请为小弟指点一下迷津。//bow

  biosdisk()调用BIOS磁盘驱动程序函数:  
  原形:char   biosdisk(int   cmd,int   drive,int   head,int   track,int   sector,int   nsects,void   *buffer)  
  功能:使用中断0x13,直接调用BIOS进行磁盘操作  
  参数:(1)cmd:  
      2-数据以每扇区512字节的格式读入buffer,起始扇区由head、track和sector定,扇区数由nsects定。  
      3-将buffer中的数据按每扇区512字节写入磁盘。  
      4-对扇区进行数据校验。  
      6-格式化一个磁盘并对化扇区设置化标志。  
      8-返回当前驱动器参数在buffer的前4个字节中。  
      10-长读,每扇区读入512字节加上额外的4个字节。  
      11-长写,每扇区写入512字节加上额外的4个字节。  
     (2)drive:0-第一个软驱;1-第二个软驱;0x80-第一个硬驱  
     (3)head:磁头  
     (4)track:磁道  
     (5)sector:扇区  
     (6)nsects:扇区数  
     (7)buffer:数据缓冲区,定义为unsigned   char   buffer[];  
  返回值:0x00-操作成功  
      0x01-错误命令  
      0x03-企图写具有写保护的磁盘  
      0x07-驱动器参数设置错误  
      0x10-磁盘读/CRC/ECC错误  
  头文件:bios.h  
  注:对于硬盘主引导记录扇区head=0,track=0,sector=1

最新喜欢:

LeopardLeopar...
实用信息:www.infozobo.com
phenix_xiaomei
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望57点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-27 16:03
多种方式可以实现,用passthrough发scsi指令给硬盘。
bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-27 16:21
引用第1楼phenix_xiaomei2007-03-27 16:03发表的“”:
多种方式可以实现,用passthrough发scsi指令给硬盘。

大侠,我也在这样做,可是正好遇到了新问题,麻烦您帮我分析分析:

    sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT);
    sptdwb.sptd.PathId = 0;
    sptdwb.sptd.TargetId = 1;
    sptdwb.sptd.Lun = 0;
    sptdwb.sptd.CdbLength = CDB10GENERIC_LENGTH;
    sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN;
    sptdwb.sptd.SenseInfoLength = SPT_SENSE_LENGTH;
    sptdwb.sptd.DataTransferLength = sectorSize;
    sptdwb.sptd.TimeOutValue = 2;
    sptdwb.sptd.DataBuffer = dataBuff;
    sptdwb.sptd.SenseInfoOffset =
       offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER,ucSenseBuf);
    sptdwb.sptd.Cdb[0] = SCSIOP_READ_DATA_BUFF;
    sptdwb.sptd.Cdb[1] = 2; // Data mode
    //sptdwb.sptd.Cdb[2] = 0;
    //sptdwb.sptd.Cdb[3] = 0;
    //sptdwb.sptd.Cdb[4] = 0;
    //sptdwb.sptd.Cdb[5] = 0;    
    sptdwb.sptd.Cdb[7] = (UCHAR)(sectorSize >> 8);  // Parameter List length
    sptdwb.sptd.Cdb[8] = 0;
    length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER);
    status = DeviceIoControl(fileHandle,
                             IOCTL_SCSI_PASS_THROUGH_DIRECT,
                             &sptdwb,
                             length,
                             &sptdwb,
                             length,
                             &returned,
                             FALSE);

上面的代码我是完全照搬了DDK/spti中的例子,可是在我编译通过后运行却发现无法读取数据。DeviceIoControl返回的错误报告为:函数不正确。开始以为我错了,然后在DDK中也编译了那个例子,运行之后一样无法读取,错误报告也相同。请问,这个问题出在哪里呢?究竟应该怎么解决?
实用信息:www.infozobo.com
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-27 19:41
貌似这个是grub的代码里面的函数!
游客

返回顶部