Системное программное обеспечение персональных ЭВМ


Пример 6



Пример 6

struct DPB { byte dev_num; /* # драйвера */ byte dev_num_mod; /* # устр-ва в драйвере */ word SectSize; /* размер сектора (байт) */ byte MaxSect; /* макс.номер сектора в кластере */ byte Log2Sect; /* LOG2(размера кластера) */ word ResSect; /* число резервных секторов */ byte FatCnt; /* число копий FAT */ word RootSize; /* размер корневого каталога */ word Data1st; /* # 1-го сектора области данных */ word MaxClust; /* максимальный номер кластера */ byte FatSize; /* размер FAT */ word Root1st; /* 1-й сектор корневого каталога */ void *drv_ptr; /* адрес драйвера */ byte Media; /* тип носителя */ byte access; /* доступ к носителю */ struct DPB *next; /* ссылка */ word Free1st; /* первый свободный кластер */ word FreeCnt; /* число свободных кластеров */ };

Поля SectSize, ResSect, RootSize, FatCnt, FatSize, Media копируются из одноименных полей загрузочного сектора носителя (см.10.3.2). Поля MaxClust, Data1st и Root1st получются из данных загрузочного сектора путем несложных вычислений. Поле MaxSect содержит значение на 1 меньшее поля ClustSize загрузочного сектора. Поле Log2Sect дает возможность получить число секторов в кластере путем сдвига 1 на Log2Sect разрядов влево. Поле access имеет значение 0, если к носителю было обращение, или 0xFF - если не было, в последнем случае значения полей, источником которых является загрузочный сектор, могут не соответствовать действительности. Наконец, последние два поля содержат некоторую информацию о свободных кластерах, если такая информация отсутствует, то значения этих полей - 0 и 0xFFFF соответственно. При помощи поля next все DPB связываются в список (смещение 0xffff - признак конца спсика). Формат DPB для DOS 4.0 и последующих отличается от вышеприведенного тем, что размер поля FatSize составляет здесь не 1, а 2 байта и, следовательно, смещения всех последующих полей увеличиваются на 1.

В DOS имеются функции 0x1F и 0x32, возвращающие в DS:BX адрес DPB. Функция 0x1F возвращает DPB текущего диска, а 0x32 - диска, логический номер которого задается в DL (0 - текущий, 1 - A и т.д.; если задан неправильный номер диска, функция возвращает 0xFF в регистре AL). Эти функции, однако, "не удовлетворяются" значением доступа (access) 0xFF, а, если обращений к носителю не было, пытаются прочитать его загрузочную запись. В программных примерах главы 10 мы могли обращаться к функции 0x32 вместо того, чтобы читать загрузочный сектор.

В программе следующего примера, выводящей на экран содержимое всех блоков DPB, структура блока разбита на 2 части: struct DPB_1 и struct DPB_2. Поле FatSize описано как 2-байтное, но в зависимости от версии DOS адрес второй части блока (начиная с поля Root1st) назначается со смещением 16 (DOS 3.x) или 17 (DOS 4.x) относительно первой части.

Программа выводит все DPB дважды - получая их адреса как из системного списка, так и по функции DOS 0x32.




- Начало -  - Назад -  - Вперед -