Κεφάλαιο – 12
Ανάγνωση και αλλαγή MBR με χρήση προγραμματισμού
Master Boot Record (MBR) ή Master Partition Table (MPT)
Το Master Boot Record (MBR) ή μερικές φορές ονομάζεται Master Partition Table (MPT) δημιουργείται στον σκληρό δίσκο με την εκτέλεση της εντολής FDISK.EXE DOS.
Το MBR περιέχει ένα μικρό πρόγραμμα για τη φόρτωση και την εκτέλεση του ενεργού διαμερίσματος (ή εκκίνησης) από τον σκληρό δίσκο. Το Master Boot Record περιέχει πληροφορίες και για τα τέσσερα κύρια διαμερίσματα του σκληρού δίσκου, όπως τον τομέα έναρξης, τον τομέα τέλους, το μέγεθος του διαμερίσματος κ.λπ.
Το MBR βρίσκεται στον απόλυτο τομέα 0 ή μπορούμε να πούμε στον κύλινδρο 0, στην κεφαλή 0 και στον τομέα 1 και αν υπάρχουν περισσότερα από ένα διαμερίσματα στο δίσκο, τότε υπάρχουν εκτεταμένες εγγραφές εκκίνησης που βρίσκονται στην αρχή κάθε τόμου του εκτεταμένου διαμερίσματος.
Για λεπτομερή περιγραφή, ανατρέξτε στο κεφάλαιο "Λογική προσέγγιση για δίσκους και λειτουργικό σύστημα" που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Κύρια μορφή εγγραφής εκκίνησης
Μπορούμε να χωρίσουμε τον σκληρό δίσκο σε πολλαπλές λογικές μονάδες, στις οποίες το DOS συνήθως εκχωρεί το δικό του γράμμα μονάδας δίσκου. Μόνο ένα διαμέρισμα κάθε φορά μπορεί να επισημανθεί ως ενεργό διαμέρισμα (ή εκκίνησης).

Η κύρια εγγραφή εκκίνησης έχει όριο τεσσάρων καταχωρήσεων στον πίνακα πρωτεύοντος διαμερίσματος. Ωστόσο, η θέση του εκτεταμένου MBR μπορεί να ληφθεί χρησιμοποιώντας το MBR που περιέχει τους πίνακες εκτεταμένων διαμερισμάτων, το οποίο έχει την ίδια μορφή με τον κύριο πίνακα διαμερισμάτων εκτός από το ότι δεν περιέχει κώδικα εκκίνησης και ότι συνήθως δεσμεύονται 446 byte για τον κώδικα εκκίνησης και μένουν κενό.
Ολόκληρα τα 512 byte της κύριας εγγραφής εκκίνησης αναλύονται όπως φαίνεται στον πίνακα:

Όλα τα εκτεταμένα διαμερίσματα πρέπει να υπάρχουν στον χώρο που έχει δεσμευτεί από την καταχώρηση εκτεταμένου διαμερίσματος. Μόνο δύο από τα εκτεταμένα διαμερίσματα προορίζονται να χρησιμοποιηθούν, το πρώτο ως κανονικό διαμέρισμα και το δεύτερο ως άλλο εκτεταμένο διαμέρισμα, εάν υπάρχει.
Έτσι, χρησιμοποιώντας έναν Κύριο Πίνακα Διαμερισμάτων μπορούμε να βρούμε τη θέση ενός άλλου Εκτεταμένου Κύριου Πίνακα Διαμερισμάτων δίπλα του, εάν υπάρχει.
Μορφή καταχώρισης πίνακα κατατμήσεων
Η μορφή καταχώρισης πίνακα κατατμήσεων οποιουδήποτε διαμερίσματος στο MBR φαίνεται στον παρακάτω πίνακα. Κάθε καταχώρηση διαμερίσματος οποιουδήποτε MBR μπορεί να αναλυθεί στα ακόλουθα byte με τις συγκεκριμένες έννοιές τους:

Σύνταξη προγράμματος για την ανάγνωση του πίνακα διαμερισμάτων MBR
Παρακάτω είναι ένα πρόγραμμα για την ανάγνωση και των τεσσάρων καταχωρήσεων διαμερισμάτων από τον πίνακα κατατμήσεων MBR. Το πρόγραμμα εμφανίζει όλες τις παραμέτρους των πληροφοριών διαμερισμάτων που έχουν καταγραφεί στον πίνακα κατατμήσεων MBR.
Η κωδικοποίηση του προγράμματος μοιάζει με αυτό:
/* Πρόγραμμα για ανάγνωση πίνακα κατατμήσεων MBR */
# περιλαμβάνουν <bios.h>
/* δομή για την ανάγνωση καταχώρισης διαμερίσματος από τον πίνακα διαμερισμάτων */
δομικό τμήμα
{
ανυπόγραφο char bootable ; /* Ενεργό byte της ενότητας */
ανυπόγραφο char start_side ;/* Αρχική κεφαλή */
ανυπόγραφο int start_sec_cyl ; /* συνδυασμός
Τομέας εκκίνησης και
αριθμός κυλίνδρου */
ανυπόγραφο parttype char ; /* Σύστημα αρχείων
byte δείκτη */
ανυπόγραφο char end_side ; /* Τελική κεφαλίδα */
ανυπόγραφος ακέραιος end_sec_cyl ; /* συνδυασμός
Τομέας εκκίνησης και
αριθμός κυλίνδρου */
ανυπόγραφο long part_beg ; /* Σχετικός τομέας
Αριθμός */
ανυπόγραφος μακρύς ακέραιος? /* Μήκος τμήματος σε
τομέας */
} ;
/* Δομή για ανάγνωση MBR */
μέρος της δομής
{
ανυπόγραφο char master_boot[446] ; /* IPL (Αρχικό
Πρόγραμμα φόρτωσης)*/
struct partition pt[4] ; /* Πίνακας χωρισμάτων */
int lasttwo ; /* Μαγικός αριθμός */
} ;
μέρος της δομής p ;
μη έγκυρη main()
{
clrscr();
/* Ανάγνωση του πρώτου τομέα του πρώτου σκληρού δίσκου */
biosdisk ( 2, 0x80, 0, 0, 1, 1, &p ) ;
επίδειξη(); /* Εμφάνιση πληροφοριών MBR
Πίνακας χωρισμάτων */
παίρνω();
}
/* Λειτουργία για εμφάνιση πληροφοριών σχετικά με τον πίνακα διαμερισμάτων MBR */
επίδειξη()
{
ανυπόγραφος ακέραιος s_sec, s_trk, e_sec, e_trk, i, t1, t2 ;
τύπος χαρακτήρα[20], boot[5] ;
printf("\n\nΜέρος. Αρχική θέση φόρτωσης
Τελική τοποθεσία Σχετική ποσότητα");
printf("\nType Side Cylinder Sector
Τομείς πλευρικών κυλίνδρων Τομείς Τομείς\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 (τύπος, "VFAT 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;
}
Οι πληροφορίες που δίνονται από την έξοδο του προγράμματος εμφανίζονται κάπως όπως δίνεται παρακάτω:

Σχόλια σχετικά με την κωδικοποίηση:
Το διαμέρισμα δομής χρησιμοποιείται για την ανάγνωση των διαφόρων παραμέτρων της καταχώρισης διαμερίσματος του διαμερίσματος στον πίνακα κατατμήσεων του MBR. Το τμήμα δομής χρησιμοποιείται για την ανάγνωση πληροφοριών MBR.
Η συνάρτηση display() εμφανίζει τις πληροφορίες των παραμέτρων του πίνακα κατατμήσεων MBR στην οθόνη. Καθώς βλέπουμε την έξοδο του προγράμματος, ο κύλινδρος έναρξης και ο τελικός αριθμός και ο αριθμός τομέα εμφανίζονται ως εξής:
Τομέας εκκίνησης = 1
Κύλινδρος εκκίνησης = 0
Τελικός τομέας = 63
Τερματικός κύλινδρος = 701
Αυτοί οι αριθμοί τομέα και κυλίνδρων υπολογίζονται από το συνδυασμό δύο byte. Οι παρακάτω πίνακες δείχνουν πώς υπολογίζονται αυτοί οι αριθμοί:

Έτσι Ξεκινώντας CHS του διαμερίσματος= 0-0-1.
Ομοίως, η κωδικοποίηση για τον κύλινδρο τερματισμού και ο αριθμός τομέα του διαμερίσματος έχουν δοθεί στον επόμενο πίνακα:

Έτσι το Τελικό CHS του Διαμερίσματος = 701-254-63.
Πρόγραμμα για την εύρεση όλων των λογικών κατατμήσεων και των πληροφοριών τους
Το πρόγραμμα που συζητήσαμε νωρίτερα ήταν η ανάγνωση των πληροφοριών διαμερισμάτων από τον πίνακα κατατμήσεων του MBR. Αλλά μόνο διαβάζοντας το MBR, δεν μπορούμε να λάβουμε τις πληροφορίες άλλων λογικών κατατμήσεων που βρίσκονται σε εκτεταμένο διαμέρισμα του δίσκου.
Έχουμε ήδη συζητήσει ότι το Master Boot Record έχει το όριο των τεσσάρων καταχωρήσεων στον πίνακα Master Partition . Ωστόσο, η θέση του Extended Master Boot Record μπορεί να ληφθεί με τη βοήθεια του Master Boot Record που περιέχει Extended Partition Tables , του οποίου η μορφή είναι ακριβώς η ίδια με του κύριου πίνακα διαμερισμάτων.
Όλα τα εκτεταμένα διαμερίσματα θα πρέπει να υπάρχουν εντός του χώρου που έχει δεσμευτεί από την καταχώρηση εκτεταμένου διαμερίσματος. Μόνο δύο από τα εκτεταμένα διαμερίσματα προορίζονται να χρησιμοποιηθούν, το πρώτο ως κανονικό διαμέρισμα και το δεύτερο ως άλλο εκτεταμένο διαμέρισμα εάν υπάρχει.
Έτσι, με τη βοήθεια ενός Master Partition Table μπορούμε να βρούμε τη θέση ενός άλλου Extended Master Partition Table δίπλα του, εάν υπάρχει.
Το παρακάτω πρόγραμμα είναι για την εύρεση όλων των λογικών κατατμήσεων και των πληροφοριών καταχώρισης διαμερισμάτων τους, την ανάγνωση MBR και Extended MBR από το δίσκο. Η κωδικοποίηση του προγράμματος έχει ως εξής:
/* Πρόγραμμα ανάγνωσης των παραμέτρων όλων των λογικών διαμερισμάτων που υπάρχουν στο δίσκο */
#include<dos.h>
έχει buffer[512], report_par[20];
unsigned drive_num =0x80;
ανυπόγραφο long star_sec[20], sec;
/* Δομή της μορφής πακέτου διεύθυνσης δίσκου, που θα χρησιμοποιηθεί από τη συνάρτηση readabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Μέγεθος πακέτου, γενικά 10H */
char κρατημένο ; /* Κράτηση (0) */
int blockcount ; /* Αριθμός μπλοκ προς μεταφορά */
char far *bufferaddress ; /* διεύθυνση στο Transfer
Buffer */
ανυπόγραφος μακρύς αριθμός μπλοκ[2] ; /* Απόλυτο εκκίνησης
Αριθμός μπλοκ */
} ;
void main()
{
int not_even,i;
clrscr();
όχι_ζυγό = 0;
All_partition_information (star_sec,&no_par, &sec, buffer,
report_par);
printf(" \n\n Σύνολο κατατμήσεων στο δίσκο = %d\n ",
όχι_ακόμα);
for(i=0;i<no_par;i++)
{
printf("\n Αριθμός αρχικού τομέα διαμερίσματος %d =
%lu " , i+1, star_sec[i]);
}
printf("\n");
getch();
}
Η έξοδος του προγράμματος θα εμφανιστεί παρόμοια με αυτήν:
Partition 1 - FAT32
Partition 2 - FAT32
Partition 3 - FAT32
Σύνολο κατατμήσεων στο δίσκο = 3
Αρχικός Αριθμός Τομέα Διαμέρισης 1 = 63
Αρχικός Αριθμός Τομέα Διαμέρισης 2 = 11277693
Αρχικός Αριθμός Τομέα Διαμέρισης 3 = 25623738
Σχόλια σχετικά με την κωδικοποίηση:
Η δομή diskaddrpacket χρησιμοποιείται για την ανάγνωση της μορφής πακέτου Διεύθυνση δίσκου, που θα χρησιμοποιηθεί από τη συνάρτηση readabsolutesectors.
Η συνάρτηση All_partition_information( ) χρησιμοποιείται για την εύρεση όλων των παραμέτρων όλων των κατατμήσεων από την καταχώρηση κατάτμησης.
Αν και σε αυτό το πρόγραμμα, έχουμε εμφανίσει μόνο τις πληροφορίες συστήματος αρχείων και σχετικού τομέα όλων των διαθέσιμων λογικών κατατμήσεων στο δίσκο, μπορείτε επίσης να εκτυπώσετε τις πληροφορίες άλλων παραμέτρων των πληροφοριών διαμερισμάτων χρησιμοποιώντας τη συνάρτηση All_partition_information( ) με λίγη ακόμα printf.
Η κωδικοποίηση της συνάρτησης είναι η εξής:
/* Λειτουργία για να βρείτε όλες τις πληροφορίες των λογικών κατατμήσεων διαβάζοντας την καταχώρισή τους */
All_partition_information( unsigned long *star_sec,
ανυπόγραφο *no_par,
long *sec, char *buffer,
ανυπόγραφο char *report_par )
{
ανυπόγραφο long fat_check?
ανυπόγραφο μακρύ *sectors_part;
στατικό μακρύ se_p;
int temp_var1,active_offset,active_pos=0,i, extended_pos=0, partloc1;
ανυπόγραφο long b_sec,se;
ανυπόγραφο char active_par;
long relative_sec;
long no_sectors?
if(*sec==0 || *sec==1)
se_p=0;
κάνω{
se=*sec;
/* Ανάγνωση απόλυτου τομέα που καθορίζεται από *sec */
readabsolutesectors (drive_num,*sec,1,buffer);
/* ***** έλεγχος για ενεργό διαμέρισμα ***** */
if(*sec==se && *no_par==0) /*if main
κατάτμηση */
{
*sec=se=0;
for(active_offset=446; active_offset<=494;active_offset+=16)
{
active_par=buffer[active_offset];
if(active_par==0x80) /* ελέγξτε για ενεργό
κατάτμηση */
διακοπή;
αλλού
active_pos++; /* θέση ενεργού
κατάτμηση */
}
/* για εκτεταμένο διαμέρισμα */
for(active_offset=450; active_offset<=511;active_offset+=16)
{
active_par=buffer[active_offset];
if(active_par==0x05 | active_par==0x0F)
/*ελέγξτε για εκτεταμένο διαμέρισμα */
διακοπή;
αλλού
extended_pos++; /*θέση παρατεταμένου
κατάτμηση */
}
if(active_pos==4)
active_pos=1;
if(extended_pos==4)
extended_pos=1;
partloc1=0x1C0+extended_pos*16;
}
αλλού
{
active_pos=0;
extended_pos=1;
partloc1=0x1D0;
if(se_p!=0)
{
*sec=se=se_p; /*έναρξη εκτεταμένης
κατάτμηση */
}
}
/* Σχετικοί τομείς σε κατάτμηση */
relative_sec= *(unsigned long *)(buffer+454+active_pos*16);
/* Αριθμός τομέων σε κατάτμηση */
no_sectors=*(long *)(buffer+458+active_pos*16);
/* Προσδιορίστε το Byte ένδειξης συστήματος αρχείων */
if( buffer[0x1C2+active_pos*16]==0x04 ||
buffer[0x1C2+active_pos*16]==0x05 ||
buffer[0x1C2+active_pos*16]==0x06 ||
buffer[0x1C2+active_pos*16]==0x0B ||
buffer[0x1C2+active_pos*16]==0x0C ||
buffer[0x1C2+active_pos*16]==0x0E ||
buffer[0x1C2+active_pos*16]==0x0F ||
buffer[0x1C2+active_pos*16]==0x07)
{
διακόπτης(buffer[0x1C2+active_pos*16])
{
/* Για διαμέρισμα NTFS */
περίπτωση 0x07: report_par[*no_par]='N';
printf("\n Διαμέρισμα -%d = NTFS",
*όχι_ακόμη+1);
διακοπή;
/* Για διαμέρισμα FAT32 */
περίπτωση 0x0B:
περίπτωση 0x0C: report_par[*no_par]='3';
printf("\n Διαμέρισμα -%d = FAT32",
*όχι_ακόμη+1);
διακοπή;
/* Για το διαμέρισμα FAT16 */
περίπτωση 0x04:
περίπτωση 0x06:
περίπτωση 0x0E: report_par[*no_par]='1';
printf("\n Διαμέρισμα -%d = FAT16",
*όχι_ακόμη+1);
διακοπή;
} // Τέλος του διακόπτη
b_sec=*sec+relative_sec;
sektors_part[*no_par]=no_sectors; /* Πίνακας για αποθήκευση Αριθμός τομέων κατατμήσεων */
} //Τέλος του if Condition
αλλού
{ /* εάν η ένδειξη διαμερίσματος δεν ταιριάζει */
if(*sec==0)
{ no_par=0;
διακοπή;
}
if((fat_check!=0x3631)&&(fat_check!=0x3233))
b_sec=*sec=0;
}
if((b_sec!=0)&&(sec!=0))
{
star_sec[*no_par]=b_sec;
(*not_ even)++;
}
αλλού
διακοπή;
/* έλεγχος εάν υπάρχει εκτεταμένο διαμέρισμα */
if(buffer[0x1C2+extended_pos*16]==0x05 ||
buffer[0x1C2+extended_pos*16]==0x0F )
{
temp_var1=(unsigned )buffer[partloc1];
*sec=temp_var1 & 0x003F; /* τομέας του
παρατεταμένη
κατάτμηση */
if(*sec!=0)
{
se_p=se+relative_sec+no_sectors;
*sec=se_p;
}
αλλού
{ *sec=-1;
διακοπή;
}
} //κλείσιμο της εντολής if
αλλού
{
if(*sec>0)
*sec=-1;
διακοπή;
}
} while(1); // κλείσιμο του βρόχου do–while
/* έλεγχος για άλλα μη ενεργά κύρια διαμερίσματα στον τομέα 0 */
if(*sec==0)
{
for(i=0;i<4;i++)
{
active_par=buffer[446+i*16];
/* Προσδιορίστε την ένδειξη συστήματος αρχείων Byte */
if((buffer[0x1C2+i*16]==(char)0x06 ||
buffer[0x1C2+i*16]==(char)0x0B ||
buffer[0x1C2+i*16]==(char)0x0C ||
buffer[0x1Cx2+i*16]=0 ||
buffer[0x1C2+i*16]==(char)0x0E ||.
buffer[0x1C2+i*16]==(char)0x04) && active_par!=0x80)
{
διακόπτης(buffer[0x1C2+active_pos*16])
{
/* Για διαμέρισμα NTFS */
περίπτωση 0x07: report_par[*no_par]='N';
printf("\n Διαμέρισμα -%d = NTFS",
*όχι_ακόμη+1);
διακοπή;
/* Για διαμέρισμα FAT32 */
περίπτωση 0x0B:
περίπτωση 0x0C: report_par[*no_par]='3';
printf("\n Διαμέρισμα -%d = FAT32",
*όχι_ακόμη+1);
διακοπή;
/* Για το διαμέρισμα FAT16 */
περίπτωση 0x04:
περίπτωση 0x06:
περίπτωση 0x0E: report_par[*no_par]='1';
printf("\n Διαμέρισμα -%d = FAT16",
*όχι_ακόμη+1);
διακοπή;
} // Τέλος διακόπτη
/* σχετικοί τομείς Αριθμός διαμερίσματος */
relative_sec=*(long *)(buffer+454+i*16);
no_sectors=*(long *)(buffer+458+i*16); /* αριθμός των
τομείς σε
χώρισμα*/
sektors_part[*no_par]=no_sectors; /* Πίνακας για αποθήκευση
Αριθμός των
τομείς των
κατατμήσεις */
*sec=star_sec[*no_par]=relative_sec;
(*not_ even)++;
}
} //κλείσιμο βρόχου του for(i=0;i<4;i++)
} //loop κλείσιμο του if(*sec==0)
απόδοση;
}
Σχόλια σχετικά με την κωδικοποίηση:
Η συνάρτηση ξεκινά την ανάγνωση των πληροφοριών κατατμήσεων από το MBR και στη συνέχεια διαβάζει τα Εκτεταμένα MBR εάν απαιτείται. Η συνάρτηση readabsolutesectors διαβάζει τον απόλυτο τομέα, που καθορίζεται από *sec.
sektors_part[*no_par] είναι ο πίνακας για την αποθήκευση του αριθμού των τομέων των κατατμήσεων. Ο αριθμός διαμερίσματος καθορίζεται από το *no_par ξεκινώντας από το 0.
no_sectors είναι ο αριθμός των τομέων στο διαμέρισμα και relative_sec είναι ο σχετικός αριθμός τομέα για αυτό το διαμέρισμα.
Το star_sec[*no_par] είναι ο πίνακας για την αποθήκευση των αριθμών του τομέα των κατατμήσεων. Ο αριθμός διαμερίσματος καθορίζεται από το *no_par ξεκινώντας από το 0.
Οι star_cyl, star_hea και star_sec είναι οι πίνακες που διατηρούν τις πληροφορίες εκκίνησης κάθε διαμερίσματος ως CHS. Το star_cyl αποθηκεύει τις πληροφορίες των κυλίνδρων εκκίνησης, το star_hea αποθηκεύει τις πληροφορίες των αρχικών κεφαλών και το star_sec αποθηκεύει τις πληροφορίες των αρχικών τομέων των κατατμήσεων.
Για την περιγραφή της συνάρτησης readabsolutesectors ανατρέξτε στα κεφάλαια που δόθηκαν νωρίτερα σε αυτό το βιβλίο.
Τροποποίηση MBR μέσω προγραμματισμού
Το δείγμα προγράμματος για να δείξουμε πώς μπορούμε να τροποποιήσουμε τις τιμές της καταχώρησης του πίνακα διαμερισμάτων MBR έχει δοθεί παρακάτω. Το πρόγραμμα τροποποιεί τις τιμές δεύτερη καταχώριση διαμερίσματος του πίνακα κατατμήσεων MBR .
Η κωδικοποίηση του προγράμματος έχει δοθεί παρακάτω:
/* Πρόγραμμα για την τροποποίηση των τιμών της καταχώρισης πίνακα κατατμήσεων του MBR */
# περιλαμβάνουν <bios.h>
/* δομή για την ανάγνωση της καταχώρησης διαμερίσματος από τον πίνακα διαμερισμάτων */
struct partition
{
ανυπόγραφο char bootable ; /* Ενεργό διαμέρισμα
Byte */
ανυπόγραφο char start_side ; /* Αρχική κεφαλή */
ανυπόγραφο int start_sec_cyl ; /* συνδυασμός του
Τομέας εκκίνησης και
αριθμός κυλίνδρου */
ανυπόγραφο parttype char ; /* Σύστημα αρχείων
Byte δείκτη */
ανυπόγραφο char end_side ; /* Κεφαλή λήξης */
ανυπόγραφο int end_sec_cyl ; /* συνδυασμός του
Τομέας εκκίνησης και
αριθμός κυλίνδρου */
ανυπόγραφο long part_beg ; /* Σχετικός Τομέας
Αριθμός */
ανυπόγραφο long plen ; /* Μήκος διαμερίσματος σε
τομείς */
} ;
/* Δομή για ανάγνωση MBR */
τμήμα κατασκευής
{
ανυπόγραφο char master_boot[446] ; /* IPL (Αρχικό
Πρόγραμμα φόρτωσης)*/
struct partition pt[4] ; /* Πίνακας χωρισμάτων*/
int lasttwo ; /* Μαγικός αριθμός */
} ;
struct μέρος p ;
void main()
{
ανυπόγραφο int t1,t2;
clrscr();
biosdisk ( 2, 0x80, 0, 0, 1, 1, &p ) ;
επίδειξη(); /* εμφάνιση του διαμερίσματος
Πληροφορίες πίνακα */
getch();
/* Ας υποθέσουμε ότι θέλουμε να τροποποιήσουμε τις πληροφορίες κατάτμησης της δεύτερης καταχώρισης διαμερίσματος από τον πίνακα κατατμήσεων του MBR, με αυτές τις τιμές */
p.pt[1].bootable = 0x80; /* Ενεργό διαμέρισμα εκκίνησης */
p.pt[1].parttype = 0x7; /* Διαμέρισμα NTFS */
p.pt[1].start_side = 0; /* Αρχική κεφαλή =0 */
p.pt[1].end_side = 31; /* Κεφαλίδα τέλους == 31 */
p.pt[1].part_beg = 808416;/* Σχετικός τομέας = 808416 */
p.pt[1].full = 405216; /* Συνολικός αριθμός τομέων στο διαμέρισμα = 405216 */
/* Γράψτε νέες πληροφορίες στο MBR *\
/* Για να γράψετε τιμές στον πίνακα διαμερισμάτων MBR, αφαιρέστε το σχόλιο της συνάρτησης biosdisk παρακάτω */
// biosdisk ( 3, 0x80, 0, 0, 1, 1, &p );
επίδειξη(); /* Η οθόνη άλλαξε
Πληροφορίες */
παίρνω();
}
Σχόλια κωδικοποίησης:
Το παραπάνω πρόγραμμα είναι ένα παράδειγμα προγράμματος για να δείξει πώς μπορούμε να αλλάξουμε τις τιμές της καταχώρισης του πίνακα κατατμήσεων MBR . Εάν θέλετε να αλλάξετε τις τιμές καταχώρισης διαμερισμάτων για τέτοια λογικά διαμερίσματα που βρίσκονται σε ένα εκτεταμένο διαμέρισμα , πρέπει να αλλάξετε τις τιμές στον πίνακα κατατμήσεων Extended MBR .
Οι τιμές που δόθηκαν εδώ για την αλλαγή της καταχώρισης του πίνακα διαμερισμάτων είναι απλώς για να δείξουν πώς να αλλάξουν. Μην τροποποιείτε ποτέ τον πίνακα διαμερισμάτων με μη έγκυρες ή παράλογες τιμές. Ως αποτέλεσμα, ολόκληρο το τμήμα μπορεί να γίνει απρόσιτο.
Το τμήμα δομής χρησιμοποιείται για την ανάγνωση της εγγραφής διαμερισμάτων από τον πίνακα διαμερισμάτων και το τμήμα δομής χρησιμοποιείται για την ανάγνωση του MBR. Για να κάνετε αλλαγές στον πίνακα διαμερισμάτων, αφαιρέστε το σχόλιο της συνάρτησης biosdisk() .
Εάν θέλετε να αλλάξετε τις τιμές έναρξης και τέλους, τους αριθμούς τομέα και κυλίνδρων ενός διαμερίσματος, υπολογίστε τις τιμές όπως περιγράφονται στα σχόλια για το πρόγραμμα ανάγνωσης και εμφάνισης του πίνακα διαμερισμάτων MBR που συζητήθηκε στην αρχή αυτού του κεφαλαίου.