|
zhgwbzhd
高级用户
积分 506
发帖 187
注册 2005-12-4
状态 离线
|
『楼 主』:
如何读取大硬盘的扇区数据?
C语言或者汇编的方法均可??
使用磁道,柱面,扇区的方法只能是读取8G的扇区。
针对大硬盘呢??
|
|
2006-3-6 10:09 |
|
|
qb45
高级用户
积分 677
发帖 194
注册 2003-9-13
状态 离线
|
『第
2 楼』:
基本 BIOS Int 13H 调用是 BIOS 提供的磁盘基本输入输出中断调用, 它可以完成磁盘(包括硬盘和软盘)的复位, 读写, 校验, 定位, 诊断, 格式化等功能.
它使用的就是 CHS 寻址方式, 因此最大识能访问 8 GB 左右的硬盘
扩展 Int13H 接口的目的是为了扩展 BIOS 的功能, 使其支持多于1024柱面的硬盘, 以及可移动介质的琐定, 解锁及弹出等功能
DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念.
操作系统 win98、dos71
使用编程软件 qbasic 版本号4.5
结果: 调试成功
在qbasic中调用中断编译执行请用qb/l命令!
'$INCLUDE: 'qb.bi'
DIM SHARED ax, bx, cx, dx, bp, si, di, ds, flags, es
BUFFdat$ = STRING$(512, 0)'设置读扇区后存放数据的缓冲区
d1% = varSEG(buffdat$)'获得缓冲区的段地址
d2% = SADD(buffdat$)'获得缓冲区的偏移地址
dat1$ = CHR$(&H10) + CHR$(0) + MKI$(1) + MKI$(d2%) + MKI$(d1%) + MKL$(0) + MKL$(0)'按要求设置数据包
ds = varSEG(dat1$)'获得数据包的段地址
si = SADD(dat1$)'获得数据包的偏移地址
ax = &H4200'扩展读扇区命令
dx = &H80'读第一个硬盘
xint &H13'调用中断
OPEN "d:\testhd.dat" FOR BINARY AS #1'保存扇区数据的文件名
PUT 1,1,BUFFDAT$'写入文件
END
SUB xint (num%)
'中断调用子程序
DIM inregs AS RegTypeX
DIM outregs AS RegTypeX
inregs.ax = ax
inregs.bx = bx
inregs.cx = cx
inregs.dx = dx
inregs.si = si
inregs.di = di
inregs.ds = ds
inregs.es = es
CALL INTERRUPTX(num%, inregs, outregs)
ax = outregs.ax
bx = outregs.bx
cx = outregs.cx
dx = outregs.dx
si = outregs.si
di = outregs.di
ds = outregs.ds
es = outregs.es
END SUB
|
我(QB45)的照片与简历
http://www.programfan.com/club/showbbs.asp?id=197280
|
|
2006-3-6 12:21 |
|
|
zhgwbzhd
高级用户
积分 506
发帖 187
注册 2005-12-4
状态 离线
|
『第
3 楼』:
2楼朋友,能不能使用其他的语言??qb确实不太了解。
不过只能看动要是用扩展13中断。
我现看看它。谢谢
|
|
2006-3-6 21:55 |
|
|
qb45
高级用户
积分 677
发帖 194
注册 2003-9-13
状态 离线
|
|
2006-3-7 10:50 |
|
|
qb45
高级用户
积分 677
发帖 194
注册 2003-9-13
状态 离线
|
『第
5 楼』:
『第 3 楼』:
请问各位,为何我在debug中直接填写要读取扇区的DAP参数而用扩展int13h不行呢?比如,要读出第一个硬盘的第一个物理扇区的内容到3333:3333地址处,DAP数据包是否应该如下:
10 00 01 00 33 33 33 33 00 00 00 00 00 00 00 00-a
mmmm:nnnn mov ah,42
mmmm:nnnn mov dl,80
mmmm:nnnn mov di,2000
mmmm:nnnn int13
mmmm:nnnn int3
mmmm:nnnn
-e2000 10 00 01 00 33 33 33 33 00 00 00 00 00 00 00 00
-g执行后在DOS7.10下返回错误,即使查看内存地址3333:3333处也无要读出的数据。在Win98的DOS窗口下死机,热启动也不行。
|
我(QB45)的照片与简历
http://www.programfan.com/club/showbbs.asp?id=197280
|
|
2006-3-7 10:50 |
|
|
qb45
高级用户
积分 677
发帖 194
注册 2003-9-13
状态 离线
|
『第
6 楼』:
磁盘地址数据包 DAP 的结构如下DAP 是基于绝对扇区地址的, 可以轻松地逾越1024 柱面的限制)
struct DiskAddressPacket
BYTE PacketSize; // 数据包尺寸:
//(固定值,恒等于16,即10H,指本结构所占用的存储空间)
BYTE Reserved; // ==0
WORD BlockCount; // 要传输的数据块个数(以扇区为单位)
DWORD BufferAddr; // 传输缓冲地址(segmentffset)
QWORD BlockNum; // 磁盘起始绝对块地址
在扩展 Int13H 调用中一般使用如下寄存器约定:
ds:si ==> 磁盘地址数据包( disk address packet )
dl ==> 驱动器号
ah ==> 功能代码 / 返回码
请你仔细看看扩展INT13的调用规范,你会发现
ds:si ==> 磁盘地址数据包
而你的程序中是
Quote:
mmmm:nnnn mov di,2000
你把SI弄成DI了! 如果你懂一点点Qbasic的话,就能从我的程序中发现你的这个错误!
|
我(QB45)的照片与简历
http://www.programfan.com/club/showbbs.asp?id=197280
|
|
2006-3-7 10:50 |
|
|
qb45
高级用户
积分 677
发帖 194
注册 2003-9-13
状态 离线
|
|
2006-3-7 10:51 |
|
|
qb45
高级用户
积分 677
发帖 194
注册 2003-9-13
状态 离线
|
『第
8 楼』:
我有着和你相同的经历,我当时要用QBASIC语言做一个磁盘编辑器,因为老的INT13有限制,所以我到处去找资料,在本论坛我也发帖子问过哪里能找到这样的资料,结果有个网友给了我一个老外的中断大全网址,资料非常全,可惜我看不懂E文,后来在罗云彬的汇编找到了中文资料,我就参考这个资料用QBASIC来试验读一个扇区,结果不成功,后来我实验了N次,死鸡了N次,头发白了N根,当时我真以为QBASIC没有这个能力,又想了想,都是编程语言,QBASIC应该能做到,没有做不到的事情,当时没有操作系统的时候,QBASIC还被当作操作系统在用呢,比尔大叔不是说:给我BASIC,没有做不到吗!想到这我就到处去问高手,还好,我在QQ上碰到一个懂编程又懂E文的网友,我请他看看E文帮我翻译,哈哈,原来是中文资料错误!我感觉,这个资料是翻译的人故意弄错的,他可能想,只要你爱好编程,而且肯研究,就能发现错误,实际上这个资料中并不只有这一处错误,最重要的错误是这个,然后还有个错误,在你读前63个扇区的时候没有问题,但是,只要读写大于63个扇区的时候,你就会发现读出来的并不是你要的!这个资料总共有3处错误!你可以看看E文的资料,具体网站我不记得了,不过在本论坛还是能找到我发的求助的帖子,里面有网友给的这个网址。我在《数据恢复论坛》也提到过技术资料下载区,INT13中文资料的错误,他们改了一下,没有改很好,但是在论坛里的编程讨论区有高手写的帖子里把这3个错误都指出来了
|
我(QB45)的照片与简历
http://www.programfan.com/club/showbbs.asp?id=197280
|
|
2006-3-7 10:51 |
|
|
qb45
高级用户
积分 677
发帖 194
注册 2003-9-13
状态 离线
|
|
2006-3-7 10:51 |
|
|
zhgwbzhd
高级用户
积分 506
发帖 187
注册 2005-12-4
状态 离线
|
『第
10 楼』:
多谢,qb45。确实,我也看了哪个国外的网站,果然弄得挺好。
人家英文你面说得也很明白
AH = 42h
DL = drive number
DS:SI -> disk address packet
|
|
2006-3-7 23:47 |
|
|
yk141
初级用户
积分 46
发帖 21
注册 2006-3-8 来自 中华人民共和国
状态 离线
|
『第
11 楼』:
学会这个是否可以把MS-DOS 6.22 装在硬盘8G以后?
修改硬盘引导程序,象引导型病毒一样,开机将自已装入内存,接管INT 13H,凡是对硬盘某一特定区域的读写都映射到硬盘的另一特定区域?
|
|
2006-3-8 22:52 |
|