Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
__u8 *tmp_buff;
__u16 start_cluster, next_cluster;
Параметры функции мы перечислили при рассмотрении функции main.
Подготовительные операции – обнуляем буфер tmp_name_buff и структуру struct split_name sn:
memset(tmp_name_buff, 0, SHORT_NAME);
memset((void *)&sn, 0, sizeof(struct split_name));
Первым символом в абсолютном путевом имени файла должен быть прямой слэш (/). Проверяем это:
if(full_path[0] != '/') return -1;
Считываем с раздела загрузочный сектор:
if(read_fbs() < 0) return -1;
Считанный загрузочный сектор находится сейчас в глобальной структуре struct fat_boot_sector fbs. Скопируем из этой структуры размер сектора, число записей в корневом каталоге и общее число секторов на разделе:
memcpy((void *)§or_size, (void *)fbs.sector_size, 2);
memcpy((void *)&dir_entries, (void *)fbs.dir_entries, 2);
memcpy((void *)§ors, (void *)fbs.sectors, 2);
Определим размер кластера в байтах:
byte_per_cluster = fbs.cluster_size * 512
Отобразим информацию, находящуюся в загрузочном секторе:
printf("System id - %s ", fbs.system_id);
printf("Sector size - %d ", sector_size);
printf("Cluster size - %d ", fbs.cluster_size);
printf("Reserved - %d ", fbs.reserved);
printf("FATs number - %d ",fbs.fats);
printf("Dir entries - %d ", dir_entries);
printf("Sectors - %d ", sectors);
printf("Media - 0x%X ", fbs.media);
printf("FAT16 length - %u ", fbs.fat_length);
printf("Total sect - %u ", fbs.total_sect);
printf("Byte per cluster - %d ", byte_per_cluster);
Вычисляем размер FAT16 в байтах и считываем её:
fat16_size = fbs.fat_length * 512;
if(read_fat16() < 0) return -1;
Считываем корневой каталог:
if(read_root_dentry() < 0) return -1;
Сейчас указатель dir_entry позиционирован на область памяти, содержащую записи корневого каталога. Размер этой области памяти равен размеру корневого каталога (root_size).
Сохраним (для контроля) содержимое корневого каталога в отдельном файле:
#ifdef DEBUG
fat = open("dir16", O_CREAT|O_WRONLY, 0600);
write(fat, dir_entry, root_size);
close(fat);
#endif
Вычисляем начало области данных:
data_start = 512 * fbs.reserved + fat16_size * fbs.fats + root_size;
Имея все записи корневого каталога, мы можем добраться до содержимого файла test.txt. С этой целью организуем цикл. В теле цикла проведем разбор полного имени файла, выделяя его элементы – подкаталоги (их у нас два, Folder1 и Folder2) и имя искомого файла (test.txt).
while(1) {
memset(tmp_name_buff, 0, SHORT_NAME);
memset((void *)&sn, 0, sizeof(struct split_name));
for(n = 0 ; n < SHORT_NAME; n++, i++) {
tmp_name_buff[n] = full_path[i];
if((tmp_name_buff[n] == '/') || (tmp_name_buff[n] == ' ')) {