发信人: goodfrd(supervisor)
整理人: yangcs(2002-09-19 10:57:51), 站内信件
|
必须使用LBA方式。
你看我的硬盘分区表(DISKEDIT):
Starting Location Ending Location Relative Number of
System Boot Side Cylinder Sector Side Cylinder Sector Sectors Sectors
? No 1 0 1 254 1 63 63 32067
? No 0 2 1 254 131 63 32130 2088450
FAT32 Yes 0 132 1 254 515 63 2120580 6168960
EXTEND No 0 516 1 254 1022 63 8289540 21591360
我的硬盘是 14多个GB(29880900个扇区)
前面3个分区如第3个分区的大小是可以从前面6个数算出来的:
(515-132+1)*255*63=6168960
但第4个分区的大小是不可以从前面6个数算出来的:
(1022-516+1)*255*63=8144955
实际第4个分区的大小是21591360
21591360/255/63=1344
1344+516-1=1859
我的硬盘按CHS方式为1860道、255头、63扇规格
小于1024道的扇区用INT13H的AH=2/3功能读/写
大于1023道的扇区用INT13H的AH=42H/43H功能读/写
C 源程序见我的主页 HDTOOL.C (其中包括克隆硬盘的功能)
摘抄其中一段如下:
memset(pkt_buf, 0x00, sizeof(pkt_buf));
*(int *)pkt_buf = 0x0018;
*(int *)(pkt_buf+0x02) = sec_num;
*(USGI *)(pkt_buf+0x04) = FP_OFF(buf);
*(USGI *)(pkt_buf+0x06) = FP_SEG(buf);
*(USGL *)(pkt_buf+0x08) = sabn;
inregs.h.dl = drv_no;
inregs.x.si = FP_OFF(pkt_buf);
segregs.ds = FP_SEG(pkt_buf);
inregs.h.ah = rwv + 0x40; /* 42h -- read, 43h -- write, 44h -- verify */
inregs.h.al = 0;
int86x(0x13, &inregs, &outregs, &segregs);
if(!outregs.x.cflag) break;
---- 欢迎光临良友程序库:http://0d0a.126.com http://f12.my163.com,免费提供我的各种Source Code
兄弟我抛出几块砖,有玉的赶紧亮出来啊! |
|