Κεφάλαιο – 16
ΑΝΑΠΤΥΞΗ ΠΕΡΙΣΣΟΤΕΡΩΝ ΒΟΗΘΗΤΩΝ ΔΙΣΚΩΝ
Εισαγωγή
Σε αυτό το κεφάλαιο, θα συζητήσουμε πώς να χρησιμοποιήσουμε πληροφορίες καταλόγου MBR, DBR, FAT και root για να αναπτύξουμε βοηθητικά προγράμματα που μπορούν να μας βοηθήσουν να διαχειριστούμε δεδομένα, να βελτιστοποιήσουμε την αποθήκευση ή να λύσουμε πολλά προβλήματα αντιμετώπισης προβλημάτων δίσκου.
Συνήθως αυτά τα προγράμματα είναι μια λύση σε ένα συγκεκριμένο πρόβλημα. Ορισμένα βοηθητικά προγράμματα και ο προγραμματισμός τους συζητήθηκαν σε αυτό το κεφάλαιο.
Απόκρυψη τμημάτων
Συνήθως, το βοηθητικό πρόγραμμα απόκρυψης διαμερισμάτων χρησιμοποιείται από εκείνους τους χρήστες που εργάζονται στο ίδιο σύστημα υπολογιστή που χρησιμοποιούν οι χρήστες. Εάν υπάρχουν πολλοί χρήστες σε έναν υπολογιστή, υπάρχει μεγάλη πιθανότητα να διαβαστούν, να κλαπούν ή να διαγραφούν τα δεδομένα ενός άλλου χρήστη.
Σε μια τέτοια περίπτωση, εάν ο χρήστης έχει κάποια σημαντικά δεδομένα ή εμπιστευτικές πληροφορίες στον ίδιο υπολογιστή, μπορεί να θέλει να κρύψει το διαμέρισμα όπου βρίσκονται τα δεδομένα του, έτσι ώστε να μην είναι δυνατή η πρόσβαση στο διαμέρισμα από το λειτουργικό σύστημα και επομένως να μην είναι δυνατή η πρόσβαση σε άλλο χρήστη.
Όταν ο χρήστης θέλει να εργαστεί στο σύστημα, μπορεί να αποκτήσει πρόσβαση στην ενότητα απλά ανοίγοντας την ενότητα. Συνήθως, τέτοια γεγονότα συμβαίνουν σε επαγγελματικά ιδρύματα όπου οι υπολογιστές χρησιμοποιούνται από πολλούς μαθητές, αλλά οι τελειόφοιτοι πάντα ανησυχούν για τα σημαντικά δεδομένα ή την εργασία τους. Όπως και με την έλλειψη γνώσης, ένας νέος μαθητής μπορεί να βλάψει ή ακόμα και να διαγράψει τα δεδομένα του.
Πώς μια ενότητα γίνεται κρυφή;
Ο παρακάτω πίνακας δείχνει τη μορφή διαμερίσματος στον πίνακα διαμερισμάτων MBR:
Αποζημιώνω |
Εννοια |
Μέγεθος |
Περιγραφή |
00H |
Byte ένδειξης τύπου εκκίνησης |
1 byte |
Εάν το byte είναι 00H, το διαμέρισμα είναι ανενεργό και εάν το byte είναι 80H , το διαμέρισμα είναι ενεργό (ή εκκινήσιμο). |
01 Ω |
Αριθμός ενότητας έναρξης |
1 byte |
Αρχικός αριθμός κατάτμησης σε δεκαεξαδικό |
02H |
Αριθμός τομέα και κυλίνδρου της αρχής του χωρίσματος |
2 byte |
Τα 6 bit του πρώτου byte αποτελούν τον αριθμό του αρχικού τομέα και ο συνδυασμός των υπολοίπων 2 bit (ως τα δύο πιο σημαντικά bit) και των 8 bit του άλλου byte (τα υπόλοιπα 8 λιγότερο σημαντικά bit του αριθμού των 10 bit) συνθέτουν τον αριθμό κυλίνδρου έναρξης του διαμερίσματος. |
04Ω |
Byte ένδειξης συστήματος αρχείων |
1 byte |
Byte δείκτη συστήματος αρχείων σε δεκαεξαδικό (για μια πλήρη λίστα των byte δείκτη διαμερισμάτων, ανατρέξτε στο κεφάλαιο "Λογική προσέγγιση σε δίσκους και λειτουργικά συστήματα" που συζητήθηκε νωρίτερα σε αυτό το βιβλίο) |
05Ω |
Τέλος ενότητας Αριθμός επικεφαλίδας |
1 byte |
Τελικός αριθμός κατάτμησης σε δεκαεξαδικό |
06Ω |
Τομέας και αριθμός κυλίνδρου στο τέλος του τμήματος |
2 byte |
Τα 6 bit του πρώτου byte αποτελούν τον τελικό αριθμό τομέα και ο συνδυασμός των υπολοίπων 2 bit (ως τα δύο πιο σημαντικά bit) και των 8 bit του άλλου byte (τα υπόλοιπα 8 λιγότερο σημαντικά bit του αριθμού των 10 bit) αποτελούν τον τελικό αριθμό κυλίνδρου του διαμερίσματος. |
08Ω |
Ο απόλυτος αριθμός τομέα της αρχής του διαμερίσματος |
4 byte |
Αριθμός τομέων μεταξύ MBR και πρώτου τομέα σε κατάτμηση |
0H |
Ο απόλυτος αριθμός τομέα του τέλους του διαμερίσματος |
4 byte |
Αριθμός τομέων στην ενότητα |
|
|
Σύνολο = 16 byte |
|
Σε μετατόπιση 04H, σε κάθε καταχώρηση διαμερίσματος, υπάρχει ένα byte ένδειξης συστήματος αρχείων. Αυτό το byte ένδειξης αντιπροσωπεύει τον τύπο συστήματος αρχείων αυτού του διαμερίσματος. Εάν αλλάξει η τιμή αυτού του byte, αλλάζει η αναγνώριση ενότητας.
Για παράδειγμα, η τιμή byte ένδειξης διαμερίσματος για το "DOS 12-Bit FAT" είναι 0x01. Εάν αυτή η τιμή αλλάξει σε 0x11, το αναγνωριστικό συστήματος αρχείων στην καταχώριση του πίνακα διαμερισμάτων αλλάζει σε "Hidden DOS 12-bit FAT" (για μια πλήρη λίστα με τα byte ένδειξης διαμερισμάτων, ανατρέξτε στο κεφάλαιο "Λογική προσέγγιση σε δίσκους και λειτουργικά συστήματα" που συζητήθηκε νωρίτερα σε αυτό το βιβλίο).
Ο παρακάτω πίνακας δείχνει μερικά ακόμη παραδείγματα byte δείκτη συστήματος αρχείων για ορισμένους τύπους διαμερισμάτων:
Byte ένδειξης τύπου partition |
Περιγραφή του συστήματος αρχείων κατάτμησης |
0x01 |
DOS 12-bit FAT |
0x11 |
Κρυφό DOS 12-bit FAT |
0x04 |
DOS 16-bit FAT (<=32 MB) |
0x14 |
Κρυφό DOS 16-bit FAT (<=32 MB) |
0x05 |
DOS Extended |
0x15 |
Εκτεταμένο κρυφό DOS |
0x06 |
DOS 16-bit μεγάλο (>32 MB) |
0x16 |
Κρυφό DOS 16-bit Μεγάλο (>32 MB) |
0x07 |
NTFS |
0x17 |
Κρυφό NTFS |
0x0B |
Windows FAT32 |
0x1B |
Κρυφό Windows FAT32 |
0x0C |
Windows FAT32 (LBA) |
0x1C |
Κρυφό Windows FAT32 (LBA) |
0x0E |
Windows FAT16 (LBA) |
0x1E |
Κρυφό Windows FAT16 (LBA) |
0x0F |
Τα Windows επεκτάθηκαν |
0x1F |
Τα κρυφά παράθυρα επεκτάθηκαν |
Εδώ βλέπουμε ότι το αντίστοιχο κρυφό διαμέρισμα για οποιοδήποτε σύστημα αρχείων βρίσκεται προσθέτοντας την τιμή 0x10 στο byte ένδειξης συστήματος.
Αν και δεν είναι ο σκληρός και γρήγορος κανόνας για την απόκρυψη του διαμερίσματος, ωστόσο λειτουργεί ακόμη και για το μεγαλύτερο μέρος του συστήματος αρχείων. Ο λόγος πίσω από αυτό είναι ότι όταν αλλάζουμε την τιμή του byte δείκτη διαμερισμάτων, αλλάζει η ταυτότητα του συστήματος αρχείων στην καταχώρηση του πίνακα διαμερισμάτων. Και είναι πολύ σπάνιο το νέο σύστημα αρχείων να υποστηρίζεται επίσης από το ίδιο λειτουργικό σύστημα.
Σύνταξη προγράμματος για την απόκρυψη διαμερίσματος
Το πρόγραμμα που δίνεται στη συνέχεια χρησιμοποιείται για την απόκρυψη του διαμερίσματος χρησιμοποιώντας την καταχώριση διαμερίσματος αυτού του διαμερίσματος από τον πίνακα κατατμήσεων του MBR. Εάν θέλετε να αποκρύψετε άλλα λογικά διαμερίσματα στον εκτεταμένο τόμο, θα πρέπει να έχετε πρόσβαση στα εκτεταμένα MBR.
Η κωδικοποίηση του προγράμματος έχει δοθεί παρακάτω:
/* Πρόγραμμα για την απόκρυψη του διαμερίσματος χρησιμοποιώντας την καταχώρηση πίνακα κατατμήσεων αυτού του Διαμερίσματος από το MBR */
#include <bios.h>
#include <stdio.h>
int main (κενό)
{
struct diskinfo_t dinfo;
int αποτέλεσμα, tohide?
int i?
static char dbuf[512];/* Data Buffer για ανάγνωση-εγγραφή του
Πληροφορίες τομέα */
clrscr();
dinfo.drive = 0x80; /* αριθμός μονάδας δίσκου για το First
Σκληρός Δίσκος */
dinfo.head = 0; /* αριθμός κεφαλής δίσκου */
dinfo.track = 0; /* αριθμός κομματιού */
dinfo.sector = 1; /* αριθμός τομέα */
dinfo.nsectors = 1; /* καταμέτρηση τομέα */
dinfo.buffer = dbuf; /* buffer δεδομένων */
/* Διαβάστε τον πρώτο τομέα του δίσκου */
αποτέλεσμα = _bios_disk(_DISK_READ, &dinfo);
αν ((αποτέλεσμα & 0xff00) == 0)
{
printf("Οι κωδικοί διαμερισμάτων τεσσάρων καταχωρήσεων διαμερισμάτων είναι,
0x%02x, 0x%02x, 0x%02x και 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
textcolor(15);
gotoxy(5,5);cprintf("Η καταχώριση διαμερίσματος στο MBR είναι ως
ακολουθεί:");
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("Εισαγάγετε τον αριθμό κατάτμησης που θέλετε να αποκρύψετε,
Ή Πατήστε οποιοδήποτε άλλο πλήκτρο για Έξοδος... ");
tohide=getche();
διακόπτης (απόκρυψη)
{
περίπτωση '1': /* Απόκρυψη πρώτου διαμερίσματος στον πίνακα διαμερισμάτων */
dbuf[450] = dbuf[450] +16;
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
διακοπή;
case '2': /* Απόκρυψη δεύτερου διαμερίσματος στον πίνακα διαμερισμάτων */
dbuf[466] = dbuf[466]+16;
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
διακοπή;
case '3': /* Απόκρυψη τρίτου διαμερίσματος στον πίνακα διαμερισμάτων */
dbuf[482] = dbuf[482] +16;
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
διακοπή;
case '4': /* Απόκρυψη τέταρτου διαμερίσματος στον πίνακα διαμερισμάτων */
dbuf[498] = dbuf[498]+16;
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
διακοπή;
αθέτηση:
exit(0);
}
αν ((αποτέλεσμα & 0xff00) == 0)
{
printf("\n\nΟι νέοι κωδικοί διαμερισμάτων του Four Partition
Οι καταχωρήσεις είναι, 0x%02x, 0x%02x, 0x%02x και 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
αλλού
{
printf("Δεν είναι δυνατή η αλλαγή του byte, κατάσταση = 0x%02x\n",
αποτέλεσμα);
getch();
}
}
επιστροφή 0;
}
Σχόλια σχετικά με την κωδικοποίηση:
Το πρόγραμμα διαβάζει byte δείκτη συστήματος αρχείων και των τεσσάρων καταχωρήσεων διαμερισμάτων στον πίνακα κατατμήσεων του MBR. Η συνάρτηση showtype( ) χρησιμοποιείται για να εμφανίσει το όνομα του συστήματος αρχείων για την αντίστοιχη τιμή του byte ένδειξης συστήματος αρχείων.
Ο χρήστης επιλέγει το διαμέρισμα που θα κρυφτεί από το μενού που εμφανίζεται στην οθόνη και στη συνέχεια προστίθεται 16 (0x10) στην τιμή του byte ένδειξης συστήματος αρχείων αυτού του διαμερίσματος για να το κρύψει.
Η κωδικοποίηση της συνάρτησης showtype( ) είναι η εξής:
/* Λειτουργία για εμφάνιση του ονόματος του συστήματος αρχείων που αντιστοιχεί στην τιμή του byte δείκτη συστήματος αρχείων */
τύπος προβολής (i)
{
διακόπτης (i)
{
case 0x00 :cprintf("Empty"); διακοπή;
case 0x01 :cprintf("DOS 12-bit FAT"); διακοπή;
case 0x02 :cprintf("ρίζα XENIX"); διακοπή;
case 0x03 :cprintf("XENIX usr"); διακοπή;
case 0x04 :cprintf("DOS 16-bit <32M"); διακοπή;
case 0x05 :cprintf("Extended"); διακοπή;
case 0x06 :cprintf("DOS 16-bit >=32M"); διακοπή;
case 0x07 :cprintf("OS/2 HPFS"); διακοπή;
case 0x08 :cprintf("AIX"); διακοπή;
case 0x09 :cprintf("AIX bootable"); διακοπή;
case 0xa :cprintf("OS/2 Boot Manag"); διακοπή;
case 0xb :cprintf("Win95/98/ME FAT32"); διακοπή;
case 0xc :cprintf("Win95/98/ME FAT32 (LBA)"); διακοπή;
case 0xd :cprintf("Win95 FAT16"); διακοπή;
case 0xe :cprintf("Win95 FAT16 (LBA)"); διακοπή;
case 0xf :cprintf("Win95 Extended"); διακοπή;
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"); διακοπή;
case 0x40 :cprintf("Venix 80286"); διακοπή;
case 0x51 :cprintf("Novell?"); διακοπή;
case 0x52 :cprintf("Microport"); διακοπή;
case 0x63 :cprintf("GNU HURD"); διακοπή;
θήκη 0x64:
case 0x65 :cprintf("Novell Netware"); διακοπή;
case 0x75 :cprintf("PC/IX"); διακοπή;
case 0x80 :cprintf("Old MINIX"); διακοπή;
case 0x81 :cprintf("Linux/MINIX"); διακοπή;
case 0x82 :cprintf("Linux swap"); διακοπή;
case 0x83 :cprintf("Linux native"); διακοπή;
case 0x85 :cprintf("Linux Extended"); διακοπή;
case 0x93 :cprintf("Amoeba"); διακοπή;
case 0x94 :cprintf("Amoeba BBT"); διακοπή;
case 0xa5 :cprintf("BSD/386"); διακοπή;
case 0xa6 :cprintf("OpenBSD"); διακοπή;
case 0xa7 :cprintf("NEXTSTEP"); διακοπή;
case 0xb7 :cprintf("BSDI fs"); διακοπή;
case 0xb8 :cprintf("BSDI swap"); διακοπή;
case 0xc7 :cprintf("Syrinx"); διακοπή;
case 0xdb :cprintf("CP/M"); διακοπή;
case 0xe1 :cprintf("πρόσβαση DOS"); διακοπή;
case 0xe3 :cprintf("DOS R/O"); διακοπή;
case 0xf2 :cprintf("DOS secondary"); διακοπή;
case 0xff :cprintf("BBT"); διακοπή;
προεπιλογή :cprintf("UNKOWN");
}
επιστροφή 0;
}
Γράψιμο προγράμματος για την Unhide the Partition
Το πρόγραμμα για την απόκρυψη του κρυφού διαμερίσματος λειτουργεί ακριβώς απέναντι από το πρόγραμμα που κρύβει το πρόγραμμα. Σε αυτό το πρόγραμμα αφαιρούμε 16 (0x10) από την τιμή του byte δείκτη συστήματος αρχείων του κρυφού διαμερίσματος.
Η κωδικοποίηση του προγράμματος έχει ως εξής:
/* Πρόγραμμα για να αποκρύψετε το διαμέρισμα που ήταν κρυμμένο από το προηγούμενο πρόγραμμα */
#include <bios.h>
#include <stdio.h>
int main (κενό)
{
struct diskinfo_t dinfo;
int αποτέλεσμα, tohide?
int i?
static char dbuf[512];/* Buffer δεδομένων */
clrscr();
dinfo.drive = 0x80; /* αριθμός μονάδας δίσκου για
Πρώτος σκληρός δίσκος */
dinfo.head = 0; /* αριθμός κεφαλής δίσκου */
dinfo.track = 0; /* αριθμός κομματιού */
dinfo.sector = 1; /* αριθμός τομέα */
dinfo.nsectors = 1; /* καταμέτρηση τομέα */
dinfo.buffer = dbuf; /* buffer δεδομένων */
αποτέλεσμα = _bios_disk(_DISK_READ, &dinfo);
αν ((αποτέλεσμα & 0xff00) == 0)
{
printf("The Partition Codes of Four Partition
Οι καταχωρήσεις είναι, 0x%02x, 0x%02x, 0x%02x και 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
textcolor(15);
gotoxy (5,5);
cprintf("Η καταχώριση διαμερίσματος στο MBR είναι η εξής:");
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., What to
unhide, Ή Πατήστε οποιοδήποτε άλλο πλήκτρο για να
Έξοδος...");
tohide=getche();
διακόπτης (απόκρυψη)
{
/* Κατάργηση απόκρυψης του πρώτου διαμερίσματος του πίνακα διαμερισμάτων */
περίπτωση '1':
dbuf[450] = dbuf[450] -16;
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
διακοπή;
/* Κατάργηση απόκρυψης δεύτερου διαμερίσματος του πίνακα διαμερισμάτων */
περίπτωση '2':
dbuf[466] = dbuf[466]-16;
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
διακοπή;
/* Κατάργηση απόκρυψης τρίτου διαμερίσματος του πίνακα διαμερισμάτων */
περίπτωση '3':
dbuf[482] = dbuf[482] -16;
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
διακοπή;
/* Κατάργηση απόκρυψης τέταρτου διαμερίσματος του πίνακα διαμερισμάτων */
περίπτωση "4":
dbuf[498] = dbuf[498]-16;
αποτέλεσμα = _bios_disk(_DISK_WRITE, &dinfo);
διακοπή;
αθέτηση:
exit(0);
}
αν ((αποτέλεσμα & 0xff00) == 0)
{
printf("\n\nΟι νέοι κωδικοί διαμερισμάτων του Four Partition
Οι καταχωρήσεις είναι, 0x%02x, 0x%02x, 0x%02x και 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
αλλού
{
printf("Δεν είναι δυνατή η αλλαγή του byte, κατάσταση = 0x%02x\n",
αποτέλεσμα);
getch();
}
}
επιστροφή 0;
}
Σχόλια για το πρόγραμμα
Να είστε προσεκτικοί όταν δίνετε τον αριθμό διαμερίσματος για να εμφανιστεί. Εάν ο αριθμός του διαμερίσματος εισαχθεί λάθος κατά λάθος, οι πληροφορίες συστήματος αρχείων αυτού του διαμερίσματος θα αλλάξουν και το διαμέρισμα ενδέχεται να μην είναι προσβάσιμο. Ωστόσο, το πρόγραμμα που συζητήθηκε προηγουμένως για την απόκρυψη των κατατμήσεων, μπορεί να σας βοηθήσει να θεραπεύσετε το byte ένδειξης συστήματος αρχείων αυτού του διαμερίσματος.
Σύνταξη προγράμματος για τη διαγραφή διαμερίσματος
Το πρόγραμμα για τη διαγραφή διαμερίσματος χρησιμοποιείται για σκοπούς αντιμετώπισης προβλημάτων. Για παράδειγμα, ας υποθέσουμε ότι είχατε τα διαμερίσματα του συστήματος αρχείων FAT32 στο δίσκο σας. Τώρα αποφασίσατε να εγκαταστήσετε το λειτουργικό σύστημα LINUX στον δίσκο σας ταυτόχρονα.
Αν ναι, η εγκατάσταση του λειτουργικού διακόπτεται ενδιάμεσα, στο στάδιο που γίνονταν οι τροποποιήσεις στον πίνακα κατατμήσεων του MBR. Σε τέτοιες περιπτώσεις, υπάρχουν πολλές πιθανότητες το διαμέρισμα, στο οποίο επρόκειτο να εγκαταστήσετε το άλλο λειτουργικό σύστημα, να γίνει απρόσιτο.
Σε αυτήν την περίπτωση ο χώρος στο δίσκο του χαμένου διαμερίσματος γίνεται άχρηστος λόγω του ότι είναι απρόσιτος. Ωστόσο, εάν διαγράψουμε τις πληροφορίες διαμερίσματος αυτού του διαμερίσματος από τον πίνακα διαμερισμάτων με οποιονδήποτε τρόπο, μπορούμε και πάλι να χρησιμοποιήσουμε αυτόν τον χώρο χρησιμοποιώντας την εντολή FDISK του DOS.
Το πρόγραμμα για τη διαγραφή της καταχώρισης κατάτμησης από τον πίνακα κατατμήσεων του MBR έχει δοθεί παρακάτω:
/* Πρόγραμμα για τη διαγραφή της δεύτερης καταχώρισης διαμερίσματος από τον πίνακα κατατμήσεων του MBR */
# περιλαμβάνουν <bios.h>
/* δομή για την ανάγνωση της καταχώρησης διαμερίσματος από τον πίνακα διαμερισμάτων */
struct partition
{
/* Active Partition Byte */
ανυπόγραφο char bootable ;
/* Αρχική κεφαλή */
ανυπόγραφο char start_side ;
/* συνδυασμός αρχικού τομέα και αριθμού κυλίνδρου */
ανυπόγραφο int start_sec_cyl ;
/* Σύστημα αρχείων Δείκτη Byte */
ανυπόγραφο parttype char ;
/* Κεφαλή λήξης */
ανυπόγραφο char end_side ;
/* συνδυασμός αρχικού τομέα και αριθμού κυλίνδρου */
ανυπόγραφο int end_sec_cyl ;
/* Αριθμός σχετικού τομέα */
ανυπόγραφο long part_beg ;
/* Μήκος διαμερίσματος σε τομείς */
ανυπόγραφο long plen ;
} ;
/* Δομή για ανάγνωση-εγγραφή MBR */
τμήμα κατασκευής
{
/* IPL (Initial Program Loader) */
ανυπόγραφο char master_boot[446] ;
/* Πίνακας χωρισμάτων */
struct partition pt[4] ;
/* Μαγικός αριθμός */
int lasttwo ;
} ;
struct μέρος p ;
void main()
{
ανυπόγραφο int t1,t2;
clrscr();
biosdisk ( 2, 0x80, 0, 0, 1, 1, &p ) ;
επίδειξη(); /* εμφανίζει τις πληροφορίες του
Πίνακας χωρισμάτων */
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 Μετά τη διαγραφή του δεύτερου διαμερίσματος
Καταχώρηση από τον πίνακα κατατμήσεων MBR,");
printf("\n Ο πίνακας διαμερισμάτων θα αλλάξει ως
Ακολουθεί: ");
/* Για να διαγράψετε τις πληροφορίες δεύτερου διαμερίσματος από το διαμέρισμα
πίνακας MBR Αφαιρέστε τις προς τα εμπρός κάθετες από το
συνάρτηση biosdisk( ). Μην χρησιμοποιείτε το Carelessly, Partition
πληροφορίες του δεύτερου διαμερίσματος του πίνακα διαμερισμάτων θα
να διαγραφεί πλήρως. */
////// biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) ;
επίδειξη(); /* Εμφάνιση των πληροφοριών του διαμερίσματος
πίνακας μετά από τροποποίηση */
getch();
}
Σχόλια για το πρόγραμμα:
Καταργήστε το σχόλιο της συνάρτησης biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) για να διαγράψετε το δεύτερο διαμέρισμα από τον πίνακα κατατμήσεων του MBR.
Για να διαγράψετε το διαμέρισμα, όλες οι παράμετροί του ορίζονται στο 0 στην καταχώρηση πίνακα κατατμήσεων στο MBR. Να θυμάστε πάντα ότι εάν διαγράψετε το εκτεταμένο διαμέρισμα, όλα τα λογικά διαμερίσματα αυτού του εκτεταμένου διαμερίσματος θα γίνουν επίσης απρόσιτα.
Το Function display( ) χρησιμοποιείται για την εμφάνιση του πίνακα κατατμήσεων του MBR. Η κωδικοποίηση της συνάρτησης είναι η εξής:
/* Λειτουργία για εμφάνιση πίνακα κατατμήσεων του MBR */
επίδειξη()
{
ανυπόγραφο int s_sec, s_trk, e_sec, e_trk, i, t1, t2 ;
char type[20], boot[5] ;
printf("\n\nΜέρος εκκίνησης Τοποθεσία έναρξης Τοποθεσία λήξης
Σχετικός αριθμός των");
printf("\nType Side Cylinder Sector Side Cylinder
Τομείς Τομείς Τομείς\n");
για (i = 0; i <= 3; i++)
{
if ( p.pt[i].bootable == 0x80 )
strcpy (boot, "Yes");
αλλού
strcpy (εκκίνηση, "Όχι");
διακόπτης (p.pt[i].parttype)
{
θήκη 0x00:
strcpy (type, "Used" ); διάλειμμα ;
περίπτωση 0x1:
strcpy (τύπος, "FAT12"); διάλειμμα ;
θήκη 0x2:
strcpy (τύπος, "Xenix"); διάλειμμα ;
θήκη 0x3:
strcpy (type, "Xenix:usr"); διάλειμμα ;
θήκη 0x4:
strcpy (τύπος, "FAT16<32M"); διάλειμμα ;
θήκη 0x5:
strcpy (πληκτρολογήστε "DOS-Ext."); διάλειμμα ;
θήκη 0x6:
strcpy (τύπος, "FAT16>32M"); διάλειμμα ;
περίπτωση 0x7:
strcpy (τύπος, "NTFS"); διάλειμμα ;
περίπτωση 0x0b:
strcpy (τύπος, "FAT32"); διάλειμμα ;
θήκη 0x0c:
strcpy (τύπος, "FAT32-LBA"); διάλειμμα ;
περίπτωση 0x0d:
strcpy (τύπος, "VFAT16"); διάλειμμα ;
περίπτωση 0x0e:
strcpy (τύπος, "VFAT16-LBA"); διάλειμμα ;
θήκη 0x0f:
strcpy (τύπος, "FAT EXT"); διάλειμμα ;
θήκη 0x17:
strcpy (τύπος, "HPFS"); διάλειμμα ;
θήκη 0x81:
strcpy (τύπος, "Παλιό LINUX"); διάλειμμα ;
θήκη 0x82:
strcpy (πληκτρολογήστε "LinuxSwap"); διάλειμμα ;
θήκη 0x83:
strcpy (τύπος, "LinuxNative"); διάλειμμα ;
θήκη 0x85:
strcpy (πληκτρολογήστε "Linux Ext."); διάλειμμα ;
προεπιλογή:
strcpy (τύπος, "Άγνωστο"); διάλειμμα ;
}
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 ) ;
}
επιστροφή 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. Ας υπολογίσουμε τώρα τον σειριακό αριθμό του δίσκου.
Η ώρα σε μορφή (δευτερόλεπτα και εκατοστά των δευτερολέπτων) είναι
= (28 και 65)
= (1CH και 41H)
Γράψτε το ως 1C41
Ομοίως, η ημερομηνία σε μορφή (μήνας και ημέρα) είναι
= (10 και 23)
= (0AH και 17H)
Γράψτε το ως 0A17
Ομοίως, ο χρόνος σε μορφή (ώρες και λεπτά) είναι:
= (11 και 16)
= (0BH και 10H)
Γράψτε το ως 0B10
Και η χρονιά θα είναι
= 2003
= 07D3
Τώρα, ας υπολογίσουμε τον σειριακό αριθμό της δισκέτας, σύμφωνα με την περιγραφή που δόθηκε προηγουμένως. Το πρώτο μέρος του σειριακού αριθμού φρεατίου είναι (1C41 + 0A17) = 2658 και το δεύτερο μέρος του σειριακού αριθμού θα είναι (0B10 + 07D3) = 12E3.
Σύνταξη του Εργαλείου Επεξεργασίας Δίσκου
Η κωδικοποίηση του προγράμματος επεξεργασίας δίσκου δόθηκε στον δίσκο που περιλαμβάνεται σε αυτό το βιβλίο, με το όνομα αρχείου "TTEDITOR.C". Μπορείτε να χρησιμοποιήσετε αυτό το πρόγραμμα για να αναλύσετε την επιφάνεια σκληρών δίσκων ή δισκέτας. Ακόμη και τις περισσότερες φορές, ενώ έγραφα αυτό το βιβλίο, χρησιμοποιούσα το TTEDITOR για να αναλύσω την επιφάνεια του δίσκου ή να εκτελέσω τροποποιήσεις δίσκου.
Ακολουθούν μερικές από τις σημαντικές εργασίες που μπορεί να εκτελέσει αυτό το πρόγραμμα επεξεργασίας:
- Ανάγνωση πληροφοριών ανά τομέα από την επιφάνεια σκληρών δίσκων και δισκέτας.
- Γράψτε ένα αντίγραφο ασφαλείας οποιουδήποτε τομέα σε ένα αρχείο.
- Ανάκτηση δεδομένων τομέα από αρχείο.
- Αλλάξτε ένα byte.
- Αριθμομηχανή μετατροπής δεκαδικών αριθμών σε δεκαδικό και δυαδικό.
Το πρόγραμμα χρησιμοποιεί τις συναρτήσεις biosdisk( ) και _bios_disk( ) για πρόσβαση σε δίσκους. Εάν θέλετε να αναλύσετε έναν δίσκο που υπερβαίνει τα 8,4 GB, τροποποιήστε το πρόγραμμα ώστε να χρησιμοποιεί επεκτάσεις INT 13H. Η περιγραφή των λειτουργιών που χρησιμοποιούνται στο πρόγραμμα δίνεται στον παρακάτω πίνακα:
Λειτουργία |
Περιγραφή |
bkground() |
δημιουργεί το φόντο και το πλαίσιο της πρώτης οθόνης |
clsline( ) |
Χρησιμοποιείται για τη διαγραφή ολόκληρης γραμμής από την οθόνη που καθορίζεται από τον αριθμό γραμμής. |
ενημέρωση ( ) |
Λειτουργία για κλήση όλων των λειτουργιών εμφάνισης στην οθόνη |
writetofile() |
Λειτουργία εγγραφής δεδομένων τομέα σε αρχείο χρήστη. |
εγγραφή στον τομέα ( ) |
Η λειτουργία της επαναφοράς ενός τομέα από ένα καθορισμένο αρχείο. |
msgdisp() |
Λειτουργία εμφάνισης μηνυμάτων στην οθόνη. |
αλλαγή ( ) |
Λειτουργία αλλαγής ενός byte οποιουδήποτε τομέα που καθορίζεται από τον χρήστη. |
πλαίσιο ( ) |
Λειτουργία σχεδίασης δομής πλαισίου προβολής τομέα |
dispmax( ) |
Εμφανίζει τον μέγιστο αριθμό CHS ενός δίσκου (ισχύει για δίσκους έως 8,4 GB) |
οθόνη ( ) |
Εμφάνιση τομέα και πληροφοριών στην οθόνη. |
hextodec( ) |
Λειτουργία μετατροπής ενός δεκαεξαδικού αριθμού στον αντίστοιχο δεκαδικό και δυαδικό του αριθμό. |