Κεφάλαιο – 13
ΑΝΑΓΝΩΣΗ ΚΑΙ ΤΡΟΠΟΠΟΙΗΣΗ MBR ΜΕ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ
Εγγραφή εκκίνησης DOS (DBR) / Τομέας εκκίνησης DOS
Μετά τον πίνακα διαμερισμάτων, η εγγραφή εκκίνησης DOS (DBR), ή μερικές φορές ονομάζεται τομέας εκκίνησης DOS, είναι η δεύτερη πιο σημαντική πληροφορία στον σκληρό δίσκο.
Για μια λεπτομερή συζήτηση του DBR, ανατρέξτε στο κεφάλαιο "Λογική προσέγγιση για δίσκους και λειτουργικό σύστημα" που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Ο πρώτος λογικός τομέας κάθε διαμερίσματος DOS θα περιέχει το DOS Boot Record (DBR) ή DOS Boot Sector. Η δουλειά του DBR είναι να φορτώσει το λειτουργικό σύστημα από τον σκληρό δίσκο στην κύρια μνήμη του υπολογιστή και να μεταφέρει τον έλεγχο του συστήματος στο φορτωμένο πρόγραμμα.
Το DOS Boot Record (DBR) για το πρώτο διαμέρισμα σε έναν σκληρό δίσκο βρίσκεται συνήθως στον απόλυτο τομέα 63 (ο 64ος τομέας στο δίσκο) ή σε μορφή CHS, δηλαδή για τους περισσότερους δίσκους μπορούμε να πούμε C–H–S = 0–1–1.
Ωστόσο, αυτή η διάταξη μπορεί να διαφέρει ανάλογα με το SPT (Sectors per Track) της μονάδας δίσκου. Για παράδειγμα, σε μια παλιά μονάδα δίσκου 245 MB που είχε μόνο 31 SPT, η εγγραφή εκκίνησης βρισκόταν στον τομέα 32 (απόλυτος τομέας 31).
Εφόσον η δισκέτα δεν έχει κατατμήσεις, δεν έχει MBR ή Master Partition Table στον πρώτο της τομέα, αντίθετα περιέχει ένα DBR στον πρώτο τομέα.
Το DBR δημιουργείται από την εντολή FORMAT DOS μετά την κατάτμηση με την εντολή FDISK. Ο τομέας όπου βρίσκεται το DBR γίνεται λογικός τομέας 1 αυτού του συγκεκριμένου διαμερίσματος για το DOS. Ο αριθμός τομέα που χρησιμοποιείται από το DOS ξεκινά από τον φυσικό τομέα όπου βρίσκεται το DBR.
Το DBR περιέχει ένα μικρό πρόγραμμα που εκτελείται από το εκτελέσιμο πρόγραμμα Master Boot Record (MBR). Όλα τα διαμερίσματα DOS περιέχουν τον κωδικό προγράμματος για την εκκίνηση του μηχανήματος, π.χ. εκκινήστε το λειτουργικό σύστημα, αλλά μόνο αυτό το διαμέρισμα λαμβάνει τον έλεγχο από το Master Boot Record, το οποίο καθορίζεται ως το ενεργό διαμέρισμα στην καταχώρηση του πίνακα κατατμήσεων.
Εάν το DBR έχει καταστραφεί με οποιονδήποτε τρόπο, ο δίσκος θα πρέπει να είναι προσβάσιμος εάν εκκινήσετε το σύστημα από δισκέτα εκκίνησης ή CD. Παρόλο που ο σκληρός δίσκος δεν είναι εκκινήσιμος (εάν το DBR του ενεργού διαμερίσματος είναι κατεστραμμένο), γενικά αυτό δεν πρέπει να επηρεάζει την πρόσβαση στα δεδομένα στη μονάδα δίσκου. Μετά την εκκίνηση του συστήματος από τη δισκέτα εκκίνησης, μπορείτε να αποκτήσετε πρόσβαση στα δεδομένα.
/* Εμφάνιση παραμέτρων εκκίνησης δισκέτας */
# περιλαμβάνει <dos.h>
# περιλαμβάνουν <stdio.h>
βασικό ( )
{
δομή φόρτωσης
{
ανυπόγραφος κωδικός χαρακτήρα[3] ; /* Κωδικός μετάβασης */
ανυπόγραφο char system_id[8] ;/* Όνομα και έκδοση OEM*/
int bytes_per_sec ; /* Byte ανά τομέα */
σύμβολο sec_per_clus ; /* Τομείς ανά σύμπλεγμα */
int res_sec ; /* Δεσμευμένοι τομείς */
char fat_copies ; /* Αριθμός ΛΙΠΩΝ */
int root_dir_entry ; /* Αριθμός ρίζας
Εγγραφές καταλόγου */
ανυπόγραφο int no_sects ; /* Αριθμός τομέων σε
Λογικός τόμος */
ανυπόγραφο char format_id ; /* Byte περιγραφής πολυμέσων
*/
int sec_per_fat ; /* Τομείς για ΛΙΠΗ */
int sec_per_trk ; /* Τομείς ανά κομμάτι */
int no_sides ; /* Αριθμός κεφαλών */
int no_sp_res_sect ; /* Αριθμός κρυφών
Τομέας */
ανυπόγραφο char rest_code[482] ; /* Υπόλοιπος κώδικας */
} ;
δομή φόρτωσης b ;
σύμβολο temp[4] ;
int val, drive ;
val = absread(0, 1, 0, &b) ; /* Χρήση για δισκέτα*/
αν (τιμή == -1)
{
printf ( "Σφάλμα ανάγνωσης δίσκου...κακός τομέας\n" );
έξοδος (1);
}
clrscr ( ) ;
printf("Αναγνωριστικό συστήματος = %s\n",
b.system_identifier);
printf ( "Byte ανά τομέα = %d\n",
b.bytes_in_sec);
printf ( "Τομείς ανά σύμπλεγμα = %d\n",
b.sec_per_class);
printf ( "Δεσμευμένοι τομείς = %d\n",
b.res_sec);
printf ( "FAT αντίγραφα = %d\n",
β.fat_copies ) ;
printf ( "Εισαγωγές καταλόγου ρίζας = %d\n",
b.root_dir_entry);
printf ("Αριθμός τομέων στο δίσκο = %u\n",
β.no_sects ) ;
printf ( "Περιγραφέας μέσων Byte = %X\n",
b.format_id ) ;
printf ( "Τομείς ανά FAT = %d\n",
b.sec_per_fat);
printf ( "Τομείς ανά κομμάτι = %d\n",
b.sec_per_trk);
printf ("Αριθ. πλευρών = %d\n",
β.no_sides ) ;
printf ("Αριθμός δεσμευμένων τομέων = %d\n",
b.no_sp_res_sect);
επιστροφή 0;
}
Εάν εκτελέσετε αυτό το πρόγραμμα για να δοκιμάσετε τη δισκέτα 1,44M, 3½ ιντσών δισκέτας με 70 κομμάτια, δύο πλευρές, 18 τομείς ανά κομμάτι και 512 byte σε έναν τομέα, η Έξοδος του Προγράμματος θα εμφανιστεί παρόμοια με την εξής:
Αναγνωριστικό συστήματος = +1<*uIHC
Byte ανά τομέα = 512
Τομείς ανά σύμπλεγμα = 1
δεσμευμένοι τομείς = 1
αντίγραφα FAT = 2
καταχωρήσεις ριζικού καταλόγου = 224
Αριθμός τομέων στο δίσκο = 2880
Byte Περιγραφέα μέσων = F0
Τομείς ανά FAT = 9
Τομείς ανά κομματάκι = 0 δεσμευμένοι τομείς = 1
Διαβάζοντας το DBR μεγάλων όγκων
Οι τόμοι διαμερισμάτων που έχουν μέγεθος μεγαλύτερο από 32 MB έχουν διαφορετική μορφή DBR από το DBR για όγκους μικρότερους ή ίσους με 32 MB.
Είναι έτσι για την παροχή υποστήριξης σε μεγάλους τόμους του δίσκου (Για λεπτομερή περιγραφή του, ανατρέξτε στο κεφάλαιο «Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα», που συζητήθηκε νωρίτερα σε αυτό το βιβλίο).
Η μορφή της εγγραφής εκκίνησης DOS ενός τόμου FAT32 έχει δοθεί στον ακόλουθο πίνακα:

Το παρακάτω πρόγραμμα είναι για την ανάγνωση του DBR μεγάλων τόμων, που έχουν μέγεθος μεγαλύτερο από 32 MB:
/* Πρόγραμμα για την εμφάνιση των παραμέτρων εκκίνησης του μεγάλου όγκου δίσκου */
# περιλαμβάνουν "dos.h"
# περιλαμβάνουν "stdio.h"
void main()
{
struct boot
{
ανυπόγραφος κωδικός χαρακτήρα[3] ; /* Κωδικός μετάβασης */
ανυπόγραφο char system_id[8] ; /* Όνομα και έκδοση OEM */
int bytes_per_sec ; /* Bytes ανά τομέα */
char sec_per_clus ; /* Τομείς ανά σύμπλεγμα*/
ανυπόγραφο int res_sec ; /* Αριθμός δεσμευμένων
Τομείς */
char fat_copies ; /* Αριθμός ΛΙΠΩΝ */
ανυπόγραφο int root_dir_entry ;/* Αριθμός ρίζας
Καταχώριση καταλόγου */
ανυπόγραφο int no_sects ; /* Αριθμός Τομέων σε
Λογικός όγκος (αν
Ο όγκος είναι <= 32 MB) */
ανυπόγραφο char Media_id ; /* Byte περιγραφής πολυμέσων
*/
ανυπόγραφο int sec_per_fat ; /* Τομέας ανά ΛΙΠΟΣ */
ανυπόγραφο int sec_per_trk ; /* Τομείς ανά κομμάτι */
ανυπόγραφο int no_sides ; /* Αριθμός κεφαλών */
ανυπόγραφο long no_sp_res_sect ; /* Αριθμός κρυφών
Τομείς */
ανυπόγραφο long long_sec_num ; /* Σύνολο τομέων σε
Λογικός τόμος
( Μέγεθος >32MB) */
ανυπόγραφο long num_sec_per_FAT; /* Τομείς ανά ΛΙΠΟΣ */
ανυπόγραφα int binary_flags. /* Δυαδικές σημαίες */
ανυπόγραφο char version_of_FAT1. /* Πρώτο Byte FAT
Έκδοση */
ανυπόγραφο char version_of_FAT2. /* Δεύτερο Byte FAT
Έκδοση */
ανυπόγραφο long root_dir_start_cluster.
/* Κατάλογος ρίζας
Συστάδα εκκίνησης
Αριθμός */
ανυπόγραφο int sec_num_of_file_sys;
/* Αριθμός Τομέα από
Σύστημα αρχείων
Τομέας Πληροφοριών
*/
ανυπόγραφο int sec_num_of_backup_boot_sec;
/* Αριθμός Τομέα από
Backup Boot Sector
*/
δεσμευμένος ανυπόγραφος χαρακτήρας[12]; /* Κράτηση */
ανυπόγραφο char logical_drive_number?
/* Φυσική κίνηση
Αριθμός Λογικών
Τόμος */
ανυπόγραφο char unused_byte; /* Αχρησιμοποίητο Byte */
ανυπόγραφο char hex_extd_boot_signature.
/* Εκτεταμένη εκκίνηση
Υπογραφή(29H) */
ανυπόγραφο long binary_volume_ID;/* Binary Volume ID */
ανυπόγραφο char volume_label[11];/* Volume Label */
ανυπόγραφο char FAT_name[8]; /* Όνομα FAT */
ανυπόγραφο char rest_code[420] ; /* Υπόλοιπο 420 Byte of
Το DBR */
ανυπόγραφο char magic_number[2]; /* Μαγικός αριθμός */
} ;
struct boot b ;
char temp[4] ;
int val, drive,i;
val = biosdisk( 2, 0x80, 1,0,1,1, &b );
/* Για τον πρώτο σκληρό δίσκο */
αν ( val == -1 )
{
printf ( "Σφάλμα ανάγνωσης δίσκου...κακός τομέας\n" );
έξοδος ( 1 ) ;
}
clrscr ( ) ;
printf ( " Κωδικός εντολών μετάβασης = ");
για(i=0;i<=2;i++)
{
printf("%X",b.code[i]);
}
printf("(H)\n ");
printf ( "Όνομα και έκδοση OEM = %s\n ",
b.system_id ) ;
printf ( "Byte ανά τομέα = %u\n ",
b.bytes_per_sec);
printf ( "Τομείς ανά σύμπλεγμα = %u\n ",
b.sec_per_clus );
printf ( "Δεσμευμένοι τομείς = %u\n ",
b.res_sec);
printf ( "FAT αντίγραφα = %d\n ",
β.fat_copies ) ;
printf ( "Εισαγωγές καταλόγου ρίζας = %u\n ",
b.root_dir_entry);
printf ("Αριθμός τομέων στο δίσκο = %u\n ",
β.no_sects ) ;
printf ( "Περιγραφέας μέσων Byte = %X(H)\n",
β.Media_id ) ;
printf ( "Τομείς ανά FAT = %u\n ",
b.sec_per_fat);
printf ( "Τομείς ανά κομμάτι = %u\n ",
b.sec_per_trk);
printf ("Αριθ. πλευρών = %u\n ",
β.no_sides ) ;
printf ("Αριθμός δεσμευμένων (Κρυφών) τομέων= %lu\n ",
b.no_sp_res_sect);
printf ( "========== Για μεγάλους (>32 MB) δίσκους ========\n");
printf ( "Αριθμός τομέων, (αν ο όγκος είναι >32 MB) = %lu\n ",
b.long_sec_num) ;
printf ( "Αριθμός Τομέων ανά FAT = %lu\n ",
b.num_sec_per_FAT );
printf ( "Root Directory Starting Cluster = %lu\n ",
b.root_dir_start_cluster);
printf ( "Τομέας πληροφοριών συστήματος αρχείων = %u\n ",
b.sec_num_of_file_sys);
printf ( "Sector Number of Backup Boot Sector = %u\n ",
b.sec_num_of_backup_boot_sec);
printf ( "Αριθμός φυσικής μονάδας = %X(H)\n",
b.logical_drive_number);
printf ( "Extended Boot Signature = %X(H)\n",
b.hex_extd_boot_signature);
printf ( "32-Bit Binary Volume ID = ");
Decimal_to_Binary (b.binary_volume_ID,32);
printf ( " (B)\n ");
printf ( "Volume Label = ");
για(i=0;i<=10;i++)
{
printf ("%c",b.volume_label[i]);
}
printf ( "\n όνομα FAT = ");
for(i=0;i<=7;i++)
{
printf ("%c",b.FAT_name[i]);
}
printf ( "\n ");
printf ( "Μαγικός αριθμός = %X%X(H)",
b.magic_number[0],b.magic_number[1]);
getch();
}
//////// Συνάρτηση μετατροπής δεκαδικού σε δυαδικό \\\\\\\\
Δεκαδικός_προς_Δυαδικό(μη υπογεγραμμένη μεγάλη είσοδος)
{
ανυπόγραφο μακρύ i?
int count = 0;
int δυαδικό [32]; /* 32 Bit MAX μόνο 32
σύνολο στοιχείων */
κάνω
{
i = είσοδος%2; /* MOD 2 για να πάρεις 1 ή 0*/
binary[count] = i; /* Φόρτωση στοιχείων στο
Δυαδικός πίνακας */
είσοδος = είσοδος/2; /* Διαιρέστε την είσοδο με 2 προς
μείωση μέσω δυαδικού */
count++; /* Μετρήστε τα στοιχεία Howy
χρειάζονται */
}while (input > 0);
/* Αντίστροφη και έξοδος δυαδικών ψηφίων */
κάνω
{
printf ("%d", δυαδικό[count - 1]);
κόμης--;
} while (count > 0);
επιστροφή 0;
}
Όταν το πρόγραμμα εκτελείται για να διαβάσει το DBR μεγάλου όγκου, η έξοδος του προγράμματος εμφανίζεται ως εξής:
Κωδικός εντολών μεταπήδησης = EB5890 (H)
Όνομα και έκδοση OEM = MSWIN4.1
Byte ανά τομέα = 512
Τομείς ανά σύμπλεγμα = 8
δεσμευμένοι τομείς = 32
αντίγραφα FAT = 2
καταχωρήσεις καταλόγου ρίζας = 0
αριθμός τομέων στο δίσκο = 0 Περιγραφέας μέσων
Byte = Αριθμός τομέας κατά F8 (FATH
) πλευρών = 255 Αριθμός δεσμευμένων (Κρυφών) τομέων = 63 ============ Για Μεγάλους (>32MB) Δίσκους =========== Αριθμός τομέων, (εάν ο όγκος είναι >32MB) = 11277567 Αριθμός Τομέων ανά Σύστημα Πληροφοριών FAT0303 = FAT Τομέας = 1 Αριθμός τομέα εφεδρικού τομέα εκκίνησης = 6 Αριθμός φυσικής μονάδας δίσκου = 80 (H) Εκτεταμένη υπογραφή εκκίνησης = 29 (Η) 32-bit Binary Volume ID = 1101010100011000011101111001011101111001011101111001011101111001011101111001011101111001011101111001011101111001011011110010111011110010111111100101110111100101 Όνομα FH = Αριθμός F11100101 (Β) 55AA (H)
Στην έξοδο του προγράμματος βλέπουμε ότι οι παρακάτω παράμετροι εμφανίζονται μηδέν:
- Καταχώριση καταλόγου ρίζας
- Αριθμός Τομέων στο Δίσκο
- Αριθμός Τομείς ανά FAT
Αυτές οι παράμετροι ισχύουν επειδή αυτές οι τιμές ορίζονται στο μηδέν, εάν ο όγκος του διαμερίσματος είναι μεγαλύτερος από 32 MB σε μέγεθος και οι πραγματικές πληροφορίες βρίσκονται στο Μπλοκ πληροφοριών εκτεταμένου όγκου του DBR.
Για παράδειγμα, στο αρχικό μέρος των πληροφοριών DBR, ο αριθμός των Τομέων ανά FAT είναι 0 και στο μπλοκ πληροφοριών εκτεταμένου όγκου του DBR ο αριθμός τομέων ανά FAT είναι 11003, που είναι η Πραγματική Τιμή για αυτόν τον μεγάλο όγκο.
Το DBR του τόμου έχει τις σημαντικές πληροφορίες σχετικά με τις παραμέτρους του δίσκου, οι οποίες μπορούν να χρησιμοποιηθούν για τη σύνδεση όλων των πληροφοριών δεδομένων για σκοπούς προγραμματισμού. Για παράδειγμα, εάν θέλετε να αποκτήσετε πρόσβαση στα DBR άλλου τόμου Διαμερισμάτων στο δίσκο, μπορείτε να τον υπολογίσετε κατά αριθμό τομέων, γραμμένους σε DBR και άλλες σχετικές πληροφορίες.
Εάν θέλετε να αποκτήσετε πρόσβαση στην προσέγγιση Δίσκος με συμπλέγμα, μπορείτε να κάνετε υπολογισμούς με τη βοήθεια Τομέων ανά σύμπλεγμα, τομέων ανά FAT και άλλων πληροφοριών.
Εάν χρησιμοποιείτε σκληρό δίσκο μεγαλύτερο από 8,4 GB (Δείτε το κεφάλαιο, «Λογική προσέγγιση για δίσκους και λειτουργικό σύστημα», που συζητήθηκε νωρίτερα σε αυτό το βιβλίο), χρησιμοποιήστε επεκτάσεις για πρόσβαση σε όλα τα DBR του δίσκου πέραν των 8,4 GB. Ανατρέξτε στις Εκτεταμένες λειτουργίες ανάγνωσης-εγγραφής, που δίνονται στα προηγούμενα κεφάλαια
Πώς να ανακτήσετε το DBR με τον προγραμματισμό
Μπορείτε να ανακτήσετε το DBR του όγκου του δίσκου έως και 100 τοις εκατό χρησιμοποιώντας κάποια δύσκολη προσέγγιση και λογικούς υπολογισμούς. Όπως συζητήσαμε για τις λογικές προσεγγίσεις των συστημάτων αρχείων στο κεφάλαιο, «Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα», νωρίτερα σε αυτό το βιβλίο, κάθε πληροφορία στο DBR είναι γραμμένη μέσα σε κάποιο όριο ή κανόνα.
Κάθε παράμετρος που γράφεται στο DBR έχει κάποιο συγκεκριμένο νόημα και γράφεται έτσι ακολουθώντας κάποιο συγκεκριμένο κανόνα και λόγο. Αυτός είναι ο λόγος για τον οποίο οι πληροφορίες του DBR, εάν χαθούν, μπορούν να επανασυνδεθούν ή να ξαναγραφτούν χειροκίνητα, εάν ακολουθήσετε αυτούς τους κανόνες και χρησιμοποιήσετε το δύσκολο μυαλό για να μάθετε τι και πώς να θεραπεύσετε.
Για παράδειγμα, ο παρακάτω πίνακας περιγράφει τον αριθμό των τομέων ανά σύμπλεγμα για διαφορετικά συστήματα αρχείων, χρησιμοποιώντας τον οποίο μπορείτε να βρείτε τον αριθμό τομέων ανά σύμπλεγμα για το δίσκο σας. Ας υποθέσουμε ότι είχατε όγκο περίπου 10 GB στο δίσκο σας και το λειτουργικό σύστημα που χρησιμοποιούσατε ήταν τα Windows 98.
Τώρα, εάν υπάρχει, πώς είναι κατεστραμμένες οι πληροφορίες "Τομείς ανά σύμπλεγμα" του DBR του τόμου. Ας προσπαθήσουμε να μάθουμε ποιο σύστημα αρχείων και πόσους τομείς ανά συμπλέγματα είχατε στον τόμο του δίσκου σας.
Καθώς το λειτουργικό σύστημα στο δίσκο σας ήταν τα windows 98, το οποίο υποστηρίζει μόνο σύστημα αρχείων FAT, επομένως το σύστημα αρχείων του τόμου σας ήταν FAT. Τώρα ας σκεφτούμε το μέγεθος του όγκου, το οποίο ήταν περίπου 10 GB.
Γνωρίζουμε ότι το διαμέρισμα των 10 GB δεν υποστηρίζεται από το FAT16 (Δείτε τον παρακάτω πίνακα) επομένως το σύστημα αρχείων του τόμου θα πρέπει να είναι FAT32.
Τώρα ας προσπαθήσουμε να υπολογίσουμε τον αριθμό των τομέων ανά συστάδα για τον τόμο. Όπως βλέπουμε στον πίνακα ότι το διαμέρισμα εντός της περιοχής από 8 GB έως 16 GB έχει ένα σύμπλεγμα 8 τομέων.

Επομένως, τώρα μπορούμε να συμπεράνουμε ότι στον τόμο, το σύστημα αρχείων ήταν FAT32 με 8 τομείς ανά σύμπλεγμα. Ομοίως μπορούμε να συγκεντρώσουμε τις άλλες πληροφορίες του DBR χρησιμοποιώντας άλλες λογικές προσεγγίσεις που περιγράφονται στα προηγούμενα κεφάλαια αυτού του βιβλίου.
Το παρακάτω πρόγραμμα έχει γραφτεί για να ξαναγράψει τις πληροφορίες των παραμέτρων του δίσκου σε DBR 1,44Mb, δισκέτα 3½ ιντσών, με 80 κομμάτια, 2 κεφαλές (πλευρές) και 18 τομείς ανά κομμάτι.
/* Πρόγραμμα για να ξαναγράψει τις παραμέτρους της δισκέτας 1,44 MB, 3½ ιντσών στο DBR */
# περιλαμβάνουν "dos.h"
# περιλαμβάνουν "stdio.h"
struct boot
{
ανυπόγραφος κωδικός χαρακτήρα[3] ; /* Κωδικός μετάβασης */
ανυπόγραφο char system_id[8] ; /* OEM ID και έκδοση*/
int bytes_per_sec ; /* Bytes ανά τομέα */
char sec_per_clus ; /* Αριθμός Τομέων
Ανά σύμπλεγμα */
int res_sec ; /* Δεσμευμένοι Τομείς */
char fat_copies ; /* Αριθμός ΛΙΠΩΝ */
int root_dir_entry ; /* Αριθμός ρίζας
Εγγραφές καταλόγου */
ανυπόγραφο int no_sects ; /* Αριθμός Συνολικού
Τομείς */
ανυπόγραφο char format_id ; /* Περιγραφέας πολυμέσων
Byte */
int sec_per_fat ; /* Τομείς ανά ΛΙΠΟΣ */
int sec_per_trk ; /* Τομείς ανά ΛΙΠΟΣ */
int no_sides ; /* Αριθμός των
Πλευρές (Κεφάλια) */
int no_sp_res_sect ; /* Αριθμός κρυφών
Τομείς */
ανυπόγραφο char rest_code[482] ;/* Rest 482 Byte code
του DBR */
} ;
struct boot b ;
κύρια ( )
{
με μια υπόδειξη?
val = absread(0, 1, 0, &b); /* Χρήση για δισκέτα */
αν ( val == -1 )
{
printf ( "\n Σφάλμα ανάγνωσης δίσκου...κακός τομέας\n" );
έξοδος ( 1 ) ;
}
clrscr ( ) ;
display_info();
getch();
printf("\n Τώρα ανακτάται το BDR της δισκέτας.....\n");
Recover_with_values();
printf ( "\n Ο δίσκος ανακτήθηκε με επιτυχία." );
display_info();
επιστροφή 0;
}
/* Λειτουργία για αλλαγή των παραμέτρων του DBR */
Recover_with_values()
{
τιμή int =0;
/* Κωδικός μετάβασης 3 byte για δισκέτα */
β.κωδικός[0] = 0xEB;
β.κωδικός[1]= 0x3E;
β.κωδικός[2]= 0x90 ;
/* Αναγνωριστικό συστήματος 8 Byte */
strcpy(b.system_id, "+05PSIHC");
/* Bytes ανά τομέα = 512 */
b.bytes_per_sec = 512;
/* Τομέας ανά σύμπλεγμα για 1,44 εκατ. δισκέτα 3,5" = 1 */
b.sec_per_clus = 1;
/* Αριθμός δεσμευμένων τομέων = 1 */
b.res_sec =1;
/* Αριθμός αντιγράφων FAT = 2 */
β.fat_copies =2;
/* Αριθμός καταχώρισης καταλόγου ρίζας = 224 */
b.root_dir_entry =224;
/* Αριθμός τομέων στο δίσκο = 2880 */
b.no_sects =2880;
/* Byte περιγραφής πολυμέσων για δισκέτα = F0 (H) */
b.format_id =0xF0;
/* Τομείς ανά FAT = 9 */
b.sec_per_fat =9;
/* Τομείς ανά κομμάτι = 18 */
b.sec_per_trk =18;
/* Αριθμός πλευρών = 2 */
β.όχι_πλευρές =2;
/* Αριθμός ειδικών δεσμευμένων τομέων (ή κρυφοί
Τομείς) = 0 */
b.no_sp_res_sect =0;
/* Χρήση για δισκέτα*/
val = abswrite ( 0, 1, 0, &b );
αν ( val == -1 )
{
printf ( "\n Σφάλμα εγγραφής στο δίσκο...κακός τομέας\n" );
printf (" Ο δίσκος δεν ανακτήθηκε.");
έξοδος ( 1 ) ;
}
επιστροφή 0;
}
display_info()
{
printf ( "\n Κωδικός μετάβασης (Hex) = %X%X%X (H)\n",
b.code[0],b.code[1],b.code[2]);
printf ( " Αναγνωριστικό συστήματος = %s\n",
b.system_id ) ;
printf ( " Byte ανά τομέα = %d\n",
b.bytes_per_sec);
printf ( " Τομείς ανά σύμπλεγμα = %d\n",
b.sec_per_clus );
printf ( " Δεσμευμένοι τομείς = %d\n",
b.res_sec);
printf ( " FAT αντίγραφα = %d\n",
β.fat_copies ) ;
printf ( " Καταχωρήσεις καταλόγου ρίζας = %d\n",
b.root_dir_entry);
printf ( " Αριθμός τομέων στο δίσκο = %u\n",
β.no_sects ) ;
printf("byte περιγραφής πολυμέσων = %X\n",
b.format_id ) ;
printf("Τομείς σε FAT = %d\n",
b.sec_per_fat);
printf("Τομείς ανά κομμάτι = %d\n",
b.sec_per_trk);
printf("Αριθμός πλευρών = %d\n",
b.no_sides) ;
printf("Αριθμός δεσμευμένων τομέων = %d\n",
б.no_sp_res_sect );
επιστροφή 0;
}
Σχόλια κωδικοποίησης:
Η δομή εκκίνησης χρησιμοποιείται για πρόσβαση στο DBR, για ανάγνωση και εγγραφή παραμέτρων δίσκου. Η συνάρτηση display_info() εμφανίζει διάφορες παραμέτρους του δίσκου διαβάζοντας από το DBR. Η συνάρτηση Recover_with_values() χρησιμοποιείται για την αλλαγή και την επαναφορά των παραμέτρων της δισκέτας DBR.
Οι τιμές που χρησιμοποιούνται από τη συνάρτηση Recover_with_values() αφορούν μια δισκέτα DBR 1,44 MB, 3 ½ ιντσών. Μια περιγραφή αυτών των τιμών δίνεται στον παρακάτω πίνακα:
