home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR9 / WDOS0793.ZIP / ZOLMAN.ZIP / DSKLABEL.C next >
C/C++ Source or Header  |  1993-05-12  |  8KB  |  216 lines

  1. /*
  2.     DskLabel.C - Remove & Set Disk Volume Label for DOS
  3.     Copyright (c) Smuth Nakpansua, 1992, 1993.  All rights reserved.
  4.     Create date:  Nov 25, 1992
  5.     Last Update:  March 23, 1993
  6.  
  7.     Compile:  cl /c dsklabel.c      (Microsoft)
  8.               bcc /c dsklabel.c     (Borland)
  9. */
  10.  
  11. #include <dos.h>
  12. #include <io.h>
  13. #include <conio.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #ifdef __TURBOC__
  18. #include <dir.h>
  19. #else   /* for Microsoft C */
  20. #include <direct.h>
  21. #endif
  22.  
  23. #include "dsklabel.h"
  24.  
  25. int _DosRemoveVolumeLabel(int DrvNum)
  26. {
  27.     char disktransfer[80];  /* buffer to DTA */
  28.     union REGS r;
  29.     struct SREGS s;
  30.     char cwd[90];           /* current work directory */
  31.     void far * oldDTA;      /* old disk transfer area */
  32.     XFCB xfcb;
  33.     int result = 0;
  34.     int OldDrv = 0;
  35.  
  36.     if (DrvNum == 0)        /* for current drive, get drive number */
  37. #ifdef __TURBOC__
  38.         DrvNum = getdisk() + 1;   /* 0=A, 1=B, etc */
  39. #else
  40.         DrvNum = _getdrive();   /* 1=A, 2=B, etc */
  41. #endif
  42.     else                    /* else save current drive */
  43. #ifdef __TURBOC__
  44.         OldDrv = getdisk();   /* 0=A, 1=B, etc */
  45. #else
  46.         OldDrv = _getdrive();
  47. #endif
  48. #ifdef __TURBOC__
  49.     getcurdir(DrvNum, cwd); /* save current work directory */
  50.     setdisk(DrvNum - 1);    /* change drive to DrvNum */
  51. #else
  52.     _getdcwd(DrvNum, cwd, sizeof(cwd)); /* save current work directory */
  53.     _dos_setdrive(DrvNum, &r.x.ax); /* change drive to DrvNum */
  54. #endif
  55.     sprintf(disktransfer, "%c:\\", DrvNum + 'A' - 1);  /* make ROOT directory */
  56.     chdir(disktransfer);    /* set to ROOT */
  57.     r.h.ah = 0x2f;          /* get DTA address, return in ES:BX */
  58.     intdosx(&r, &r, &s);    /* call int 21h */
  59. #ifdef __TURBOC__
  60.     oldDTA = MK_FP(s.es, r.x.bx);
  61. #else
  62.     FP_SEG(oldDTA) = s.es;  /* save it */
  63.     FP_OFF(oldDTA) = r.x.bx;
  64. #endif
  65.     segread(&s);            /* get current segment register */
  66.     s.ds = s.ss;            /* point DS:DX to @disktransfer */
  67.     r.x.dx = (unsigned short)disktransfer;
  68.     r.h.ah = 0x1a;          /* set DTA address to DS:DX */
  69.     intdosx(&r, &r, &s);    /* call int 21h */
  70.     memset((void *)&xfcb, 0, sizeof(xfcb));
  71.     memset((void *)xfcb.name, '?', sizeof(xfcb.name)+sizeof(xfcb.ext));
  72.     xfcb.flag = -1;         /* flag signifying extended FCB */
  73.     xfcb.attr = 8;          /* volume attribute byte */
  74.     xfcb.drive = (char)DrvNum;  /* drive number 1=A, 2=B, etc */
  75.     r.h.ah = 0x11;          /* search for first match */
  76.     r.x.dx = (unsigned short)&xfcb;
  77.     segread(&s);
  78.     s.ds = s.ss;
  79.     intdosx(&r, &r, &s);    /* call int 21h */
  80.     if (r.h.al == 0) {  /* found exists volume label, delete */
  81.         strncpy(xfcb.name, (char *)((XFCB *)disktransfer)->name, sizeof(xfcb.name) +
  82.           sizeof(xfcb.ext));
  83.         r.h.ah = 0x13;      /* delete file */
  84.         r.x.dx = (unsigned short)&xfcb;
  85.         segread(&s);        /* point DS:DX to extended FCB for rename file */
  86.         s.ds = s.ss;
  87.         intdosx(&r, &r, &s);    /* call int 21h */
  88.         result = (int)r.h.al;
  89.     } /* if, else do nothing */
  90.     /* restore DTA */
  91.     s.ds = FP_SEG(oldDTA);
  92.     r.x.dx = FP_OFF(oldDTA);
  93.     r.h.ah = 0x1a;          /* set DTA address to DS:DX */
  94.     intdosx(&r, &r, &s);    /* call int 21h */
  95.     if (OldDrv)             /* if changed current drive */
  96. #ifdef __TURBOC__
  97.         setdisk(OldDrv);    /* change drive to DrvNum */
  98. #else
  99.         _dos_setdrive(OldDrv, &OldDrv);
  100. #endif
  101.     chdir(cwd);             /* restore active directiry */
  102.     return(result);         /* return 0 if OK, else error */
  103. } /* eof: _DosRemoveVolumeLabel() */
  104.  
  105. int _DosSetVolumeLabel(int DrvNum, char *VolumeName)
  106. {
  107.     char disktransfer[80];  /* buffer to DTA */
  108.     union REGS r;
  109.     struct SREGS s;
  110.     char cwd[90];           /* current work directory */
  111.     void far * oldDTA;      /* old disk transfer area */
  112.     XFCB xfcb;
  113.     int result = 0;
  114.     int len = strlen(VolumeName);
  115.     int OldDrv = 0;
  116.  
  117.     if (!VolumeName || len == 0)    /* if invalid name */
  118.         return(-1);
  119.     if (len > 11)           /* longer than DOS limited, 11 bytes */
  120.         len = 11;
  121.     if (DrvNum == 0)        /* for current drive, get drive number */
  122. #ifdef __TURBOC__
  123.         DrvNum = getdisk() + 1; /* 0=A, 1=B, etc */
  124. #else
  125.         DrvNum = _getdrive();   /* 1=A, 2=B, etc */
  126. #endif
  127.     else                    /* else save current drive */
  128. #ifdef __TURBOC__
  129.         OldDrv = getdisk();     /* 0=A, 1=B, etc */
  130. #else
  131.         OldDrv = _getdrive();
  132. #endif
  133. #ifdef __TURBOC__
  134.     getcurdir(DrvNum, cwd); /* save current work directory */
  135.     setdisk(DrvNum - 1);    /* change drive to DrvNum */
  136. #else
  137.     _getdcwd(DrvNum, cwd, sizeof(cwd)); /* save current work directory */
  138.     _dos_setdrive(DrvNum, &r.x.ax); /* change drive to DrvNum */
  139. #endif
  140.     sprintf(disktransfer, "%c:\\", DrvNum + 'A' - 1);  /* make ROOT directory */
  141.     chdir(disktransfer);    /* set to ROOT */
  142.     r.h.ah = 0x2f;          /* get DTA address, return in ES:BX */
  143.     intdosx(&r, &r, &s);    /* call int 21h */
  144. #ifdef __TURBOC__
  145.     oldDTA = MK_FP(s.es, r.x.bx);
  146. #else
  147.     FP_SEG(oldDTA) = s.es;  /* save it */
  148.     FP_OFF(oldDTA) = r.x.bx;
  149. #endif
  150.     segread(&s);            /* get current segment register */
  151.     s.ds = s.ss;            /* point DS:DX to @disktransfer */
  152.     r.x.dx = (unsigned short)disktransfer;
  153.     r.h.ah = 0x1a;          /* set DTA address to DS:DX */
  154.     intdosx(&r, &r, &s);    /* call int 21h */
  155.     memset(&xfcb, 0, sizeof(xfcb));
  156.     memset(xfcb.name, '?', sizeof(xfcb.name)+sizeof(xfcb.ext));
  157.     xfcb.flag = -1;         /* flag signifying extended FCB */
  158.     xfcb.attr = 8;          /* volume attribute byte */
  159.     xfcb.drive = (char)DrvNum;  /* drive number 1=A, 2=B, etc */
  160.     r.h.ah = 0x11;          /* search for first match */
  161.     r.x.dx = (unsigned short)&xfcb;
  162.     segread(&s);
  163.     s.ds = s.ss;
  164.     intdosx(&r, &r, &s);    /* call int 21h */
  165.     if (r.h.al == 0) {  /* found exists volume label, rename */
  166.         strncpy(xfcb.name, ((XFCB *)disktransfer)->name, sizeof(xfcb.name) +
  167.           sizeof(xfcb.ext));
  168.         memset(xfcb.name+16, ' ', sizeof(xfcb.name) + sizeof(xfcb.ext));
  169.         strncpy(xfcb.name+16, VolumeName, len);
  170.         r.h.ah = 0x17;      /* rename file */
  171.         r.x.dx = (unsigned short)&xfcb;
  172.         segread(&s);        /* point DS:DX to extended FCB for rename file */
  173.         s.ds = s.ss;
  174.         intdosx(&r, &r, &s);    /* call int 21h */
  175.         result = (int)r.h.al;
  176.     } /* if */
  177.     else {  /* else create */
  178.         char vol[12];
  179.         strncpy(vol, VolumeName, 11);
  180.         if (strchr(vol, '.') == NULL && len > 8) {
  181.             /* if length of filename > 8, must insert '.' */
  182.             strncpy(vol, VolumeName, 8);
  183.             vol[8] = '.';
  184.             strcpy(vol + 9, VolumeName + 8);
  185.         }
  186.         else
  187.             strcpy(vol, VolumeName);
  188.         r.h.ah = 0x5b;      /* create new file */
  189.         r.x.cx = 8;         /* volume label bit set */
  190.         r.x.dx = (unsigned short)vol;
  191.         segread(&s);
  192.         s.ds = s.ss;
  193.         intdosx(&r, &r, &s);
  194.         result = r.x.cflag ? -1 : 0;
  195.         if (!result) {      /* can open, close */
  196.             r.h.ah = 0x3e;      /* close file */
  197.             r.x.bx = r.x.ax;
  198.             intdosx(&r, &r, &s);
  199.         } /* if */
  200.     } /* else */
  201.     s.ds = FP_SEG(oldDTA);
  202.     r.x.dx = FP_OFF(oldDTA);
  203.     r.h.ah = 0x1a;          /* set DTA address to DS:DX */
  204.     intdosx(&r, &r, &s);    /* call int 21h */
  205.     if (OldDrv)
  206. #ifdef __TURBOC__
  207.         setdisk(OldDrv);    /* change drive to DrvNum */
  208. #else
  209.         _dos_setdrive(OldDrv, &OldDrv);
  210. #endif
  211.     chdir(cwd);
  212.     return(result);
  213. } /* eof: _DosSetVolumeLabel() */
  214.  
  215. /* eof: dsklabel.c */
  216.