|
Top Document: comp.os.msdos.programmer FAQ part 3/5 Previous Document: Next Document: See reader questions & answers on this topic! - Help others by sharing your knowledge
Date: 5 Feb 2002 22:03:03 -0400
In DOS 5.0 (and possibly in 4.0 as well), there are actually two volume
labels: the LABEL command reports only the first but changes both of
them.
* The traditional volume label is an entry with "volume label" attribute
in the root directory of the disk. The DIR, VOL, and LABEL commands
report this volume label, and LABEL sets it.
* There is a second volume label, which may be different, in the boot
record along with the serial number. In DOS 4.0 and later, INT 21
AH=69 gets or sets the boot record's serial number and volume label
together; see <Q:05.13> [How can I get the disk serial number?] DIR
and VOL ignore this volume label; the LABEL command doesn't report it
but does set it.
The rest of this answer assumes that by "volume label" you mean the
traditional one, the one that DIR and VOL display. Though it's a
directory entry in the root directory, you can't change it using the
newer DOS file-access functions (INT 21 AH=3C, 41, 43); instead, use the
old FCB-oriented directory functions. Specifically, you need to allocate
a 64-byte buffer and a 41- byte extended FCB (file control block). Call
INT 21 AH=1A to find out whether there is a volume label. If there is,
AL returns 0 and you can change the label using DOS function 17 or
delete it using DOS function 13. If there's no volume label, function 1A
will return FF and you can create a label via function 16. Important
points to notice are that ? wildcards are allowed but * are not; the
volume label must be space filled not null terminated.
The following MSC 7.0 code worked for me in DOS 5.0; the functions it
uses have been around since DOS 2.0. The function parameter is 0 for the
current disk, 1 for a:, 2 for b:, etc. It doesn't matter what your
current directory is; these functions always search the root directory
for volume labels. (I didn't try to change the volume label of any
networked drives.)
// Requires DOS.H, STDIO.H, STRING.H
void vollabel(unsigned char drivenum)
{
static unsigned char extfcb[41], dta[64], status, *newlabel;
int chars_got = 0;
#define DOS(buff,func) __asm { __asm mov dx,offset buff \
__asm mov ax,seg buff __asm push ds __asm mov ds,ax \
__asm mov ah,func __asm int 21h __asm pop ds \
__asm mov status,al }
#define getlabel(buff,prompt) newlabel = buff; \
memset(newlabel,' ',11); printf(prompt); \
scanf("%11[^\n]%n", newlabel, &chars_got); \
if (chars_got < 11) newlabel[chars_got] = ' ';
// Set up the 64-byte transfer area used by function 1A.
DOS(dta, 1Ah)
// Set up an extended FCB and search for the volume label.
memset(extfcb, 0, sizeof extfcb);
extfcb[0] = 0xFF; // denotes extended FCB
extfcb[6] = 8; // volume-label attribute bit
extfcb[7] = drivenum; // 1=A,2=B,...; 0=current drive
memset(&extfcb[8], '?', 11);// wildcard *.*
DOS(extfcb,11h)
if(status == 0)
{ // DTA has volume label's FCB
printf("volume label is %11.11s\n", &dta[8]);
getlabel(&dta[0x18], "new label (\"delete\" to delete): ");
if(chars_got==0)
printf("label not changed\n");
else if (strncmp(newlabel,"delete ",11) == 0)
{
DOS(dta,13h)
printf(status ? "label failed\n":"label deleted\n");
}
else
{ // user wants to change label
DOS(dta,17h)
printf(status ? "label failed\n" : "label changed\n");
}
}
else
{ // no volume label was found
printf("disk has no volume label.\n");
getlabel(&extfcb[8], "new label (<Enter> for none): ");
if (chars_got > 0)
{
DOS(extfcb,16h)
printf(status ? "label failed\n" : "label created\n");
}
}
} // end function vollabel
User Contributions:Top Document: comp.os.msdos.programmer FAQ part 3/5 Previous Document: Next Document: Part1 - Part2 - Part3 - Part4 - Part5 - Single Page [ Usenet FAQs | Web FAQs | Documents | RFC Index ] Send corrections/additions to the FAQ Maintainer: jeffrey@carlyle.org (Jeffrey Carlyle)
Last Update March 27 2014 @ 02:11 PM
|

Comment about this article, ask questions, or add new information about this topic: