MS-DOS для программиста


Программа FATSCAN - часть 4


// Показываем содержимое каталога rptr = (FITEM far *)clust_buffer;

// Первый дескриптор в каталоге указывает на // этот же каталог. В поле имени первого дескриптора // находится строка ". ". // Этот факт можно использовать // для проверки каталога. Если вы по ошибке указали // номер кластера, не принадлежащего каталогу, // программа завершит работу с сообщением об ошибке. if(k == 0) { k = 1; if(_fstrncmp(rptr->name,". ",8) != 0) { printf("\nЭто не каталог !"); farfree(root_buffer); free(boot_rec); farfree(fat_buffer); farfree(clust_buffer); return(-1); } }

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

for(;;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(" %-6ld %lu", (long)rptr->cluster_nu, (long)rptr->size); }

// Если этот кластер - последний из распределенных // каталогу, завершаем работу программы if((cur_clust == 0xfff) (cur_clust == 0xffff)) break; }

farfree(root_buffer); free(boot_rec); farfree(fat_buffer); farfree(clust_buffer); return 0; }

int getboot(BOOT far *boot, int drive) { cb.first_sect = 0; cb.nsect = 1; cb.buf = (void far*)boot;

_BX = FP_OFF(&cb); _DS = FP_SEG(&cb); _CX = 0xffff; _DX = 0; _AX = drive; asm int 25h asm pop ax asm jc err

return 0; err: return 1; }

/** * fat * * Выбрать элемент из FAT * * Функция выбирает элемент с заданным номером из таблицы * размещения файлов FAT . Формат FAT передается * функции как параметр * * int fat(b_fat, t_fat, idx); * * char far *b_fat - буфер, содержащий FAT * * int t_fat - формат FAT (12 или 16) * * unsigned idx - номер элемента FAT , который * должен быть выбран * **/

int fat(char far *b_fat, int t_fat, unsigned idx) { div_t clust_nu ; int cluster;

if(t_fat == 12) { clust_nu = div(idx * 3, 2);

if(clust_nu.rem != 0) cluster = (*((int far*)(b_fat + clust_nu.quot)) >> 4) & 0xfff; else cluster = *((int far*)(b_fat + clust_nu.quot)) & 0xfff; } else if(t_fat == 16) { cluster = *((int far*)(b_fat + idx * 2)); } else { printf("Ошибка в формате FAT \n"); exit(-100); } return(cluster); }




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



Книжный магазин