Capitolo – 13
Lettura e Modifica MBR con Programmazione
Record di avvio DOS (DBR) / Settore di avvio DOS
Registro di avvio DOS (DBR) / Settore di avvio DOS
Dopo la tabella delle partizioni, il DOS Boot Record (DBR) o talvolta chiamato DOS Boot Sector è la seconda informazione più importante sul tuo disco rigido.
Per uno studio dettagliato su DBR, fare riferimento al capitolo "Approccio logico ai dischi e al sistema operativo", discusso in precedenza in questo libro.
Il primo settore logico di ciascuna partizione DOS conterrà un record di avvio DOS (DBR) o un settore di avvio DOS. Il compito del DBR è caricare il sistema operativo dal disco rigido nella memoria principale del computer e dare il controllo del sistema al programma caricato.
Il DOS Boot Record (DBR) per la prima partizione su un disco rigido si trova solitamente nel settore assoluto 63 (il 64° settore dell'unità disco) o in forma CHS possiamo dire C–H–S = 0–1 –1 per la maggior parte delle unità.
Tuttavia, questa posizione può variare a seconda dell'SPT (Settori per traccia) del Drive. Ad esempio, su una vecchia unità da 245 MB con solo 31 SPT, il record di avvio si trovava nel 32° settore (settore assoluto 31).
Dato che il floppy non ha partizioni, quindi non ha MBR o Master Partition Table nel suo primo settore, invece contiene il DBR nel suo primo settore.
Il DBR viene creato dal comando FORMAT di DOS, dopo che il partizionamento è stato eseguito utilizzando il comando FDISK. Il settore su cui risiede DBR diventa il settore logico 1 di quella particolare partizione per il DOS. Il numero di settore utilizzato da DOS inizia dal settore fisico su cui si trova DBR.
Il DBR contiene un piccolo programma che viene eseguito dal programma eseguibile Master Boot Record (MBR). Tutte le partizioni DOS contengono il codice del programma per avviare la macchina, ovvero caricare il sistema operativo, ma solo quella partizione riceve il controllo dal Master Boot Record che è specificato come partizione attiva, nella voce della tabella delle partizioni.
Se il DBR è danneggiato in qualche modo, l'unità dovrebbe essere accessibile se si avvia il sistema dal floppy o dal CD avviabile. Sebbene il disco rigido non sia avviabile (se il DBR della partizione attiva è danneggiato), tuttavia in genere ciò non dovrebbe influire sull'accesso ai dati dell'unità disco. Dopo aver avviato il sistema con il disco di avvio è possibile accedere ai dati.
/* Visualizza i parametri di avvio del floppy */
# 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;
}
Se esegui questo programma per testare il DBR di 1,44 M, floppy disk da 3½ pollici con 70 tracce, due lati, 18 settori per traccia e 512 byte in un settore, l'output del programma verrà visualizzato in modo simile come segue:
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
Lettura del DBR di grandi volumi
I volumi di partizione di dimensioni maggiori di 32 MB hanno un formato di DBR diverso rispetto al DBR per volumi inferiori o uguali a 32 MB.
È così per fornire il supporto a grandi volumi del disco (per una descrizione dettagliata su di esso, fare riferimento al capitolo "Approccio logico ai dischi e al sistema operativo", discusso in precedenza in questo libro).
Il formato del record di avvio DOS di un volume FAT32 è stato fornito nella tabella seguente:
Il seguente programma legge il DBR di grandi volumi, di dimensioni superiori a 32 MB:
/* Programma per visualizzare i parametri di avvio di Large Disk Volume */
# 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();
}
//////// Funzione di conversione da decimale a binario \\\\\\\\
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);
/* Inverti e genera cifre binarie */
do
{
printf ("%d", binary[count - 1]);
count--;
} while (count > 0);
return 0;
}
Quando il programma viene eseguito per leggere il DBR di un volume elevato, l'output del programma viene visualizzato come segue:
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)
Nell'output del programma vediamo che i seguenti parametri sono mostrati zero:
- Voce della directory principale
- Numero di settori su disco
- Numero di settori per FAT
Questi parametri sono così perché questi valori sono impostati su zero, se il volume della partizione è maggiore di 32 MB e le informazioni effettive si trovano nel blocco informazioni sul volume esteso del DBR.
Ad esempio, nella parte iniziale delle informazioni DBR, il numero di settori per FAT è 0 e nel blocco informazioni sul volume esteso di DBR il numero di settori per FAT è 11003, che è il valore effettivo per questo grande volume .
Il DBR del volume contiene le informazioni importanti sui parametri del disco, che possono essere utilizzate per collegare tutte le informazioni sui dati a scopo di programmazione. Ad esempio, se desideri accedere ai DBR di un altro volume di partizione sul disco, puoi calcolarlo per numero di settori, scritti in DBR e altre informazioni correlate.
Se vuoi accedere all'approccio Disco con cluster, puoi eseguire calcoli con l'aiuto di Settori per cluster, settori per FAT e altre informazioni.
Se si utilizza un disco rigido di dimensioni superiori a 8,4 GB (consultare il capitolo "Approccio logico ai dischi e al sistema operativo", discusso in precedenza in questo libro), utilizzare le estensioni per accedere a tutti i DBR del disco oltre gli 8,4 GB. Fare riferimento alle Funzioni di lettura-scrittura estese, fornite nei capitoli precedenti
Come recuperare DBR con la programmazione
Puoi recuperare il DBR del volume del disco fino al 100 percento utilizzando un approccio complicato e calcoli logici. Come abbiamo discusso sugli approcci logici dei file system nel capitolo "Approccio logico ai dischi e al sistema operativo", in precedenza in questo libro, ogni informazione in DBR è scritta entro un limite o una regola.
Ogni parametro scritto nel DBR ha un significato specifico e lo si scrive seguendo alcune regole e ragioni specifiche. Ecco perché le informazioni di DBR, se perse, possono essere ricollegate o riscritte manualmente se segui queste regole e usi la mente complicata per scoprire cosa e come curare.
Ad esempio, la tabella riportata di seguito descrive il numero di settori per cluster per diversi file system, utilizzando la quale puoi trovare il numero di settori per cluster per il tuo disco. Supponiamo che tu abbia un volume di circa 10 GB nel tuo disco e che il sistema operativo che stavi utilizzando fosse Windows 98.
Ora, se del caso, le informazioni sui "Settori per cluster" del DBR del volume sono danneggiate. Proviamo a scoprire quale file system e quanti settori per cluster avevi nel volume del tuo disco.
Poiché il sistema operativo nel tuo disco era Windows 98, che supporta solo il file system FAT, quindi il file system del tuo volume era FAT. Ora pensiamo alla dimensione del volume, che era di circa 10 GB.
Sappiamo che la partizione da 10GB non è supportata da FAT16 (vedi tabella riportata di seguito) quindi il file system del volume dovrebbe essere FAT32.
Ora proviamo a calcolare il numero di settori per cluster per il volume. Come vediamo nella tabella, la partizione nell'intervallo da 8 GB a 16 GB ha un cluster di 8 settori.
Pertanto, ora possiamo concludere che nel volume, Il file system era FAT32 con 8 settori per cluster. Allo stesso modo possiamo assemblare le altre informazioni del DBR utilizzando altri approcci logici descritti nei capitoli precedenti di questo libro.
Il seguente programma è stato scritto per riscrivere le informazioni dei parametri del disco in DBR da 1.44Mb, floppy disk da 3½ pollici, con 80 tracce, 2 testine (lati) e 18 settori per traccia.
/* Programma per riscrivere i parametri di un floppy disk da 1,44 MB, 3½ pollici nel suo 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;
}
/* Funzione per modificare i parametri di 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;
}
Commenti sulla codifica:
La struttura boot serve per accedere al DBR, per leggere-scrivere i parametri del disco. La funzione display_info(), visualizza i vari parametri del disco, leggendo dal DBR. La funzione Recover_with_values() serve per modificare e recuperare i parametri di DBR di Floppy.
I valori utilizzati dalla funzione Recover_with_values(), sono per parametri di 1.44 MB, DBR del floppy disk da 3 ½ pollici. La descrizione di questi valori è stata data nella tabella seguente:
Pagina modificata il: 10/03/2022