Читайте также:
|
|
Задача 1.
Условие:
Найти физический номер дисковода.
Способ 1: программа читает загрузочную запись диска (BOOT-сектор) в специальную структуру и затем получает из нее значение поля,
Листинг программы:
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <ctype.h>
typedef struct _EBPB_
{
unsigned sectsize;
char clustsize;
unsigned ressecs;
char fatcnt;
unsigned rootsize;
unsigned totsecs;
char media;
unsigned fatsize;
unsigned seccnt;
unsigned headcnt;
unsigned hiddensec_low;
unsigned hiddensec_hi;
unsigned long drvsecs;
} EBPB;
typedef struct _BOOT_
{
char jmp[3];
char oem[8];
EBPB bpb;
char drive;
char reserved;
char signature;
unsigned volser_lo;
unsigned volser_hi;
char label[11];
char fat_format[8];
char boot_code[450];
} BOOT;
int getboot(BOOT far *boot, int drive);
int main(void)
{
char boot[512];
BOOT far* boot_rec = (BOOT far*)boot;
int i, status;
char drive;
printf("\nЧтение загрузочной записи логического диска");
// Запрашиваем диск, для которого необходимо
// выполнить чтение загрузочной записи
printf(
"\nВведите обозначение диска, для просмотра"
"\nзагрузочной записи (A, B,...):");
drive = getche();
// Вычисляем номер дисковода
drive = toupper(drive) - 'A';
// Читаем загрузочную запись в буфер
status = getboot((BOOT far*)boot_rec, drive);
// Если произошла ошибка (например, неправильно
// указано обозначение диска),
// завершаем работу программы
if(status)
{
printf("\nОшибка при чтении загрузочного сектора");
return(-1);
}
printf("\nСодержимое загрузочного "
"сектора для диска %c", drive + 'A');
printf("\n"
"\nOEM - название фирмы и версия DOS - ");
for(i = 0; i < 8; i++)
printf("%c", boot_rec->oem[i]);
printf("\nНомер диска - %x",
(unsigned char)boot_rec->drive);
printf("\nФормат FAT - ");
for(i = 0; i < 8; i++)
printf("%c", boot_rec->fat_format[i]);
return 0;
}
/**
* getboot
*
* Прочитать загрузочную запись
*
* int getmboot(BOOT far *boot, int drive);
*
* boot - указатель на буфер, в который
* будет прочитана загрузочная запись
*
* drive - номер физического НМД
* (0 - первый НМД, 1 - второй,...)
**/
int getboot(BOOT far *boot, int drive)
{
union REGS reg;
struct SREGS segreg;
reg.x.ax = drive;
reg.x.bx = FP_OFF(boot);
segreg.ds = FP_SEG(boot);
reg.x.cx = 1;
reg.x.dx = 0;
int86x(0x25, ®, ®, &segreg);
// Извлекаем из стека оставшееся там после
// вызова прерывания слово
asm pop ax
return(reg.x.cflag);
}
Теоретическое обоснование.
Главная загрузочная запись
Самый первый сектор жесткого диска (сектор 1, дорожка 0, головка 0) содержит так называемую главную загрузочную запись (Master Boot Record). Эта запись занимает не весь сектор, а только его начальную часть.
Сама по себе главная загрузочная запись является программой. Эта программа во время начальной загрузки операционной системы с НМД помещается по адресу 7C00h:0000h, после чего ей передается управление. Загрузочная запись продолжает процесс загрузки операционной системы.
Таблица разделов диска
В конце самого первого сектора жесткого диска располагается таблица разделов диска (Partition Table). Эта таблица содержит четыре элемента, описывающих до четырех разделов диска. В последних двух байтах сектора находится значение 55AAh. Это признак таблицы разделов (сигнатура таблицы разделов).
Для просмотра и изменения содержимого таблицы разделов НМД используется программа fdisk.exe.
Что представляет из себя элемент таблицы разделов диска?
Это структура размером 16 байт, соответствующая части диска, называемой разделом. В структуре располагается информация о расположении и размере раздела в секторах, а также о назначении раздела.
Разделы диска бывают активными или неактивными. Активный раздел может использоваться для загрузки операционной системы. Заметим, что диск может содержать одновременно несколько активных разделов, которые могут принадлежать разным операционным системам.
Приведем формат первого сектора жесткого диска:
Смещение, байт | Размер, байт | Описание |
1BEh | Загрузочная запись | |
1BEh | 10H | Элемент таблицы разделов диска |
1CEh | 10H | Элемент таблицы разделов диска |
1DEh | 10H | Элемент таблицы разделов диска |
1EEh | 10H | Элемент таблицы разделов диска |
1FEh | Признак таблицы разделов - значение 55AAh |
Все элементы таблицы разделов диска имеют одинаковый формат:
Дата добавления: 2015-10-16; просмотров: 67 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Тема 9. Глобальные проблемы человечества | | | Первичный и расширенный раздел |