Операционная система MS DOS (том 2)


Файлы и каталоги - часть 9


// Формат FAT определяем исходя из общего // количества секторов на логическом диске

if(total_sectors > 20791) { printf("\nFAT имеет 16-битовый формат"); ffat=16; } else { printf("\nFAT имеет 12-битовый формат"); ffat=12; }

// Определяем количество секторов, занимаемых FAT

fat_sectors = boot_rec->bpb.fatsize;

// Заказываем буфер для FAT

fat_buffer = _fmalloc(fat_sectors * boot_rec->bpb.sectsize);

// Вычисляем номер первого сектора FAT

j = boot_rec->bpb.ressecs;

// Читаем FAT в буфер fat_buffer

// Заполняем регистровые структуры для вызова // прерывания DOS INT 25h

reg.x.ax = drive; reg.x.bx = FP_OFF(fat_buffer); segreg.ds = FP_SEG(fat_buffer); reg.x.cx = fat_sectors; reg.x.dx = j; int86x(0x25, &reg, &reg, &segreg);

// Извлекаем из стека оставшееся там после // вызова прерывания слово

_asm pop ax

// Вычисляем номер первого сектора корневого каталога

root_begin = j + fat_sectors * boot_rec->bpb.fatcnt;

// Вычисляем длину корневого каталога

root_sectors = (boot_rec->bpb.rootsize * 32) / boot_rec->bpb.sectsize;

// Заказываем буфер для корневого каталога

root_buffer = _fmalloc(root_sectors * boot_rec->bpb.sectsize);

// Читаем корневой каталог в буфер root_buffer

reg.x.ax = drive; reg.x.bx = FP_OFF(root_buffer); segreg.ds = FP_SEG(root_buffer); reg.x.cx = root_sectors; reg.x.dx = root_begin; int86x(0x25, &reg, &reg, &segreg); _asm pop ax

// Показываем содержимое корневого каталога

printf("\n" "\nИмя файла Аттр. Дата Время Кластер Размер" "\n------------ ----- ---------- -------- ------- ------");

for(rptr = root_buffer;;rptr++) { printf("\n");

// Признак конца каталога - нулевой байт в начале // имени файла

if(rptr->name[0] == 0) break;

// Выводим содержимое дескриптора файла

for(i=0; i<8; i++) printf("%c",rptr->name[i]); printf("."); for(i=0; i<3; i++) printf("%c",rptr->ext[i]); printf(" %02X %02d-%02d-%02d %02d:%02d:%02d ", rptr->attr, rptr->date.day, rptr->date.month, rptr->date.year + 1980, rptr->time.hour, rptr->time.min, rptr->time.sec * 2); printf(" %-5d %lu", rptr->cluster_nu, rptr->size);




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