Kapitel – 16
ENTWICKLUNG WEITERER FESTPLATTEN-DIENSTPROGRAMME
Einführung
In diesem Kapitel besprechen wir, wie wir mithilfe von MBR-, DBR-, FAT- und Stammverzeichnisinformationen Dienstprogramme entwickeln, die uns bei der Verwaltung von Daten, der Speicheroptimierung oder der Lösung vieler Probleme bei der Festplattenfehlerbehebung helfen können.
Normalerweise stellen diese Programme eine Lösung für ein bestimmtes Problem dar. In diesem Kapitel wurden einige Dienstprogramme und ihre Programmierung besprochen.
Abschnitte ausblenden
Normalerweise wird das Dienstprogramm zum Verbergen von Partitionen von den Benutzern verwendet, die am selben Computersystem arbeiten wie die anderen Benutzer. Wenn sich viele Benutzer auf einem Computer befinden, ist die Wahrscheinlichkeit groß, dass Daten anderer Benutzer gelesen, gestohlen oder gelöscht werden können.
Wenn der Benutzer in einem solchen Fall wichtige Daten oder vertrauliche Informationen auf demselben Computer hat, möchte er möglicherweise die Partition verbergen, auf der sich seine Daten befinden, sodass das Betriebssystem und somit auch ein anderer Benutzer nicht auf die Partition zugreifen können.
Wenn der Benutzer am System arbeiten möchte, kann er durch einfaches Öffnen wieder auf den Abschnitt zugreifen. Typischerweise ereignen sich derartige Vorfälle in Berufsbildungseinrichtungen, wo die Computer von vielen Studierenden genutzt werden, ältere Studierende sich jedoch ständig Sorgen um ihre wichtigen Daten oder Projektarbeiten machen. Ebenso wie bei mangelndem Wissen kann es passieren, dass ein neuer Student seine Daten beschädigt oder sogar löscht.
Wie wird ein Abschnitt ausgeblendet?
Die folgende Tabelle zeigt das Partitionsformat in der MBR-Partitionstabelle:
Kompensieren |
Bedeutung |
Größe |
Beschreibung |
00 Uhr |
Boot-Typ-Indikator-Byte |
1 Byte |
Wenn das Byte 00H ist, ist die Partition inaktiv, und wenn das Byte 80H ist , ist die Partition aktiv (oder bootfähig). |
01 Uhr |
Startabschnittsnummer |
1 Byte |
Startpartitionsnummer in Hexadezimal |
02 Uhr |
Sektor- und Zylindernummer des Beginns der Partition |
2 Byte |
Die 6 Bits des ersten Bytes bilden die Startsektornummer, und die Kombination der verbleibenden 2 Bits (als die beiden höchstwertigen Bits) und der 8 Bits des anderen Bytes (die verbleibenden 8 niederwertigsten Bits der 10-Bit-Zahl) bilden die Startzylindernummer der Partition. |
04 Uhr |
Dateisystem- Indikatorbyte |
1 Byte |
Dateisystemindikatorbyte in hexadezimaler Schreibweise (eine vollständige Liste der Partitionsindikatorbytes finden Sie im Kapitel „Logischer Ansatz für Festplatten und Betriebssysteme“ , das weiter oben in diesem Buch besprochen wurde) |
05 Uhr |
Ende der Abschnittsüberschriftnummer |
1 Byte |
Endpartitionsnummer in Hexadezimal |
06 Uhr |
Sektor- und Zylindernummer am Ende des Abschnitts |
2 Byte |
Die 6 Bits des ersten Bytes bilden die endgültige Sektornummer, und die Kombination der verbleibenden 2 Bits (als die beiden höchstwertigen Bits) und der 8 Bits des anderen Bytes (die verbleibenden 8 niederwertigsten Bits der 10-Bit-Zahl) bilden die endgültige Zylindernummer der Partition. |
08 Uhr |
Absolute Sektornummer vom Anfang der Partition |
4 Byte |
Anzahl der Sektoren zwischen MBR und erstem Sektor in der Partition |
0H |
Absolute Sektornummer des Endes der Partition |
4 Byte |
Anzahl der Sektoren im Abschnitt |
|
|
Gesamt = 16 Bytes |
|
Am Offset 04H befindet sich in jedem Partitionseintrag ein Dateisystemindikatorbyte. Dieses Anzeigebyte stellt den Dateisystemtyp dieser Partition dar. Ändert sich der Wert dieses Bytes, ändert sich die Abschnittsidentifikation.
Beispielsweise ist der Partitionsindikator-Bytewert für „DOS 12-Bit FAT“ 0x01. Wenn dieser Wert auf 0x11 geändert wird, ändert sich die Dateisystemkennung im Partitionstabelleneintrag in „Hidden DOS 12-Bit FAT“ (eine vollständige Liste der Partitionsindikatorbytes finden Sie im Kapitel „Logischer Ansatz für Festplatten und Betriebssysteme“, das weiter oben in diesem Buch besprochen wurde).
Die folgende Tabelle zeigt einige weitere Beispiele für Dateisystem-Indikatorbytes für einige Partitionstypen:
Partitionstyp-Indikatorbyte |
Beschreibung des Partitionsdateisystems |
Nummer: |
DOS 12–Bit FAT |
Version: 0x11 |
Verstecktes DOS 12-Bit FAT |
Version: |
DOS 16–Bit FAT (<=32 MB) |
Version: 0x14 |
Verstecktes DOS 16-Bit FAT (<=32 MB) |
Version: |
DOS erweitert |
0x15 |
Verstecktes DOS erweitert |
Version: |
DOS 16-Bit groß (>32 MB) |
Version: 0x16 |
Verstecktes DOS 16-Bit, groß (> 32 MB) |
Version: |
NTFS |
Version: 0x17 |
Verstecktes NTFS |
Version: |
Windows FAT32 |
Version: 0x1B |
Verstecktes Windows FAT32 |
0x0C |
Windows FAT32 (LBA) |
Version: |
Verstecktes Windows FAT32 (LBA) |
Version: |
Windows FAT16 (LBA) |
Version: |
Verstecktes Windows FAT16 (LBA) |
Version: |
Windows erweitert |
Version: |
Versteckte Fenster erweitert |
Hier sehen wir, dass die entsprechende versteckte Partition für jedes Dateisystem gefunden wird, indem der Wert 0x10 zu seinem Systemindikatorbyte hinzugefügt wird.
Obwohl dies keine feste Regel zum Ausblenden der Partition ist, funktioniert es dennoch für die meisten Dateisysteme. Der Grund dafür ist, dass sich die Identität des Dateisystems im Partitionstabelleneintrag ändert, wenn wir den Wert des Partitionsindikatorbytes ändern. Und es kommt sehr selten vor, dass das neue Dateisystem auch vom gleichen Betriebssystem unterstützt wird.
Programm zum Verstecken der Partition schreiben
Das folgende Programm wird verwendet, um die Partition mithilfe des Partitionseintrags dieser Partition aus der Partitionstabelle des MBR auszublenden. Wenn Sie andere logische Partitionen im erweiterten Volume ausblenden möchten, sollten Sie auf die erweiterten MBRs zugreifen.
Die Codierung des Programms ist wie folgt:
/* Programm zum Ausblenden der Partition mithilfe des Partitionstabelleneintrags dieser Partition im MBR */
#include <bios.h>
#include <stdio.h>
int Haupt(void)
{
Struktur diskinfo_t dinfo;
int-Ergebnis, ausblenden;
int ich;
static char dbuf[512];/* Datenpuffer zum Lesen/Schreiben der
Brancheninformationen */
clrscr();
dinfo.drive = 0x80; /* Laufwerksnummer für First
Festplatte */
dinfo.head = 0; /* Festplattenkopfnummer */
dinfo.track = 0; /* Titelnummer */
dinfo.sector = 1; /* Sektornummer */
dinfo.nsectors = 1; /* Sektorenanzahl */
dinfo.buffer = dbuf; /* Datenpuffer */
/* Den ersten Sektor der Festplatte lesen */
Ergebnis = _bios_disk(_DISK_READ, &dinfo);
wenn ((Ergebnis & 0xff00) == 0)
{
printf("Die Partitionscodes der vier Partitionseinträge sind:
0x%02x, 0x%02x, 0x%02x und 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
Textfarbe (15);
gotoxy(5,5);cprintf("Partitionseintrag im MBR ist wie
folgt:");
gotoxy(10,7);cprintf("1. "); showtype(dbuf[450] & 0xff);
gotoxy(10,8);cprintf("2. "); showtype(dbuf[466] & 0xff);
gotoxy(10,9);cprintf("3. "); showtype(dbuf[482] & 0xff);
gotoxy(10,10);cprintf("4. "); showtype(dbuf[498] & 0xff);
/* Benutzereingabe zum Ausblenden der Partition abrufen */
gotoxy(1,15);
printf("Geben Sie die Partitionsnummer ein, die Sie verbergen möchten,
Oder drücken Sie zum Beenden eine beliebige andere Taste … ");
zu verstecken = getche();
Schalter (zum Ausblenden)
{
Fall '1': /* Erste Partition in der Partitionstabelle ausblenden */
dbuf[450] = dbuf[450] +16;
Ergebnis = _bios_disk(_DISK_WRITE, &dinfo);
brechen;
Fall '2': /* Zweite Partition in der Partitionstabelle ausblenden */
dbuf[466] = dbuf[466]+16;
Ergebnis = _bios_disk(_DISK_WRITE, &dinfo);
brechen;
Fall '3': /* Dritte Partition in der Partitionstabelle ausblenden */
dbuf[482] = dbuf[482] +16;
Ergebnis = _bios_disk(_DISK_WRITE, &dinfo);
brechen;
Fall '4': /* Vierte Partition in Partitionstabelle ausblenden */
dbuf[498] = dbuf[498]+16;
Ergebnis = _bios_disk(_DISK_WRITE, &dinfo);
brechen;
Standard:
Ausfahrt (0);
}
wenn ((Ergebnis & 0xff00) == 0)
{
printf("\n\nDie neuen Partitionscodes von Four Partition
Einträge sind 0x%02x, 0x%02x, 0x%02x und 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
anders
{
printf("Byte kann nicht geändert werden, Status = 0x%02x\n",
Ergebnis);
getch();
}
}
gebe 0 zurück;
}
Anmerkungen zur Kodierung:
Das Programm liest Dateisystemindikatorbytes aller vier Partitionseinträge in der Partitionstabelle des MBR. Die Funktion showtype( ) wird verwendet, um den Namen des Dateisystems für den entsprechenden Wert des Dateisystemindikatorbytes anzuzeigen.
Der Benutzer wählt die auszublendende Partition aus dem auf dem Bildschirm angezeigten Menü aus. Anschließend wird zum Wert des Dateisystemindikatorbytes dieser Partition 16 (0x10) addiert, um sie auszublenden.
Die Kodierung der Funktion showtype( ) lautet wie folgt:
/* Funktion zum Anzeigen des Namens des Dateisystems entsprechend dem Wert des Dateisystemindikatorbytes */
Anzeigetyp(i)
{
Schalter (i)
{
Fall 0x00: cprintf ("Leer"); Unterbrechung;
Fall 0x01: cprintf ("DOS 12-Bit FAT"); Unterbrechung;
Fall 0x02: cprintf ("XENIX-Wurzel"); Unterbrechung;
Fall 0x03: cprintf ("XENIX usr"); Unterbrechung;
Fall 0x04: cprintf ("DOS 16-Bit <32 M"); Unterbrechung;
Fall 0x05: cprintf ("Erweitert"); Unterbrechung;
Fall 0x06: cprintf ("DOS 16-Bit >=32 M"); Unterbrechung;
Fall 0x07: cprintf ("OS/2 HPFS"); Unterbrechung;
Fall 0x08: cprintf ("AIX"); Unterbrechung;
Fall 0x09: cprintf ("AIX bootfähig"); Unterbrechung;
Fall 0xa: cprintf ("OS/2 Boot Manag"); Unterbrechung;
Fall 0xb: cprintf ("Win95/98/ME FAT32"); Unterbrechung;
Fall 0xc: cprintf ("Win95/98/ME FAT32 (LBA)"); Unterbrechung;
Fall 0xd: cprintf ("Win95 FAT16"); Unterbrechung;
Fall 0xe: cprintf ("Win95 FAT16 (LBA)"); Unterbrechung;
Fall 0xf: cprintf ("Win95 Extended"); Unterbrechung;
Fall 0x11: cprintf ("Verstecktes FAT-12"); Unterbrechung;
Fall 0x12: cprintf ("Compaq Diagnostics"); Unterbrechung;
Fall 0x14: cprintf ("Verstecktes FAT-16 (<32)"); Unterbrechung;
Fall 0x15: cprintf ("Versteckt erweitert"); Unterbrechung;
Fall 0x16: cprintf ("Verstecktes FAT-16"); Unterbrechung;
Fall 0x17: cprintf ("NTFS"); Unterbrechung;
Fall 0x40: cprintf ("Venix 80286"); Unterbrechung;
Fall 0x51: cprintf („Novell?“); Unterbrechung;
Fall 0x52: cprintf ("Mikroport"); Unterbrechung;
Fall 0x63: cprintf ("GNU HURD"); Unterbrechung;
Fall 0x64:
Fall 0x65: cprintf ("Novell Netware"); Unterbrechung;
Fall 0x75: cprintf ("PC/IX"); Unterbrechung;
Fall 0x80: cprintf ("Altes MINIX"); Unterbrechung;
Fall 0x81: cprintf ("Linux/MINIX"); Unterbrechung;
Fall 0x82: cprintf ("Linux-Swap"); Unterbrechung;
Fall 0x83: cprintf ("Linux native"); Unterbrechung;
Fall 0x85: cprintf ("Linux Extended"); Unterbrechung;
Fall 0x93: cprintf ("Amöbe"); Unterbrechung;
Fall 0x94: cprintf ("Amöbe BBT"); Unterbrechung;
Fall 0xa5: cprintf ("BSD/386"); Unterbrechung;
Fall 0xa6: cprintf ("OpenBSD"); Unterbrechung;
Fall 0xa7: cprintf ("NÄCHSTER SCHRITT"); Unterbrechung;
Fall 0xb7: cprintf ("BSDI fs"); Unterbrechung;
Fall 0xb8: cprintf ("BSDI-Austausch"); Unterbrechung;
Fall 0xc7: cprintf ("Syrinx"); Unterbrechung;
Fall 0xdb: cprintf ("CP/M"); Unterbrechung;
Fall 0xe1: cprintf ("DOS-Zugriff"); Unterbrechung;
Fall 0xe3: cprintf("DOS R/O"); Unterbrechung;
Fall 0xf2: cprintf ("DOS sekundär"); Unterbrechung;
Fall 0xff: cprintf ("BBT"); Unterbrechung;
Standard: cprintf("UNBEKANNT");
}
gebe 0 zurück;
}
Ein Programm zum Einblenden der Partition schreiben
Das Programm zum Einblenden der versteckten Partition funktioniert genau entgegengesetzt zu dem Programm, das das Programm versteckt. In diesem Programm subtrahieren wir 16 (0x10) vom Wert des Dateisystemindikatorbytes der versteckten Partition.
Die Codierung des Programms ist wie folgt:
/* Programm zum Einblenden der vom vorherigen Programm ausgeblendeten Partition */
#include <bios.h>
#include <stdio.h>
int Haupt(void)
{
Struktur diskinfo_t dinfo;
int-Ergebnis, ausblenden;
int ich;
static char dbuf[512];/* Datenpuffer */
clrscr();
dinfo.drive = 0x80; /* Laufwerksnummer für
Erste Festplatte */
dinfo.head = 0; /* Festplattenkopfnummer */
dinfo.track = 0; /* Titelnummer */
dinfo.sector = 1; /* Sektornummer */
dinfo.nsectors = 1; /* Sektorenanzahl */
dinfo.buffer = dbuf; /* Datenpuffer */
Ergebnis = _bios_disk(_DISK_READ, &dinfo);
wenn ((Ergebnis & 0xff00) == 0)
{
printf("Die Partitionscodes von vier Partitionen
Einträge sind 0x%02x, 0x%02x, 0x%02x und 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
Textfarbe (15);
gotoxy(5,5);
cprintf("Partitionseintrag im MBR ist wie folgt:");
gotoxy(10,7);cprintf("1. "); showtype(dbuf[450] & 0xff);
gotoxy(10,8);cprintf("2. "); showtype(dbuf[466] & 0xff);
gotoxy(10,9);cprintf("3. "); showtype(dbuf[482] & 0xff);
gotoxy(10,10);cprintf("4. "); showtype(dbuf[498] & 0xff);
/* Holen Sie sich die Eingabe „Use“, um die Partition sichtbar zu machen */
gotoxy(1,15);printf("Geben Sie die Partitionsnummer ein, die
einblenden, Oder Drücken Sie eine beliebige andere Taste, um
Ausfahrt... ");
zu verstecken = getche();
Schalter (zum Ausblenden)
{
/* Erste Partition der Partitionstabelle einblenden */
Fall '1':
dbuf[450] = dbuf[450] -16;
Ergebnis = _bios_disk(_DISK_WRITE, &dinfo);
brechen;
/* Zweite Partition der Partitionstabelle einblenden */
Fall '2':
dbuf[466] = dbuf[466]-16;
Ergebnis = _bios_disk(_DISK_WRITE, &dinfo);
brechen;
/* Dritte Partition der Partitionstabelle einblenden */
Fall '3':
dbuf[482] = dbuf[482] -16;
Ergebnis = _bios_disk(_DISK_WRITE, &dinfo);
brechen;
/* Vierte Partition der Partitionstabelle einblenden */
Fall '4':
dbuf[498] = dbuf[498]-16;
Ergebnis = _bios_disk(_DISK_WRITE, &dinfo);
brechen;
Standard:
Ausfahrt (0);
}
wenn ((Ergebnis & 0xff00) == 0)
{
printf("\n\nDie neuen Partitionscodes von Four Partition
Einträge sind 0x%02x, 0x%02x, 0x%02x und 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
anders
{
printf("Byte kann nicht geändert werden, Status = 0x%02x\n",
Ergebnis);
getch();
}
}
gebe 0 zurück;
}
Kommentare zum Programm
Seien Sie vorsichtig, wenn Sie die anzuzeigende Partitionsnummer eingeben. Wenn die Partitionsnummer versehentlich falsch eingegeben wird, werden die Dateisysteminformationen dieser Partition geändert und die Partition kann unzugänglich werden. Das zuvor besprochene Programm zum Ausblenden der Partitionen kann Ihnen jedoch dabei helfen, das Dateisystemindikatorbyte dieser Partition zu reparieren.
Programm zum Löschen der Partition schreiben
Das Programm zum Löschen von Partitionen wird zur Fehlerbehebung verwendet. Nehmen wir beispielsweise an, dass Sie FAT32-Dateisystempartitionen auf Ihrer Festplatte hatten. Nun haben Sie beschlossen, gleichzeitig das LINUX-Betriebssystem auf Ihrer Festplatte zu installieren.
In jedem Fall wird die Installation des Betriebssystems unterbrochen, und zwar in der Phase, in der Änderungen an der Partitionstabelle des MBR vorgenommen werden. In solchen Fällen besteht eine große Wahrscheinlichkeit, dass die Partition, in der Sie das andere Betriebssystem installieren wollten, nicht mehr zugänglich ist.
In diesem Fall wird der Speicherplatz der verlorenen Partition unbrauchbar, da er nicht mehr zugänglich ist. Wenn wir jedoch die Partitionsinformationen dieser Partition auf irgendeine Weise aus der Partitionstabelle löschen, können wir diesen Speicherplatz mit dem DOS-Befehl FDISK wieder nutzbar machen.
Im Folgenden finden Sie das Programm zum Löschen des Partitionseintrags aus der Partitionstabelle des MBR:
/* Programm zum Löschen des zweiten Partitionseintrags aus der Partitionstabelle des MBR */
# include <bios.h>
/* Struktur zum Lesen des Partitionseintrags aus der Partitionstabelle */
Strukturpartition
{
/* Aktives Partitionsbyte */
vorzeichenloser Charakter, bootfähig;
/* Startkopf */
unsigned char Startseite;
/* Kombination aus Startsektor und Zylindernummer */
vorzeichenlose Ganzzahl start_sec_cyl;
/* Dateisystem-Indikator-Byte */
vorzeichenloser Zeichenteiltyp;
/* Endkopf */
vorzeichenloses Zeichen Endseite;
/* Kombination aus Startsektor und Zylindernummer */
vorzeichenlose Ganzzahl end_sec_cyl;
/* Relative Sektornummer */
vorzeichenloser langer Teilanfang;
/* Partitionslänge in Sektoren */
unsigniertes langes Plen;
} ;
/* Struktur zum Lesen/Schreiben des MBR */
Strukturteil
{
/* IPL (Initialer Programmlader) */
unsigned char master_boot[446] ;
/* Partitionstabelle */
Strukturpartition pt[4];
/* Magische Zahl */
int letztezwei;
} ;
Strukturteil p;
void main()
{
vorzeichenlose Ganzzahl t1,t2;
clrscr();
Biosdisk (2, 0x80, 0, 0, 1, 1, &p);
display(); /* zeige die Informationen an von
Partitionstabelle */
getch();
p.pt[1].bootable = 0;
p.pt[1].start_seite = 0 ;
p.pt[1].start_sec_cyl = 0;
p.pt[1].parttype = 0;
p.pt[1].end_side = 0;
p.pt[1].end_sec_cyl = 0;
p.pt[1].part_beg = 0;
p.pt[1].plen = 0;
printf("\n\n\n Nach dem Löschen der zweiten Partition
Eintrag aus der MBR-Partitionstabelle,");
printf("\n Die Partitionstabelle wird geändert als
Es folgt: ");
/* So löschen Sie die Informationen zur zweiten Partition aus der Partition
Tabelle des MBR Entfernen Sie die Schrägstriche aus der
biosdisk( )-Funktion. Verwenden Sie nicht nachlässig, Partition
Informationen zur zweiten Partition der Partitionstabelle werden
vollständig gelöscht werden. */
////// Biosdisk (3, 0x80, 0, 0, 1, 1, &p);
display(); /* Zeigt die Informationen zur Partition an
Tabelle nach Änderung */
getch();
}
Kommentare zum Programm:
Entfernen Sie die Kommentarzeichen aus der Funktion „Biosdisk“ (3, 0x80, 0, 0, 1, 1, &p), um die zweite Partition aus der Partitionstabelle des MBR zu löschen.
Um die Partition zu löschen, werden alle Parameter im Partitionstabelleneintrag im MBR auf 0 gesetzt. Denken Sie immer daran, dass, wenn Sie die erweiterte Partition löschen, auch alle logischen Partitionen dieser erweiterten Partition unzugänglich werden.
Die Funktion display( ) wird verwendet, um die Partitionstabelle des MBR anzuzeigen. Die Kodierung der Funktion lautet wie folgt:
/* Funktion zum Anzeigen der Partitionstabelle des MBR */
Anzeige()
{
vorzeichenlose Ganzzahl s_sec, s_trk, e_sec, e_trk, i, t1, t2;
Zeichentyp[20], Boot[5];
printf("\n\nPart. Boot Startort Endort
Relative Anzahl von");
printf("\nTyp Seitenzylinder Sektor Seitenzylinder
Sektor Sektoren Sektoren\n");
für (i = 0; i <= 3; i++)
{
wenn (p.pt[i].bootable == 0x80)
strcpy (boot, "Ja");
anders
strcpy (boot, "Nein");
Schalter ( p.pt[i].parttype )
{
Fall 0x00:
strcpy (Typ, „Unbenutzt“); Unterbrechung;
Fall 0x1:
strcpy (Typ „FAT12“); Unterbrechung;
Fall 0x2:
strcpy (Typ „Xenix“); Unterbrechung;
Fall 0x3:
strcpy (Typ „Xenix:usr“); Unterbrechung;
Fall 0x4:
strcpy (Typ „FAT16<32M“); Unterbrechung;
Fall 0x5:
strcpy (Typ „DOS-Ext.“); Unterbrechung;
Fall 0x6:
strcpy (Typ „FAT16>32M“); Unterbrechung;
Fall 0x7:
strcpy (Typ „NTFS“); Unterbrechung;
Fall 0x0b:
strcpy (Typ „FAT32“); Unterbrechung;
Fall 0x0c:
strcpy (Typ „FAT32-LBA“); Unterbrechung;
Fall 0x0d:
strcpy (Typ „VFAT16“); Unterbrechung;
Fall 0x0e:
strcpy (Typ „VFAT16-LBA“); Unterbrechung;
Fall 0x0f:
strcpy (Typ „FAT EXT“); Unterbrechung;
Fall 0x17:
strcpy (Typ „HPFS“); Unterbrechung;
Fall 0x81:
strcpy (Typ „Altes LINUX“); Unterbrechung;
Fall 0x82:
strcpy (Typ „LinuxSwap“); Unterbrechung;
Fall 0x83:
strcpy (Typ „LinuxNative“); Unterbrechung;
Fall 0x85:
strcpy (Typ „Linux Ext.“); Unterbrechung;
Standard :
strcpy (Typ „Unbekannt“); Unterbrechung;
}
s_sec = ( p.pt[i].start_sec_cyl & 0x3f ) ;
t1 = ( p.pt[i].start_sec_cyl & 0xff00 ) >> 8 ;
t2 = (p.pt[i].start_sec_cyl & 0x00c0) << 2;
s_trk = t1 | t2;
e_sec = ( p.pt[i].end_sec_cyl & 0x3f ) ;
t1 = ( p.pt[i].end_sec_cyl & 0xff00 ) >> 8 ;
t2 = (p.pt[i].end_sec_cyl & 0x00c0) << 2;
e_trk = t1 | t2;
printf ( "\n%6s %3s", Typ, Booten ) ;
printf ( "%4d %6d %8d", p.pt[i].start_side,
s_trk,s_sec ) ;
printf ( "%7d %6u %8u", p.pt[i].end_side, e_trk,
e_sec ) ;
printf ( " %10lu %10lu", p.pt[i].part_beg,
p.pt[i].plen ) ;
}
gebe 0 zurück;
}
Formatieren der Diskette „Track 0 Bad“
Dieses Programm dient zum Formatieren von Disketten, die fehlerhafte Sektoren auf Spur 0 aufweisen und bei der Formatierung mit DOS oder Windows Fehlermeldungen wie „Spur 0 BAD“ anzeigen. Sie können es jedoch auch zum Formatieren normaler Disketten verwenden.
Der Code des Programms ist auf der diesem Buch beiliegenden Diskette mit dem Namen „TTFORMAT.C“ angegeben. Die Arbeitslogik des Programms ist dieselbe wie die des Programms, das im Computermagazin PCQUEST in der Februarausgabe 2003 veröffentlicht wurde.
In diesem Programm versuchen wir, diese Art von Disketten durch Formatieren wiederverwendbar zu machen. Das Programm gibt an, dass Sie die Diskette auch dann verwenden können, wenn sie einige fehlerhafte Sektoren enthält. Wenn jedoch der erste Sektor der Diskette fehlerhaft ist, kann die Diskette nicht formatiert werden.
Das Programm schreibt alle DBR-, FAT- und Stammverzeichnisinformationen neu. Wenn sich auf der Oberfläche der Festplatte fehlerhafte Sektoren befinden, werden diese in FAT als fehlerhaft markiert.
Bei der Codierung des Programms wird die Struktur BPB verwendet, um den BIOS-Parameterblock des DBR zu schreiben. Die Struktur boot_sector wird verwendet, um den DBR der Festplatte zu schreiben. Die Struktur address_field wird verwendet, um mit der Anzahl der Zylinder, Köpfe und Sektoren pro Spur und mit der Größe des Sektors zu interagieren.
In der folgenden Tabelle sind die verschiedenen bei der Programmcodierung verwendeten Funktionen und ihre Beschreibung aufgeführt.

Die Volume-Seriennummer der Diskette wird vom DOS anhand des aktuellen Datums und der Uhrzeit der Systemuhr berechnet.
Der erste Teil der Seriennummer errechnet sich aus der Summe von Uhrzeit (Sekunden und Hundertstelsekunden) und Datum (Monat und Tag). Der zweite Teil der Seriennummer entspricht der Summe von Uhrzeit (Stunden und Minuten) und Datum (Jahr).
Alle Berechnungen werden im Hexadezimalsystem durchgeführt. Nehmen wir beispielsweise an, Sie haben die Diskette am 23.10.2003 um 11:16:28:65 in der DOS-Umgebung formatiert. Nun berechnen wir die Seriennummer der Diskette.
Die Zeit im Format (Sekunden und Hundertstelsekunden) ist
= (28 und 65)
= (1CH und 41H)
Schreiben Sie es als 1C41
Ebenso ist das Datum im Format (Monat und Tag)
= (10 und 23)
= (0AH und 17H)
Schreiben Sie es als 0A17
Ebenso ist die Zeit im Format (Stunden und Minuten)
= (11 und 16)
= (0BH und 10H)
Schreiben Sie es als 0B10
Und das Jahr wird
= 2003
= 07D3
Berechnen wir nun die Seriennummer der Diskette gemäß der zuvor gegebenen Beschreibung. Der erste Teil der Seriennummer lautet (1C41 + 0A17) = 2658 und der zweite Teil der Seriennummer lautet (0B10 + 07D3) = 12E3.
Schreiben des Disk-Editing-Tools
Die Kodierung des Diskettenbearbeitungsprogramms ist auf der diesem Buch beiliegenden Diskette mit dem Dateinamen „TTEDITOR.C“ angegeben. Mit diesem Programm können Sie die Oberfläche von Festplatten oder Disketten analysieren. Sogar die meiste Zeit beim Schreiben dieses Buches habe ich TTEDITOR verwendet, um die Festplattenoberfläche zu analysieren oder Festplattenänderungen vorzunehmen.
Hier sind einige der wichtigen Aufgaben, die dieses Bearbeitungsprogramm ausführen kann:
- Sektorweises Lesen von Informationen von der Oberfläche von Festplatten und Disketten.
- Schreiben Sie eine Sicherungskopie eines beliebigen Sektors in eine Datei.
- Sektordaten aus Datei wiederherstellen.
- Ändere ein Byte.
- Rechner zum Umwandeln von Hexadezimalzahlen in Dezimal- und Binärzahlen.
Das Programm verwendet die Funktionen biosdisk( ) und _bios_disk( ), um auf Festplatten zuzugreifen. Wenn Sie eine Festplatte mit mehr als 8,4 GB analysieren möchten, ändern Sie das Programm so, dass es INT 13H-Erweiterungen verwendet. Die Beschreibung der im Programm verwendeten Funktionen finden Sie in der folgenden Tabelle:
Funktion |
Beschreibung |
Hintergrund() |
erstellt den Hintergrund und den Rahmen des ersten Bildschirms |
clsline( ) |
Wird verwendet, um eine ganze Zeile vom Bildschirm zu löschen, die durch die Zeilennummer angegeben ist. |
aktualisieren( ) |
Funktion zum Aufrufen aller Anzeigefunktionen auf dem Bildschirm |
schreibeindatei() |
Funktion zum Schreiben von Sektordaten in eine Benutzerdatei. |
in Sektor schreiben () |
Die Funktion zum Wiederherstellen eines Sektors aus einer angegebenen Datei. |
msgdisp() |
Funktion zum Anzeigen von Nachrichten auf dem Bildschirm. |
ändern( ) |
Funktion zum Ändern eines Bytes eines vom Benutzer angegebenen Sektors. |
rahmen( ) |
Funktion zum Zeichnen der Sektoranzeigerahmenstruktur |
dispmax( ) |
Zeigt die maximale CHS-Nummer einer Platte an (gültig für Platten bis 8,4 GB) |
Anzeige( ) |
Anzeigebereich und Informationen auf dem Bildschirm. |
hextodec( ) |
Funktion zum Umwandeln einer Hexadezimalzahl in die entsprechende Dezimal- und Binärzahl. |