S_MSDOS.C
上传用户:yeshiping1
上传日期:2007-01-06
资源大小:29k
文件大小:4k
源码类别:

磁盘编程

开发平台:

Others

  1. /* This file contains system-specific functions for MS-DOS.
  2.  * The program pfdisk.c calls these routines.
  3.  */
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <dos.h>
  9. #define extern
  10. #include "sysdep.h"
  11. #undef extern
  12. int usage(prog) /* print a usage message */
  13. char *prog; /* program name */
  14. {
  15.   fprintf(stderr,"Usage: %s <disk>n", prog);
  16.   fprintf(stderr,"twhere <disk> is a digit [0-9]n");
  17. }
  18. void getGeometry(name, c, h, s)
  19. char *name; /* device name */
  20. unsigned *c,*h,*s; /* cyls, heads, sectors */
  21. {
  22.   int dev; /* hard disk number */
  23.   union  REGS regs;
  24.   struct SREGS sregs;
  25.   
  26.   if (name[0] < '0' ||
  27.       name[0] > '9' ||
  28.       name[1] != 0  )
  29.     {
  30.       fprintf(stderr,"%s: device name must be a digitn", name);
  31.       return;
  32.     }
  33.   dev = (name[0] - '0');
  34.   
  35.   regs.h.ah = 8; /* get param. */
  36.   regs.h.dl = dev | 0x80;
  37.   
  38.   int86x(0x13,&regs,&regs,&sregs);
  39.   
  40.   /* Are that many drives responding? */
  41.   if (regs.h.dl <= dev ) {
  42.     fprintf(stderr,"%s: drive not foundn", name);
  43.     return;
  44.   }
  45.   if (regs.x.cflag) {
  46.     fprintf(stderr,"%s: can't get disk parametersn", name);
  47.     return;
  48.   }
  49.   *c = ((((int) regs.h.cl << 2) & 0x300) | regs.h.ch) + 1;
  50.   *h = regs.h.dh + 1;
  51.   *s = regs.h.cl & 0x3F;
  52. }
  53. int getFile(name, buf, len) /* read file into buffer */
  54. char *name, *buf;
  55. int len;
  56. { /* (open, read, close) */
  57.   int devfd, retval;
  58.   
  59.   devfd = open(name, O_RDONLY|O_BINARY, 0);
  60.   if (devfd < 0) {
  61.     fprintf(stderr,"%s: can't open for readingn", name);
  62.     return(devfd);
  63.   }
  64.   retval = read(devfd, buf, len);
  65.   if (retval < 0)
  66.     fprintf(stderr,"%s: read failedn", name);
  67.   close(devfd);
  68.   return(retval);
  69. }
  70. int putFile(name, buf, len) /* write buffer to file */
  71. char *name, *buf;
  72. int len;
  73. { /* (open, write, close) */
  74.   int devfd, retval;
  75.   
  76.   devfd = open(name,
  77.        O_WRONLY|O_CREAT|O_BINARY,
  78.        S_IREAD|S_IWRITE ); /* stupid DOS... */
  79.   if (devfd < 0) {
  80.     fprintf(stderr,"%s: can't open for writingn", name);
  81.     return(devfd);
  82.   }
  83.   retval = write(devfd, buf, len);
  84.   if (retval < 0)
  85.     fprintf(stderr,"%s: write failedn", name);
  86.   close(devfd);
  87.   return(retval);
  88. }
  89. int getBBlk(name, buf) /* read boot block into buffer */
  90. char *name, *buf;
  91. { /* BIOS absolute disk read */
  92.   int dev;
  93.   union  REGS regs;
  94.   struct SREGS sregs;
  95.   
  96.   if (name[0] < '0' ||
  97.       name[0] > '9' ||
  98.       name[1] != 0  )
  99.     {
  100.       fprintf(stderr,"%s: device name must be a digitn",name);
  101.       return(-1);
  102.     }
  103.   dev = (name[0] - '0');
  104.   
  105.   segread(&sregs); /* get ds */
  106.   sregs.es = sregs.ds; /* buffer address */
  107.   regs.x.bx = (int) buf;
  108.   
  109.   regs.h.ah = 2; /* read */
  110.   regs.h.al = 1; /* sector count */
  111.   regs.h.ch = 0; /* track */
  112.   regs.h.cl = 1; /* start sector */
  113.   regs.h.dh = 0; /* head */
  114.   regs.h.dl = dev|0x80; /* drive */
  115.   
  116.   int86x(0x13,&regs,&regs,&sregs);
  117.   if (regs.x.cflag) {
  118.     fprintf(stderr,"%s: read failedn", name);
  119.     return(-1);
  120.   }
  121.   return(SECSIZE);
  122. }
  123. int putBBlk(name, buf) /* write buffer to boot block */
  124. char *name, *buf;
  125. { /* BIOS absolute disk write */
  126.   int dev;
  127.   union  REGS regs;
  128.   struct SREGS sregs;
  129.   
  130.   if (name[0] < '0' ||
  131.       name[0] > '9' ||
  132.       name[1] != 0  )
  133.     {
  134.       fprintf(stderr,"%s: device name must be a digitn", name);
  135.       return(-1);
  136.     }
  137.   dev = (name[0] - '0');
  138.   
  139.   segread(&sregs); /* get ds */
  140.   sregs.es = sregs.ds; /* buffer address */
  141.   regs.x.bx = (int) buf;
  142.   
  143.   regs.h.ah = 3; /* write */
  144.   regs.h.al = 1; /* sector count */
  145.   regs.h.ch = 0; /* track */
  146.   regs.h.cl = 1; /* start sector */
  147.   regs.h.dh = 0; /* head */
  148.   regs.h.dl = dev|0x80; /* drive */
  149.   
  150.   int86x(0x13,&regs,&regs,&sregs);
  151.   if (regs.x.cflag) {
  152.     fprintf(stderr,"%s: write failedn",name);
  153.     return(-1);
  154.   }
  155.   return(SECSIZE);
  156. }