Работа с диском на физическом уровне_______ 89

Процедура Set FAT Item. Записывает нужное значение в таблицу FAT и во все ее (таблицы) копии. Заголовок:

procedure SetFATItem(Disk: Byte; Cluster,Item: Word).

Здесь Disk — номер диска; Cluster — номер элемента FAT; Item — новое значение элемента.

Использование этой процедуры требует предельной осторожности, т.к. ошибочное изменение состояния FAT может привести к катастрофическим последствиям.

Как уже говорилось, на диске создается несколько следующих друг за другом копий FAT. Это обстоятельство приходится учитывать при записи скорректированного состояния FAT на диск в случае, если FAT использует 12-битные элементы. Вызвано это тем, что в целях уменьшения требуемой памяти и упрощения алгоритма в процедуре считывается не вся FAT, а лишь та тройка секторов, в которой находится изменяемый элемент (три смежных сектора гарантируют цикличность изменения адресов FAT — в одном 512—байтном секторе сохраняется информация о 2*512/3 = 341^3 12—разрядных элементах FAT). После коррекции копии FAT в памяти ее нужно записать на диск, предварительно исключив из записи те секторы, которые, возможно, не принадлежат первой копии FAT. Если этого не сделать, то при изменении последних элементов таблицы может быть испорчен корневой каталог.

Процедура SetMasterBoot. Записывает новое значение главного (системного) загрузчика. Заголовок:

Procedure SetMasterBoot(var Buf).

Здесь Buf — произвольная переменная; первые 512 байт этой переменной записываются в первый сектор нулевой дорожки первого жесткого диска.

Эта процедура может пригодиться в программах защиты от компьютерных вирусов (см. гл.6). Я настоятельно рекомендую не экспериментировать с процедурой SetMasterBoot, т.к. это может привести к разрушению системного загрузчика и Ваш ПК перестанет нормально функционировать.

Процедура UnpackCylSec. Преобразует упакованный формат ци— линдр/сектор, используемый при обращениях к прерыванию $13, к двум 16—разрядным словам, т.е. эта процедура осуществляет обратные действия по сравнению с функцией PackCylSec. Заголовок:

Procedure UnpackCylSec(CSec: Word; var Cyl,Sec: Word).

Здесь CSec — упакованный формат цилиндр/сектор; Cyl — номер цилиндра; Sec — номер сектора.

Процедура WriteSector. Записывает содержимое переменной любого типа в один или несколько смежных секторов. Заголовок:

Procedure WriteSector (Disk: Byte; Sector, Count: Word;

var Buffer);