Chapitre – 13
Lecture et modification du MBR avec programmation
Enregistrement de démarrage DOS (DBR) / Secteur de démarrage DOS
Enregistrement de démarrage DOS (DBR) / Secteur de démarrage DOS
Après la table de partition, le DOS Boot Record (DBR) ou parfois appelé DOS Boot Sector est la deuxième information la plus importante sur votre disque dur.
Pour une étude détaillée sur DBR, reportez-vous au chapitre "Approche logique des disques et du système d'exploitation", abordé plus haut dans ce livre.
Le premier secteur logique de chaque partition DOS contiendra un enregistrement de démarrage DOS (DBR) ou un secteur de démarrage DOS. Le travail du DBR est de charger le système d'exploitation du disque dur dans la mémoire principale de l'ordinateur et de donner le contrôle du système au programme chargé.
L'enregistrement de démarrage DOS (DBR) pour la première partition sur un disque dur se trouve généralement au secteur absolu 63 (le 64e secteur sur le lecteur de disque) ou sous forme CHS, nous pouvons dire C–H–S = 0–1 –1 pour la plupart des lecteurs.
Cependant, cet emplacement peut varier en fonction du SPT (secteurs par piste) du lecteur. Par exemple, sur un ancien lecteur de 245 Mo n'ayant que 31 SPT, l'enregistrement de démarrage était situé sur le 32e secteur (secteur absolu 31).
Étant donné que la disquette n'a pas de partitions, elle n'a donc pas de MBR ou de table de partition principale sur son premier secteur, à la place, elle contient le DBR sur son tout premier secteur.
Le DBR est créé par la commande FORMAT du DOS, une fois le partitionnement effectué à l'aide de la commande FDISK. Le secteur sur lequel réside DBR devient le secteur logique 1 de cette partition particulière pour le DOS. Le numéro de secteur utilisé par DOS commence par le secteur physique sur lequel se trouve DBR.
Le DBR contient un petit programme qui est exécuté par le programme exécutable Master Boot Record (MBR). Toutes les partitions DOS contiennent le code du programme pour démarrer la machine, c'est-à-dire charger le système d'exploitation, mais seule cette partition reçoit le contrôle du Master Boot Record qui est spécifié comme partition active, dans l'entrée de la table des partitions.
Si le DBR est corrompu de quelque manière que ce soit, le lecteur doit être accessible si vous démarrez le système à partir de la disquette ou du CD de démarrage. Bien que le disque dur ne soit pas amorçable (si le DBR de la partition active est corrompu), cela ne devrait généralement pas affecter l'accès aux données du lecteur de disque. Après avoir démarré le système avec le disque amorçable, vous pouvez accéder aux données.
/* Afficher les paramètres de démarrage de la disquette */
# 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;
}
Si vous exécutez ce programme pour tester le DBR d'une disquette 1,44 M, 3½ pouces ayant 70 pistes, deux faces, 18 secteurs par piste et 512 octets dans un secteur, la sortie du programme s'affichera de la même manière comme suit :
System ID = +1<*uIHC
Bytes per sector = 512
Sectors per cluster = 1
Reserved sectors = 1
FAT copies = 2
Root directory entries = 224
No. of sectors on disk = 2880
Media Descriptor Byte = F0
Sectors per FAT = 9
Sectors per track = 18
No. of sides = 2
No. of reserved sectors = 0
Lecture du DBR des Gros Volumes
Les volumes de partition dont la taille est supérieure à 32 Mo ont un format de DBR différent de celui du DBR pour les volumes inférieurs ou égaux à 32 Mo.
Il s'agit de fournir le support aux gros volumes du disque (pour une description détaillée à ce sujet, reportez-vous au chapitre "Approche logique des disques et du système d'exploitation", discuté plus tôt dans ce livre).
Le format de l'enregistrement de démarrage DOS d'un volume FAT32 a été donné dans le tableau suivant :
Le programme suivant permet de lire le DBR de gros volumes, dont la taille est supérieure à 32 Mo :
/* Programme pour afficher les paramètres de démarrage d'un grand volume de disque */
# 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();
}
//////// Fonction de conversion décimal en binaire \\\\\\\\
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);
/* Inverser et sortir des chiffres binaires */
do
{
printf ("%d", binary[count - 1]);
count--;
} while (count > 0);
return 0;
}
Lorsque le programme est exécuté pour lire le DBR d'un grand volume, la sortie du programme s'affiche comme suit :
Jump Instruction Code = EB5890 (H)
OEM name and version = MSWIN4.1
Bytes per sector = 512
Sectors per cluster = 8
Reserved sectors = 32
FAT copies = 2
Root directory entries = 0
No. of sectors on disk = 0
Media Descriptor Byte = F8 (H)
Sectors per FAT = 0
Sectors per track = 63
No. of sides = 255
No. of reserved (Hidden) sectors = 63
=========== For Large (>32MB) Disks ===========
No. of sectors, (if Volume is >32MB) = 11277567
Number of Sectors per FAT = 11003
Root Directory Starting Cluster = 2
File System Information Sector = 1
Sector Number of Backup Boot Sector = 6
Physical Drive Number = 80 (H)
Extended Boot Signature = 29 (H)
32-Bit Binary Volume ID = 110101010001100001110111100101 (B)
Volume Label = SAAYA
FAT name = FAT32
Magic Number = 55AA (H)
Dans la sortie du programme, nous voyons que les paramètres suivants sont affichés à zéro :
- Entrée du répertoire racine
- Nombre de secteurs sur le disque
- Nombre de secteurs par FAT
Ces paramètres le sont car ces valeurs sont définies sur zéro, si le volume de la partition est supérieur à 32 Mo et que les informations réelles se trouvent dans le bloc d'informations sur le volume étendu du DBR.
Par exemple, dans la partie initiale des informations DBR, le nombre de secteurs par FAT est 0 et dans le bloc d'informations de volume étendu de DBR, le nombre de secteurs par FAT est 11003, qui est la valeur réelle pour ce grand volume .
Le DBR du volume contient des informations importantes sur les paramètres du disque, qui peuvent être utilisées pour lier toutes les informations de données à des fins de programmation. Par exemple, si vous souhaitez accéder aux DBR d'un autre volume de partition sur le disque, vous pouvez le calculer en nombre de secteurs, écrit en DBR et autres informations connexes.
Si vous souhaitez accéder à l'approche disque avec cluster, vous pouvez effectuer des calculs à l'aide des secteurs par cluster, des secteurs par FAT et d'autres informations.
Si vous utilisez un disque dur de plus de 8,4 Go (voir le chapitre "Approche logique des disques et du système d'exploitation", discuté plus haut dans ce livre), utilisez des extensions pour accéder à tous les DBR du disque au-delà de 8,4 Go. Reportez-vous aux fonctions de lecture-écriture étendues, données dans les chapitres précédents
Comment récupérer DBR avec la programmation
Vous pouvez récupérer le DBR du volume de disque jusqu'à 100 % en utilisant une approche délicate et des calculs logiques. Comme nous avons discuté des approches logiques des systèmes de fichiers dans le chapitre "Approche logique des disques et du système d'exploitation", plus haut dans ce livre, toutes les informations dans DBR sont écrites dans une certaine limite ou règle.
Chaque paramètre écrit dans le DBR a une signification spécifique et écrit ainsi en suivant une règle et une raison spécifiques. C'est pourquoi les informations de DBR, si elles sont perdues, peuvent être reliées ou réécrites manuellement si vous suivez ces règles et utilisez l'esprit délicat pour savoir quoi et comment guérir.
Par exemple, le tableau ci-dessous décrit le nombre de secteurs par cluster pour différents systèmes de fichiers, à l'aide duquel vous pouvez trouver le nombre de secteurs par cluster pour votre disque. Supposons que vous disposiez d'un volume d'environ 10 Go sur votre disque et que le système d'exploitation que vous utilisiez était Windows 98.
Maintenant, le cas échéant, comment les informations "Secteurs par cluster" du DBR du volume sont corrompues. Essayons de savoir quel système de fichiers et combien de secteurs par clusters vous aviez dans le volume de votre disque.
Comme le système d'exploitation de votre disque était Windows 98, qui ne prend en charge que le système de fichiers FAT, le système de fichiers de votre volume était donc FAT. Pensons maintenant à la taille du volume, qui était d'environ 10 Go.
Nous savons que la partition de 10 Go n'est pas prise en charge par FAT16 (voir le tableau ci-dessous), par conséquent, le système de fichiers du volume doit être FAT32.
Essayons maintenant de calculer le nombre de secteurs par cluster pour le volume. Comme nous le voyons dans le tableau, la partition comprise entre 8 Go et 16 Go comporte un cluster de 8 secteurs.
Par conséquent, nous pouvons maintenant conclure que dans le volume, le système de fichiers était FAT32 avec 8 secteurs par cluster. De même, nous pouvons assembler les autres informations du DBR en utilisant d'autres approches logiques décrites dans les chapitres précédents de ce livre.
Le programme suivant a été écrit pour réécrire les informations des paramètres du disque en DBR de 1,44 Mo, disquette 3½ pouces, avec 80 pistes, 2 têtes (côtés) et 18 secteurs par piste.
/* Programme pour réécrire les paramètres d'une disquette de 1,44 Mo, 3½ pouces sur son 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;
}
/* Fonction pour modifier les paramètres de 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;
}
Commentaires sur le codage :
La structure boot est utilisée pour accéder au DBR, pour lire-écrire les paramètres du disque. La fonction display_info(), affiche les différents paramètres du disque, lus depuis le DBR. La fonction Recover_with_values() permet de modifier et de récupérer les paramètres du DBR de Floppy.
Les valeurs utilisées par la fonction Recover_with_values(), sont pour les paramètres de 1,44 Mo, disquette 3 ½ pouces DBR. La description de ces valeurs a été donnée dans le tableau ci-dessous :
Page modifiée le: 09/03/2022