MS-DOS для программиста

Программа PARTVIEW


Операционная система MS-DOS не предоставляет программам никаких средств для работы с главной загрузочной записью и таблицей разделов диска.

Приведем текст программы PARTVIEW (листинг 2.1), которая выводит на экран содержимое таблицы разделов первого диска, выполняя чтение первого сектора диска с помощью функции _bios_disk .

Листинг 2.1. Файл partview\ partview.cpp

#include <stdio.h> #include <dos.h> #include <bios.h>

typedef struct _PART_ENTRY_ { unsigned char flag; unsigned char beg_head; unsigned beg_sec_cyl; unsigned char sys; unsigned char end_head; unsigned end_sec_cyl; unsigned long rel_sec; unsigned long size; } PART_ENTRY;

typedef struct _MBOOT_ { char boot_prg[0x1be]; PART_ENTRY part_table[4]; unsigned char signature[2]; } MBOOT;

int getmboot(MBOOT *master_boot, int drive);

int main(void) { MBOOT mb; int i,j, k, status;

printf("\nТаблица разделов диска" "\n (C)Фролов А., 1995\n");

// Читаем главную загрузочную запись первого НМД status = getmboot(&mb, 0); if(status != 0) { printf("\nОшибка чтения диска, код ошибки: %d", status); return(1); }

printf("\n" "\n------------------------------" "------------------------------" "\n|Флаг|Начало раздела |" "Конец раздела |Код |Размер |Отн. |" "\n| |---------------|" "---------------|сист.|раздела|номер |" "\n| |Гол.|Сект.|Цил.|" "Гол.|Сект.|Цил.| | |сектора|" "\n|----|----|-----|----|" "----|-----|----|-----|-------|-------|" "\n");

for(k=0; k<4; k++) { printf("|%3X |%4d|%4d |%4d|%4d|%4d |%4d|%5d|%7u|", mb.part_table[k].flag, mb.part_table[k].beg_head, mb.part_table[k].beg_sec_cyl & 0x3f, (mb.part_table[k].beg_sec_cyl >> 6) & 0x3ff, mb.part_table[k].end_head, mb.part_table[k].end_sec_cyl & 0x3f, (mb.part_table[k].end_sec_cyl >> 6) & 0x3ff, mb.part_table[k].sys, mb.part_table[k].size);

printf("%7u|\n", mb.part_table[k].rel_sec); } printf("---------------------------" "---------------------------------"); return 0; }


/** * getmboot * * Чтение главной загрузочной записи * * Функция читает главную загрузочную запись * для указанного НМД * * int getmboot(MBOOT *master_boot, int drive); * * master_boot - указатель на буфер, в который * будет считана главная загрузочная запись * * drive - номер НМД * (0 - первый НМД, 1 - второй,...) * * Функция возвращает 0, если главная * загрузочная запись считана успешно, * или код ошибки, полученный от функции BIOS "Чтение * сектора" - если чтение главной загрузочной * записи выполнить невозможно **/

int getmboot(MBOOT *master_boot, int drive) { struct diskinfo_t di; int status;

// Готовим структуру для чтения // главной загрузочной записи di.drive = drive | 0x80; di.head = 0; di.track = 0; di.sector = 1; di.nsectors = 1; di.buffer = (void far*)master_boot;

// Читаем сектор, содержащий главную // загрузочную запись status = _bios_disk ( _DISK_READ , &di ) >> 8; return(status); }


Содержание раздела