Чтение, запись и манипулирование FAT32 в C

Я пытаюсь написать программу на C, которая позволяет мне перемещаться по образу файловой системы FAT32. Однако у меня возникают трудности с пониманием и применением уравнений для сбора правильных данных. Я использую Debian-дистрибутив Linux, поэтому поддерживается прямой порядок байтов. Ниже приведен псевдокод с сайта Microsoft о FAT32, вычисляющий следующий кластер для доступа к каталогу или файлу:

    ThisFATSecNum = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
    ThisFATEntOffset = REM(FATOffset / BPB_BytsPerSec);

    FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) =
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) = 
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal;

Я не совсем понимаю, что делает массив символов SecBuff или к чему он обращается. DWORD должен быть целым числом без знака, и я не уверен, что понимаю и последующие приведения. Любой легкий сарай очень ценится.

Если бы кто-то мог также объяснить, как мы должны перемещаться по файловой системе FAT32 на основе кластеров, мы были бы очень признательны, мне кажется, что переход по ссылке на секторы более эффективен, хотя распределение кластеров обеспечивает пространственную локальность. Я не совсем понимаю, как выполнить чтение байтов, чтобы найти следующий кластер для файлов/папок.


person GFXGunblade    schedule 10.12.2011    source источник
comment
SecBuff, вероятно, является буфером памяти, в котором хранится содержимое сектора диска, с которым вы в данный момент работаете. А вот в остальном совсем не уверен.   -  person Eric J.    schedule 11.12.2011


Ответы (1)


Этот псевдокод предназначен для чтения и записи номера кластера из/в таблицу размещения файлов. Документ говорит это прямо между двумя фрагментами псевдокода. Здесь это единственная возможность, если только вы не имеете ни малейшего представления о том, как работает FAT12/16/32.

------8<------

Предположим, что это считывается в 8-битный массив байтов с именем SecBuff. Также предположим, что тип WORD является 16-разрядным беззнаковым, а тип DWORD — 32-разрядным беззнаковым.

If(FATType == FAT16)
    FAT16ClusEntryVal = *((WORD *) &SecBuff[ThisFATEntOffset]);
Else
    FAT32ClusEntryVal = (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0x0FFFFFFF;

Выбирает содержимое этого кластера. Чтобы установить содержимое этого же кластера, выполните следующие действия:

If(FATType == FAT16)
    *((WORD *) &SecBuff[ThisFATEntOffset]) = FAT16ClusEntryVal;
Else {
     FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) =
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) = 
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal;
}

------8<------

Именно с этими номерами кластеров в ячейках манипулирует приведенный выше псевдокод:

введите здесь описание изображения

Говорят, где следующая часть файла (если есть), в каком кластере. Каждый файл или каталог представляет собой цепочку кластеров.

SecBuff — это массив, содержащий 512-байтовый сектор таблицы размещения файлов. Приведение типов *((DWORD *) позволяет избежать чтения/записи 32-битных значений отдельными 8-битными фрагментами.

person Alexey Frunze    schedule 12.12.2011