Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
где:
n SEEK – смещение к кластеру на разделе
n DATA_START – начало области данных
n CLUSTER_NUM – порядковый номер кластера
n BYTE_PER_CLUSTER – размер кластера в байтах
int read_cluster(__u16 cluster_num, __u8 *tmp_buff)
{
__u64 seek = (__u64)(byte_per_cluster) * (cluster_num - 2) + data_start; // вычисляем смещение к кластеру
if(pread64(hard, tmp_buff, byte_per_cluster, seek) < 0) return -1;
return 0;
}
Функция read_directory выполняет чтение записей каталога (не корневого) и помещает результат в область памяти, на которую настроен указатель dir_entry:
int read_directory(__u16 start_cluster)
{
int i = 1;
__u16 next_cluster;
for(; ;i++) {
Выделяем память для хранения содержимого каталога, считываем содержимое стартового кластера и получаем из таблицы FAT16 значение очередного кластера:
dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster);
if(!dir_entry) return -1;
if(read_cluster(start_cluster, (dir_entry + (i - 1) * byte_per_cluster)) < 0) return -1;
next_cluster = fat16[start_cluster];
Сохраним содержимое каталога в отдельном файле (для контроля):
#ifdef DEBUG
printf("Next cluster - 0x%X ", next_cluster);
fat = open("dir16", O_CREAT|O_WRONLY, 0600);
write(fat, dir_entry, root_size);
close(fat);
#endif
Если достигнут последний кластер, выходим из цикла, иначе продолжаем чтение каталога, увеличив размер буфера dir_entry ещё на один кластер:
if(next_cluster & EOF_FAT16) break;
start_cluster = next_cluster;
}
return 0;
}
Поиск в содержимом каталога элемента, соответствующего искомому файлу, выполняет функция get_dentry(). Входные параметры этой функции – указатель на структуру struct split_name *sn, содержащую элементы короткого имени файла:
int get_dentry(struct split_name *sn)
{
int i = 0;
В глобальном буфере dir_entry находится массив элементов каталога, в котором мы собираемся искать запись файла (или каталога). Для поиска организуем цикл. В теле цикла производим копирование элементов каталога в глобальную структуру dentry и сравниваем значение полей name и ext этой структуры с соответствующими полями структуры struct split_name *sn. Совпадение этих полей означает, что мы нашли в массиве элементов каталога запись искомого файла:
for(; ; i++) {
memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), sizeof(dentry));
if(!(memcmp(dentry.name, sn->name, sn->name_len)) &&
!(memcmp(dentry.ext, sn->ext, sn->ext_len)))
break;