Технологии доступа к данным в информационных системах: Файловые системы FAT. Павлов А.Ю. - 10 стр.

UptoLike

Составители: 

драйвер или воспользоваться thunk). Чтобы все же получить доступ к MBR в этих
ОС можно воспользоваться режимом эмуляции DOS, в котором выполняются пре-
рывания. В этом случае можно использовать функции базовой структуры вво-
да/вывода (BIOS), например, Int 13 функцую 2 (абсолютное чтение секторов диска).
Для этого случая, функция чтения таблицы разделов, описанная на языке Паскаль,
может
выглядит следующим образом:
procedure Partition_Table(var d:byte);
var
index:byte;
r:registers; {структура регистров}
buffer:array[1..512] of byte; {буфер}
offs:word; {смещение}
boot:array[1..4] of byte; {смещ +0; длина 1 ;Флаг загрузки 0-неактивен, 80h-активен}
Hd_begin:array[1..4] of byte; {смещ +1;длина 1 ;Начало раздела:номер головки }
Sec_Cyl_begin:array[1..4] of word; {смещ +2;длина 2 ;Начало раздела:сектор/цилиндр корне-
вого сектора }
Sys_Indicator:array[1..4] of byte; {смещ +4;длина 1 ;Код системы 4-FAT16}
Hd_end:array[1..4] of byte; {смещ +5;длина 1 ;Конец раздела:номер головки}
Sec_Cyl_end:array[1..4] of word; {смещ +6;длина 2 ;Конец раздела:сектор/цилиндр последне-
го сектора}
begin
r.ah:=$02; {номер функции}
r.dl:=$80; {1-й жесткий диск}
r.dh:=0; {номер стороны}
r.ch:=0; {номер дорожки}
r.cl:=1; {номер сектора}
r.al:=1; {количество секторов}
r.es:=seg(buffer);
r.bx:=ofs(buffer);
intr($13,r);
if r.flags and 1 = 1 then
begin
halt(1);{Ошибка}
end;
{Элементы раздела}
Case index of
1:offs:=$1BE;
2:offs:=$1CE;
3:offs:=$1DE;
4:offs:=$1EE;
end;
writeln('Структура элементов раздела диска:');
writeln('Раздел ',index);
boot[index]:=buffer[offs+1];
write(' Флаг загрузки {0-неактивен, (128) 80h-активен}.....');
writeln(boot[index]);
write(' Начало раздела:номер головки:.....................');
Hd_begin[index]:=buffer[offs+2];
writeln(Hd_begin[index]);
write(' Начало раздела:сектор/цилиндр корневого сектора:..');
Sec_Cyl_begin[index]:=buffer[offs+3];
writeln(Sec_Cyl_begin[index]);
write(' Код системы:......................................');
Sys_Indicator[index]:=buffer[offs+5];
writeln(Sys_Indicator[index]);