发信人: 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
 
  兄弟我抛出几块砖,有玉的赶紧亮出来啊!  | 
 
 
 |