Чтение загрузочного сектора файловой системы FAT32 - PullRequest
2 голосов
/ 21 декабря 2011

Я пишу программу, и мне нужен доступ к некоторой информации в загрузочном секторе о файловой системе FAT32, которую я смонтировал.

Вот что я сделал, полностью прокомментировал.

int main (void) {
    unsigned short *i;                  //2 byte unsigned integer pointer
    char tmp[1024];                     //buffer
    int fd;                             //file descriptor from opening device
    fd =  open("/dev/sdf", O_RDONLY);   //open the device file
    lseek(fd, 14, SEEK_SET);            //set offset to 14 (0x0E), i.e. storing "no. of reserved sectors" of the FAT32 system
    read(fd, tmp, 2);                   //read off 2 bytes, "no. of reserved sectors" is represented by 2 bytes
    i = &tmp;                           //point j at those 2 bytes
    printf("*j: %d\n", *j);             //print *j out
    close(fd);                          //close device
    return 0;
}

Вывод * i равен 38, что является ерундой. Я отформатировал файловую систему с помощью mkfs.vfat. Я установил «№ зарезервированных секторов» на 32.

Что я пробовал:

  • i = (unsigned short *) & tmp, выполнить приведение, это удаляет предупреждение при компиляции, но не помогает

  • чтение (fd, tmp, 512), загрузка всего загрузочного сектора (512 байт) в tmp, затем чтение из буфера, но это не помогает, но результат все равно 38.

  • возьмите со смещением, то есть измените 14 на 13 или 15, на случай, если я получу неправильный индекс. Он печатает 9744 для 13 и 512 для 15 соответственно, поэтому не работает.

Я не уверен, правильно ли я это делаю. Может кто-нибудь указать мне правильное направление?

Заранее спасибо,

Felastine.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011
unsigned short *i;                  //2 byte unsigned integer pointer
char tmp[1024];  
 [...] 
i = &tmp;                           //point j at those 2 bytes

tmp - это char[], &tmp что-то порядка char**.Подумайте еще раз, вы не хотите & здесь.

0 голосов
/ 21 декабря 2011

Попробуйте запустить:

$ dd if=/dev/sdf of=/tmp/x.bin bs=512 count=1

А потом:

$ hd /tmp/x.bin

Или

$ od -tx2 /tmp/x.bin

И постить первые строчки.

Скорее всего, ваши fattools добавляют 6 собственных зарезервированных секторов. И затем они вычитают их перед показом данных.

...