Глава – 11
Создание резервных копий
Почему резервные копии?
“Профилактика всегда лучше лечения». Создание резервных копий также является важной частью предотвращения сбоев данных, что может помочь нам преодолеть сбой диска или любую другую потерю данных. В этой главе мы обсудим, как мы можем восстановить данные даже после некоторых серьезных сбоев диска, только с помощью ранее сделанных резервных копий.
Восстановление, выполненное с помощью ранее сохраненных резервных копий, почти всегда достигает 100 процентов, однако некоторые типы сбоев диска могут привести к изменению результатов восстановления в некоторых конкретных случаях.
Восстановление данных с помощью резервных копий довольно просто, быстро и надежно и может дать наилучшие результаты, в то время как восстановление данных без резервных копий является трудным, сложным процессом, который может занять много времени, и даже в этом случае мы опасаемся не получение 100-процентных данных в нескольких случаях.
Когда и что создавать резервную копию
На диске есть несколько различных областей, резервные копии которых следует создавать один раз или через разные промежутки времени. Следующая таблица дает представление о мерах по полному резервному копированию и помогает выяснить, когда и что следует резервировать:
What to Backup |
When to be Backed up |
Backup of MBR |
Once after FDISK. The MBR is Created By the FDISK command of DOS. You can take backup of MBR After FDISK, however even after the FORMAT of partitions created by FDISK, The MBR remains Unchanged. |
Backup of DBR |
Back up the DBRs for each logical drive once, after FORMAT. |
Backup of FAT and Directory entries. |
FAT and Directory Entries are changed every time when you create of delete files or directories. Therefore it is recommended that you should take backup daily. |
Backup of User Data |
Should be taken regularly. This type of backup causes the disk imaging to take place. However it is time taking yet most of the companies which have very sensitive data in their disks like to spend their time on disk imaging because by doing this they can backup all of the information described above. |
Кроме того, вы должны сделать аварийную загрузочную дискету для системы. Если с данными на вашем жестком диске произойдет какая-либо авария, вы можете загрузить свою систему с помощью этой дискеты и проанализировать диск на наличие ошибок.
Резервное копирование MBR (Master Boot Record) и его использование
Главная загрузочная запись (MBR), которую иногда называют главной таблицей разделов (MPT), содержит небольшую программу для загрузки и запуска активного (или загрузочного) раздела с жесткого диска. Основная загрузочная запись содержит информацию обо всех четырех основных разделах.
Подробное изучение MBR см. в главе “Логический подход к дискам и ОС», рассмотренной ранее в этой книге.
MBR расположен в абсолютном секторе 0 или, можно сказать, в цилиндре 0, головке 0 и секторе 1. Он создается на жестком диске путем выполнения команды FDISK.EXE из DOS.
Зачем делать резервную копию MBR:
MBR позволяет загрузочному сектору активного раздела получать управление при запуске системы.
После самотестирования при включении питания (POST) BIOS загружает MBR (главную загрузочную запись) с жесткого диска в память, а затем выполняет ее. Сначала MBR проверяет жесткий диск на наличие активного раздела, затем загружает загрузочную запись DOS (DBR) в память и передает управление коду загрузки операционной системы, а затем код загрузочной записи операционной системы загружает остальную часть операционной системы в память. Память.
Итак, мы можем сказать, что если MBR диска повреждена, жесткий диск почти мертв, и система полностью не может загрузиться или запустить операционную систему. В таком состоянии все данные, хранящиеся на жестком диске, становятся недоступными. Обычно сообщения об ошибках отображаются следующим образом:
“Недопустимая таблица разделов” “Ошибка загрузки операционной системы” “Отсутствует операционная система"
Что можно восстановить с помощью резервной копии MBR?
Резервное копирование MBR может помочь вам избавиться от вышеуказанных сообщений об ошибках. С помощью резервного копирования можно устранить следующие проблемы:
- Ошибка при загрузке операционной системы из-за поврежденного IPL (начального загрузчика программы)
- Потеряны основные разделы
- Информация о разделе повреждена
- Недопустимый магический номер
Написание программы для резервного копирования MBR:
/* Программа для резервного копирования MBR */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo; /* Structure to Hold the
information of disk Parameters */
int result;
int count=0;
char filename[80]; /* Stores the File name given by
User */
static char dbuf[512]; /* Data Buffer of 512 Bytes */
FILE *fp;
dinfo.drive = 0x80; /* drive number for First Hard
Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
printf("\n Enter The Filename and path to store the
Backup of MBR \n ");
gets(filename);
// Откройте файл для хранения резервной копии MBR \\
if((fp=fopen(filename,"wb"))==NULL)
{
printf("Could not Create File, Press any key to
Exit...");
getch();
exit(0);
}
printf("Attempting to read from Hard disk drive :\n");
//// Чтение указанного сектора диска \\\\
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Disk read from hard disk drive :
successful.\n");
/// Записать 512 байт MBR в файл \\\\
while(count<512)
{
fprintf(fp,"%c",dbuf[count] & 0xff );
count++;
}
fclose(fp);
}
else
printf("Cannot read Hard Disk drive, status = 0x%02x\n", result);
return 0;
}
Комментарии к программному кодированию:
В программном кодировании, приведенном ранее, в основном мы шаг за шагом приступаем к выполнению следующих задач:
- dinfo указывает на структуру diskinfo_t, которая содержит информацию о параметрах, необходимых для операции, выполняемой функцией _bios_disk.
- Поскольку мы хотим прочитать первый сектор диска, расположение сектора будет следующим:
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive. |
dinfo.head = 0 |
It points to head number 0 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
>Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
- Откройте файловый поток с заданным пользователем именем файла и путем для хранения резервной копии MBR размером ровно 512 байт. Имя файла и путь хранятся в имени файла массива символов.
- _bios_disk(_DISK_READ, &dinfo) считывает первый сектор жесткого диска (80H), указанный в dinfo.
- Возвращенный статус сохраняется в результате, который используется для отображения сообщения об успешной операции или для отображения сообщения об ошибке на экране в случае возникновения какой-либо ошибки.
Программа для восстановления MBR из резервной копии:
Если MBR каким-либо образом повреждена, приведенная ниже программа поможет восстановить MBR Back.
Всегда следует помнить, что незаконное использование или использование без ведома этой программы может уничтожить ваши данные на жестком диске и сделать все данные недоступными. Вы должны быть уверены в том, что собираетесь делать. В противном случае вы можете еще больше усложнить проблему.
Программа для восстановления MBR из резервной копии:
Кодировка программы следующая:
/* Программа для восстановления резервной копии MBR из файла резервной копии */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo;
int result;
int count=0;
char filename[80]; /* Stores the File name given
by User */
static char dbuf[512]; /* Data Buffer of 512 Bytes
*/
FILE *fp;
/* Получить пользовательский ввод для пути к файлу резервной копии MBR */
printf("\n Enter The Filename and path of Backup File of
MBR \n ");
gets(filename);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("Could not open Backup File, Press any key
to Exit...");
getch();
exit(1);
}
/* Данные MBR должны иметь размер 512 байт */
while(count<512)
{
fscanf(fp,"%c",&dbuf[count]);
count++;
}
fclose(fp);
printf("Attempting to Write to Hard disk drive :\n");
dinfo.drive = 0x80; /* drive number for First
Hard Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
result = _bios_disk(_DISK_WRITE, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Restoring the Backup of MBR to The Disk
Sector: successful.\n");
}
else
printf("Cannot Write on Hard Disk drive, status =
0x%02x\n", result);
return 0;
}
Комментарии к программному кодированию:
В программном кодировании, приведенном выше, в основном мы шаг за шагом приступаем к выполнению следующих задач:
- dinfo указывает на структуру diskinfo_t, которая содержит информацию о параметрах, необходимых для операции, выполняемой функцией _bios_disk.
- Поскольку мы хотим записывать в первый сектор диска, расположение сектора будет следующим:
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive. |
dinfo.head = 0 |
It points to head number 0 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
- Имя файла и путь резервной копии MBR, указанные пользователем, сохраняются в имени файла массива символов. Следует иметь в виду, что информация MBR должна иметь размер ровно 512 байт.
- _bios_disk(_DISK_WRITE, &dinfo) записывает данные в первый сектор жесткого диска (80H), указанный в dinfo.
- Возвращенный статус сохраняется в результате, который используется для отображения сообщения об успешной операции или для отображения сообщения об ошибке на экране в случае возникновения какой-либо ошибки.
Резервное копирование DBR (загрузочной записи DOS) и его использование
После таблицы разделов загрузочная запись DOS (DBR), которую иногда называют загрузочным сектором DOS, является второй по важности информацией на жестком диске.
Подробное изучение DBR см. в главе “Логический подход к дискам и ОС”, рассмотренной ранее в этой книге.
Первый логический сектор каждого раздела DOS будет содержать загрузочную запись DOS (DBR) или загрузочный сектор DOS. Задача DBR состоит в том, чтобы загрузить операционную систему с жесткого диска в основную память компьютера и передать управление системой загруженной программе.
Загрузочная запись DOS (DBR) для первого раздела на жестком диске обычно находится в абсолютном секторе 63 (64-й сектор на диске) или в форме CHS, мы можем сказать C–H–S = 0–1&ndash ;1 для большинства приводов.
Однако это расположение может варьироваться в зависимости от SPT (количества секторов на дорожку) накопителя. Например, на старом диске емкостью 245 МБ, имеющем только 31 SPT, загрузочная запись располагалась в 32-м секторе (абсолютный сектор 31).
DBR создается с помощью команды DOS FORMAT после того, как разбиение на разделы выполняется с помощью команды FDISK. Сектор, в котором находится DBR, становится логическим сектором 1 этого конкретного раздела для DOS. Номер сектора, используемый DOS, начинается с физического сектора, на котором находится DBR.
DBR содержит небольшую программу, которая выполняется исполняемой программой основной загрузочной записи (MBR). Все разделы DOS содержат программный код для загрузки машины, т. е. для загрузки операционной системы, но только этот раздел получает управление с помощью основной загрузочной записи, которая указана как активный раздел в записи таблицы разделов.
Зачем делать резервную копию DBR:
DBR содержит важную информацию о геометрии диска. Эта информация находится в первом секторе каждого раздела, например:
- Код перехода + NOP
- OEM-имя и версия
- Байт на сектор
- Секторов на кластер
- Зарезервированные секторы
- Количество копий FAT
- Максимальное количество записей корневого каталога (но недоступно для FAT32)
- Количество секторов в разделе меньше 32 МБ (поэтому недоступно для FAT32)
- Дескриптор носителя (F8H для жестких дисков)
- Секторов на FAT (в старых системах FAT и недоступно для FAT32)
- Секторов на дорожку
- Количество головок
- Количество скрытых секторов в разделе
- Количество секторов в разделе
- Количество секторов на FAT
- Флаги информационного дескриптора FAT
- Версия диска FAT32
- Номер кластера начала корневого каталога
- Номер сектора информации о файловой системе.
- Номер резервного загрузочного сектора
- Зарезервировано
- Номер логического диска раздела
- Расширенная подпись (29H)
- Серийный номер раздела
- Имя тома раздела
- Имя FAT
- Исполняемый код
- Исполняемый маркер или магический номер (AAH 55H)
Как правило, на экране отображаются следующие сообщения об ошибках:
“Ошибка загрузки с диска»
“Несистемный диск или ошибка диска”
“Недопустимый системный диск или ошибка дискового ввода/вывода”
“Замените диск и нажмите любую клавишу…”
Что можно восстановить с помощью резервной копии DBR?
Резервное копирование DBR может помочь вам избавиться от вышеуказанных сообщений об ошибках. Эти сообщения об ошибках на экране подождите, пока пользователь поместит загрузочный диск с вышеупомянутыми программами в дисковод и нажмет клавишу.
Диск должен быть доступен, если вы загружаете систему с загрузочной дискеты или компакт-диска. Хотя жесткий диск не является загрузочным, в целом это не должно влиять на доступ к данным на жестком диске. После загрузки системы с загрузочного диска вы можете получить доступ к данным.
Восстановив резервную копию DBR, вы можете решить возникшие проблемы, как указано выше.
Программы для создания и восстановления резервных копий DBR:
Программы для создания резервных копий DBR и их восстановления практически аналогичны программам для резервного копирования и восстановления MBR.
Например, если вы собираетесь писать программы для резервного копирования DBR Первого логического диска диска и восстановления его обратно, параметры, указанные в dinfo-структуре, будут изменены следующим образом:
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive> |
dinfo.head = 1 |
It points to head number 1 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
Здесь мы видим, что меняется только расположение сектора для чтения/записи. Здесь C-H-S задается как 0-1-1, так как здесь хранится DBR первого логического диска.
Полный образ диска
Этот тип резервного копирования становится все более и более популярным в наши дни и наиболее предпочтительным для организаций, которые хранят в своих системах очень конфиденциальные данные. Люди не могут рисковать даже одним процентом потери данных.
Такие организации регулярно создают свои резервные копии как образ всего диска. Хотя это занимает некоторое время, но дает вам уверенность, что вы ничего не пропустите. Из-за его растущей популярности программисты изо всех сил старались сделать программное обеспечение для создания образа диска все более и более быстрым, чтобы минимизировать период времени, затрачиваемый на процесс создания образа.
Создание образа диска — хорошая идея, поскольку, потратив несколько десятков минут, вы можете быть уверены, что у вас есть резервная копия всего, что есть в вашем кармане. Все факторы, такие как MBR, BDR, FAT, корневые каталоги, копируются на целевой диск как есть.
Что нам нужно для создания образа диска, так это идентичный (или почти идентичный) целевой жесткий диск с нашим исходным жестким диском, на котором у нас есть ценные данные. Всегда следует иметь в виду, что целевой диск не должен быть меньше исходного диска.
После получения полного образа, если вы загружаете систему с целевого диска, на котором вы создали образ диска, как правило, вы получите все данные как есть.
Написание программы для полного создания образа
Далее была дана программа для создания образа инфы. Программа использует расширения INT 13H, поэтому может поддерживать и большие диски.
Программа создает образ первого физического жесткого диска (0x80) для второго физического жесткого диска (0x81), поэтому перед созданием резервной копии следует помнить, что все данные на целевом диске (0x81) будут сохранены. быть перезаписаны данными исходного диска (0x80) по посекторному шаблону.
Кодировка программы была дана следующая:
/* Программа для преобразования образа первого жесткого диска (0x80) во второй жесткий диск (0x81) */
#include<stdio.h>
#include<dos.h>
#include<conio.h>
/* Структура, используемая функцией getdrivegeometry с использованием расширения INT 13H, номер функции 0x48. */
struct geometry
{
unsigned int size ; /* (call) size of Buffer */
unsigned int flags ; /* Information Flags */
unsigned long cyl ; /* Number of Physical
Cylinders on Drive */
unsigned long heads ;/* Number of Physical
Heads on Drive */
unsigned long spt ; /* Number of Physical
Sectors Per Track */
unsigned long sectors[2] ; /* Total Number of
Sectors on Drive */
unsigned int bps ; /* Bytes Per Sector */
} ;
/* Структура формата пакета адреса диска, используемого функциями, readabsolutesectors и writeabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Size of Packet, generally 10H */
char reserved ; /* Reserved (0) */
int blockcount ; /* Number of Blocks to Transfer */
char far *bufferaddress ; /* address to Transfer
Buffer */
unsigned long blocknumber[2] ; /* Starting Absolute
Block Number */
} ;
///// Функция для получения параметров привода \\\\\
unsigned long getdrivegeometry (int drive)
{
union REGS i, o ;
struct SREGS s ;
struct geometry g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
i.h.ah = 0x48 ; /* Function Number 0x48 of INT 13H
Extensions See the Comments
Below */
i.h.dl = drive; /* Drive Number */
i.x.si = FP_OFF ( (void far*)&g ) ;
s.ds = FP_SEG ( (void far*)&g ) ;
/* Вызвать указанный номер функции расширения INT 13H со значениями регистра сегмента */
int86x ( 0x13, &i, &o, &s ) ;
printf("\n Head = %lu, Sectors Per Track = %lu, Cylinder =
%lu\n", g.heads, g.spt, g.cyl);
/* Если получить функцию геометрии диска не удается, отобразите сообщение об ошибке и выйдите */
if(g.spt==0)
{
printf("\n Get Drive Geometry Function Fails....");
printf("\n Extensions Not Supported, Press any Key to
Exit...");
getch();
exit(1);
}
return *g.sectors; /* Return The Number of Sectors
on Drive */
}
////// Начало основного \\\\\\
void main()
{
unsigned long loop=0, Sectors_in_HDD1=0, Sectors_in_HDD2=0;
unsigned char buffer[61440]; /* Data buffer of 61440
Bytes to Read/Write 120 Sectors of 512 Bytes at a time to save time. */
char choice;
clrscr();
/* Если общее количество подключенных жестких дисков меньше двух Показать сообщение об ошибке и выйти. */
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n You Must Have At least Two Hard Disks
Attached to your Computer To Run This");
printf("\n Program. Press any Key to Exit... ");
getch();
exit(1);
}
/// Получить параметры первого жесткого диска (0x80) \\\
Sectors_in_HDD1 = getdrivegeometry (0x80);
printf(" Total Sectors in First Hard Disk = %lu\n\n",
Sectors_in_HDD1);
/// Получить параметры второго Hsrd диска (0x81) \\\
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Total Sectors in Second Hard Disk = %lu\n\n",
Sectors_in_HDD2);
/// Сначала подтвердите, затем продолжите \\\
printf("\n All The Data in Second Hard Disk will be
lost !!!");
printf("\n Press \'Y\' to Continue, Else any key to
Exit... ");
choice = getche();
switch(choice)
{
case 'y':
case 'Y':
break;
default:
exit(0);
}
/* Место назначения не должно быть меньше источника */
if(Sectors_in_HDD2<Sectors_in_HDD1)
{
printf("\n\n Destination Disk should not be Smaller
than Source Disk");
printf("\n Press any Key to Exit...");
getch();
exit(0);
}
/* Если все в порядке, скопируйте все сектора исходного диска на целевой жесткий диск. */
gotoxy(10,15);printf("Copying Absolute Sector: ");
for(loop=0;loop< =Sectors_in_HDD1;loop=loop+120)
{
readabsolutesectors ( 0x80, loop, 120, buffer );
writeabsolutesectors ( 0x81, loop, 120, buffer );
gotoxy(36,15); printf("%ld",loop);
if(kbhit())
{
exit(0);
}
}
//// Показать сообщение о завершении \\\
printf("\n\n Disk Imaging is Now Completed, Press any Key
To Exit...");
getch();
}
//// Конец основного
Комментарии по кодированию:
В кодировании программы, приведенной ранее, для создания образа диска мы действуем, выполняя следующие задачи:
- Структура, геометрия используется функцией getdrivegeometry с использованием расширения INT 13H, номер функции 0x48. Подробное описание расширений INT 13H см. в главе «Обработка больших жестких дисков», рассмотренной ранее в этой книге.
Типы данных, представляющие несколько параметров диска, имеют следующие значения:
Data Type |
Size in Bytes |
Description |
unsigned int size |
2 Bytes |
Size of Buffer |
unsigned int flags |
2 Bytes |
Information Flags |
unsigned long cyl |
4 Bytes |
Number of Physical Cylinders on Drive |
unsigned long heads |
4 Bytes |
Number of Physical Heads on Drive |
unsigned long spt |
4 Bytes |
Number of Physical Sectors Per Track |
unsigned long sectors[2] |
8 Bytes |
Total Number of Sectors on Drive |
unsigned int bps |
2 Bytes |
Bytes Per Sector |
- Структура diskaddrpacket используется функциями readabsolutesectors и writeabsolutesectors. Формат пакета адресов дисков приведен в следующей таблице:
Data Type |
Size in Bytes |
Description |
char packetsize |
1 Byte |
Size of Packet, generally 10H |
char reserved |
1 Byte |
Reserved (0) |
int blockcount |
2 Bytes |
Number of Blocks to Transfer |
char far *bufferaddress |
4 Bytes |
address to Transfer Buffer |
unsigned long blocknumber[2] |
4 Bytes |
Starting Absolute Block Number |
- Функция getdrivegeometry используется для получения параметров указанного диска. Функция getdrivegeometry использует номер функции 0x48 расширений INT 13H.
Значение параметров описано в следующей таблице:
Parameter |
What it means |
i.h.ah = 0x48 |
Function Number 0x48 of INT 13H Extensions |
i.h.dl = drive |
Drive Number |
i.x.si = FP_OFF ( (void far*)&g ) |
ds:si address to buffer for drive parameters as discussed earlier |
s.ds = FP_SEG ( (void far*)&g ) |
ds:si address to buffer for drive parameters as discussed earlier |
Функция int86x(0x13, &i, &o, &s) вызывает прерывание 13H со значениями сегментного регистра. Функция getdrivegeometry возвращает общее количество файлов на диске.
- В функции main() (char)peekb(0x0040, 0x0075); (функция peekb определена в DOS.H) возвращает количество жестких дисков, подключенных к системе.
Количество жестких дисков, подключенных к системе, представлено байтом, хранящимся в ячейке памяти 0040H:0075H (сегмент 0040H: смещение 0075H). Если количество жестких дисков, подключенных к системе, меньше двух, программа показывает сообщение об ошибке и завершает работу.
Sectors_in_HDD1 = getdrivegeometry (0x80); получает параметры первого жесткого диска (0x80) и возвращает общее количество секторов на первом жестком диске.
Аналогично Sectors_in_HDD2 = getdrivegeometry (0x81); получает параметры второго жесткого диска (0x81) и возвращает общее количество секторов на втором жестком диске.
После подтверждения пользователем продолжения создания образа сначала проверьте условие, согласно которому размер исходного жесткого диска не должен превышать размер целевого жесткого диска. Если место назначения меньше, отобразите сообщение об ошибке и выйдите.
Если все в порядке, скопируйте сектора исходного диска на целевой диск. Здесь мы читаем и записываем 61440 байт (120 секторов по 512 байт каждый) за раз, чтобы ускорить процесс создания образа.
Если вы хотите использовать больше секторов за раз, даже больше 64 КБ, вы можете сделать это с помощью “огромного указателя” в модели с большой памятью. Пример спецификации выглядит следующим образом:
char huge array[100000L];
- Функция readabsolutesectors (0x80, цикл, 120, буфер); считывает 120 секторов первого жесткого диска (0x80), начиная с номера сектора, заданного циклом длинного целого числа без знака, и сохраняет данные в буфере данных.
- Функция writeabsolutesectors ( 0x81, цикл, 120, буфер ); записывает данные буфера данных в 120 секторов второго жесткого диска (0x81), начиная с номера сектора, заданного циклом длинного целого числа без знака.
Кодирование функций readabsolutesectors ( ) и writeabsolutesectors ( ) приведено ниже:
//// Функция для чтения абсолютных секторов \\\\
int readabsolutesectors ( int drive,
unsigned long sectornumber,
int numofsectors,
void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* packet size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ; /* Number of sectors
to read */
/* для буфера данных */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ; /* Sector number
to read */
pp.blocknumber[1] = 0 ; /* Block number */
i.h.ah = 0x42 ; /* Function Number*/
i.h.dl = drive ; /* Physical Drive Number */
i.x.si = FP_OFF ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
/* Вызвать указанную функцию INT 13H со значениями регистра сегмента */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /*failure */
else
return 1 ; /* success */
}
//// Функция для записи абсолютных секторов \\\\
int writeabsolutesectors ( int drive,
unsigned long sectornumber,
int numofsectors,
void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* Packet Size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ; /* Number of Sectors
to be written */
/* для буфера данных */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ;/* Sector number
to be written */
pp.blocknumber[1] = 0 ; /* Block number = 0 */
i.h.ah = 0x43 ; /* Function Number */
i.h.al = 0x00 ; /* Write Flags, see
comments */
i.h.dl = drive ; /* Physical Drive number*/
/* ds:si for buffer Parameters */
i.x.si = FP_OFF ( (void far*)&pp ) ;
/* ds:si for buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ;
/* Вызвать указанную функцию INT 13H со значениями регистра сегмента */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /* failure */
else
return 1 ; /* success */
}
Комментарии по кодированию:
Параметры, используемые обеими функциями, имеют следующие значения:
Parameter |
Size in Bytes |
Description |
pp.packetsize = 16 ; |
1 Byte |
Size of packet = 10H |
pp.reserved = 0 ; |
1 Byte |
Reserved = 0 |
pp.blockcount = numofsectors ; |
2 Bytes |
Number of sectors to read |
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer)); |
----- |
for Data buffer or Transfer Buffer |
pp.blocknumber[0] = sectornumber ; |
4 Bytes |
Sector number to read/write (generally, we need only this). Only alone This can support up to 2.1 Terabytes. |
pp.blocknumber[1] = 0 ; |
4 Bytes |
Block number. Use this, If accessing the disk of greater then 2.1 Terabytes in size. |
i.h.ah = 0x42 ; or i.h.ah = 0x43 ; |
2 Bytes |
Function Number of INT 13H Extensions |
i.h.al = 0x00 ; |
1 Byte |
Write Flags used in write function only,00H, 01H are used for Write Without Verify and 02H is used for write with verify |
i.h.dl = drive ; |
2 Bytes |
Physical Drive Number |
i.x.si = FP_OFF ( (void far*)&pp ) ; |
------ |
ds:si for buffer Parameters |
s.ds = FP_SEG ( (void far*)&pp ) ; |
------ |
ds:si for buffer Parameters |
int86x ( 0x13, &i, &o, &s ) ; |
------ |
Invoke the specified Function of INT 13H with segment register values |
Страница изменена: 16/03/2022