S_MSDOS.C
资源名称:bootmenu.zip [点击查看]
上传用户:yeshiping1
上传日期:2007-01-06
资源大小:29k
文件大小:4k
源码类别:
磁盘编程
开发平台:
Others
- /* This file contains system-specific functions for MS-DOS.
- * The program pfdisk.c calls these routines.
- */
- #include <stdio.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <dos.h>
- #define extern
- #include "sysdep.h"
- #undef extern
- int usage(prog) /* print a usage message */
- char *prog; /* program name */
- {
- fprintf(stderr,"Usage: %s <disk>n", prog);
- fprintf(stderr,"twhere <disk> is a digit [0-9]n");
- }
- void getGeometry(name, c, h, s)
- char *name; /* device name */
- unsigned *c,*h,*s; /* cyls, heads, sectors */
- {
- int dev; /* hard disk number */
- union REGS regs;
- struct SREGS sregs;
- if (name[0] < '0' ||
- name[0] > '9' ||
- name[1] != 0 )
- {
- fprintf(stderr,"%s: device name must be a digitn", name);
- return;
- }
- dev = (name[0] - '0');
- regs.h.ah = 8; /* get param. */
- regs.h.dl = dev | 0x80;
- int86x(0x13,®s,®s,&sregs);
- /* Are that many drives responding? */
- if (regs.h.dl <= dev ) {
- fprintf(stderr,"%s: drive not foundn", name);
- return;
- }
- if (regs.x.cflag) {
- fprintf(stderr,"%s: can't get disk parametersn", name);
- return;
- }
- *c = ((((int) regs.h.cl << 2) & 0x300) | regs.h.ch) + 1;
- *h = regs.h.dh + 1;
- *s = regs.h.cl & 0x3F;
- }
- int getFile(name, buf, len) /* read file into buffer */
- char *name, *buf;
- int len;
- { /* (open, read, close) */
- int devfd, retval;
- devfd = open(name, O_RDONLY|O_BINARY, 0);
- if (devfd < 0) {
- fprintf(stderr,"%s: can't open for readingn", name);
- return(devfd);
- }
- retval = read(devfd, buf, len);
- if (retval < 0)
- fprintf(stderr,"%s: read failedn", name);
- close(devfd);
- return(retval);
- }
- int putFile(name, buf, len) /* write buffer to file */
- char *name, *buf;
- int len;
- { /* (open, write, close) */
- int devfd, retval;
- devfd = open(name,
- O_WRONLY|O_CREAT|O_BINARY,
- S_IREAD|S_IWRITE ); /* stupid DOS... */
- if (devfd < 0) {
- fprintf(stderr,"%s: can't open for writingn", name);
- return(devfd);
- }
- retval = write(devfd, buf, len);
- if (retval < 0)
- fprintf(stderr,"%s: write failedn", name);
- close(devfd);
- return(retval);
- }
- int getBBlk(name, buf) /* read boot block into buffer */
- char *name, *buf;
- { /* BIOS absolute disk read */
- int dev;
- union REGS regs;
- struct SREGS sregs;
- if (name[0] < '0' ||
- name[0] > '9' ||
- name[1] != 0 )
- {
- fprintf(stderr,"%s: device name must be a digitn",name);
- return(-1);
- }
- dev = (name[0] - '0');
- segread(&sregs); /* get ds */
- sregs.es = sregs.ds; /* buffer address */
- regs.x.bx = (int) buf;
- regs.h.ah = 2; /* read */
- regs.h.al = 1; /* sector count */
- regs.h.ch = 0; /* track */
- regs.h.cl = 1; /* start sector */
- regs.h.dh = 0; /* head */
- regs.h.dl = dev|0x80; /* drive */
- int86x(0x13,®s,®s,&sregs);
- if (regs.x.cflag) {
- fprintf(stderr,"%s: read failedn", name);
- return(-1);
- }
- return(SECSIZE);
- }
- int putBBlk(name, buf) /* write buffer to boot block */
- char *name, *buf;
- { /* BIOS absolute disk write */
- int dev;
- union REGS regs;
- struct SREGS sregs;
- if (name[0] < '0' ||
- name[0] > '9' ||
- name[1] != 0 )
- {
- fprintf(stderr,"%s: device name must be a digitn", name);
- return(-1);
- }
- dev = (name[0] - '0');
- segread(&sregs); /* get ds */
- sregs.es = sregs.ds; /* buffer address */
- regs.x.bx = (int) buf;
- regs.h.ah = 3; /* write */
- regs.h.al = 1; /* sector count */
- regs.h.ch = 0; /* track */
- regs.h.cl = 1; /* start sector */
- regs.h.dh = 0; /* head */
- regs.h.dl = dev|0x80; /* drive */
- int86x(0x13,®s,®s,&sregs);
- if (regs.x.cflag) {
- fprintf(stderr,"%s: write failedn",name);
- return(-1);
- }
- return(SECSIZE);
- }