Capitolo – 13
LETTURA E MODIFICA MBR CON PROGRAMMAZIONE
Record di avvio DOS (DBR) / Settore di avvio DOS
Dopo la tabella delle partizioni, il record di avvio DOS (DBR), talvolta chiamato settore di avvio DOS, è la seconda informazione più importante sul disco rigido.
Per una discussione dettagliata su DBR, vedere il capitolo "Un approccio logico ai dischi e al sistema operativo" discusso in precedenza in questo libro.
Il primo settore logico di ogni partizione DOS conterrà il DOS Boot Record (DBR) o DOS Boot Sector. Il compito del DBR è caricare il sistema operativo dal disco rigido alla memoria principale del computer e trasferire 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 del disco) o nel formato CHS, ovvero, per la maggior parte dei dischi possiamo dire C–H–S = 0–1–1.
Tuttavia, questa disposizione può variare a seconda degli SPT (settori per traccia) dell'unità. Ad esempio, su una vecchia unità da 245 MB che aveva solo 31 SPT, il record di avvio si trovava nel settore 32 (settore assoluto 31).
Poiché il floppy disk non ha partizioni, non ha un MBR o Master Partition Table nel suo primo settore, ma contiene invece un DBR nel primissimo settore.
Il DBR viene creato dal comando FORMAT DOS dopo il partizionamento con il comando FDISK. Il settore in cui risiede il DBR diventa il settore logico 1 di quella particolare partizione per DOS. Il numero di settore utilizzato da DOS parte dal settore fisico in cui si trova il 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: avviare il sistema operativo, ma solo questa partizione riceve il controllo dal Master Boot Record, che è specificato come partizione attiva nella voce della tabella delle partizioni.
Se il DBR è danneggiato in qualsiasi modo, il disco dovrebbe essere accessibile avviando il sistema da un floppy disk o da un CD di avvio. Sebbene il disco rigido non sia avviabile (se il DBR della partizione attiva è danneggiato), in genere ciò non dovrebbe influire sull'accesso ai dati sull'unità. Dopo aver avviato il sistema dal disco di avvio, è possibile accedere ai dati.
/* Visualizza i parametri di avvio del floppy disk */
# includere <dos.h>
# includere <stdio.h>
di base( )
{
struttura di carico
{
codice carattere senza segno[3] ; /* Codice di transizione */
unsigned char system_id[8] ;/* Nome OEM e versione*/
int byte_al_secondo ; /* Byte per settore */
simbolo sec_per_clus ; /* Settori per cluster */
int ris_sec ; /* Settori riservati */
carattere fat_copie ; /* Numero di FAT */
int voce_directory_radice ; /* Numero radice
Voci della directory */
intero senza segno no_sects ; /* Numero di settori in
Volume logico */
formato carattere senza segno_id ; /* Byte descrittore del supporto
*/
int sec_per_fat ; /* Settori su FAT */
int sec_per_tracciato ; /* Settori per traccia */
int no_sides ; /* Numero di teste */
int no_sp_res_sect ; /* Numero di nascosti
Settore */
carattere senza segno rest_code[482] ; /* Resto del codice */
} ;
struttura di carico b ;
simbolo temp[4] ;
int valore, unità ;
val = absread(0, 1, 0, &b); /* Utilizzare per floppy disk*/
se (valore == -1)
{
printf( "Errore durante la lettura del disco...settore danneggiato\n" ) ;
uscita (1);
}
clrscr ( );
printf("Identificatore di sistema = %s\n",
b.identificatore_di_sistema ) ;
printf( "Byte per settore = %d\n",
b.byte_in_sec ) ;
printf ( "Settori per cluster = %d\n",
b.sec_per_classe);
printf( "Settori riservati = %d\n",
(b.res_sec ) ;
printf( "Copie FAT = %d\n",
(b.fat_copies ) ;
printf( "Voci della directory radice = %d\n",
(b.root_dir_entry );
printf( "Numero di settori su disco = %u\n",
(nessuna_sezione) ;
printf( "Byte del descrittore del supporto = %X\n",
(b.format_id ) ;
printf( "Settori per FAT = %d\n",
b.sec_per_fat ) ;
printf ( "Settori per traccia = %d\n",
(b.sec_per_trk ) ;
printf("Numero di lati = %d\n",
(nessun lato);
printf ( "Numero di settori riservati = %d\n",
(b.no_sp_res_sect ) ;
restituisci 0;
}
Se si esegue questo programma per testare il DBR di un floppy disk da 1,44 M, 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 a quanto segue:
ID di sistema = +1<*uIHC
Byte per settore = 512
Settori per cluster = 1
Settori riservati = 1
Copie FAT = 2
Voci directory radice = 224
Numero di settori su disco = 2880
Byte descrittore supporto = F0
Settori per FAT = 9
Settori per traccia = 18
Numero di lati = 2
Numero di settori riservati = 0
Lettura del DBR di grandi volumi
I volumi di partizione di dimensioni superiori a 32 MB hanno un formato DBR diverso rispetto al DBR per volumi di dimensioni inferiori o uguali a 32 MB.
Serve a fornire supporto a grandi volumi di disco (per una descrizione dettagliata, fare riferimento al capitolo "Approccio logico ai dischi e al sistema operativo", discusso in precedenza in questo libro).
Il formato del DOS Boot Record di un volume FAT32 è riportato nella seguente tabella:

Il seguente programma serve per leggere il DBR di volumi di grandi dimensioni, di dimensioni superiori a 32 MB:
/* Programma per visualizzare i parametri di avvio del Large Disk Volume */
# includi "dos.h"
# includi "stdio.h"
vuoto principale()
{
avvio struttura
{
codice carattere non firmato[3] ; /* Codice di salto */
unsigned char system_id[8] ; /* Nome OEM e versione */
int bytes_per_sec ; /* Byte per settore */
carattere sec_per_clus ; /* Settori per cluster*/
unsigned int res_sec ; /* Numero di riservati
Settori */
char fat_copies ; /* Numero di FAT */
unsigned int root_dir_entry ;/* Numero di Root
Voce di directory */
unsigned int no_sects ; /* Numero di settori in
Volume logico (se
Il volume è <= 32 MB) */
unsigned char Media_id ; /* Byte descrittore del supporto
*/
unsigned int sec_per_fat ; /* Settore per FAT */
unsigned int sec_per_trk ; /* Settori per traccia */
unsigned int no_sides ; /* Numero di teste */
unsigned long no_sp_res_sect ; /* Numero di nascosti
Settori */
unsigned long long_sec_num ; /* Settori totali in
Volume logico
(Dimensione >32 MB) */
unsigned long num_sec_per_FAT; /* Settori per FAT */
unsigned int binary_flags; /* Flag binari */
unsigned char version_of_FAT1; /* Primo byte di FAT
Versione */
unsigned char version_of_FAT2; /* Secondo byte di FAT
Versione */
unsigned long root_dir_start_cluster;
/* Directory radice
Cluster di partenza
Numero */
int senza segno sec_num_del_file_sys;
/* Numero di settore di
Sistema di file
Settore dell'informazione
*/
int senza segno sec_num_di_sec_di_avvio_del_backup;
/* Numero di settore di
Backup del settore di avvio
*/
unsigned char riservato[12]; /* Riservato */
unsigned char numero_unità_logica;
/* Unità fisica
Numero di Logico
Quantità */
unsigned char unused_byte; /* Byte non utilizzato */
carattere non firmato hex_extd_boot_signature;
/* Avvio esteso
Firma(29H) */
unsigned long binary_volume_ID;/* ID volume binario */
unsigned char volume_label[11];/* Etichetta del volume */
unsigned char FAT_name[8]; /* Nome FAT */
unsigned char rest_code[420] ; /* Resto 420 byte di
Il DBR */
unsigned char magic_number[2]; /* Numero magico */
} ;
struttura di avvio b ;
temperatura del carattere[4] ;
int valore, unità,i;
val = biosdisk( 2, 0x80, 1,0,1,1, &b ) ;
/* Per il primo disco rigido */
se (valore == -1)
{
printf( "Errore di lettura del disco...settore danneggiato\n" ) ;
uscita ( 1 ) ;
}
clrscr ( );
printf(" Codice istruzione salto = ");
per(i=0;i<=2;i++)
{
printf("%X",b.codice[i]);
}
printf("(H)\n ");
printf( "Nome e versione OEM = %s\n ",
(b.system_id );
printf( "Byte per settore = %u\n ",
b.byte_al_sec ) ;
printf( "Settori per cluster = %u\n ",
b.sec_per_clus );
printf( "Settori riservati = %u\n ",
(b.res_sec ) ;
printf( "Copie FAT = %d\n ",
(b.fat_copies ) ;
printf( "Voci della directory radice = %u\n ",
(b.root_dir_entry );
printf( "Numero di settori su disco = %u\n ",
(nessuna_sezione) ;
printf ( "Byte del descrittore del supporto = %X(H)\n",
b.Media_id ) ;
printf( "Settori per FAT = %u\n ",
b.sec_per_fat ) ;
printf( "Settori per traccia = %u\n ",
(b.sec_per_trk ) ;
printf( "Numero di lati = %u\n ",
(nessun lato);
printf( "Numero di settori riservati (nascosti)= %lu\n ",
(b.no_sp_res_sect ) ;
printf ( "========== Per dischi di grandi dimensioni (>32 MB) ========\n");
printf( "Numero di settori,(se il volume è >32MB) = %lu\n ",
b.long_sec_num) ;
printf(“Numero di settori per FAT = %lu\n “,
b.num_sec_per_FAT );
printf( "Directory radice di avvio del cluster = %lu\n ",
b.root_dir_start_cluster);
printf( "Settore informazioni file system = %u\n ",
b.sec_num_di_file_sys);
printf( "Numero del settore del settore di avvio di backup = %u\n ",
b.sec_num_di_sec_di_avvio_del_backup);
printf( "Numero unità fisica = %X(H)\n",
b.numero_unità_logica);
printf ( "Firma di avvio estesa = %X(H)\n",
b.hex_extd_boot_signature);
printf( "ID volume binario a 32 bit = ");
Decimale_in_binario (b.binary_volume_ID,32);
stampa( " (B)\n ");
printf( "Etichetta del volume = ");
per(i=0;i<=10;i++)
{
printf( "%c",b.etichetta_volume[i]);
}
printf( "\n FAT nome = ");
per(i=0;i<=7;i++)
{
printf( "%c",b.nome_FAT[i]);
}
stampa( "\n ");
printf( "Numero magico = %X%X(H)",
b.numero_magico[0],b.numero_magico[1]);
ottenere();
}
//////// Funzione di conversione da decimale a binario \\\\\\\
Decimal_to_Binary(input lungo senza segno)
{
i lungo senza segno;
int conteggio = 0;
int binario [32]; /* Solo 32 bit MAX 32
elementi totali */
Fare
{
i = input%2; /* MOD 2 per ottenere 1 o 0*/
binary[count] = i; /* Carica gli elementi nel
Matrice binaria */
input = input/2; /* Dividi input per 2 per
decremento tramite binario */
count++; /* Conta quanti elementi
sono necessari */
}mentre (input > 0);
/* Inverti e restituisci cifre binarie */
Fare
{
printf ("%d", binario[conteggio - 1]);
contare--;
} while (conteggio > 0);
restituisci 0;
}
Quando il programma viene eseguito per leggere il DBR di un volume di grandi dimensioni, l'output del programma viene visualizzato come segue:
Codice istruzione Jump = EB5890 (H)
Nome e versione OEM = MSWIN4.1
Byte per settore = 512
Settori per cluster = 8
Settori riservati = 32
Copie FAT = 2
Voci directory radice = 0
Numero di settori su disco = 0
Byte descrittore supporto = F8 (H)
Settori per FAT = 0
Settori per traccia = 63
Numero di lati = 255
Numero di settori riservati (nascosti) = 63
=========== Per dischi di grandi dimensioni (>32 MB) ===========
Numero di settori (se il volume è >32 MB) = 11277567
Numero di settori per FAT = 11003
Cluster di avvio directory radice = 2
Settore informazioni file system = 1
Numero di settore del settore di avvio di backup = 6
Numero unità fisica = 80 (H)
Firma di avvio estesa = 29 (H)
ID volume binario a 32 bit = 110101010001100001110111100101 (B)
Etichetta volume = SAAYA
Nome FAT = FAT32
Numero magico = 55AA (H)
Nell'output del programma vediamo che i seguenti parametri sono visualizzati come zero:
- Voce della directory radice
- 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 nell'Extended Volume Information Block del DBR.
Ad esempio, nella parte iniziale delle informazioni DBR, il numero di settori per FAT è 0 e nel blocco di 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 informazioni importanti sui parametri del disco, che possono essere utilizzate per collegare tutte le informazioni sui dati a scopo di programmazione. Ad esempio, se si desidera accedere ai DBR di altri volumi di partizione sul disco, è possibile calcolarli in base al numero di settori, scritti in DBR e altre informazioni correlate.
Se si desidera accedere al disco con approccio cluster, è possibile effettuare calcoli con l'ausilio di settori per cluster, settori per FAT e altre informazioni.
Se si utilizza un disco rigido più grande di 8,4 GB (vedere il capitolo "Approccio logico a dischi e sistema operativo", discusso in precedenza in questo libro), utilizzare le estensioni per accedere a tutti i DBR del disco oltre 8,4 GB. Fare riferimento alle funzioni di lettura-scrittura estese, fornite nei capitoli precedenti
Come recuperare DBR con la programmazione
È possibile 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 a dischi e SO", 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 viene scritto seguendo una regola e una ragione specifiche. Ecco perché le informazioni del DBR, se perse, possono essere ricollegate o riscritte manualmente se si seguono queste regole e si usa la mente ingannevole per scoprire cosa e come curare.
Ad esempio, la tabella riportata di seguito descrive il numero di settori per cluster per diversi file system, tramite i quali 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 in qualche modo le informazioni "Settori per cluster" del DBR del volume sono corrotte. 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 10 GB non è supportata da FAT16 (vedere la tabella riportata di seguito), pertanto 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 di un floppy disk da 3½ pollici e 1,44 Mb, con 80 tracce, 2 testine (lati) e 18 settori per traccia.
/* Programma per riscrivere i parametri del floppy disk da 1,44 MB e 3½ pollici sul suo DBR */
# includi "dos.h"
# includi "stdio.h"
avvio struttura
{
codice carattere non firmato[3] ; /* Codice di salto */
unsigned char system_id[8] ; /* ID OEM e versione*/
int bytes_per_sec ; /* Byte per settore */
char sec_per_clus ; /* Numero di settori
Per cluster */
int res_sec ; /* Settori riservati */
char fat_copies ; /* Numero di FAT */
int root_dir_entry ; /* Numero di Root
Voci della directory */
unsigned int no_sects ; /* Numero di totali
Settori */
unsigned char format_id ; /* Descrittore del supporto
Byte */
int sec_per_fat ; /* Settori per FAT */
int sec_per_trk ; /* Settori per FAT */
int no_sides ; /* Numero di
Lati (Teste) */
int no_sp_res_sect ; /* Numero di nascosti
Settori */
unsigned char rest_code[482] ;/* Codice Rest 482 Byte
di DBR */
} ;
struttura di avvio b ;
principale( )
{
con un suggerimento;
val = absread(0, 1, 0, &b); /* Utilizzare per floppy disk */
se (valore == -1)
{
printf( "\n Errore di lettura del disco...settore danneggiato\n" ) ;
uscita ( 1 ) ;
}
clrscr ( );
visualizza_info();
ottenere();
printf("\n Ora recupero BDR del floppy.....\n");
Recupera_con_valori();
printf( "\n Disco recuperato con successo." ) ;
visualizza_info();
restituisci 0;
}
/* Funzione per modificare i parametri di DBR */
Recupera_con_valori()
{
valore intero =0;
/* Codice di salto di 3 byte per floppy */
b.codice[0] = 0xEB;
b.codice[1]= 0x3E;
b.codice[2]= 0x90 ;
/* ID di sistema di 8 byte */
strcpy(b.system_id, "+05PSIHC");
/* Byte per settore = 512 */
b.byte_al_sec = 512;
/* Settore per Cluster per Floppy da 3,5" da 1,44 M = 1 */
b.sec_per_clus = 1;
/* Numero di settori riservati = 1 */
b.res_sec =1;
/* Numero di copie FAT = 2 */
b.fat_copies =2;
/* Numero di voci della directory radice = 224 */
b.root_dir_entry =224;
/* Numero di settori su disco = 2880 */
b.no_sects =2880;
/* Byte descrittore del supporto per floppy = F0 (H) */
b.format_id =0xF0;
/* Settori per FAT = 9 */
b.sec_per_fat =9;
/* Settori per traccia = 18 */
b.sec_per_trk =18;
/* Numero di lati = 2 */
b.no_sides =2;
/* Numero di settori riservati speciali (o nascosti)
Settori) = 0 */
b.no_sp_res_sect =0;
/* Utilizzare per floppy disk*/
val = abswrite ( 0, 1, 0, &b ) ;
se (valore == -1)
{
printf( "\n Errore di scrittura su disco...settore danneggiato\n" ) ;
printf( "Il disco non è stato recuperato." ) ;
uscita ( 1 ) ;
}
restituisci 0;
}
visualizza_info()
{
printf( "\n Codice di salto (esadecimale) = %X%X%X (H)\n",
b.codice[0],b.codice[1],b.codice[2]);
printf( "ID di sistema = %s\n",
(b.system_id );
printf( "Byte per settore = %d\n",
b.byte_al_sec ) ;
printf ( " Settori per cluster = %d\n",
b.sec_per_clus );
printf( " Settori riservati = %d\n",
(b.res_sec ) ;
printf( " Copie FAT = %d\n",
(b.fat_copies ) ;
printf ( "Voci della directory radice = %d\n",
(b.root_dir_entry );
printf( " Numero di settori su disco = %u\n",
(nessuna_sezione) ;
printf("Descrittore del supporto byte = %X\n",
(b.format_id ) ;
printf("Settori su FAT = %d\n",
b.sec_per_fat ) ;
printf("Settori per traccia = %d\n",
(b.sec_per_trk ) ;
printf("Numero di lati = %d\n",
(nessun lato) ;
printf("Numero di settori riservati = %d\n",
(b.no_sp_res_sect ) ;
restituisci 0;
}
Commenti sulla codifica:
La struttura di avvio viene utilizzata per accedere al DBR, per leggere e scrivere i parametri del disco. La funzione display_info() visualizza vari parametri del disco leggendoli dal DBR. La funzione Recover_with_values() viene utilizzata per modificare e ripristinare i parametri del floppy DBR.
I valori utilizzati dalla funzione Recover_with_values() sono per un floppy disk DBR da 1,44 MB e 3 ½ pollici. Una descrizione di questi valori è fornita nella tabella seguente:
