Κεφάλαιο – 13
Ανάγνωση και τροποποίηση MBR με προγραμματισμό
Εγγραφή εκκίνησης DOS (DBR) / Τομέας εκκίνησης DOS
Εγγραφή εκκίνησης DOS (DBR) / Τομέας εκκίνησης DOS
Μετά τον πίνακα διαμερισμάτων, το DOS Boot Record (DBR) ή μερικές φορές ονομάζεται DOS Boot Sector είναι η δεύτερη πιο σημαντική πληροφορία στον σκληρό σας δίσκο.
Για μια λεπτομερή μελέτη σχετικά με το DBR, ανατρέξτε στο κεφάλαιο, "Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα", που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Ο πρώτος λογικός τομέας κάθε διαμερίσματος DOS θα περιέχει ένα DOS Boot Record (DBR) ή DOS Boot Sector. Η δουλειά του DBR είναι να φορτώσει το λειτουργικό σύστημα από τη μονάδα σκληρού δίσκου στην κύρια μνήμη του υπολογιστή και να δώσει τον έλεγχο του συστήματος στο φορτωμένο πρόγραμμα.
Το DOS Boot Record (DBR) για το πρώτο διαμέρισμα σε έναν σκληρό δίσκο βρίσκεται συνήθως στον Absolute Sector 63 (ο 64ος τομέας στη μονάδα δίσκου) ή σε μορφή CHS μπορούμε να πούμε C–H–S = 0–1 –1 για τις περισσότερες μονάδες δίσκου.
Ωστόσο, αυτή η τοποθεσία μπορεί να διαφέρει ανάλογα με το SPT (Τομείς ανά ίχνος) του Drive. Για παράδειγμα, σε μια παλιά μονάδα δίσκου 245 MB με μόνο 31 SPT, η εγγραφή εκκίνησης βρισκόταν στον 32ο τομέα (Absolute Sector 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 του Active είναι κατεστραμμένο), ωστόσο γενικά αυτό δεν πρέπει να επηρεάζει την πρόσβαση στα δεδομένα της μονάδας δίσκου. Μετά την εκκίνηση του συστήματος με τον εκκινήσιμο δίσκο, μπορείτε να έχετε πρόσβαση στα δεδομένα.
/* Εμφάνιση παραμέτρων εκκίνησης της δισκέτας */
# include <dos.h>
# include <stdio.h>
main( )
{
struct boot
{
unsigned char code[3] ; /* Jump Code */
unsigned char system_id[8] ;/* OEM Name and Version*/
int bytes_per_sec ; /* Bytes Per Sector */
char sec_per_clus ; /* Sectors Per Cluster */
int res_sec ; /* Reserved Sectors */
char fat_copies ; /* Number of FATs */
int root_dir_entry ; /* Number of Root
Directory Entries */
unsigned int no_sects ; /* Number of Sectors in
Logical Volume */
unsigned char format_id ; /* Media Descriptor Byte
*/
int sec_per_fat ; /* Sectors Per FAT */
int sec_per_trk ; /* Sectors Per Track */
int no_sides ; /* Number of Heads */
int no_sp_res_sect ; /* Number of Hidden
Sectors */
unsigned char rest_code[482] ; /* Rest of the code */
} ;
struct boot b ;
char temp[4] ;
int val, drive ;
val = absread(0, 1, 0, &b) ; /* Use For Floppy Disk*/
if ( val == -1 )
{
printf ( "Disk read Error...bad sector\n" ) ;
exit ( 1 ) ;
}
clrscr ( ) ;
printf ( "System ID = %s\n",
b.system_id ) ;
printf ( "Bytes per sector = %d\n",
b.bytes_per_sec ) ;
printf ( "Sectors per cluster = %d\n",
b.sec_per_clus ) ;
printf ( "Reserved sectors = %d\n",
b.res_sec ) ;
printf ( "FAT copies = %d\n",
b.fat_copies ) ;
printf ( "Root directory entries = %d\n",
b.root_dir_entry ) ;
printf ( "No. of sectors on disk = %u\n",
b.no_sects ) ;
printf ( "Media Descriptor Byte = %X\n",
b.format_id ) ;
printf ( "Sectors per FAT = %d\n",
b.sec_per_fat ) ;
printf ( "Sectors per track = %d\n",
b.sec_per_trk ) ;
printf ( "No. of sides = %d\n",
b.no_sides ) ;
printf ( "No. of reserved sectors = %d\n",
b.no_sp_res_sect ) ;
return 0;
}
Εάν εκτελέσετε αυτό το πρόγραμμα για να δοκιμάσετε τη δισκέτα 1,44M, 3½ ιντσών δισκέτας με 70 κομμάτια, δύο πλευρές, 18 τομείς ανά κομμάτι και 512 byte σε έναν τομέα, η Έξοδος του Προγράμματος θα εμφανιστεί παρόμοια με την εξής:
Αναγνωριστικό συστήματος = +1<*uIHC
Byte ανά τομέα = 512
Τομείς ανά σύμπλεγμα = 1
Δεσμευμένοι τομείς = 1
Αντίγραφα FAT = 2
Εισχωρήσεις καταλόγου ρίζας = 224
Όχι. των τομέων στο δίσκο = 2880
Byte περιγραφής μέσων = F0
Τομείς ανά FAT = 9
Τομείς ανά κομμάτι = 18
Όχι. των πλευρών = 2
Όχι. δεσμευμένων τομέων = 0
Διαβάζοντας το DBR Μεγάλων Τόμων
Οι τόμοι διαμερισμάτων που έχουν μέγεθος μεγαλύτερο από 32 MB έχουν διαφορετική μορφή DBR από το DBR για λιγότερους ή ίσους με 32 MB τόμους.
Για την παροχή υποστήριξης σε μεγάλους τόμους του δίσκου (Για λεπτομερή περιγραφή του, ανατρέξτε στο κεφάλαιο "Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα", που συζητήθηκε νωρίτερα σε αυτό το βιβλίο).
Η μορφή της εγγραφής εκκίνησης DOS ενός τόμου FAT32 έχει δοθεί στον ακόλουθο πίνακα:
Το παρακάτω πρόγραμμα είναι για την ανάγνωση του DBR μεγάλων τόμων, που έχουν μέγεθος μεγαλύτερο από 32 MB:
/* Προγραμματίστε την εμφάνιση των παραμέτρων εκκίνησης του μεγάλου όγκου δίσκου */
# include "dos.h"
# include "stdio.h"
void main()
{
struct boot
{
unsigned char code[3] ; /* Jump Code */
unsigned char system_id[8] ; /* OEM name & Version */
int bytes_per_sec ; /* Bytes Per Sector */
char sec_per_clus ; /* Sectors Per Cluster*/
unsigned int res_sec ; /* Number of Reserved
Sectors */
char fat_copies ; /* Number of FATs */
unsigned int root_dir_entry ;/* Number of Root
Directory Entry */
unsigned int no_sects ; /* Number of Sectors in
Logical Volume (if
Volume is <= 32MB) */
unsigned char Media_id ; /* Media Descriptor Byte
*/
unsigned int sec_per_fat ; /* Sector Per FAT */
unsigned int sec_per_trk ; /* Sectors Per Track */
unsigned int no_sides ; /* Number of Heads */
unsigned long no_sp_res_sect ; /* Number of Hidden
Sectors */
unsigned long long_sec_num ; /* Total Sectors in
Logical Volume
( Size >32MB) */
unsigned long num_sec_per_FAT; /* Sectors Per FAT */
unsigned int binary_flags; /* Binary Flags */
unsigned char version_of_FAT1; /* First Byte of FAT
Version */
unsigned char version_of_FAT2; /* Second Byte of FAT
Version */
unsigned long root_dir_start_cluster;
/* Root Directory
Starting Cluster
Number */
unsigned int sec_num_of_file_sys;
/* Sector Number of
File System
Information Sector
*/
unsigned int sec_num_of_backup_boot_sec;
/* Sector Number of
Backup Boot Sector
*/
unsigned char reserved[12]; /* Reserved */
unsigned char logical_drive_number;
/* Physical Drive
Number of Logical
Volume */
unsigned char unused_byte; /* Unused Byte */
unsigned char hex_extd_boot_signature;
/* Extended Boot
Signature(29H) */
unsigned long binary_volume_ID;/* Binary Volume ID */
unsigned char volume_label[11];/* Volume Label */
unsigned char FAT_name[8]; /* FAT Name */
unsigned char rest_code[420] ; /* Rest 420 Bytes of
The DBR */
unsigned char magic_number[2]; /* Magic Number */
} ;
struct boot b ;
char temp[4] ;
int val, drive,i;
val = biosdisk( 2, 0x80, 1,0,1,1, &b ) ;
/* For First Hard Disk */
if ( val == -1 )
{
printf ( "Disk read Error...bad sector\n" ) ;
exit ( 1 ) ;
}
clrscr ( ) ;
printf ( " Jump Instruction Code = ");
for(i=0;i<=2;i++)
{
printf("%X",b.code[i]);
}
printf("(H)\n ");
printf ( "OEM name and version = %s\n ",
b.system_id ) ;
printf ( "Bytes per sector = %u\n ",
b.bytes_per_sec ) ;
printf ( "Sectors per cluster = %u\n ",
b.sec_per_clus ) ;
printf ( "Reserved sectors = %u\n ",
b.res_sec ) ;
printf ( "FAT copies = %d\n ",
b.fat_copies ) ;
printf ( "Root directory entries = %u\n ",
b.root_dir_entry ) ;
printf ( "No. of sectors on disk = %u\n ",
b.no_sects ) ;
printf ( "Media Descriptor Byte = %X(H)\n",
b.Media_id ) ;
printf ( "Sectors per FAT = %u\n ",
b.sec_per_fat ) ;
printf ( "Sectors per track = %u\n ",
b.sec_per_trk ) ;
printf ( "No. of sides = %u\n ",
b.no_sides ) ;
printf ( "No. of reserved (Hidden) sectors= %lu\n ",
b.no_sp_res_sect ) ;
printf ( "========== For Large(>32MB) Disks ========\n");
printf ( "No. of sectors,(if Volume is >32MB) = %lu\n ",
b.long_sec_num) ;
printf ( “Number of Sectors Per FAT = %lu\n “,
b.num_sec_per_FAT );
printf ( "Root Directory Starting Cluster = %lu\n ",
b.root_dir_start_cluster);
printf ( "File System Information Sector = %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 ( "Physical Drive Number = %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 = ");
for(i=0;i<=10;i++)
{
printf ( "%c",b.volume_label[i]);
}
printf ( "\n FAT name = ");
for(i=0;i<=7;i++)
{
printf ( "%c",b.FAT_name[i]);
}
printf ( "\n ");
printf ( "Magic Number = %X%X(H)",
b.magic_number[0],b.magic_number[1]);
getch();
}
//////// Συνάρτηση μετατροπής δεκαδικού σε δυαδικό \\\\\\\\
Decimal_to_Binary(unsigned long input)
{
unsigned long i;
int count = 0;
int binary [32]; /* 32 Bit MAX only 32
elements total */
do
{
i = input%2; /* MOD 2 to get 1 or a 0*/
binary[count] = i; /* Load Elements into the
Binary Array */
input = input/2; /* Divide input by 2 to
decrement via binary */
count++; /* Count howy elements
are needed */
}while (input > 0);
/* Αντιστροφή και έξοδος δυαδικών ψηφίων */
do
{
printf ("%d", binary[count - 1]);
count--;
} while (count > 0);
return 0;
}
Όταν το πρόγραμμα εκτελείται για την ανάγνωση του DBR μεγάλου όγκου, η έξοδος του προγράμματος εμφανίζεται ως εξής:
Κωδικός οδηγιών άλματος = EB5890 (H)
Όνομα και έκδοση OEM = MSWIN4.1
Byte ανά τομέα = 512
Τομείς ανά σύμπλεγμα = 8
Δεσμευμένοι τομείς = 32
αντίγραφα FAT = 2
Εισχωρήσεις καταλόγου ρίζας = 0
Αριθμός τομέων στο δίσκο = 0
Byte περιγραφής μέσων = F8 (H)
Τομείς ανά FAT = 0
Τομείς ανά κομμάτι = 63
Αριθμός πλευρών = 255
Αριθμός δεσμευμένων (Κρυφών) τομέων = 63
=========== Για μεγάλους (>32 MB) δίσκους ===========
Αριθμός τομέων, (αν ο όγκος είναι >32 MB) = 11277567
Αριθμός Τομέων ανά FAT = 11003
Σύμπλεγμα εκκίνησης καταλόγου ρίζας = 2
Τομέας πληροφοριών συστήματος αρχείων = 1
Αριθμός τομέα του τομέα εκκίνησης αντιγράφων ασφαλείας = 6
Αριθμός φυσικής μονάδας = 80 (H)
Εκτεταμένη υπογραφή εκκίνησης = 29 (H)
Αναγνωριστικό δυαδικού όγκου 32 bit = 110101010001100001110111100101 (B)
Ετικέτα τόμου = SAAYA
όνομα FAT = FAT32
Μαγικός αριθμός = 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,44 Mb, δισκέτα 3½ ιντσών, με 80 κομμάτια, 2 κεφαλές (πλευρές) και 18 τομείς ανά κομμάτι.
/* Πρόγραμμα για να ξαναγράψετε τις παραμέτρους της δισκέτας 1,44 MB, 3½ ιντσών στο DBR της */
# include "dos.h"
# include "stdio.h"
struct boot
{
unsigned char code[3] ; /* Jump Code */
unsigned char system_id[8] ; /* OEM ID and Version*/
int bytes_per_sec ; /* Bytes Per Sector */
char sec_per_clus ; /* Number of Sectors
Per Cluster */
int res_sec ; /* Reserved Sectors */
char fat_copies ; /* Number of FATs */
int root_dir_entry ; /* Number of Root
Directory Entries */
unsigned int no_sects ; /* Number of Total
Sectors */
unsigned char format_id ; /* Media Descriptor
Byte */
int sec_per_fat ; /* Sectors Per FAT */
int sec_per_trk ; /* Sectors Per FAT */
int no_sides ; /* Number of
Sides(Heads) */
int no_sp_res_sect ; /* Number of Hidden
Sectors */
unsigned char rest_code[482] ;/* Rest 482 Bytes code
of DBR */
} ;
struct boot b ;
main( )
{
int val ;
val = absread(0, 1, 0, &b); /* Use For Floppy Disk */
if ( val == -1 )
{
printf ( "\n Disk read Error...bad sector\n" ) ;
exit ( 1 ) ;
}
clrscr ( ) ;
display_info();
getch();
printf("\n Now Recovering BDR of Floppy.....\n");
Recover_with_values();
printf ( "\n Disk Recovered Successfully." ) ;
display_info();
return 0;
}
/* Λειτουργία για την αλλαγή των παραμέτρων του DBR */
Recover_with_values()
{
int val =0;
/* Jump Code of 3 Bytes For Floppy */
b.code[0] = 0xEB;
b.code[1]= 0x3E;
b.code[2]= 0x90 ;
/* System Id of 8 Bytes */
strcpy(b.system_id, "+05PSIHC");
/* Bytes Per Sector = 512 */
b.bytes_per_sec = 512;
/* Sector per Cluster for 1.44M 3.5" Floppy = 1 */
b.sec_per_clus = 1;
/* Number of Reserved Sectors = 1 */
b.res_sec =1;
/* Number of FAT Copies = 2 */
b.fat_copies =2;
/* Number of Root Directory Entry = 224 */
b.root_dir_entry =224;
/* Number of Sectors on Disk = 2880 */
b.no_sects =2880;
/* Media Descriptor Byte For Floppy = F0 (H) */
b.format_id =0xF0;
/* Sectors Per FAT = 9 */
b.sec_per_fat =9;
/* Sectors Per Track = 18 */
b.sec_per_trk =18;
/* Number of Sides = 2 */
b.no_sides =2;
/* Number of Special Reserved Sectors (or Hidden
Sectors) = 0 */
b.no_sp_res_sect =0;
/* Use For Floppy Disk*/
val = abswrite ( 0, 1, 0, &b ) ;
if ( val == -1 )
{
printf ( "\n Disk Write Error...bad sector\n" ) ;
printf ( " Disk was not Recovered." ) ;
exit ( 1 ) ;
}
return 0;
}
display_info()
{
printf ( "\n Jump Code (Hex) = %X%X%X (H)\n",
b.code[0],b.code[1],b.code[2]);
printf ( " System ID = %s\n",
b.system_id ) ;
printf ( " Bytes per sector = %d\n",
b.bytes_per_sec ) ;
printf ( " Sectors per cluster = %d\n",
b.sec_per_clus ) ;
printf ( " Reserved sectors = %d\n",
b.res_sec ) ;
printf ( " FAT copies = %d\n",
b.fat_copies ) ;
printf ( " Root directory entries = %d\n",
b.root_dir_entry ) ;
printf ( " No. of sectors on disk = %u\n",
b.no_sects ) ;
printf ( " Media Descriptor Byte = %X\n",
b.format_id ) ;
printf ( " Sectors per FAT = %d\n",
b.sec_per_fat ) ;
printf ( " Sectors per track = %d\n",
b.sec_per_trk ) ;
printf ( " No.sides = %d\n",
b.no_sides ) ;
printf ( " No. of reserved sectors = %d\n",
b.no_sp_res_sect ) ;
return 0;
}
Σχόλια σχετικά με την κωδικοποίηση:
Η εκκίνηση δομής χρησιμοποιείται για πρόσβαση στο DBR, για ανάγνωση-εγγραφή των παραμέτρων του δίσκου. Η συνάρτηση display_info(), εμφανίζει τις διάφορες παραμέτρους του δίσκου, διαβάζοντας από το DBR. Η συνάρτηση Recover_with_values() χρησιμοποιείται για την τροποποίηση και την ανάκτηση των παραμέτρων του DBR της δισκέτας.
Οι τιμές που χρησιμοποιούνται από τη συνάρτηση Recover_with_values(), είναι για παραμέτρους 1,44 MB, DBR δισκέτας 3 ½ ιντσών. Η περιγραφή αυτών των τιμών έχει δοθεί στον παρακάτω πίνακα: