Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
if(next_cluster == EOF_FAT16) {
#ifdef DEBUG
printf("last cluster. ");
#endif
free(tmp_buff);
close(n);
return ++i;
}
start_cluster = next_cluster;
}
#ifdef DEBUG
printf("stop reading ");
#endif
return i;
}
}
}
Чтение загрузочного сектора FAT16 выполняет функция read_fbs(). Результат помещается в глобальную структуру fbs:
int read_fbs()
{
if(read(hard,(__u8 *)&fbs, sizeof(fbs)) < 0) return -1;
return 0;
}
Чтение таблицы размещения файлов файловой системы FAT16 выполняет функция read_fat16():
int read_fat16()
{
__u64 seek = (__u64)(fbs.reserved) * 512; // смещение к FAT16 от начала раздела
fat16 = (void *)malloc(fat16_size);
if(pread64(hard, (__u8 *)fat16, fat16_size, seek) < 0) return -1;
return 0;
}
Чтение корневого каталога выполняет функция read_root_dentry():
int read_root_dentry()
{
__u64 seek = (__u64)fbs.reserved * 512 + fat16_size * fbs.fats; // смещение к корневому каталогу от начала раздела
root_size = 32 * dir_entries; // вычисляем размер корневого каталога
dir_entry = (__u8 *)malloc(root_size);
if(!dir_entry) return -1;
memset(dir_entry, 0, root_size);
if(pread64(hard, dir_entry, root_size, seek) < 0) return -1;
return 0;
}
Чтение кластера, принадлежащего файлу, выполняет функция read_cluster(). Входные параметры функции – номер кластера cluster_num и указатель на буфер __u8 *tmp_buff, куда нужно поместить результат чтения. Смещение к кластеру на разделе вычисляется по формуле (см. [1]):
SEEK = DATA_START + (CLUSTER_NUM - 2) * BYTE_PER_CLUSTER,