阅读:1769回复:3
大家了解这样一个读写磁盘操作的函数吗?
下面是该函数的一些说明。我想问大家的是该函数对磁盘的读写是否经过了文件系统层,还是直接磁盘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 |
|
最新喜欢:![]()
|
沙发#
发布于:2007-03-27 16:03
![]() |
|
板凳#
发布于:2007-03-27 16:21
引用第1楼phenix_xiaomei于2007-03-27 16:03发表的“”: 大侠,我也在这样做,可是正好遇到了新问题,麻烦您帮我分析分析: 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中也编译了那个例子,运行之后一样无法读取,错误报告也相同。请问,这个问题出在哪里呢?究竟应该怎么解决? |
|
|
地板#
发布于:2007-03-27 19:41
貌似这个是grub的代码里面的函数!
|
|