Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
if(!dentry.name[0]) return -1;
}
#ifdef DEBUG
printf("name - %s ", dentry.name);
printf("start cluster - 0x%X ", dentry.start);
printf("file size - %u ", dentry.size);
printf("file attrib - 0x%X ", dentry.attr);
#endif
return 0;
}
Весь вышеприведенный код находится в каталоге FAT16, файл fat16.c. Для получения исполняемого модуля создадим Makefile следующего содержания:
INCDIR = /usr/src/linux/include
.PHONY = clean
fat16: fat16.o split.o
gcc -I$(INCDIR) $^ -g -o $@
%.o: %.c
gcc -I$(INCDIR) -DDEBUG -c $^
clean:
rm -f *.o
rm -f ./fat16
Программная реализация алгоритма чтения файла с логического раздела с файловой системой FAT12
В целом алгоритм чтения файла с раздела FAT12 идентичен алгоритму чтения файла с раздела FAT16. Отличие заключается в процедуре чтения элементов из таблицы FAT12. Таблица FAT16 рассматривалась нами как простой массив 16-разрядных элементов. Для чтения элементов таблицы FAT12 в [1] предложен следующий алгоритм:
n умножить номер элемента на 1.5;
n извлечь из FAT 16-разрядное слово, используя в качестве смещения результат предыдущей операции;
n если номер элемента четный, выполнить операцию AND над считанным словом и маской 0x0FFF. Если номер нечетный, сдвинуть считанное из таблицы слово на 4 бита в сторону младших разрядов.
Базируясь на этом алгоритме, реализуем функцию чтения элементов из таблицы FAT12:
int get_cluster(__u16 cluster_num)
{
__u16 seek;
__u16 clust;
Вычисляем смещение в таблице FAT12 и считываем из таблицы 16-разрядное слово:
seek = (cluster_num * 3) / 2;
memcpy((__u8 *)&clust, (__u8 *)(fat12 + seek), 2);
Если стартовый номер кластера – четное число, сдвигаем считанное из таблицы значение на 4 бита в сторону младших разрядов, если нечетное – суммируем его с 0x0FFF:
if(cluster_num % 2) clust >>= 4;
else clust &= 0x0FFF;
Этот фрагмент можно также реализовать на ассемблере:
asm(
" xorw %%ax, %%ax "
" btw $0, %%cx "
" jnc 1f "
" shrw $4, %%dx "
" jmp 2f "
"1: andw $0x0FFF, %%dx "
"2: movw %%dx, %%ax "
:"=a" (next)