|
Как использовать INT 13H Расширения C Programming
Мы можем назвать Расширение функций INT 13H с той же функции C (() int86, int86x () и т.д.), которой мы пользовались в предыдущих главах. Давайте учиться ему пример.
Следующий пример позволяет сосредоточить внимание на три функции (Проверить Extensions настоящее время, продлен продлен читать и писать). Однако мы не собираемся писать используете функцию в этой главе.
Программа сначала проверяет в случае продления или не продления в том случае, если находятся за INT 13H, Она считывает сектор 0 абсолютной (т.е. MBR) на диске. Кодирования программы проводится следующим образом :
/* Программа для доступа к секторам за 8.46 GB использовании INT 13 BIOS расширений */
#include<stdio.h>
#include<dos.h>
/* Assigns the identifier to the data type */
typedef unsigned char Byte;
typedef unsigned int Word;
typedef unsigned long DWord;
/* disk_packet structure is loaded in DS:SI and command
executed */
struct disk_packet
{
Byte size_pack; // Size of packet must be 16 or 16+
Byte reserved1; // Reserved
Byte no_of_blocks;// Number of blocks for transfer
Byte reserved2; // Reserved
/* Address in Segment:Offset format */
Word offset; //offset address
Word segment; //segment address
/* To Support the Disk Even of Capacity of
1152921504.607 GB */
DWord lba1;
DWord lba2;
}disk_pack;
/* Function to check if the Extensions are supported */
void check_ext_present()
{
union REGS inregs, outregs; /* Input Registers and
Output */
inregs.h.ah=0x41; /* Function to Check
Extension Present */
inregs.x.bx=0x55AA;
inregs.h.dl=0x80; /* Drive No for first Hard Disk */
int86(0x13,&inregs,&outregs); /*Call interrupt */
if(outregs.x.cflag)
{
/* Extension Not Supported */
printf("\nBios extension not supported");
exit(1);
}
if(outregs.x.bx==0xAA55)
if(outregs.x.cx & 0x1)
/* Extension Present */
printf("\nExtended I/O supported");
}
/* Function to read the Sector */
void read_sectors(void *buffer)
{
union REGS inregs, outregs; /* Input and Output
Registers */
struct SREGS segregs; // Segment Registers
disk_pack.size_pack=16; // Set size to 16
disk_pack.no_of_blocks=1; // One block
disk_pack.reserved1=0; // Reserved Word
disk_pack.reserved2=0; // Reserved Word
disk_pack.segment=FP_SEG(buffer);// Segment of buffer
disk_pack.offset=FP_OFF(buffer); // Offset of buffer
/* request for MBR of hard disk 1 */
/* Read Absolute sector 0 */
disk_pack.lba1=0; /* LBA address, Contains first
32 bits */
/* We normally require( drives < 2.1 T.B) to set
only this */
disk_pack.lba2=0; // Last 32 bit address
inregs.h.ah=0x42; // Function to read
inregs.h.dl=0x80; // Drive Number for First Hard Disk inregs.x.si = FP_OFF(&disk_pack); /*Make DS:SI point
to disk_pack */
segregs.ds = FP_SEG(&disk_pack);
/* Call Interrupt */
int86x(0x13,&inregs,&outregs,&segregs);
if(outregs.x.cflag)
printf("\n\nError %d\n",outregs.h.ah);
else
printf("\n\nI hope Everything is all Right");
}
//// Write Sector Function \\\\
void write_sector()
{
/* Оно пишется так же, как read_sectors функции, за исключением функций Номер которые будут 0x43 этой функции. Мы поговорим продлен написать функцию в следующей главе.
До использования этой функции проверьте и убедитесь, что вы собираетесь делать. Вы должны иметь необходимые знания о том, что вы собираетесь делать. Используйте эту функцию в отсутствие знаний или, возможно, неосторожно разрушить ваши данные.*/
}
/// Main Function \\\\
void main()
{
int i=0;
/* buffer to hold MBR */
Byte mbr[512];
clrscr();
/* check for BIOS extension present */
check_ext_present();
/* read sector */
read_sectors(&mbr);
printf("\n\n Data of MBR \n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
while(i++<512)
{
/* display the MBR buffer */
printf("%c",mbr[i]);
}
}
Комментарии к Кодирование программы
typedef задает идентификатор, тип данных, что такое typedef неподписанные байта символ; присваивает идентификатор байта для типа данных характеристик. Аналогично Word идентификатор присваивается int DWord и возлагается на долго.
Disk_packet структура загружается в DS : SI и командованием (таких как продление образом, продлен писать или проверять и т.д.), казнен. См. функции IBM / MS Extensions INT 13H (функция к функции 41H 49H) раньше.
Check_ext_present () функции проверяет модули доступны / поддерживает или нет. Функция вызвана с ВХ = 55AAH (inregs.x.bx = 0x55AA;) А если расширение поддерживает регистр ВХ имеет значение AA55H. (См. Функция 41H раньше)
Функция read_sectors используется следующим образом абсолютные сектора диска, указываемый disk_pack.lba1. В этой программе мы уделяем disk_pack.lba1 = 0, Таким образом, мы будем читать абсолютного 0 сектора (см. Примечание ниже), таким образом, происходит следующим образом MBR на диске.
Write_sector функция также же, как и функция read_sectors будут написаны таким же образом, но с Функция различных вариантов. Мы будем использовать его в последующих главах.
Примечание :
Мы читаем секторов диска в следующих двух способов :
- Относительный сектор Прочтите (или напишите)
- Абсолютные сектора Прочтите (или напишите)
В секторе Относительная Читать мы читаем секторов диска в соответствии с КНП (Цилиндрические, Начальник сектора и) геометрию диска. В относительном секторе прочитать MBR на диске (первый сектор на диске) находится на Цилиндрические 0, руководитель сектора 0 и 1.
В Абсолют чтение секторов диска, Нам нет надобности указывать или цилиндров руководитель номера в нашей программе. Абсолютные сектора отсчитываются от абсолютного 0 сектора.
Таким образом, если мы будем читать в MBR диска (первый сектор на диске), мы будем читать абсолютный сектор 0. Именно работа BIOS преобразовать абсолютные сектора рядом с корреспондентом цилиндров, головки и номер сектора.
Как и в абсолютном секторе чтения (или записи), нам надо только подсчитать абсолютные сектора в шлейфе в таких операциях, как всего диска, считывание или письменной форме, а в случае относительного сектора чтения (или записи), нам нужно запустить три петли на момент расчета КНП поэтому абсолютные сектора чтения / записи не намного быстрее, чем относительные сектора чтения / writing.
Например, если нам нужно любой жесткий диск, 16 головок (сторон), 12 цилиндров и 63 секторов, учетом следующей таблице, показывает, процедуры и разница как методы чтения и, таким образом, показывает, как абсолютный подход может сделать наши момент принятия программы (например, чтения всего диска / письменно или стирая весь диск и т. п.) запускался значительно быстрее :
Relative
Sectors ReadingОтносительная
чтение секторов |
Absolute
Sector readingАбсолютные сектора
чтении |
Cylinder =0,
Head =0, Sector = 1Цилиндрические = 0, = 0
Начальник сектора = 1 |
Absolute Sector = 0Абсолютные сектора = 0 |
Cylinder =0,
Head =0, Sector = 2Цилиндрические = 0, = 0
Начальник сектора = 2 |
Absolute Sector = 1Абсолютные сектора = 1 |
Cylinder =0,
Head =0, Sector = 3Цилиндрические = 0, = 0
Начальник сектора = 3 |
Absolute Sector = 2Абсолютные сектора = 2 |
.
.
.
. |
.
.
.
. |
Cylinder =0,
Head =0, Sector = 62Цилиндрические = 0, = 0
Начальник сектора = 62 |
Absolute Sector = 61Абсолютные сектора = 61 |
Cylinder =0,
Head =0, Sector = 63Цилиндрические = 0, = 0
Начальник сектора = 63 |
Absolute Sector = 62Абсолютные сектора = 62 |
Cylinder =0,
Head =1, Sector = 1Цилиндрические = 0, = 1
Начальник, Сектор = 1 |
Absolute Sector = 63Абсолютные сектора = 63 |
Cylinder =0,
Head =1, Sector = 2Цилиндрические = 0, = 1
Начальник сектора = 2 |
Absolute Sector = 64Абсолютные сектора = 64 |
Cylinder =0,
Head =1, Sector = 3Цилиндрические = 0, = 1
Начальник сектора = 3 |
Absolute Sector = 65Абсолютные сектора = 65 |
Cylinder =0,
Head =1, Sector = 4Цилиндрические = 0, = 1
Начальник сектора = 4 |
Absolute Sector = 66Абсолютные сектора = 66 |
.
.
.
. |
.
.
.
. |
Cylinder =0,
Head =1, Sector = 63Цилиндрические = 0, = 1
Начальник сектора = 63 |
Absolute Sector = 125Абсолютный
сектор = 125 |
Cylinder =0,
Head =2, Sector = 1Цилиндрические = 0, = 2
Начальник сектора = 1 |
Absolute Sector = 126Абсолютный сектор = 126 |
Cylinder =0,
Head =2, Sector = 2Цилиндрические = 0, = 2
Начальник сектора = 2 |
Absolute Sector = 127Абсолютный сектор = 127 |
Cylinder =0,
Head =2, Sector = 3Цилиндрические = 0, = 2
Начальник сектора = 3 |
Absolute Sector = 128Абсолютный сектор = 128 |
.
.
.
. |
.
.
.
. |
Cylinder =0,
Head =15, Sector = 63Цилиндрические = 0, = 15
Начальник сектора = 63 |
Absolute Sector = 1007Абсолютные сектора = 1007 |
Cylinder =1,
Head =0, Sector = 1Цилиндрические = 1, Глава = 0,
Сектор = 1 |
Absolute Sector = 1008Абсолютные сектора = 1008 |
Cylinder =1,
Head =0, Sector = 2Цилиндрические = 1, Глава = 0,
Сектор = 2 |
Absolute Sector = 1009Абсолютные сектора = 1009 |
Cylinder =1,
Head =0, Sector = 3Цилиндрические = 1, Глава = 0,
Сектор = 3 |
Absolute Sector = 1010Абсолютные сектора = 1010 |
.
.
.
. |
.
.
.
. |
Cylinder =1,
Head =0, Sector = 63Цилиндрические = 1, Глава =
0, Сектор = 63 |
Absolute Sector = 1070Абсолютные сектора = 1070 |
Cylinder =1,
Head =1, Sector = 1Цилиндрические = 1, = 1
Начальник, Сектор = 1 |
Absolute Sector = 1071Абсолютные сектора = 1071 |
Cylinder =1,
Head =1, Sector = 2Цилиндрические = 1, Глава 1 =,
= 2 сектора |
Absolute Sector = 1072Абсолютные сектора = 1072 |
Cylinder =1,
Head =1, Sector = 3Цилиндрические = 1, = 1
Начальник сектора = 3 |
Absolute Sector = 1073Абсолютные сектора = 1073 |
.
.
.
. |
.
.
.
. |
Cylinder =1,
Head =15, Sector = 63Цилиндрические = 1, Глава =
15, = 63 сектор " |
Absolute Sector = 2015Абсолютные сектора = 2015
году |
Cylinder =2,
Head =0, Sector = 1Цилиндрические = 2, Глава = 0,
Сектор = 1 |
Absolute Sector = 2016Абсолютные сектора = 2016 |
Cylinder =2,
Head =0, Sector = 2Цилиндрические = 2, Глава = 0,
Сектор = 2 |
Absolute Sector = 2017Абсолютные сектора = 2017 |
Cylinder =2,
Head =0, Sector = 3Цилиндрические = 2, Глава = 0,
Сектор = 3 |
Absolute Sector = 2018Абсолютные сектора = 2018 |
.
.
.
. |
.
.
.
. |
Cylinder =11,
Head =15, Sector = 60Цилиндрические = 11, 15 =
Начальник, Сектор = 60 |
Absolute Sector = 12092Абсолютные сектора = 12092 |
Cylinder =11,
Head =15, Sector = 61Цилиндрические = 11, 15 =
Начальник, Сектор = 61 |
Absolute Sector = 12093Абсолютные сектора = 12093 |
Cylinder =11,
Head =15, Sector = 62Цилиндрические = 11, 15 =
Начальник, Сектор = 62 |
Absolute Sector = 12094Абсолютные сектора = 12094 |
Cylinder =11,
Head =15, Sector = 63Цилиндрические = 11, 15 =
Начальник, Сектор = 63 |
Absolute Sector = 12095Абсолютные сектора = 12095 |
Информацию о таблице разделов в MBR, который отображается на диск MBR любой инструмент анализа, были приведены ниже :
В вышеуказанной информации относительного номера сектора начала обоих разделов 63 и 11277630 соответственно, которые были свободны от разделов и, исходя из количества секторов на диске.
|
|