Работа с диском на физическом уровне 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 определяет полное количество секторов на логическом диске.