/* lblmod.c Funktion zum Lesen und Schreiben eines Disketten Kennsatzes (disk label) */ #include #include #include 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] = ' '; /* DTA-Adresse holen */ DOS(dta,1ah) /* FCB-Adresse holen und Label suchen */ memset(extfcb, 0 , sizeof extfcb); extfcb[0] = 0xFF; /* erw. FCB deaktivieren */ extfcb[6] = 8; /* Vol. Label Attribut Bit */ extfcb[7] = drivenum; /* 0 = akt. Laufwerk, 1=A , 2=B u.s.w. */ memset(&extfcb[8], '?' , 11); /* waehle *.* */ DOS(extfcb,11h) /* DTA enthaelt den Label FCB */ if ( status == 0 ) { printf("Diskettenname: %11.11s\n", &dta[8]); getlabel(&dta[0x18], "Neuer Name (\"delete\" fuer loeschen) :") if (chars_got == 0) printf("Label nicht geaendert\n"); else if (strncmp(newlabel,"delete ",11) == 0 ) { DOS(dta,13h) printf(status ? "Label fehlerhaft\n" : "Label geloescht\n"); } else { /* Labelaenderung wird ausgefuehrt */ DOS(dta,17h) printf(status ? "Label fehlerhaft\n" : "Label geaendert\n"); } } else { /* kein Label gefunden */ getlabel(&extfcb[8], "neuer Name ( fuer keinen ): \n") if (chars_got > 0 ) { DOS(extfcb,16h) printf(status ? "Label fehlerhaft\n" : "Label angelegt\n"); } } } /* Ende Funktion */ void main() { vollabel(0); /* auf aktuelles Laufwerk */ }