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

3.3. МОДУЛЬ FJDisk ДЛЯ РАБОТЫ С ДИСКОМ НА ФИЗИЧЕСКОМ УРОВНЕ

Описываемый в этом разделе модуль F_Disk содержит подпрограммы, рассчитанные на работу с диском на физическом уровне. Все они основываются на изложенной в предыдущих разделах информации о логической организации диска и средствах ДОС. Полный текст модуля приведен в прил.П4.

3.3.1. Описание модуля

В модуле объявляются описанные ранее типы ВРВ_Туре, Add_BPB_Type и Dir__Type, a также глобальные переменные Disk_Error и Disk_Status, в которых указывается признак ошибки и код ошибки последнего обращения к подпрограммам модуля. Поскольку многие процедуры модуля интенсивно используют информацию о диске, а недокументированная функция $32 ненадежна, в модуле используется специальный тип TDisk, собирающий в единое целое всю необходимую информацию о диске, и создается списочная структура, содержащая информацию о всех жестких дисках ПК.

Тип TDisk открывает доступ к следующей структуре данных:

TDisk = record

Number Byte {Номер диска: 0=А,1=В,...}

TypeD Byte (Тип диска}

AttrD Word {Атрибуты диска}

С у Is Word {Число цилиндров}

Media Byte {Дескриптор носителя}

SectSize Word {Количество байт в секторе}

TotSecs Word {Объем диска в секторах}

ClusSize Byte {Количество секторов в кластере}

MaxClus Word {Максимальный номер кластера}

FATLock Word {Номер 1-го сектора FAT}

FATCnt Byte {Количество FAT}

FATSize Word {Длина FAT в секторах}

FAT16: Boolean {Признак 16-битовой FAT}

RootLock Word {Начало корневого каталога}

RootSize Word {Количество элементов каталога}

DataLock Word {Начальный сектор данных}

end;

В этой структуре поля TypeD, AttrD и Cyls заполняются драйвером диска и соответствуют полям TypeDrv, Attrib и Cylindrs записи IOCTL_Info_Type (см. выше). Поле Media представляет собой дескриптор носителя.

Как уже отмечалось, при вызове IOCTL для дисков большой емкости поле IOCTL_Info_Type.Add. TotSecs содержит 0. В этом случае программа GetDiskInfo модуля F_Disk читает загрузочный сектор диска с помощью прерывания $25 и по его блоку BPB_Add_4_Type определяет полное количество секторов на логическом диске.