Κεφάλαιο – 16
Ανάπτυξη περισσότερων βοηθητικών προγραμμάτων για δίσκους
Εισαγωγή
Σε αυτό το κεφάλαιο θα συζητήσουμε πώς να χρησιμοποιήσουμε τις πληροφορίες των καταλόγων MBR, DBR, FAT και Root για την ανάπτυξη βοηθητικών προγραμμάτων που μπορεί να μας βοηθήσουν στη διαχείριση των δεδομένων, στη βελτιστοποίηση της αποθήκευσης ή σε εργασίες αντιμετώπισης προβλημάτων του δίσκου.
Συνήθως, αυτά τα προγράμματα είναι λύση σε κάποιο συγκεκριμένο πρόβλημα. Ορισμένα βοηθητικά προγράμματα και ο προγραμματισμός τους έχουν συζητηθεί σε αυτό το κεφάλαιο.
Απόκρυψη κατατμήσεων
Γενικά, το βοηθητικό πρόγραμμα απόκρυψης διαμερισμάτων χρησιμοποιείται από εκείνους τους χρήστες που εργάζονται σε τέτοιο σύστημα υπολογιστή που χρησιμοποιείται από τους χρήστες. Εάν υπάρχουν πολλοί χρήστες για τον ίδιο υπολογιστή, μπορεί να υπάρχει μεγάλη πιθανότητα να διαβαστούν, να κλαπούν ή να διαγραφούν δεδομένα άλλου χρήστη.
Σε αυτήν την περίπτωση, όταν ο χρήστης έχει ορισμένα σημαντικά δεδομένα ή ορισμένες εμπιστευτικές πληροφορίες στον ίδιο υπολογιστή, μπορεί να είναι πρόθυμος να κρύψει το διαμέρισμα στο οποίο έχει τα δεδομένα του με τέτοιο τρόπο ώστε το διαμέρισμα να μην είναι προσβάσιμο από τον Λειτουργό σύστημα, έτσι ώστε να μην είναι προσβάσιμο από άλλους χρήστες.
Όταν ο χρήστης θέλει να εργαστεί στο σύστημα, μπορεί να έχει πρόσβαση στο διαμέρισμα πίσω, απλώς αποκρύπτοντας το διαμέρισμα. Γενικά αυτού του είδους οι εκδηλώσεις λαμβάνουν χώρα στα επαγγελματικά ιδρύματα, όπου οι υπολογιστές χρησιμοποιούνται από πολλούς φοιτητές, αλλά οι τελειόφοιτοι πάντα ανησυχούν για τα σημαντικά δεδομένα ή την εργασία τους. Όπως και στην έλλειψη γνώσης, ο νέος μαθητής μπορεί να βλάψει ή ακόμα και να διαγράψει τα δεδομένα του.
Πώς το διαμέρισμα γίνεται κρυφό
Ο παρακάτω πίνακας αντιπροσωπεύει τη μορφή του διαμερίσματος στον πίνακα κατατμήσεων του MBR:
Shift |
Importance |
Size |
Description |
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 |
|
Στο offset 04H, σε κάθε καταχώρηση διαμερίσματος, υπάρχει ένα byte ένδειξης συστήματος αρχείων. Αυτό το byte ένδειξης αντιπροσωπεύει τον τύπο του συστήματος αρχείων αυτού του διαμερίσματος. Εάν αλλάξει η τιμή αυτού του byte, αλλάζει η ταυτότητα του διαμερίσματος.
Για παράδειγμα, η τιμή του byte ένδειξης διαμερίσματος για το "DOS 12-Bit FAT" είναι 0x01. Εάν αυτή η τιμή αλλάξει σε 0x11, η ταυτότητα του συστήματος αρχείων στην καταχώριση του πίνακα διαμερισμάτων αλλάζει σε "Hidden DOS 12-bit FAT" (για την πλήρη λίστα των byte ένδειξης διαμερισμάτων, ανατρέξτε στο κεφάλαιο "Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα" που συζητήθηκε νωρίτερα σε αυτό το βιβλίο).
Ο πίνακας που ακολουθεί δείχνει μερικά ακόμη παραδείγματα byte δείκτη συστήματος αρχείων για ορισμένους τύπους διαμερισμάτων:
Ένδειξη τύπου διαμερίσματος Byte |
Περιγραφή του συστήματος αρχείων κατάτμησης |
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 |
Εδώ βλέπουμε ότι το αντίστοιχο κρυφό διαμέρισμα για οποιοδήποτε σύστημα αρχείων βρίσκεται προσθέτοντας την τιμή 0x10 στο byte ένδειξης συστήματος.
Αν και δεν είναι ο σκληρός και γρήγορος κανόνας για την απόκρυψη του διαμερίσματος, ωστόσο λειτουργεί ακόμη και για το μεγαλύτερο μέρος του συστήματος αρχείων. Ο λόγος πίσω από αυτό είναι ότι όταν αλλάζουμε την τιμή του byte δείκτη διαμερισμάτων, αλλάζει η ταυτότητα του συστήματος αρχείων στην καταχώρηση του πίνακα κατατμήσεων. Και είναι πολύ σπάνιο το νέο σύστημα αρχείων να υποστηρίζεται επίσης από το ίδιο λειτουργικό σύστημα.
Σύνταξη προγράμματος για απόκρυψη διαμερίσματος
Το πρόγραμμα που δίνεται στη συνέχεια χρησιμοποιείται για την απόκρυψη του διαμερίσματος χρησιμοποιώντας την καταχώριση διαμερίσματος αυτού του διαμερίσματος από τον πίνακα κατατμήσεων του MBR. Εάν θέλετε να αποκρύψετε άλλα λογικά διαμερίσματα στον εκτεταμένο τόμο, θα πρέπει να αποκτήσετε πρόσβαση στα εκτεταμένα MBR.
Η κωδικοποίηση του προγράμματος δόθηκε στη συνέχεια:
/* Προγραμματίστε την απόκρυψη του διαμερίσματος χρησιμοποιώντας την καταχώρηση πίνακα κατατμήσεων αυτού του Διαμερίσματος από το 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 */
/* Διαβάστε τον Πρώτο Τομέα του Δίσκου */
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);
/* λάβετε την εισαγωγή χρήστη για την απόκρυψη του διαμερίσματος */
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;
}
Σχόλια σχετικά με την κωδικοποίηση:
Το πρόγραμμα διαβάζει byte ένδειξης συστήματος αρχείων και των τεσσάρων καταχωρήσεων διαμερισμάτων στον πίνακα κατατμήσεων του MBR. Η συνάρτηση showtype( ) χρησιμοποιείται για να εμφανίσει το όνομα του συστήματος αρχείων για την αντίστοιχη τιμή του byte δείκτη συστήματος αρχείων.
Ο χρήστης επιλέγει το διαμέρισμα που θα κρυφτεί από το μενού που εμφανίζεται στην οθόνη και, στη συνέχεια, προστίθεται 16 (0x10) στην τιμή του byte ένδειξης συστήματος αρχείων αυτού του διαμερίσματος για να το αποκρύψει.
Η κωδικοποίηση της συνάρτησης showtype( ) είναι η εξής:
/* Λειτουργία για την εμφάνιση του ονόματος του συστήματος αρχείων που αντιστοιχεί στην τιμή του byte ένδειξης συστήματος αρχείων */
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;
}
Γράψιμο προγράμματος για την Unhide the Partition
Το πρόγραμμα για την κατάργηση της απόκρυψης του κρυφού διαμερίσματος λειτουργεί ακριβώς απέναντι από το πρόγραμμα που κρύβει το πρόγραμμα. Σε αυτό το πρόγραμμα αφαιρούμε 16 (0x10) από την τιμή του byte ένδειξης συστήματος αρχείων του κρυφού διαμερίσματος.
Η κωδικοποίηση του προγράμματος γίνεται ως εξής:
/* Προγραμματίστε την απόκρυψη του διαμερίσματος που είχε κρυφτεί από το προηγούμενο πρόγραμμα */
#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);
/* Λάβετε την είσοδο Χρήση για να αποκρύψετε το διαμέρισμα */
gotoxy(1,15);printf("Enter The partition no., Which to
unhide, Or Press any other key to
Exit... ");
tohide=getche();
switch(tohide)
{
/* Αποκρύψτε το πρώτο διαμέρισμα του πίνακα διαμερισμάτων */
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;
}
Σχόλια στο Πρόγραμμα
Να είστε προσεκτικοί όταν δίνετε τον αριθμό διαμερίσματος για να αποκρύψετε. Εάν ο αριθμός του διαμερίσματος εισαχθεί λανθασμένα κατά λάθος, οι πληροφορίες συστήματος αρχείων αυτού του διαμερίσματος θα αλλάξουν και το διαμέρισμα ενδέχεται να μην είναι προσβάσιμο. Ωστόσο, το πρόγραμμα που συζητήθηκε προηγουμένως για την απόκρυψη των κατατμήσεων, μπορεί να σας βοηθήσει να θεραπεύσετε το byte ένδειξης συστήματος αρχείων αυτού του διαμερίσματος.
Σύνταξη προγράμματος διαγραφής διαμερίσματος
Το πρόγραμμα για τη διαγραφή διαμερίσματος χρησιμοποιείται για σκοπούς αντιμετώπισης προβλημάτων. Για παράδειγμα, ας υποθέσουμε ότι είχατε τα διαμερίσματα του συστήματος αρχείων FAT32 στο δίσκο σας. Τώρα αποφασίσατε να εγκαταστήσετε το λειτουργικό σύστημα LINUX στον δίσκο σας ταυτόχρονα.
Εάν υπάρχει τρόπος, η εγκατάσταση του λειτουργικού συστήματος διακόπτεται ενδιάμεσα, στο στάδιο που γίνονταν οι τροποποιήσεις στον πίνακα κατατμήσεων του MBR. Σε τέτοιες περιπτώσεις, υπάρχουν πολλές πιθανότητες το διαμέρισμα, στο οποίο επρόκειτο να εγκαταστήσετε το άλλο λειτουργικό σύστημα, να μην είναι προσβάσιμο.
Σε αυτήν την περίπτωση, ο χώρος στο δίσκο του χαμένου διαμερίσματος καθίσταται άχρηστος λόγω του ότι δεν είναι προσβάσιμος. Ωστόσο, εάν διαγράψουμε τις πληροφορίες διαμερίσματος αυτού του διαμερίσματος από τον πίνακα διαμερισμάτων με οποιονδήποτε τρόπο, μπορούμε να κάνουμε ξανά αυτόν τον χώρο χρησιμοποιήσιμο χρησιμοποιώντας την εντολή FDISK του DOS.
Το πρόγραμμα για τη διαγραφή της καταχώρισης διαμερίσματος από τον πίνακα διαμερισμάτων του MBR έχει δοθεί στη συνέχεια:
/* Προγραμματίστε τη διαγραφή της δεύτερης καταχώρισης διαμερίσματος από τον πίνακα κατατμήσεων του 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();
}
Σχόλια για το πρόγραμμα:
Απαιρέστε το σχόλιο της συνάρτησης biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) για να διαγράψετε το δεύτερο διαμέρισμα από τον πίνακα κατατμήσεων του MBR.
Για να διαγράψετε το διαμέρισμα, όλες οι παράμετροί του ορίζονται στο 0 στην καταχώρηση του πίνακα κατατμήσεων στο MBR. Να θυμάστε πάντα ότι εάν διαγράψετε το εκτεταμένο διαμέρισμα, όλα τα λογικά διαμερίσματα αυτού του εκτεταμένου διαμερίσματος θα γίνουν επίσης απρόσιτα.
Η εμφάνιση συνάρτησης( ) χρησιμοποιείται για την εμφάνιση του πίνακα κατατμήσεων του MBR. Η κωδικοποίηση της συνάρτησης είναι η εξής:
/* Λειτουργία για εμφάνιση πίνακα κατατμήσεων του 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;
}
Μορφοποίηση δισκέτας “Track 0 Bad”
Αυτό το πρόγραμμα χρησιμοποιείται για να μορφοποιήσει τις δισκέτες που έχουν κατεστραμμένους τομείς στο κομμάτι τους 0 και όταν μορφοποιούνται με DOS ή παράθυρα, εμφανίζουν μηνύματα σφάλματος όπως "Track 0 BAD". Ωστόσο, μπορείτε επίσης να το χρησιμοποιήσετε για να διαμορφώσετε κανονικές δισκέτες.
Η κωδικοποίηση του προγράμματος έχει δοθεί στο δίσκο που περιλαμβάνεται σε αυτό το βιβλίο με το όνομα "TTFORMAT.C". Η λογική λειτουργίας του προγράμματος είναι ίδια με το πρόγραμμα που δημοσιεύτηκε στο περιοδικό υπολογιστή PCQUEST, στην έκδοση Φεβρουαρίου 2003.
Σε αυτό το πρόγραμμα, προσπαθούμε να κάνουμε αυτόν τον τύπο δισκέτας επαναχρησιμοποιήσιμες μορφοποιώντας τις. Το πρόγραμμα ακούγεται ότι μπορείτε να χειριστείτε τη δισκέτα ακόμα και με κάποιους κακούς τομείς σε αυτήν. Ωστόσο, εάν ο πρώτος τομέας του δίσκου είναι κακός, η δισκέτα δεν μπορεί να μορφοποιηθεί.
Το πρόγραμμα ξαναγράφει όλες τις πληροφορίες DBR, FAT και Root Directory. Εάν υπάρχουν κατεστραμμένοι τομείς στην επιφάνεια του δίσκου, επισημαίνονται ως κακοί στο FAT.
Στην κωδικοποίηση του προγράμματος, η δομή BPB χρησιμοποιείται για την εγγραφή του μπλοκ παραμέτρων BIOS του DBR. Η δομή boot_sector χρησιμοποιείται για την εγγραφή του DBR του δίσκου. Η δομή διεύθυνση_πεδίου χρησιμοποιείται για την αλληλεπίδραση με τον αριθμό κυλίνδρων, κεφαλών και τομέων ανά κομμάτι και με το μέγεθος του τομέα.
Διαφορετικές λειτουργίες που χρησιμοποιούνται στην κωδικοποίηση του προγράμματος και η περιγραφή τους έχουν δοθεί στον παρακάτω πίνακα.
Ο σειριακός αριθμός τόμου της δισκέτας υπολογίζεται από το DOS σύμφωνα με την τρέχουσα ημερομηνία και ώρα του ρολογιού του συστήματος.
Το πρώτο μέρος του σειριακού αριθμού υπολογίζεται με το άθροισμα του χρόνου (δευτερόλεπτα και εκατοστά του δευτερολέπτου) και της ημερομηνίας (μήνας και ημέρα). Το δεύτερο μέρος του σειριακού αριθμού είναι ίσο με το άθροισμα του χρόνου (ώρες και λεπτά) και της ημερομηνίας (έτος).
Όλοι οι υπολογισμοί εκτελούνται σε δεκαεξαδικό σύστημα. Για παράδειγμα, ας υποθέσουμε ότι μορφοποιήσατε τη δισκέτα σε περιβάλλον DOS στις 11:16:28:65 στις 23/10/2003. Ας υπολογίσουμε τώρα τον σειριακό αριθμό του δίσκου.
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
Τώρα, ας υπολογίσουμε τον σειριακό αριθμό της δισκέτας, σύμφωνα με την περιγραφή που δόθηκε προηγουμένως. Το πρώτο μέρος του σειριακού αριθμού φρεατίου είναι (1C41 + 0A17) = 2658 και το δεύτερο μέρος του σειριακού αριθμού θα είναι (0B10 + 07D3) = 12E3.
Σύνταξη του Εργαλείου Επεξεργασίας Δίσκου
Η κωδικοποίηση του προγράμματος επεξεργασίας δίσκου έχει δοθεί στον δίσκο που περιλαμβάνεται σε αυτό το βιβλίο, με το όνομα αρχείου "TTEDITOR.C". Μπορείτε να χρησιμοποιήσετε αυτό το πρόγραμμα για να αναλύσετε την επιφάνεια των σκληρών δίσκων ή των δισκέτας. Ακόμη και το μεγαλύτερο μέρος της μελέτης κατά τη συγγραφή αυτού του βιβλίου, χρησιμοποίησα το TTEDITOR για να αναλύσω την επιφάνεια του δίσκου ή να εκτελέσω τις τροποποιήσεις του δίσκου.
Ορισμένες από τις σημαντικές εργασίες που μπορεί να εκτελέσει αυτό το πρόγραμμα επεξεργασίας είναι οι εξής:
- Ανάγνωση πληροφοριών ανά τομέα της επιφάνειας σκληρών δίσκων και δισκέτας.
- Γράψτε το αντίγραφο ασφαλείας οποιουδήποτε τομέα για αρχείο.
- Επαναφέρετε τα δεδομένα του τομέα από το αρχείο.
- Τροποποιήστε το μεμονωμένο byte.
- Αριθμομηχανή δεκαεξαδικού σε δεκαδικό και δυαδικό.
Το πρόγραμμα χρησιμοποιεί τις συναρτήσεις biosdisk( ) και _bios_disk( ) για πρόσβαση στους δίσκους. Εάν θέλετε να αναλύσετε το δίσκο πέρα από τα 8,4 GB, Τροποποιήστε το πρόγραμμα με τη χρήση των επεκτάσεων του INT 13H. Η περιγραφή των λειτουργιών που χρησιμοποιούνται στο πρόγραμμα έχει δοθεί στον παρακάτω πίνακα:
Συνάρτηση |
Περιγραφή |
bkground( ) |
δημιουργεί το φόντο και το πλαίσιο της πρώτης οθόνης |
clsline( ) |
Χρησιμοποιείται για τη διαγραφή ολόκληρης της σειράς από την οθόνη που καθορίζεται από τον αριθμό σειράς. |
refresh( ) |
Λειτουργία για ανάκληση όλων των λειτουργιών εμφάνισης στην οθόνη |
writetofile( ) |
Λειτουργία εγγραφής των δεδομένων ενός τομέα σε αρχείο που ορίζεται από το χρήστη. |
writetosector( ) |
Λειτουργία επαναφοράς του τομέα από καθορισμένο αρχείο. |
msgdisp( ) |
Λειτουργία εμφάνισης μηνυμάτων στην οθόνη. |
modify( ) |
Λειτουργία για την τροποποίηση ενός μόνο byte οποιουδήποτε τομέα, που καθορίζεται από τον χρήστη. |
frame( ) |
Λειτουργία σχεδίασης της δομής πλαισίου της εμφάνισης τομέα |
dispmax( ) |
Εμφάνιση μέγιστου αριθμού CHS του δίσκου (Ισχύει έως 8,4 GB Δίσκος) |
display( ) |
Εμφάνιση του τομέα και των πληροφοριών στην οθόνη. |
hextodec( ) |
Λειτουργία για τον υπολογισμό δεκαεξαδικού αριθμού στους αντίστοιχους δεκαδικούς και δυαδικούς αριθμούς. |
Σελίδα Τροποποιήθηκε στις: 18/01/2022