Κεφάλαιο – 12
Ανάγνωση και τροποποίηση MBR με προγραμματισμό
Master Boot Record (MBR) ή Master Partition Table (MPT)
Η κύρια εγγραφή εκκίνησης (MBR) ή μερικές φορές αναφέρεται ως Ο κύριος πίνακας διαμερισμάτων (MPT), δημιουργείται στη μονάδα σκληρού δίσκου με την εκτέλεση της εντολής FDISK.EXE του DOS.
Το MBR περιέχει ένα μικρό πρόγραμμα για τη φόρτωση και εκκίνηση του ενεργού (ή εκκινήσιμου) διαμερίσματος από τη μονάδα σκληρού δίσκου. Η κύρια εγγραφή εκκίνησης περιέχει πληροφορίες και για τα τέσσερα κύρια διαμερίσματα στη μονάδα σκληρού δίσκου, όπως τον τομέα έναρξης, τον τομέα λήξης, το μέγεθος του διαμερίσματος κ.λπ.
Το MBR βρίσκεται στον Απόλυτο Τομέα 0 ή μπορούμε να πούμε στον κύλινδρο 0, στην κεφαλή 0 και στον τομέα 1 και εάν υπάρχουν περισσότερα από ένα διαμερίσματα στο δίσκο, υπάρχουν εκτεταμένες εγγραφές εκκίνησης, που βρίσκονται στην αρχή κάθε εκτεταμένος τόμος διαμερίσματος.
Για λεπτομερή περιγραφή, ανατρέξτε στο κεφάλαιο “Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα”, που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Μορφή κύριας εγγραφής εκκίνησης
Μπορεί να χωρίσουμε τη μονάδα σκληρού δίσκου σε πολλές λογικές μονάδες, στις οποίες γενικά εκχωρείται το δικό τους γράμμα μονάδας δίσκου από το DOS). Μόνο ένα διαμέρισμα κάθε φορά μπορεί να επισημανθεί ως ενεργό (ή εκκινήσιμο) διαμέρισμα.
Το Master Boot Record έχει το όριο των τεσσάρων καταχωρήσεων στον πίνακα Master Partition. Ωστόσο, η θέση της εκτεταμένης κύριας εγγραφής εκκίνησης μπορεί να ληφθεί με τη βοήθεια της κύριας εγγραφής εκκίνησης που περιέχει εκτεταμένους πίνακες διαμερισμάτων, η μορφή της οποίας είναι ακριβώς η ίδια με αυτή του κύριου πίνακα διαμερισμάτων εκτός από το ότι δεν υπάρχει κωδικός εκκίνησης και αυτός ο χώρος των 446 Byte είναι συνήθως δεσμεύεται για τον κωδικό εκκίνησης και παραμένει κενό.
Όλα τα 512 Byte του The Master Boot Record έχουν σπάσει ως εξής, που δίνονται στον Πίνακα:
Όλα τα εκτεταμένα διαμερίσματα θα πρέπει να υπάρχουν εντός του χώρου που έχει δεσμευτεί από την καταχώρηση εκτεταμένου διαμερίσματος. Μόνο δύο από τα εκτεταμένα διαμερίσματα προορίζονται να χρησιμοποιηθούν, το πρώτο ως κανονικό διαμέρισμα και το δεύτερο ως άλλο εκτεταμένο διαμέρισμα εάν υπάρχει.
Έτσι, με τη βοήθεια ενός Κύριου Πίνακα Διαμερισμάτων Μπορούμε να βρούμε τη θέση ενός άλλου Εκτεταμένου Κύριου Πίνακα Διαμερισμάτων δίπλα του, εάν υπάρχει.
Μορφή καταχώρισης πίνακα κατατμήσεων
Η μορφή καταχώρισης πίνακα κατατμήσεων οποιουδήποτε Διαμερίσματος στο MBR έχει δοθεί στον επόμενο πίνακα. Κάθε Καταχώρηση Διαμερίσματος οποιουδήποτε MBR μπορεί να χωριστεί στα ακόλουθα byte με τις συγκεκριμένες έννοιές τους:
Σύνταξη προγράμματος για την ανάγνωση του πίνακα κατατμήσεων του MBR
Το πρόγραμμα για την ανάγνωση και των τεσσάρων καταχωρήσεων διαμερισμάτων από τον πίνακα κατατμήσεων του MBR έχει δοθεί στη συνέχεια. Το πρόγραμμα εμφανίζει όλες τις παραμέτρους των πληροφοριών διαμερισμάτων, γραμμένες στον πίνακα κατατμήσεων του MBR.
Η κωδικοποίηση του προγράμματος έχει ως εξής:
/* Πρόγραμμα για ανάγνωση του πίνακα διαμερισμάτων MBR */
# include <bios.h>
/* δομή για την ανάγνωση της καταχώρισης διαμερίσματος από τον πίνακα κατατμήσεων */
struct partition
{
unsigned char bootable ; /* Active Partition Byte */
unsigned char start_side ;/* Starting Head */
unsigned int start_sec_cyl ; /* combination of
Starting sector and
cylinder number */
unsigned char parttype ; /* File system
Indicator Byte */
unsigned char end_side ; /* Ending Head */
unsigned int end_sec_cyl ; /* combination of
Starting sector and
cylinder number */
unsigned long part_beg ; /* Relative Sector
Number */
unsigned long plen ; /* Partition length in
sectors */
} ;
/* Δομή για ανάγνωση MBR */
struct part
{
unsigned char master_boot[446] ; /* IPL (Initial
Program Loader)*/
struct partition pt[4] ; /* Partition table */
int lasttwo ; /* Magic Number */
} ;
struct part p ;
void main()
{
clrscr();
/* Διαβάστε το First Sector του πρώτου σκληρού δίσκου */
biosdisk ( 2, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* Display the information of MBR
Partition Table */
getch();
}
/* Λειτουργία για την εμφάνιση των πληροφοριών του πίνακα κατατμήσεων του 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, "VFAT 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 ) ; /* starting
Sector of the
partition */
t1 = ( p.pt[i].start_sec_cyl & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].start_sec_cyl & 0x00c0 ) << 2 ;
s_trk = t1 | t2 ; /* Starting Cylinder */
e_sec = ( p.pt[i].end_sec_cyl & 0x3f ) ; /*Ending Sector */
t1 = ( p.pt[i].end_sec_cyl & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].end_sec_cyl & 0x00c0 ) << 2 ;
e_trk = t1 | t2 ; /* ending Cylinder */
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;
}
Οι πληροφορίες που δίνονται από την έξοδο του προγράμματος εμφανίζονται όπως φαίνεται παρακάτω:
Σχόλια σχετικά με την κωδικοποίηση:
Το διαμέρισμα δομής χρησιμοποιείται για την ανάγνωση των διαφόρων παραμέτρων της καταχώρισης διαμερίσματος του διαμερίσματος στον πίνακα κατατμήσεων του MBR. Το τμήμα δομής χρησιμοποιείται για την ανάγνωση πληροφοριών MBR.
Η συνάρτηση display() εμφανίζει τις πληροφορίες των παραμέτρων του πίνακα κατατμήσεων MBR στην οθόνη. Καθώς βλέπουμε την έξοδο του προγράμματος, ο κύλινδρος έναρξης και ο τελικός αριθμός και ο αριθμός τομέα εμφανίζονται ως εξής:
Starting Sector = 1
Starting Cylinder = 0
Ending Sector = 63
Ending Cylinder = 701
Αυτοί οι αριθμοί τομέα και κυλίνδρων υπολογίζονται από το συνδυασμό δύο byte. Οι παρακάτω πίνακες δείχνουν πώς υπολογίζονται αυτοί οι αριθμοί:
Έτσι Ξεκινώντας C-H-S του partition= 0-0-1.
Ομοίως, η κωδικοποίηση για τον κύλινδρο τερματισμού και ο αριθμός τομέα του διαμερίσματος έχουν δοθεί στον επόμενο πίνακα:
Έτσι η κατάληξη C-H-S του Διαμερίσματος = 701-254-63.
Πρόγραμμα εύρεσης όλων των λογικών κατατμήσεων και των πληροφοριών τους
Το πρόγραμμα που συζητήσαμε νωρίτερα ήταν η ανάγνωση των πληροφοριών διαμερισμάτων από τον πίνακα κατατμήσεων του MBR. Αλλά μόνο διαβάζοντας το MBR, δεν μπορούμε να λάβουμε τις πληροφορίες άλλων λογικών κατατμήσεων που βρίσκονται σε εκτεταμένο διαμέρισμα του δίσκου.
Έχουμε ήδη συζητήσει ότι η Κύρια εγγραφή εκκίνησης έχει το όριο των τεσσάρων καταχωρήσεων στον Κύριο πίνακα κατατμήσεων. Ωστόσο, η θέση της εκτεταμένης κύριας εγγραφής εκκίνησης μπορεί να ληφθεί με τη βοήθεια της κύριας εγγραφής εκκίνησης που περιέχει Εκτεταμένους πίνακες διαμερισμάτων, η μορφή των οποίων είναι ακριβώς η ίδια με αυτή του κύριου πίνακα διαμερισμάτων.
Όλα τα εκτεταμένα διαμερίσματα θα πρέπει να υπάρχουν εντός του χώρου που έχει δεσμευτεί από την καταχώρηση εκτεταμένου διαμερίσματος. Μόνο δύο από τα εκτεταμένα διαμερίσματα προορίζονται να χρησιμοποιηθούν, το πρώτο ως κανονικό διαμέρισμα και το δεύτερο ως άλλο εκτεταμένο διαμέρισμα εάν υπάρχει.
Επομένως, με τη βοήθεια ενός κύριου πίνακα διαμερισμάτων μπορούμε να βρούμε τη θέση ενός άλλου εκτεταμένου κύριου πίνακα διαμερισμάτων δίπλα του, εάν υπάρχει.
Το παρακάτω πρόγραμμα είναι για την εύρεση όλων των λογικών κατατμήσεων και των πληροφοριών καταχώρισης διαμερισμάτων, ανάγνωση MBR και Εκτεταμένων MBR από το δίσκο. Η κωδικοποίηση του προγράμματος έχει ως εξής:
/* Πρόγραμμα για την ανάγνωση των παραμέτρων όλων των λογικών διαμερισμάτων που υπάρχουν στο δίσκο */
#include<dos.h>
har buffer[512], report_par[20];
unsigned drive_num =0x80;
unsigned long star_sec[20], sec;
/* Δομή της μορφής πακέτου διεύθυνσης δίσκου, που θα χρησιμοποιηθεί από τη συνάρτηση readabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Size of Packet, generally 10H */
char reserved ; /* Reserved (0) */
int blockcount ; /* Number of Blocks to Transfer */
char far *bufferaddress ; /* address to Transfer
Buffer */
unsigned long blocknumber[2] ; /* Starting Absolute
Block Number */
} ;
void main()
{
int no_par,i;
clrscr();
no_par = 0;
All_partition_information (star_sec,&no_par, &sec, buffer,
report_par);
printf(" \n\n Total Partitions in Disk = %d\n ",
no_par);
for(i=0;i<no_par;i++)
{
printf("\n Starting Sector Number of Partition %d =
%lu " , i+1, star_sec[i]);
}
printf("\n");
getch();
}
Η έξοδος του προγράμματος θα εμφανιστεί παρόμοια με αυτήν:
Διαμέρισμα 1 - FAT32
Χώρισμα 2 - FAT32
Χώρισμα 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,
unsigned *no_par,
long *sec, char *buffer,
unsigned char *report_par )
{
unsigned long fat_check;
unsigned long *sectors_part;
static long se_p;
int temp_var1,active_offset,active_pos=0,i, extended_pos=0, partloc1;
unsigned long b_sec,se;
unsigned char active_par;
long relative_sec;
long no_sectors;
if(*sec==0 || *sec==1)
se_p=0;
do{
se=*sec;
/* Ανάγνωση απόλυτου τομέα που καθορίζεται από *sec */
readabsolutesectors (drive_num,*sec,1,buffer);
/* ***** check for active partition ***** */
if(*sec==se && *no_par==0) /*if primary
partition */
{
*sec=se=0;
for(active_offset=446; active_offset<=494;active_offset+=16)
{
active_par=buffer[active_offset];
if(active_par==0x80) /* check for active
partition */
break;
else
active_pos++; /* position of active
partition */
}
/* για εκτεταμένη κατάτμηση */
for(active_offset=450; active_offset<=511;active_offset+=16)
{
active_par=buffer[active_offset];
if(active_par==0x05 | active_par==0x0F)
/*check for extended partition */
break;
else
extended_pos++; /*position of extended
partition */
}
if(active_pos==4)
active_pos=1;
if(extended_pos==4)
extended_pos=1;
partloc1=0x1C0+extended_pos*16;
}
else
{
active_pos=0;
extended_pos=1;
partloc1=0x1D0;
if(se_p!=0)
{
*sec=se=se_p; /*starting of extended
partition */
}
}
/* Σχετικοί Τομείς σε κατάτμηση */
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)
{
switch(buffer[0x1C2+active_pos*16])
{
/* For NTFS Partition */
case 0x07: report_par[*no_par]='N';
printf("\n Partition -%d = NTFS",
*no_par+1);
break;
/* Για το διαμέρισμα FAT32 */
case 0x0B:
case 0x0C: report_par[*no_par]='3';
printf("\n Partition -%d = FAT32",
*no_par+1);
break;
/* Για το διαμέρισμα FAT16 */
case 0x04:
case 0x06:
case 0x0E: report_par[*no_par]='1';
printf("\n Partition -%d = FAT16",
*no_par+1);
break;
} // End of the Switch
b_sec=*sec+relative_sec;
sectors_part[*no_par]=no_sectors; /* Array to store Number of sectors of partitions */
} //End of if Condition
else
{ /* if partition indicator not match */
if(*sec==0)
{ no_par=0;
break;
}
if((fat_check!=0x3631)&&(fat_check!=0x3233))
b_sec=*sec=0;
}
if((b_sec!=0)&&(sec!=0))
{
star_sec[*no_par]=b_sec;
(*no_par)++;
}
else
break;
/* έλεγχος εάν υπάρχει εκτεταμένο διαμέρισμα */
if(buffer[0x1C2+extended_pos*16]==0x05 ||
buffer[0x1C2+extended_pos*16]==0x0F )
{
temp_var1=(unsigned )buffer[partloc1];
*sec=temp_var1 & 0x003F; /* sector of
extended
partition */
if(*sec!=0)
{
se_p=se+relative_sec+no_sectors;
*sec=se_p;
}
else
{ *sec=-1;
break;
}
} //close of if statement
else
{
if(*sec>0)
*sec=-1;
break;
}
} while(1); // close of do–while loop
/* ελέγξτε για άλλα μη ενεργά πρωτεύοντα διαμερίσματα στον τομέα 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[0x1C2+i*16]==(char)0x07 ||
buffer[0x1C2+i*16]==(char)0x0E ||
buffer[0x1C2+i*16]==(char)0x04) && active_par!=0x80)
{
switch(buffer[0x1C2+active_pos*16])
{
/* Για το διαμέρισμα NTFS */
case 0x07: report_par[*no_par]='N';
printf("\n Partition -%d = NTFS",
*no_par+1);
break;
/* Για το διαμέρισμα FAT32 */
case 0x0B:
case 0x0C: report_par[*no_par]='3';
printf("\n Partition -%d = FAT32",
*no_par+1);
break;
/* Για το διαμέρισμα FAT16 */
case 0x04:
case 0x06:
case 0x0E: report_par[*no_par]='1';
printf("\n Partition -%d = FAT16",
*no_par+1);
break;
} // End of switch
/* σχετικοί τομείς Αριθμός Διαμέρισης */
relative_sec=*(long *)(buffer+454+i*16);
no_sectors=*(long *)(buffer+458+i*16); /* number of
sectors in
partition*/
sectors_part[*no_par]=no_sectors; /* Array to store
Number of
sectors of
partitions */
*sec=star_sec[*no_par]=relative_sec;
(*no_par)++;
}
} //loop close of for(i=0;i<4;i++)
} //loop close of if(*sec==0)
return;
}
Σχόλια σχετικά με την κωδικοποίηση:
Η συνάρτηση ξεκινά την ανάγνωση των πληροφοριών κατατμήσεων από το MBR και στη συνέχεια διαβάζει τα Εκτεταμένα MBR εάν απαιτείται. Η συνάρτηση readabsolutesectors διαβάζει τον απόλυτο τομέα, που καθορίζεται από *sec.
Το
sectors_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 */
# include <bios.h>
/* δομή για την ανάγνωση της καταχώρισης διαμερίσματος από τον πίνακα κατατμήσεων */
struct partition
{
unsigned char bootable ; /* Active Partition
Byte */
unsigned char start_side ; /* Starting Head */
unsigned int start_sec_cyl ; /* combination of
Starting sector and
cylinder number */
unsigned char parttype ; /* File system
Indicator Byte */
unsigned char end_side ; /* Ending Head */
unsigned int end_sec_cyl ; /* combination of
Starting sector and
cylinder number */
unsigned long part_beg ; /* Relative Sector
Number */
unsigned long plen ; /* Partition length in
sectors */
} ;
/* Δομή για ανάγνωση MBR */
struct part
{
unsigned char master_boot[446] ; /* IPL (Initial
Program Loader)*/
struct partition pt[4] ; /* Partition table*/
int lasttwo ; /* Magic Number */
} ;
struct part p ;
void main()
{
unsigned int t1,t2;
clrscr();
biosdisk ( 2, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* display the partition
Table information */
getch();
/* Ας υποθέσουμε ότι θέλουμε να τροποποιήσουμε τις πληροφορίες κατάτμησης της δεύτερης καταχώρισης κατάτμησης από τον πίνακα κατατμήσεων του MBR, με αυτές τις τιμές */
p.pt[1].bootable = 0x80; /* Active Boot Partition */
p.pt[1].parttype = 0x7; /* NTFS Partition */
p.pt[1].start_side = 0; /* Starting Head =0 */
p.pt[1].end_side = 31; /* Ending Head == 31 */
p.pt[1].part_beg = 808416;/* Relative Sector = 808416 */
p.pt[1].plen = 405216; /* Total Sectors in Partition = 405216 */
/* Γράψτε νέες πληροφορίες στο MBR *\
/* Για να γράψετε τις τιμές στον πίνακα διαμερισμάτων MBR, αφαιρέστε το σχόλιο της συνάρτησης biosdisk που δίνεται παρακάτω */
// biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* Display the Modified
Information */
getch();
}
Σχόλια σχετικά με την κωδικοποίηση:
Το πρόγραμμα που δίνεται παραπάνω είναι ένα δείγμα προγράμματος που δείχνει πώς μπορούμε να τροποποιήσουμε τις τιμές της καταχώρισης πίνακα κατατμήσεων του MBR. Εάν θέλετε να τροποποιήσετε τις τιμές της καταχώρισης διαμερίσματος για τέτοια λογικά διαμερίσματα, τα οποία βρίσκονται σε εκτεταμένο διαμέρισμα, πρέπει να τροποποιήσετε τις τιμές στον πίνακα διαμερισμάτων του Extended MBR .
Οι τιμές που έχουν δοθεί εδώ για την τροποποίηση της καταχώρησης του πίνακα κατατμήσεων είναι απλώς για επίδειξη του τρόπου τροποποίησης. Ποτέ μην τροποποιείτε τον πίνακα διαμερισμάτων με παράνομες ή παράλογες τιμές. Με αυτόν τον τρόπο ολόκληρο το διαμέρισμα ενδέχεται να μην είναι προσβάσιμο.
Το διαμέρισμα δομής χρησιμοποιείται για την ανάγνωση της καταχώρισης διαμερίσματος από τον πίνακα διαμερισμάτων και το τμήμα δομής για την ανάγνωση MBR. Για να κάνετε πραγματικά τις τροποποιήσεις στον πίνακα διαμερισμάτων, αφαιρέστε το σχόλιο της συνάρτησης biosdisk( ).
Εάν θέλετε να τροποποιήσετε τις τιμές έναρξης και λήξης, τομέων και αριθμούς κυλίνδρων του διαμερίσματος, υπολογίστε τις τιμές, όπως περιγράφονται στα σχόλια του προγράμματος για να διαβάσετε και να εμφανίσετε τον πίνακα κατατμήσεων του MBR, που συζητήθηκε στην αρχή αυτού του κεφαλαίου.
Σελίδα Τροποποιήθηκε στις: 17/01/2022