hdtool.c
上传用户:tjzyjsm
上传日期:2007-02-22
资源大小:6k
文件大小:24k
源码类别:

磁盘编程

开发平台:

DOS

  1. /*
  2.    HDTOOL.C --- Hard disk tools Ver 1.1
  3.    (C) M.L.Y  2000.8, 2001.6
  4. */
  5. #include "HDTOOL.H"
  6. USGC rwv_buf[63*0x0200];
  7. char help_msg[] =
  8. "HDTOOL --- Hard disk tools Ver 1.1n"
  9. "(C) M.L.Y  2000.8, 2001.6nn"
  10. "Usage: HDTOOL func disk_no other_parms...n"
  11. " 1.Read test total disk:n"
  12. "   HDTOOL 1 disk_non"
  13. " 2.Clone (copy sector by sector: 80->81, 81->80, etc):n"
  14. "   HDTOOL 2 src_disk_no dest_disk_no [LBA_begin [LBA_end]]n"
  15. " 3.Format a track:n"
  16. "   HDTOOL 3 disk_no cyl_no head_non"
  17. " 4.Display a sector:n"
  18. "   HDTOOL 4 disk_no cyl_no head_no sector_non"
  19. " 5.Backup a sector to file:n"
  20. "   HDTOOL 5 disk_no cyl_no head_no sector_no filenamen"
  21. " 6.Restore a sector from file:n"
  22. "   HDTOOL 6 disk_no cyl_no head_no sector_no filenamen"
  23. " 7.Backup a track to file:n"
  24. "   HDTOOL 7 disk_no cyl_no head_no filenamen"
  25. " 8.Restore a track from file:n"
  26. "   HDTOOL 8 disk_no cyl_no head_no filenamen"
  27. "where: disk_no: 0=A,1=B,80-83=hard disk no 1-4n";
  28. int main(int argc,char **argv)
  29. {
  30. int  writeflag=2;
  31.   int  func, drv = 0, drv2 = 0, head = -1, sec = 0;
  32.   long cyl = -1;
  33.   char filename[256];
  34.   int  rc = 0, i, n;
  35.   USGI cyl_num[4], head_num[4], sec_num[4], drvnum;
  36.   int  ext_ver[4];
  37.   USGI phy_cyl[4], phy_head[4], phy_sec[4];
  38.   USGL LBA_sec_numL[4], LBA_sec_numH[4], MB;
  39.   USGL sabn = 0;             /* starting absolute block number */
  40.   USGL LBA_begin = 0L, LBA_end = 0L;
  41.   char *endptr;
  42. /* if (argc<4)
  43. {
  44. printf("Usage:%s R/W A/B FileName Flagn",argv[0]);
  45. return -1;
  46. }
  47. */
  48.   if(argc == 1)
  49.   {
  50.     printf(help_msg);
  51.     printf("nPress any key to continue ...n");
  52.     getch();
  53.     for(i = 0; i < 4; i++)
  54.     {
  55.       printf("Get hard disk %d parm: ", i+1);
  56.       rc = get_drv_parm(0x80+i,
  57.                         &cyl_num[i], &head_num[i], &sec_num[i], &drvnum,
  58.                         &phy_cyl[i], &phy_head[i], &phy_sec[i],
  59.                         &ext_ver[i], &LBA_sec_numL[i], &LBA_sec_numH[i]);
  60.       if(rc < 0)
  61.         printf("Error!n");
  62.       else
  63.       {
  64.         printf("Cyl=%d, head=%d, sec=%d, drv num=%dn",
  65.                cyl_num[i], head_num[i], sec_num[i], drvnum);
  66.         if(ext_ver[i] > 0)
  67.         {
  68.           MB = LBA_sec_numL[i] / 2 / 1024;
  69.           printf("(Ext: Cyl=%d, head=%d, sec=%d, LBA sectors: ",
  70.                  phy_cyl[i], phy_head[i], phy_sec[i]);
  71.           if(LBA_sec_numH[i] > 0)
  72.             printf("Too big.");
  73.           else
  74.             printf("%lu (%lu MB)", LBA_sec_numL[i], MB);
  75.           printf(")n");
  76.         }
  77.       }
  78.     }
  79.     return 0;
  80.   }
  81.   if(argc < 3) rc = -1;
  82.   else
  83.   {
  84.     func = atoi(argv[1]);
  85. if (func<0)
  86. {
  87. writeflag=3;
  88. func=func*(-1);
  89. }
  90. else writeflag=2;
  91.     if(func < 1 || func > 8) rc = -1;
  92.     else drv = atoi(argv[2]);
  93.     if(argc >= 4)
  94.     {
  95.       if(func == 2) drv2 = atoi(argv[3]);
  96.       else          cyl = atoi(argv[3]);
  97.     }
  98.     if(argc >= 5)
  99.     {
  100.       if(func == 2) LBA_begin = strtoul(argv[4], &endptr, 0);
  101.       else          head = atoi(argv[4]);
  102.     }
  103.     if(argc >= 6)
  104.     {
  105.       if(func >= 7 && func <= 8) strcpy(filename, argv[5]);
  106.       else if(func == 2)         LBA_end = strtoul(argv[5], &endptr, 0);
  107.       else                       sec = atoi(argv[5]);
  108.     }
  109.     if(func >= 5 && func <= 6 && argc >= 7) strcpy(filename, argv[6]);
  110.     if((func == 2 && argc < 3) || (func == 3 && argc < 4) ||
  111.        (func == 4 && argc < 5) || (func >= 5 && func <= 6 && argc < 7) ||
  112.        (func >= 7 && func <= 8 && argc < 6))
  113.       rc = -1;
  114.   }
  115.   if(rc >= 0)
  116.   {
  117.     if(!((drv >= 0 && drv <= 1) || (drv >= 80 && drv <= 83))) rc = -1;
  118.     if(func == 2 && !(drv >= 80 && drv2 >= 80 && drv2 != drv)) rc = -1;
  119.     if(func >= 3 && func <= 8 && (cyl < 0 || head < 0)) rc = -1;
  120.     if((func >= 4 && func <= 6) && sec <= 0) rc = -1;
  121.   }
  122.   if(rc < 0)
  123.   {
  124.     printf(help_msg);
  125.     return 0;
  126.   }
  127.   if(drv >= 80) drv = drv - 80 + 0x80;
  128.   if(drv2 >= 80) drv2 = drv2 - 80 + 0x80;
  129.   rc = get_drv_parm(drv, &cyl_num[0], &head_num[0], &sec_num[0], &drvnum,
  130.     &phy_cyl[0], &phy_head[0], &phy_sec[0],
  131.     &ext_ver[0], &LBA_sec_numL[0], &LBA_sec_numH[0]);
  132.   if(func == 2 && drvnum < 2)
  133.   {
  134.     printf("Error: you have only %d hard disk!n", drvnum);
  135.     return -1;
  136.   }
  137.   if(rc < 0)
  138.   {
  139.     printf("Get drive parm. error!n");
  140.     return -1;
  141.   }
  142.   if(ext_ver[0] > 0)
  143.   {
  144.     cyl_num[0] = phy_cyl[0];
  145.     head_num[0] = phy_head[0];
  146.     sec_num[0] = phy_sec[0];
  147.     if(LBA_sec_numH[0] > 0)
  148.     {
  149.       printf("Hard disk too big.n");
  150.       return -2;
  151.     }
  152.   }
  153.   if(func == 2)
  154.   {
  155.     rc = get_drv_parm(drv2, &cyl_num[1], &head_num[1], &sec_num[1], &drvnum,
  156.                       &phy_cyl[1], &phy_head[1], &phy_sec[1],
  157.                       &ext_ver[1], &LBA_sec_numL[1], &LBA_sec_numH[1]);
  158.     if(rc < 0)
  159.     {
  160.       printf("Get drive parm. error!n");
  161.       return -1;
  162.     }
  163.     if(ext_ver[1] > 0)
  164.     {
  165.       cyl_num[1] = phy_cyl[1];
  166.       head_num[1] = phy_head[1];
  167.       sec_num[1] = phy_sec[1];
  168.       if(LBA_sec_numH[1] > 0)
  169.       {
  170.         printf("Hard disk too big.n");
  171.         return -2;
  172.       }
  173.     }
  174.   }
  175.   if(func == 1)
  176.   /*
  177.     read_test_disk(drv, cyl_num[0], head_num[0], sec_num[0],
  178.                    ext_ver[0], LBA_sec_numL[0]);
  179.   */
  180. if (writeflag==3)
  181. {
  182. WriteFloppyFromFile(drv, cyl_num[0], head_num[0], sec_num[0],
  183.                    ext_ver[0], LBA_sec_numL[0],argv[3]);
  184. }
  185. else
  186. ReadFloppyToFile(drv, cyl_num[0], head_num[0], sec_num[0],
  187.                    ext_ver[0], LBA_sec_numL[0],argv[3]);
  188.   if(func == 2)
  189.   {
  190.     if((cyl_num[0] < cyl_num[1] &&
  191.         head_num[0] < head_num[1] &&
  192.         sec_num[0] < sec_num[1]) ||
  193.        (cyl_num[0] >= cyl_num[1] &&
  194.         head_num[0] >= head_num[1] &&
  195.         sec_num[0] >= sec_num[1]))
  196.     {
  197.       if(LBA_end == 0) LBA_end = min(LBA_sec_numL[0], LBA_sec_numL[1]);
  198.       printf("Clone hard disk: 0x%02X -> 0x%02X (LBA from %lu to %lu),"
  199. " are you sure(Y/N)? ", drv, drv2, LBA_begin, LBA_end);
  200.       gets(filename);
  201.       if(filename[0] != 'y' && filename[0] != 'Y') return 0;
  202.       hd_clone(drv, cyl_num[0], head_num[0], sec_num[0],
  203.                ext_ver[0], LBA_sec_numL[0],
  204.                drv2, cyl_num[1], head_num[1], sec_num[1],
  205.                ext_ver[1], LBA_sec_numL[1],
  206.                LBA_begin, LBA_end);
  207.     }
  208.     else
  209.     {
  210.       printf("Error: 2 disks parm. do not match!n");
  211.       return -1;
  212.     }
  213.   }
  214.   if(func == 3)
  215.   {
  216.     rc = format_cyl(drv, cyl, head, sec_num[0], ext_ver[0]);
  217.     if(rc < 0)
  218.     {
  219.       printf("Error!n");
  220.       return -1;
  221.     }
  222.     printf("Ok!n");
  223.   }
  224.   if(func == 4)
  225.   {
  226.     if(ext_ver[0] > 0)
  227.     {
  228.       sabn = cyl;
  229.       sabn = (sabn * head_num[0] + head) * sec_num[0] + sec - 1;
  230.     }
  231.     rc = rwv_disk_sect(2, drv, cyl, head, sec, 1, rwv_buf, ext_ver[0], sabn);
  232.     if(rc == 0)
  233.       disp_hex(rwv_buf, 0x0200);
  234.     else
  235.       printf("Error!n");
  236.   }
  237.   if(func == 5 || func == 7)
  238.   {
  239.     n = 1;
  240.     if(func == 7)
  241.     {
  242.       sec = 1;
  243.       n = sec_num[0];
  244.     }
  245.     if(ext_ver[0] > 0)
  246.     {
  247.       sabn = cyl;
  248.       sabn = (sabn * head_num[0] + head) * sec_num[0] + sec - 1;
  249.     }
  250.     rc = rwv_disk_sect(2, drv, cyl, head, sec, n, rwv_buf, ext_ver[0], sabn);
  251.     if(rc < 0)
  252.     {
  253.       printf("Reading disk error!n");
  254.       return -1;
  255.     }
  256.     else
  257.       rc = wrt_buf2file(filename, rwv_buf, n*0x0200);
  258.   }
  259.   if(func == 6 || func == 8)
  260.   {
  261.     n = 1;
  262.     if(func == 8)
  263.     {
  264.       sec = 1;
  265.       n = sec_num[0];
  266.     }
  267.     rc = read_file2buf(filename, rwv_buf, n*0x0200);
  268.     if(rc >= 0)
  269.     {
  270.       if(ext_ver[0] > 0)
  271.       {
  272.         sabn = cyl;
  273.         sabn = (sabn * head_num[0] + head) * sec_num[0] + sec - 1;
  274.       }
  275.       rc = rwv_disk_sect(3, drv, cyl, head, sec, n, rwv_buf, ext_ver[0], sabn);
  276.       if(rc < 0)
  277.       {
  278.         printf("Reading disk error!n");
  279.         return -1;
  280.       }
  281.     }
  282.   }
  283.   return 0;
  284. }
  285. /* ------------------------------------------------------------------------- */
  286. int  int13_ext_chk(USGC drv_no, int *ext_ver)
  287. {
  288.   union REGS inregs, outregs;
  289.   struct SREGS segregs;
  290.   inregs.h.ah = 0x41;
  291.   inregs.x.bx = 0x55AA;
  292.   inregs.h.dl = drv_no;
  293.   int86x(0x13, &inregs, &outregs, &segregs);
  294.   if(outregs.x.cflag) return -1;
  295.   if(outregs.x.bx != 0xAA55) return -1;
  296.   *ext_ver = outregs.h.ah;
  297.   return 0;
  298. }
  299. /* ------------------------------------------------------------------------- */
  300. int  get_drv_parm(USGC drv_no, USGI *cyl, USGI *head, USGI *sec, USGI *drvnum,
  301.                   USGI *phy_cyl, USGI *phy_head, USGI *phy_sec,
  302.                   int *ext_ver, USGL *LBA_sec_numL, USGL *LBA_sec_numH)
  303. {
  304.   union REGS inregs, outregs;
  305.   struct SREGS segregs;
  306.   USGC para_buf[0x42];
  307.   *ext_ver = 0;
  308.   *phy_cyl = 0;
  309.   *phy_head = 0;
  310.   *phy_sec = 0;
  311.   *LBA_sec_numL = 0;
  312.   *LBA_sec_numH = 0;
  313.   inregs.h.ah = 0x08;
  314.   inregs.h.dl = drv_no;
  315.   int86x(0x13, &inregs, &outregs, &segregs);
  316.   if(outregs.x.cflag) return -1;
  317.   *cyl = (outregs.h.cl >> 6 << 8 | outregs.h.ch) + 1;
  318.   *sec = outregs.h.cl & 0x3F;
  319.   *head = outregs.h.dh + 1;
  320.   *drvnum = outregs.h.dl;
  321.   if(int13_ext_chk(drv_no, ext_ver) < 0)
  322.   {
  323.     *ext_ver = 0;
  324.     return 0;
  325.   }
  326.   memset(para_buf, 0x00, sizeof(para_buf));
  327.   if(*ext_ver == 0x01)
  328.     *(int *)para_buf = 0x001A;
  329.   else if(*ext_ver == 0x20 || *ext_ver == 0x21)
  330.     *(int *)para_buf = 0x001E;
  331.   else /* *ext_ver == 30h */
  332.     *(int *)para_buf = 0x0042;
  333.   inregs.x.si = FP_OFF(para_buf);
  334.   segregs.ds = FP_SEG(para_buf);
  335.   inregs.h.dl = drv_no;
  336.   inregs.h.ah = 0x48;
  337.   int86x(0x13, &inregs, &outregs, &segregs);
  338.   if(outregs.x.cflag)
  339.   {
  340.     *ext_ver = 0;
  341.     return 0;
  342.   }
  343.   *phy_cyl = *(USGL *)(para_buf+0x04);
  344.   *phy_head = *(USGL *)(para_buf+0x08);
  345.   *phy_sec = *(USGL *)(para_buf+0x0C);
  346.   *LBA_sec_numL = *(USGL *)(para_buf+0x10);
  347.   *LBA_sec_numH = *(USGL *)(para_buf+0x14);
  348.   return 0;
  349. }
  350. /* ------------------------------------------------------------------------- */
  351. int  rwv_disk_sect(USGC rwv, USGC drv_no, USGI cyl, USGC head, USGC sec,
  352.                    USGC sec_num, USGC *buf, int ext_ver, USGL sabn)
  353. {
  354.   union REGS inregs, outregs;
  355.   struct SREGS segregs;
  356.   int  i, rc;
  357.   USGC pkt_buf[0x18];
  358. printf("nrwv=%d drv_no=%d cyl=%d head=%d sec=%d sec_num=%d ext_ver=%d",
  359. rwv,drv_no,cyl,head,sec,sec_num,ext_ver);
  360.   for(i = 0; i < 3; i++)
  361.   {
  362.     rc = 0;
  363.     if(ext_ver == 0)
  364.     {
  365.       inregs.h.ah = rwv;     /* 2 -- read, 3 -- write, 4 -- verify */
  366.       inregs.h.al = sec_num;
  367.       inregs.h.dh = head;
  368.       inregs.h.dl = drv_no;
  369.       inregs.h.ch = cyl & 0xFF;
  370.       inregs.h.cl = cyl >> 8 << 6 | sec;
  371.   inregs.x.bx = FP_OFF(buf);
  372.       segregs.es = FP_SEG(buf);
  373.   int86x(0x13, &inregs, &outregs, &segregs);
  374.       printf("n-----[%02X]-----n",buf[10]);
  375.   if(!outregs.x.cflag) break;
  376.     }
  377.     else
  378.     {
  379.       memset(pkt_buf, 0x00, sizeof(pkt_buf));
  380.       *(int *)pkt_buf = 0x0018;
  381.       *(int *)(pkt_buf+0x02) = sec_num;
  382.       *(USGI *)(pkt_buf+0x04) = FP_OFF(buf);
  383.       *(USGI *)(pkt_buf+0x06) = FP_SEG(buf);
  384.       *(USGL *)(pkt_buf+0x08) = sabn;
  385.       inregs.h.dl = drv_no;
  386.       inregs.x.si = FP_OFF(pkt_buf);
  387.       segregs.ds = FP_SEG(pkt_buf);
  388.       inregs.h.ah = rwv + 0x40; /* 42h -- read, 43h -- write, 44h -- verify */
  389.       inregs.h.al = 0;
  390.       int86x(0x13, &inregs, &outregs, &segregs);
  391.       if(!outregs.x.cflag) break;
  392.     }
  393.     rc = -1;
  394.     inregs.h.ah = 0;
  395.     inregs.h.dl = drv_no;
  396.     int86x(0x13, &inregs, &outregs, &segregs);
  397.   }
  398.   return rc;
  399. }
  400. /* ------------------------------------------------------------------------- */
  401. int  format_cyl(USGC drv_no, USGI cyl, USGC head, USGC sec_num, int ext_ver)
  402. {
  403.   union REGS inregs, outregs;
  404.   struct SREGS segregs;
  405.   int  i, rc;
  406.   USGC format_buf[63*4];
  407.   if(ext_ver > 0) return -2; /* Not support now */
  408.   if(drv_no < 0x80)          /* floppy disk */
  409.   {
  410.     for(i = 0; i < sec_num; i++)
  411.     {
  412.       format_buf[i*4+0] = cyl;
  413.       format_buf[i*4+1] = head;
  414.       format_buf[i*4+2] = i+1;
  415.       format_buf[i*4+3] = 0x02; /* sector size (02h=512) */
  416.     }
  417.   }
  418.   else                       /* fixed disk (hard disk) */
  419.   {
  420.     for(i = 0; i < sec_num; i++)
  421.     {
  422.       format_buf[i*2+0] = 0x00; /* F = 00h for good sector, 80h for bad */
  423.       format_buf[i*2+1] = i+1;  /* N = sector number */
  424.     }
  425.   }
  426.   for(i = 0; i < 3; i++)
  427.   {
  428.     rc = 0;
  429.     inregs.h.ah = 0x07;      /* 5 -- format a cylinder */
  430.     if(drv_no < 0x80)        /* floppy disk */
  431.       inregs.h.al = sec_num;
  432.     else                     /* fixed disk (hard disk) */
  433.       inregs.h.al = 0x00;    /* interleave value (XT-type controllers only) */
  434.     inregs.h.dh = head;
  435.     inregs.h.dl = drv_no;
  436.     inregs.h.ch = cyl & 0xFF;
  437.     inregs.h.cl = cyl >> 8 << 6 | sec_num;
  438.     inregs.x.bx = FP_OFF(format_buf);
  439.     segregs.es = FP_SEG(format_buf);
  440.     int86x(0x13, &inregs, &outregs, &segregs);
  441.     if(!outregs.x.cflag) break;
  442.     rc = -1;
  443.     inregs.h.ah = 0;
  444.     inregs.h.dl = drv_no;
  445.     int86x(0x13, &inregs, &outregs, &segregs);
  446.   }
  447.   return rc;
  448. }
  449. /* ------------------------------------------------------------------------- */
  450. int  ReadFloppyToFile(USGC drv, USGI cyl_num, USGI head_num, USGI sec_num,
  451.                     int ext_ver, USGL LBA_sec_num,char * FileName)
  452. {
  453.   int  i, j, k, rc = 0, rc1,l;
  454.   USGL n;
  455.   FILE * f;
  456.   if(ext_ver > 0)
  457.   {
  458.     for(n = 0; n < LBA_sec_num; n++)
  459.     {
  460.       printf("Reading LBA block no: %lu -- ", n);
  461.       rc1 = rwv_disk_sect(2, drv, 0, 0, 0, 1, rwv_buf, ext_ver, n);
  462.       if(rc1 == 0) printf("ok!n");
  463.       else
  464.       {
  465.         printf("error!n");
  466.         rc++;
  467.         if(rc > 10)
  468.         {
  469.           printf("Errors > 10!n");
  470.           return -1;
  471.         }
  472.       }
  473.     }
  474.     return 0;
  475.   }
  476.   f=fopen(FileName,"w+b");
  477.   if(f==NULL)
  478. {
  479.   perror(FileName);
  480.   return -1;
  481. }
  482.   for(i = 0; i < cyl_num; i++)
  483.     for(j = 0; j < head_num; j++)
  484.       for(k = 1; k <= sec_num; k++)
  485.       {
  486.         //printf("Reading cyl:%d, head:%d, sector:%d -- ", i, j, k);
  487.         rc1 = rwv_disk_sect(2, drv, i, j, k, 1, rwv_buf, 0, 0);
  488.         if(rc1 == 0) 
  489.   {
  490. //printf("ok!n");
  491. for (l=0;l<0x0200 ;l++ )
  492. {
  493. fprintf(f,"%c",rwv_buf[i]);
  494. printf("%02X ",rwv_buf[i]);
  495. }
  496. //fwrite(rwv_buf,1,0x0200,f);
  497.   }
  498.         else
  499.         {
  500.           printf("error!n");
  501.           rc++;
  502.           if(rc > 10)
  503.           {
  504.   fclose(f);
  505.             printf("Errors > 10!n");
  506.             return -1;
  507.           }
  508.         }
  509.       }
  510.   fclose(f);
  511.   return 0;
  512. }
  513. int  WriteFloppyFromFile(USGC drv, USGI cyl_num, USGI head_num, USGI sec_num,
  514.                     int ext_ver, USGL LBA_sec_num,char * FileName)
  515. {
  516.   int  i, j, k, rc = 0, rc1,l;
  517.   USGL n;
  518.   FILE * f;
  519.   if(ext_ver > 0)
  520.   {
  521.     for(n = 0; n < LBA_sec_num; n++)
  522.     {
  523.       printf("Reading LBA block no: %lu -- ", n);
  524.       rc1 = rwv_disk_sect(2, drv, 0, 0, 0, 1, rwv_buf, ext_ver, n);
  525.       if(rc1 == 0) printf("ok!n");
  526.       else
  527.       {
  528.         printf("error!n");
  529.         rc++;
  530.         if(rc > 10)
  531.         {
  532.           printf("Errors > 10!n");
  533.           return -1;
  534.         }
  535.       }
  536.     }
  537.     return 0;
  538.   }
  539.   f=fopen(FileName,"rb");
  540.   if(f==NULL)
  541. {
  542.   perror(FileName);
  543.   return -1;
  544. }
  545.   for(i = 0; i < cyl_num; i++)
  546.     for(j = 0; j < head_num; j++)
  547.       for(k = 1; k <= sec_num; k++)
  548.       {
  549.         //printf("Reading cyl:%d, head:%d, sector:%d -- ", i, j, k);
  550. fread(rwv_buf,1,0x0200,f);
  551. for (l=0;l<0x0200 ;l++ )
  552. {
  553. printf("%02X ",rwv_buf[l]);
  554. }
  555.         rc1 = rwv_disk_sect(3, drv, i, j, k, 1, rwv_buf, 0, 0);
  556.         if(rc1 == 0) 
  557.   {
  558. //printf("ok!n");
  559.   }
  560.         else
  561.         {
  562.           printf("error!n");
  563.           rc++;
  564.           if(rc > 10)
  565.           {
  566.   fclose(f);
  567.             printf("Errors > 10!n");
  568.             return -1;
  569.           }
  570.         }
  571.       }
  572.   fclose(f);
  573.   return 0;
  574. }
  575. /* ------------------------------------------------------------------------- */
  576. int  read_test_disk(USGC drv, USGI cyl_num, USGI head_num, USGI sec_num,
  577.                     int ext_ver, USGL LBA_sec_num)
  578. {
  579.   int  i, j, k, rc = 0, rc1;
  580.   USGL n;
  581.   if(ext_ver > 0)
  582.   {
  583.     for(n = 0; n < LBA_sec_num; n++)
  584.     {
  585.       printf("Reading LBA block no: %lu -- ", n);
  586.       rc1 = rwv_disk_sect(2, drv, 0, 0, 0, 1, rwv_buf, ext_ver, n);
  587.       if(rc1 == 0) printf("ok!n");
  588.       else
  589.       {
  590.         printf("error!n");
  591.         rc++;
  592.         if(rc > 10)
  593.         {
  594.           printf("Errors > 10!n");
  595.           return -1;
  596.         }
  597.       }
  598.     }
  599.     return 0;
  600.   }
  601.   for(i = 0; i < cyl_num; i++)
  602.     for(j = 0; j < head_num; j++)
  603.       for(k = 1; k <= sec_num; k++)
  604.       {
  605.         printf("Reading cyl:%d, head:%d, sector:%d -- ", i, j, k);
  606.         rc1 = rwv_disk_sect(2, drv, i, j, k, 1, rwv_buf, 0, 0);
  607.         if(rc1 == 0) 
  608.   {
  609. printf("ok!n");
  610.   }
  611.         else
  612.         {
  613.           printf("error!n");
  614.           rc++;
  615.           if(rc > 10)
  616.           {
  617.             printf("Errors > 10!n");
  618.             return -1;
  619.           }
  620.         }
  621.       }
  622.   return 0;
  623. }
  624. /* ------------------------------------------------------------------------- */
  625. int  hd_clone(USGC drv1, USGI cyl_num1, USGI head_num1, USGI sec_num1,
  626.               int ext_ver1, USGL LBA_sec_num1,
  627.               USGC drv2, USGI cyl_num2, USGI head_num2, USGI sec_num2,
  628.               int ext_ver2, USGL LBA_sec_num2,
  629.               USGL LBA_begin, USGL LBA_end)
  630. {
  631.   int  i, j, k, r_err_num = 0, w_err_num = 0, rc1, rc2, disp = 0;
  632.   USGI cyl_num, head_num, sec_num;
  633.   USGL LBA_sec_num, n;
  634.   time_t timer;
  635.   struct tm *tms;
  636.   char time_buf1[20], time_buf2[20];
  637.   timer = time(NULL);
  638.   tms = localtime(&timer);
  639.   k = sprintf(time_buf1, "%4d-%02d-%02d %02d:%02d:%02d", tms->tm_year+1900,
  640.               tms->tm_mon+1, tms->tm_mday, tms->tm_hour, tms->tm_min,
  641.               tms->tm_sec);
  642.   time_buf1[k] = 0;
  643.   if(ext_ver1 != ext_ver2)
  644.   {
  645.     printf("Error: ext_ver1 != ext_ver2n");
  646.     return -1;
  647.   }
  648.   cyl_num = min(cyl_num1, cyl_num2);
  649.   head_num = min(head_num1, head_num2);
  650.   sec_num = min(sec_num1, sec_num2);
  651.   if(sec_num > 63)
  652.   {
  653.     printf("Error: sec_num > 63n");
  654.     return -1;
  655.   }
  656.   if(ext_ver1 > 0)
  657.   {
  658.     LBA_sec_num = min(LBA_sec_num1, LBA_sec_num2);
  659.     LBA_end = min(LBA_end, LBA_sec_num);
  660.     for(n = LBA_begin; n < LBA_end; disp++)
  661.     {
  662.       if(disp <= 0)
  663.         printf("rCopy from LBA block no: %lu, sectors: %d -- ", n, sec_num);
  664.       rc1 = rwv_disk_sect(2, drv1, 0, 0, 0, sec_num, rwv_buf, ext_ver1, n);
  665.       if(rc1 == 0)
  666.       {
  667.         rc2 = rwv_disk_sect(3, drv2, 0, 0, 0, sec_num, rwv_buf, ext_ver2, n);
  668.         if(rc2 == 0)
  669.         {
  670.           if(disp <= 0) printf("ok! ......");
  671.         }
  672.         else
  673.         {
  674.           w_err_num++;
  675.           if(disp > 0)
  676.             printf("nCopy from LBA block no: %lu, sectors: %d -- ",
  677.                    n, sec_num);
  678.           printf("write error!n");
  679.         }
  680.       }
  681.       else
  682.       {
  683.         r_err_num++;
  684.         if(disp > 0)
  685.           printf("nCopy from LBA block no: %lu, sectors: %d -- ", n, sec_num);
  686.         printf("read error!n");
  687.       }
  688.       if(r_err_num > 5)
  689.       {
  690.         printf("Read errors > 5!n");
  691.         return -1;
  692.       }
  693.       if(w_err_num > 5)
  694.       {
  695.         printf("Write errors > 5!n");
  696.         return -1;
  697.       }
  698.       n += sec_num;
  699.       if(disp >= 300) disp = -1;
  700.       if(n >= (LBA_end - sec_num - 1)) disp = -1;
  701.     }
  702.   }
  703.   else
  704.   {
  705.     for(i = 0; i < cyl_num; i++)
  706.       for(j = 0; j < head_num; j++)
  707.       {
  708.         k = 1;
  709.         printf("Copy from cyl:%d, head:%d, sectors:%d -- ", i, j, sec_num);
  710.         rc1 = rwv_disk_sect(2, drv1, i, j, k, sec_num, rwv_buf, 0, 0);
  711.         if(rc1 == 0)
  712.         {
  713.           rc2 = rwv_disk_sect(3, drv2, i, j, k, sec_num, rwv_buf, 0, 0);
  714.           if(rc2 == 0) printf("ok!n");
  715.           else
  716.           {
  717.             w_err_num++;
  718.             printf("write error!n");
  719.           }
  720.         }
  721.         else
  722.         {
  723.           r_err_num++;
  724.           printf("read error!n");
  725.         }
  726.         if(r_err_num > 5)
  727.         {
  728.           printf("Read errors > 5!n");
  729.           return -1;
  730.         }
  731.         if(w_err_num > 5)
  732.         {
  733.           printf("Write errors > 5!n");
  734.           return -1;
  735.         }
  736.       }
  737.   }
  738.   printf("nTotal errors: Read = %d, write = %dn", r_err_num, w_err_num);
  739.   timer = time(NULL);
  740.   tms = localtime(&timer);
  741.   k = sprintf(time_buf2, "%4d-%02d-%02d %02d:%02d:%02d", tms->tm_year+1900,
  742.               tms->tm_mon+1, tms->tm_mday, tms->tm_hour, tms->tm_min,
  743.               tms->tm_sec);
  744.   time_buf2[k] = 0;
  745.   printf("Time: from %s to %sn", time_buf1, time_buf2);
  746.   return 0;
  747. }
  748. /* ------------------------------------------------------------------------- */
  749. int  wrt_buf2file(char *filename, USGC *buf, USGI bytes)
  750. {
  751.   FILE *fp;
  752.   if((fp = fopen(filename, "wb")) == NULL)
  753.   {
  754.     printf("Create file error!n");
  755.     return -1;
  756.   }
  757.   if(fwrite(buf, 1, bytes, fp) != bytes)
  758.   {
  759.     printf("Write file error!n");
  760.     fclose(fp);
  761.     return -1;
  762.   }
  763.   if(fclose(fp) != 0)
  764.   {
  765.     printf("Close file error!n");
  766.     return -1;
  767.   }
  768.   printf("Ok!n");
  769.   return 0;
  770. }
  771. /* ------------------------------------------------------------------------- */
  772. int  read_file2buf(char *filename, USGC *buf, USGI bytes)
  773. {
  774.   FILE *fp;
  775.   if((fp = fopen(filename, "rb")) == NULL)
  776.   {
  777.     printf("Open file error!n");
  778.     return -1;
  779.   }
  780.   if(fread(buf, 1, bytes, fp) != bytes)
  781.   {
  782.     printf("Read file error!n");
  783.     fclose(fp);
  784.     return -1;
  785.   }
  786.   if(fclose(fp) != 0)
  787.   {
  788.     printf("Close file error!n");
  789.     return -1;
  790.   }
  791.   printf("Ok!n");
  792.   return 0;
  793. }
  794. /* ------------------------------------------------------------------------- */
  795. void disp_hex(USGC *buf, int len)
  796. {
  797.   USGC dispstr[8192];
  798.   DbgOutStrA(dispstr, buf, len, "", 4);
  799.   printf("%s", dispstr);
  800. }
  801. /* ------------------------------------------------------------------------- */
  802. int  sprintf_end(void *buffer, void *fmt, ...)
  803. /*
  804.    sprintf to buffer end
  805.    M.L.Y  1999.6.2
  806. */
  807. {
  808.   char tmpstr1[8192];
  809.   va_list arg_ptr;
  810.   va_start(arg_ptr, fmt);
  811.   vsprintf(tmpstr1, fmt, arg_ptr);
  812.   va_end(arg_ptr);
  813.   strcat(buffer, tmpstr1);
  814.   return 0;
  815. }
  816. /* ------------------------------------------------------------------------- */
  817. int  DbgOutStrA(USGC *buf, USGC *str, int str_len, char *ptr_left,
  818.                 int ptr_len)
  819. /*
  820.    Output an ASCII code string by DEBUG format to the buffer
  821.    Return: 0
  822.    M.L.Y  1995, 1999
  823. */
  824. {
  825.   int  j, k, ccpair = 0, ptr;
  826.   USGC buf1[1024];
  827.   buf[0] = '';
  828.   for(ptr = 0; ptr < str_len; )      /* pointer of this line of str */
  829.   {
  830.     if(str_len - ptr >= 16) k = 16;  /* length of this line of str */
  831.     else                    k = str_len - ptr;
  832.     sprintf_end(buf, "%s", ptr_left);
  833.     sprintf_end(buf, "%0*X ", ptr_len, ptr);
  834.     for(j = 0; j < 16; j++)  /* byte order of this line */
  835.     {
  836.       if(j < k)
  837.       {
  838.         if(j == 8) sprintf_end(buf, "-%02X", str[ptr + j]);
  839.         else       sprintf_end(buf, " %02X", str[ptr + j]);
  840.       }
  841.       else         sprintf_end(buf, "   ");
  842.     }
  843.     sprintf_end(buf, "  ");
  844.     buf1[0] = '';
  845.     for(j = 0; j < 16; j++)
  846.     {
  847.       if(j >= k) break;
  848.       if(j == 0 && ccpair > 0)
  849.       {
  850.         ccpair = 0;
  851.         goto dscc_dispul;
  852.       }
  853.       if(ccpair == 0)
  854.       {
  855.         if(str[ptr + j] > 0xA0 && str[ptr + j] < 0xFF)
  856.         {
  857.           if(str[ptr + j + 1] > 0xA0 && str[ptr + j + 1] < 0xFF)
  858.           {
  859.             ccpair = 1;        /* DBCS left byte */
  860.             goto dscc_dispch;
  861.           }
  862.           goto dscc_dispdot;
  863.         }
  864.         if(str[ptr + j] >= 0x20 && str[ptr + j] < 0x80) goto dscc_dispch;
  865.         goto dscc_dispdot;
  866.       }
  867.       ccpair = 0;              /* DBCS right byte */
  868.       goto dscc_dispch;
  869. dscc_dispul:  /* use the underline character instead */
  870.       /* sprintf_end(buf1, "_"); */
  871.       sprintf_end(buf1, "%c", 0x5F);
  872.       goto dscc_cont1;
  873. dscc_dispch:
  874.       sprintf_end(buf1, "%c", str[ptr + j]);
  875.       goto dscc_cont1;
  876. dscc_dispdot:
  877.       /* sprintf_end(buf1, "."); */
  878.       sprintf_end(buf1, "%c", 0x2E);
  879.       goto dscc_cont1;
  880. dscc_dispblk:
  881.       /* sprintf_end(buf1, " "); */
  882.       sprintf_end(buf1, "%c", 0x20);
  883. dscc_cont1:
  884.       ;
  885.     }
  886.     if(ccpair > 0 && k == 16)
  887.     {
  888.       sprintf_end(buf1, "%c", str[ptr + 16]);
  889.       /* output the first byte of next line (the DBCS right byte) */
  890.     }
  891.     strcat((char *)buf, (char *)buf1);
  892.     sprintf_end(buf, "n");
  893.     ptr = ptr + 16;
  894.   }
  895.   return 0;
  896. }
  897. /* End of file */