Глава – 13
Чтение и изменение DBR с помощью программирования
Загрузочная запись DOS (DBR) / загрузочный сектор DOS
Загрузочная запись DOS (DBR) / загрузочный сектор DOS
После таблицы разделов загрузочная запись DOS (DBR), или иногда называемая загрузочным сектором DOS, является второй по важности информацией на вашем жестком диске.
Подробное изучение DBR см. в главе «Логический подход к дискам и ОС», обсуждавшейся ранее в этой книге.
Первый логический сектор каждого раздела DOS будет содержать загрузочную запись DOS (DBR) или загрузочный сектор DOS. Задача DBR — загрузить операционную систему с жесткого диска в основную память компьютера и передать управление системой загруженной программе.
Загрузочная запись DOS (DBR) для первого раздела на жестком диске обычно находится в абсолютном секторе 63 (64-й сектор на диске) или в форме CHS, мы можем сказать C–H–S = 0–1. –1 для большинства приводов.
Однако это расположение может варьироваться в зависимости от SPT (количества секторов на дорожку) накопителя. Например, на старом диске емкостью 245 МБ, имеющем только 31 SPT, загрузочная запись располагалась в 32-м секторе (абсолютный сектор 31).
Поскольку на дискете нет разделов, в ее первом секторе нет MBR или главной таблицы разделов, вместо этого она содержит DBR в самом первом секторе.
DBR создается с помощью команды DOS FORMAT после того, как разбиение на разделы выполняется с помощью команды FDISK. Сектор, в котором находится DBR, становится логическим сектором 1 этого конкретного раздела для DOS. Номер сектора, используемый DOS, начинается с физического сектора, на котором находится DBR.
DBR содержит небольшую программу, которая выполняется исполняемой программой главной загрузочной записи (MBR). Все разделы DOS содержат программный код для загрузки машины, т. е. для загрузки операционной системы, но только этот раздел получает управление с помощью основной загрузочной записи, которая указана как активный раздел в записи таблицы разделов.
Если DBR каким-либо образом поврежден, диск должен быть доступен при загрузке системы с загрузочной дискеты или компакт-диска. Хотя жесткий диск не является загрузочным (если DBR активного раздела поврежден), в целом это не должно влиять на доступ к данным на диске. После загрузки системы с загрузочного диска вы можете получить доступ к данным.
/* Показать параметры загрузки дискеты */
# 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;
}
Если вы запустите эту программу для проверки DBR дискеты размером 1,44 Мб, 3½ дюйма, имеющей 70 дорожек, две стороны, 18 секторов на дорожку и 512 байтов в секторе, вывод программы будет выглядеть примерно так:
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
Чтение DBR больших томов
Тома раздела, размер которых превышает 32 МБ, имеют несколько иной формат DBR, чем DBR для томов меньше или равно 32 МБ.
Это необходимо для обеспечения поддержки больших томов диска (подробное описание см. в главе «Логический подход к дискам и ОС», рассмотренной ранее в этой книге).
Формат загрузочной записи DOS тома FAT32 приведен в следующей таблице:
Следующая программа предназначена для чтения DBR больших томов размером более 32 МБ:
/* Программа для отображения параметров загрузки большого дискового тома */
# 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 большого тома, вывод программы отображается следующим образом:
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)
В выводе программы мы видим, что следующие параметры показаны нулевыми:
- Запись корневого каталога
- Количество секторов на диске
- Число секторов на FAT
Эти параметры таковы, потому что эти значения устанавливаются равными нулю, если размер тома раздела больше 32 МБ, а фактическая информация находится в информационном блоке расширенного тома DBR.
Например, в начальной части информации DBR количество секторов на FAT равно 0, а в информационном блоке расширенного тома DBR количество секторов на FAT равно 11003, что является фактическим значением для этого большого тома. .
DBR тома содержит важную информацию о параметрах диска, которую можно использовать для связывания всей информации данных в целях программирования. Например, если вы хотите получить доступ к DBR другого тома раздела на диске, вы можете рассчитать его по количеству секторов, записанных в DBR и другой связанной информации.
Если вы хотите получить доступ к Диску с кластерным подходом, вы можете произвести расчеты с помощью Секторов на кластер, Секторов на FAT и другой информации.
Если вы используете жесткий диск размером более 8,4 ГБ (см. главу «Логический подход к дискам и ОС», обсуждавшуюся ранее в этой книге), используйте расширения для доступа ко всем DBR диска за пределами 8,4 ГБ. Обратитесь к расширенным функциям чтения-записи, приведенным в предыдущих главах.
Как восстановить DBR с помощью программирования
Вы можете восстановить DBR дискового тома до 100 процентов, используя хитрый подход и логические вычисления. Как мы обсуждали логические подходы к файловым системам в главе «Логический подход к дискам и ОС» ранее в этой книге, каждая информация в DBR записывается в рамках некоторого ограничения или правила.
Каждый параметр, записанный в DBR, имеет определенное значение и написан таким образом, следуя определенному правилу и причине. Именно поэтому информация DBR в случае утери может быть Пересвязана или перезаписана вручную, если следовать этому правилу и использовать хитрый ум, чтобы узнать, что и как лечить.
Например, в приведенной ниже таблице указано количество секторов на кластер для разных файловых систем, с помощью которой вы можете найти количество секторов на кластер для вашего диска. Предположим, что у вас на диске имеется объем примерно 10 ГБ, а вы используете операционную систему Windows 98.
Теперь, если таковые имеются, повреждена информация «Секторов на кластер» DBR тома. Давайте попробуем выяснить, какая файловая система и сколько секторов на кластеры у вас было в объеме вашего диска.
Поскольку операционная система на вашем диске была Windows 98, которая поддерживает только файловую систему FAT, поэтому файловая система вашего тома была FAT. Теперь давайте подумаем о размере тома, который был примерно 10 ГБ.
Мы знаем, что раздел размером 10 ГБ не поддерживается FAT16 (см. приведенную ниже таблицу), поэтому файловая система тома должна быть FAT32.
Теперь попробуем подсчитать количество секторов на кластер для тома. Как мы видим в таблице, раздел в диапазоне от 8Гб до 16Гб имеет один кластер из 8 секторов.
Следовательно, теперь мы можем сделать вывод, что в томе Файловая система была FAT32 с 8 секторами на кластер. Точно так же мы можем собрать другую информацию DBR, используя другие логические подходы, описанные в предыдущих главах этой книги.
Следующая программа была написана для перезаписи информации о параметрах диска в DBR 1,44 Мб, 3½-дюймовая дискета, с 80 дорожками, 2 головками (сторонами) и 18 секторами на дорожку.
/* Программа для перезаписи параметров 1,44 МБ, 3,5-дюймовой дискеты на ее 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;
}
Комментарии по кодированию:
Структура boot используется для доступа к DBR, для чтения-записи параметров диска. Функция display_info() отображает различные параметры диска, считываемые из DBR. Функция Recover_with_values() используется для изменения и восстановления параметров DBR дискеты.
Значения, используемые функцией Recover_with_values(), предназначены для параметров 1,44 МБ, 3,5-дюймовой дискеты DBR. Описание этих значений приведено в следующей таблице:
Страница изменена: 17/01/2022