Kapitel – 16
Entwicklung weiterer Dienstprogramme für Festplatten
Einführung
In diesem Kapitel werden wir erörtern, wie die Informationen von MBR, DBR, FAT und Root-Verzeichnissen verwendet werden, um Dienstprogramme zu entwickeln, die uns bei der Verwaltung der Daten, bei der Optimierung des Speichers oder bei Aufgaben zur Fehlerbehebung bei Festplatten helfen können.
Normalerweise sind diese Programme die Lösung für ein bestimmtes Problem. Einige Dienstprogramme und ihre Programmierung wurden in diesem Kapitel besprochen.
Partitionen verstecken
Im Allgemeinen wird das Dienstprogramm zum Verbergen von Partitionen von denjenigen Benutzern verwendet, die an einem solchen Computersystem arbeiten, das von Benutzern verwendet wird. Wenn es viele Benutzer für denselben Computer gibt, kann es sehr wahrscheinlich sein, dass Daten eines anderen Benutzers gelesen, gestohlen oder gelöscht werden.
In einem solchen Fall, in dem der Benutzer einige wichtige Daten oder einige vertrauliche Informationen auf demselben Computer hat, kann er bereit sein, die Partition, in der er seine Daten hat, so zu verstecken, dass das Betriebssystem nicht auf die Partition zugreifen sollte dass andere Benutzer nicht darauf zugreifen können.
Wenn der Benutzer am System arbeiten möchte, kann er wieder auf die Partition zugreifen, indem er einfach die Partition sichtbar macht. Im Allgemeinen finden diese Arten von Veranstaltungen in den professionellen Institutionen statt, wo die Computer von vielen Studenten verwendet werden, aber ältere Studenten sich immer Sorgen um ihre wichtigen Daten oder Projektarbeiten machen. Wie bei Unwissenheit kann der neue Student seine Daten beschädigen oder sogar löschen.
Wie die Partition ausgeblendet wird
Die folgende Tabelle stellt das Partitionsformat in der Partitionstabelle des MBR dar:
Versatz |
Bedeutung |
Größe |
Beschreibung |
00H |
Boot Type Indicator Byte |
1 Byte |
If Byte is 00H, the Partition is Inactive and if Byte is 80H, The Partition is Active (or Bootable) |
01H |
Head Number of Beginning of the Partition |
1 Byte |
Starting Head number of the Partition in Hexadecimal System |
02H |
Sector and Cylinder Number of Beginning of the Partition |
2 Bytes |
6 Bits of First Byte make Starting Sector Number and Combination of remaining 2 Bits (as Two Most Significant Bits) plus 8 Bits of another Byte (Rest 8 least Significant Bits of the 10-Bit Number ) make the Starting Cylinder Number of the Partition |
04H |
File System indicator Byte |
1 Byte |
File System Indicator Byte in Hexadecimal system (for complete list of partition indicator bytes, refer the chapter “Logical Approach to Disks and OS” discussed earlier in this book) |
05H |
Head Number of End of the Partition |
1 Byte |
Ending Head Number of the Partition in Hexadecimal System |
06H |
Sector and Cylinder Number of End of the Partition |
2 Bytes |
6 Bits of First Byte make Ending Sector Number and Combination of remaining 2 Bits (as Two Most Significant Bits) plus 8 Bits of another Byte (Rest 8 least Significant Bits of the 10-Bit Number ) make the Ending Cylinder Number of the Partition |
08H |
Absolute Sector number of Beginning of the Partition |
4 Bytes |
Number of Sectors Between the MBR and the First Sector in the Partition |
0CH |
Absolute Sector number of End of the Partition |
4 Bytes |
Number of Sectors in the Partition |
|
|
Total = 16 Bytes |
|
Am Offset 04H gibt es in jedem Partitionseintrag ein Dateisystemanzeigebyte. Dieses Indikatorbyte repräsentiert den Typ des Dateisystems dieser Partition. Wenn der Wert dieses Bytes geändert wird, wird die Identität der Partition geändert.
Beispielsweise ist der Wert des Partitionsanzeigebytes für „DOS 12-Bit FAT“ 0x01. Wenn dieser Wert auf 0x11 geändert wird, wird die Identität des Dateisystems im Partitionstabelleneintrag in „Hidden DOS 12-Bit FAT“ geändert (eine vollständige Liste der Partitionsanzeigebytes finden Sie im besprochenen Kapitel „Logischer Ansatz für Festplatten und Betriebssysteme“) früher in diesem Buch).
Die folgende Tabelle zeigt einige weitere Beispiele für Dateisystemanzeigebytes für einige Partitionstypen:
Partition type indicator Byte |
Description of File System of Partition |
0x01 |
DOS 12–bit FAT |
0x11 |
Hidden DOS 12–bit FAT |
0x04 |
DOS 16–bit FAT (<=32MB) |
0x14 |
Hidden DOS 16–bit FAT (<=32MB) |
0x05 |
DOS Extended |
0x15 |
Hidden DOS Extended |
0x06 |
DOS 16–bit big (> 32MB) |
0x16 |
Hidden DOS 16–bit big (> 32MB) |
0x07 |
NTFS |
0x17 |
Hidden NTFS |
0x0B |
Windows FAT32 |
0x1B |
Hidden Windows FAT32 |
0x0C |
Windows FAT32 (LBA) |
0x1C |
Hidden Windows FAT32 (LBA) |
0x0E |
Windows FAT16 (LBA) |
0x1E |
Hidden Windows FAT16 (LBA) |
0x0F |
Windows Extended |
0x1F |
Hidden Windows Extended |
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 es nicht die feste Regel zum Verstecken der Partition ist, funktioniert es sogar für den größten Teil des Dateisystems. Der Grund dafür ist, dass, wenn wir den Wert des Partitionsanzeigebytes ändern, die Identität des Dateisystems im Partitionstabelleneintrag geändert wird. Und es ist sehr selten, dass das neue Dateisystem auch von demselben Betriebssystem unterstützt wird.
Programm zum Verstecken der Partition schreiben
Das als nächstes angegebene Programm wird verwendet, um die Partition unter Verwendung des Partitionseintrags dieser Partition aus der Partitionstabelle des MBR zu verbergen. Wenn Sie andere logische Partitionen im erweiterten Volume verstecken möchten, sollten Sie auf die erweiterten MBRs zugreifen.
Die Codierung des Programms wurde als nächstes angegeben:
/* Programm zum Ausblenden der Partition mithilfe des Partitionstabelleneintrags dieser Partition aus dem MBR */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo;
int result, tohide;
int i;
static char dbuf[512];/* Data Buffer to read-Write the
Sector information */
clrscr();
dinfo.drive = 0x80; /* drive number for First
Hard Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
/* Lesen Sie den ersten Sektor der Festplatte */
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("The Partition Codes of Four Partition Entries are,
0x%02x, 0x%02x, 0x%02x And 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
textcolor(15);
gotoxy(5,5);cprintf("Partition Entry in MBR is as
follows:");
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 Benutzereingabe zum Ausblenden der Partition */
gotoxy(1,15);
printf("Enter The partition no. you want to hide,
Or Press any other key to Exit... ");
tohide=getche();
switch(tohide)
{
case '1': /* Hide First Partition in partition Table */
dbuf[450] = dbuf[450] +16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
case '2': /* Hide second Partition in partition Table */
dbuf[466] = dbuf[466]+16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
case '3': /* Hide third Partition in partition Table */
dbuf[482] = dbuf[482] +16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
case '4': /* Hide Fourth Partition in partition Table */
dbuf[498] = dbuf[498]+16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
default:
exit(0);
}
if ((result & 0xff00) == 0)
{
printf("\n\nThe New Partition Codes of Four Partition
Entries are, 0x%02x, 0x%02x, 0x%02x And 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
else
{
printf("Cannot Change the Byte, status = 0x%02x\n",
result);
getch();
}
}
return 0;
}
Kommentare zur Codierung:
Das Programm liest Dateisystemanzeigebytes 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 Dateisystemanzeigebytes anzuzeigen.
Der Benutzer wählt die zu verbergende Partition aus dem auf dem Bildschirm angezeigten Menü aus, und dann wird 16 (0x10) zum Wert des Dateisystemanzeigebytes dieser Partition addiert, um sie zu verbergen.
Die Kodierung der Funktion showtype( ) ist wie folgt:
/* Funktion zum Anzeigen des Namens des Dateisystems, das dem Wert des Dateisystemanzeigebytes entspricht */
showtype(i)
{
switch (i)
{
case 0x00 :cprintf("Empty"); break;
case 0x01 :cprintf("DOS 12-bit FAT"); break;
case 0x02 :cprintf("XENIX root"); break;
case 0x03 :cprintf("XENIX usr"); break;
case 0x04 :cprintf("DOS 16-bit <32M"); break;
case 0x05 :cprintf("Extended"); break;
case 0x06 :cprintf("DOS 16-bit >=32M"); break;
case 0x07 :cprintf("OS/2 HPFS"); break;
case 0x08 :cprintf("AIX"); break;
case 0x09 :cprintf("AIX bootable"); break;
case 0xa :cprintf("OS/2 Boot Manag"); break;
case 0xb :cprintf("Win95/98/ME FAT32"); break;
case 0xc :cprintf("Win95/98/ME FAT32 (LBA)"); break;
case 0xd :cprintf("Win95 FAT16"); break;
case 0xe :cprintf("Win95 FAT16 (LBA)"); break;
case 0xf :cprintf("Win95 Extended"); break;
case 0x11 :cprintf("Hidden FAT-12");break;
case 0x12 :cprintf("Compaq Diagnostics");break;
case 0x14 :cprintf("Hidden FAT-16 (<32)");break;
case 0x15 :cprintf("Hidden Extended");break;
case 0x16 :cprintf("Hidden FAT-16");break;
case 0x17 :cprintf("NTFS"); break;
case 0x40 :cprintf("Venix 80286"); break;
case 0x51 :cprintf("Novell?"); break;
case 0x52 :cprintf("Microport"); break;
case 0x63 :cprintf("GNU HURD"); break;
case 0x64 :
case 0x65 :cprintf("Novell Netware"); break;
case 0x75 :cprintf("PC/IX"); break;
case 0x80 :cprintf("Old MINIX"); break;
case 0x81 :cprintf("Linux/MINIX"); break;
case 0x82 :cprintf("Linux swap"); break;
case 0x83 :cprintf("Linux native"); break;
case 0x85 :cprintf("Linux Extended"); break;
case 0x93 :cprintf("Amoeba"); break;
case 0x94 :cprintf("Amoeba BBT"); break;
case 0xa5 :cprintf("BSD/386"); break;
case 0xa6 :cprintf("OpenBSD"); break;
case 0xa7 :cprintf("NEXTSTEP"); break;
case 0xb7 :cprintf("BSDI fs"); break;
case 0xb8 :cprintf("BSDI swap"); break;
case 0xc7 :cprintf("Syrinx"); break;
case 0xdb :cprintf("CP/M"); break;
case 0xe1 :cprintf("DOS access"); break;
case 0xe3 :cprintf("DOS R/O"); break;
case 0xf2 :cprintf("DOS secondary"); break;
case 0xff :cprintf("BBT"); break;
default :cprintf("UNKOWN");
}
return 0;
}
Schreiben eines Programms zum Einblenden der Partition
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 Dateisystemanzeigebytes der versteckten Partition.
Die Codierung des Programms ist wie folgt:
/* Programm zum Einblenden der vom vorherigen Programm verborgenen Partition */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo;
int result, tohide;
int i;
static char dbuf[512];/* Data buffer */
clrscr();
dinfo.drive = 0x80; /* drive number for
First Hard Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("The Partition Codes of Four Partition
Entries are, 0x%02x, 0x%02x, 0x%02x And 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
textcolor(15);
gotoxy(5,5);
cprintf("Partition Entry in MBR is as follows:");
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);
/* Rufen Sie die Use-Eingabe ab, um die Partition einzublenden */
gotoxy(1,15);printf("Enter The partition no., Which to
unhide, Or Press any other key to
Exit... ");
tohide=getche();
switch(tohide)
{
/* Blendet die erste Partition der Partitionstabelle ein */
case '1':
dbuf[450] = dbuf[450] -16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
/* Unhide second partition of partition table */
case '2':
dbuf[466] = dbuf[466]-16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
/* Unhide third partition of partition table */
case '3':
dbuf[482] = dbuf[482] -16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
/* Unhide fourth partition of partition table */
case '4':
dbuf[498] = dbuf[498]-16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
default:
exit(0);
}
if ((result & 0xff00) == 0)
{
printf("\n\nThe New Partition Codes of Four Partition
Entries are, 0x%02x, 0x%02x, 0x%02x And 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
else
{
printf("Cannot Change the Byte, status = 0x%02x\n",
result);
getch();
}
}
return 0;
}
Kommentare zu Programm
Seien Sie vorsichtig, wenn Sie die Partitionsnummer zum Einblenden angeben. Wenn die Partitionsnummer versehentlich falsch eingegeben wird, werden die Dateisysteminformationen dieser Partition geändert und die Partition kann möglicherweise nicht mehr aufgerufen werden. Das zuvor besprochene Programm zum Ausblenden der Partitionen kann Ihnen jedoch dabei helfen, das Dateisystem-Indikatorbyte dieser Partition zu reparieren.
Schreiben eines Programms zum Löschen einer Partition
Das Programm zum Löschen der Partition wird zur Fehlerbehebung verwendet. Angenommen, Sie hätten die FAT32-Dateisystempartitionen auf Ihrer Festplatte. Jetzt haben Sie sich entschieden, das Betriebssystem LINUX gleichzeitig auf Ihrer Festplatte zu installieren.
Gegebenenfalls wird die Installation des Betriebssystems in dem Stadium unterbrochen, in dem die Änderungen an der Partitionstabelle des MBR vorgenommen wurden. In solchen Fällen gibt es viele Möglichkeiten, dass die Partition, in der Sie das andere Betriebssystem installieren wollten, unzugänglich wird.
In diesem Fall wird der Speicherplatz der verlorenen Partition unbrauchbar, da er nicht mehr zugänglich ist. Wenn wir jedoch die Partitionsinformationen dieser Partition aus der Partitionstabelle löschen, können wir diesen Speicherplatz mit dem FDISK-Befehl von DOS wieder nutzbar machen.
Als nächstes wurde das Programm zum Löschen des Partitionseintrags aus der Partitionstabelle des MBR angegeben:
/* Programm zum Löschen des zweiten Partitionseintrags aus der Partitionstabelle des MBR */
# include <bios.h>
/* structure to read the partition entry from partition table */
struct partition
{
/* Active Partition Byte */
unsigned char bootable ;
/* Starting Head */
unsigned char start_side ;
/* combination of Starting sector and cylinder number */
unsigned int start_sec_cyl ;
/* File system Indicator Byte */
unsigned char parttype ;
/* Ending Head */
unsigned char end_side ;
/* combination of Starting sector and cylinder number */
unsigned int end_sec_cyl ;
/* Relative Sector Number */
unsigned long part_beg ;
/* Partition length in sectors */
unsigned long plen ;
} ;
/* Structure to read-write MBR */
struct part
{
/* IPL (Initial Program Loader) */
unsigned char master_boot[446] ;
/* Partition table */
struct partition pt[4] ;
/* Magic Number */
int lasttwo ;
} ;
struct part p ;
void main()
{
unsigned int t1,t2;
clrscr();
biosdisk ( 2, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* display the information of
Partition table */
getch();
p.pt[1].bootable = 0;
p.pt[1].start_side = 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 After Deleting the Second Partition
Entry From MBR Partition Table,");
printf("\n The Partition Table will Be Changed as
Follows: ");
/* To Delete Second Partition Information from partition
table of MBR Remove the forward slashes from the
biosdisk( ) function. Do not use Carelessly, Partition
information of Second Partition of Partition Table will
be Erased Completely. */
////// biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* Display the information of partition
table after modification */
getch();
}
Kommentare zum Programm:
Kommentieren Sie die Funktion biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) aus, um die zweite Partition aus der Partitionstabelle des MBR zu löschen.
Um die Partition zu löschen, werden alle Parameter davon im Partitionstabelleneintrag im MBR auf 0 gesetzt. Denken Sie immer daran, dass alle logischen Partitionen dieser erweiterten Partition ebenfalls unzugänglich werden, wenn Sie die erweiterte Partition löschen.
Die Funktion display( ) wird verwendet, um die Partitionstabelle des MBR anzuzeigen. Die Codierung der Funktion ist wie folgt:
/* Funktion zum Anzeigen der Partitionstabelle des MBR */
display()
{
unsigned int s_sec, s_trk, e_sec, e_trk, i, t1, t2 ;
char type[20], boot[5] ;
printf("\n\nPart. Boot Starting location Ending Location
Relative Number of");
printf("\nType Side Cylinder Sector Side Cylinder
Sector Sectors Sectors\n");
for ( i = 0 ; i <= 3 ; i++ )
{
if ( p.pt[i].bootable == 0x80 )
strcpy ( boot, "Yes" ) ;
else
strcpy ( boot, "No" ) ;
switch ( p.pt[i].parttype )
{
case 0x00 :
strcpy ( type, "Unused" ) ; break ;
case 0x1 :
strcpy ( type, "FAT12" ) ; break ;
case 0x2 :
strcpy ( type, "Xenix" ) ; break ;
case 0x3 :
strcpy ( type, "Xenix:usr" ) ; break ;
case 0x4 :
strcpy ( type, "FAT16<32M" ) ; break ;
case 0x5 :
strcpy ( type, "DOS-Ext." ) ; break ;
case 0x6 :
strcpy ( type, "FAT16>32M" ) ; break ;
case 0x7 :
strcpy ( type, "NTFS" ) ; break ;
case 0x0b :
strcpy ( type, "FAT32" ) ; break ;
case 0x0c :
strcpy ( type, "FAT32-LBA" ) ; break ;
case 0x0d :
strcpy ( type, "VFAT16" ) ; break ;
case 0x0e :
strcpy ( type, "VFAT16-LBA" ) ; break ;
case 0x0f :
strcpy ( type, "FAT EXT" ) ; break ;
case 0x17 :
strcpy ( type, "HPFS" ) ; break ;
case 0x81 :
strcpy ( type, "Old LINUX" ) ; break ;
case 0x82 :
strcpy ( type, "LinuxSwap" ) ; break ;
case 0x83 :
strcpy ( type, "LinuxNative" ) ; break ;
case 0x85 :
strcpy ( type, "Linux Ext." ) ; break ;
default :
strcpy ( type, "Unknown" ) ; break ;
}
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", type, boot ) ;
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 ) ;
}
return 0;
}
Formatieren der „Track 0 Bad“-Diskette
Dieses Programm wird verwendet, um jene Disketten zu formatieren, die fehlerhafte Sektoren auf ihrer Spur 0 haben und wenn sie mit DOS oder Windows formatiert werden, Fehlermeldungen wie „Spur 0 SCHLECHT“ anzeigen. Sie können damit aber auch normale Disketten formatieren.
Die Codierung des Programms ist auf der diesem Buch beiliegenden Diskette mit dem Namen „TTFORMAT.C“ angegeben. Die Arbeitslogik des Programms ist die gleiche wie bei dem Programm, das in der Ausgabe Februar 2003 des Computermagazins PCQUEST veröffentlicht wurde.
In diesem Programm versuchen wir, diese Art von Disketten wiederverwendbar zu machen, indem wir sie formatieren. Das Programm klingt, dass Sie mit der Diskette sogar mit einigen fehlerhaften Sektoren umgehen können. 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 auf der Oberfläche der Festplatte fehlerhafte Sektoren vorhanden sind, werden sie 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 Platte zu schreiben. Die Struktur address_field wird zum Interagieren mit der Anzahl von Zylindern, Köpfen und Sektoren pro Spur und mit der Größe des Sektors verwendet.
Verschiedene Funktionen, die bei der Codierung des Programms verwendet werden, und ihre Beschreibung sind in der folgenden Tabelle angegeben.
Die Datenträger-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 der Uhrzeit (Sekunden und Hundertstelsekunden) und des Datums (Monat und Tag). Der zweite Teil der Seriennummer ist gleich der Summe aus Uhrzeit (Stunden und Minuten) und Datum (Jahr).
Alle Berechnungen werden im Hexadezimalsystem durchgeführt. Nehmen wir beispielsweise an, dass Sie die Diskette am 23.10.2003 um 11:16:28:65 in der DOS-Umgebung formatiert haben. Lassen Sie uns nun die Seriennummer der Festplatte berechnen.
The time in (seconds and Hundredths of seconds) format is
= (28 and 65)
= (1CH and 41H)
Write it as 1C41
Similarly, date in (month and day) format is
= (10 and 23)
= (0AH and 17H)
Write it as 0A17
Similarly, time in (hours and minutes) format is,
= (11 and 16)
= (0BH and 10H)
Write it as 0B10
And the year will be
= 2003
= 07D3
Lassen Sie uns nun die Seriennummer der Diskette gemäß der obigen Beschreibung berechnen. 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 Codierung 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. Selbst während des Schreibens dieses Buches habe ich den größten Teil des Studiums mit TTEDITOR durchgeführt, um die Plattenoberfläche zu analysieren oder die Plattenmodifikationen durchzuführen.
Einige der wichtigen Aufgaben, die dieses Bearbeitungsprogramm ausführen kann, sind wie folgt:
- Lesen Sie pro Sektor Informationen über die Oberfläche von Festplatten und Disketten.
- Schreiben Sie die Sicherung eines beliebigen Sektors in eine Datei.
- Stellen Sie die Daten des Sektors aus der Datei wieder her.
- Ändern Sie das einzelne Byte.
- Hexadezimal zu Dezimal und Binärrechner.
Das Programm verwendet die Funktionen biosdisk( ) und _bios_disk( ) für den Zugriff auf die Festplatten. Wenn Sie die Festplatte über 8,4 GB hinaus analysieren möchten, ändern Sie das Programm mit der Verwendung von Erweiterungen von INT 13H. Die Beschreibung der im Programm verwendeten Funktionen ist in der folgenden Tabelle angegeben:
Function |
Description |
bkground( ) |
creates the back ground and frame of first screen |
clsline( ) |
Used to clear the complete row from the screen specified by row number. |
refresh( ) |
Function to recall all the display functions on the screen |
writetofile( ) |
Function to write the data of a sector to user defined file. |
writetosector( ) |
Function to restore the sector from specified file. |
msgdisp( ) |
Function to display messages on the screen. |
modify( ) |
Function to modify a single byte of any sector, specified by user. |
frame( ) |
Function to draw the frame structure of sector display |
dispmax( ) |
Display maximum CHS number of the disk (Valid Up to 8.4 GB Disk) |
display( ) |
Display the sector and information on the screen. |
hextodec( ) |
Function to Calculate hexadecimal number to corresponding decimal and binary numbers. |
Seite Geändert am: 08/03/2022