2011-12-21 89 views
2

我正在編寫一個程序,我需要訪問引導扇區中關於我已安裝的FAT32文件系統的一些信息。正在讀取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 =(無符號短*)& TMP,做一個鑄件,這消除當我編譯警告,但沒有幫助

  • 讀取(fd,tmp,512),將整個引導扇區(512字節)加載到tmp中,然後從緩衝區讀取,但沒有幫助,結果仍然是38。

  • 擺弄偏移量,即改變14到13或15,以防我索引錯誤。它打印出13分別爲9744和512分別爲15,所以不起作用。

我不知道我是否正確地做了這件事。有人可以請指點我正確的方向嗎?

在此先感謝,

Felastine。

+0

你打開'/ dev/sdf',這是整個磁盤。您是否嘗試僅打開您格式化爲FAT32的分區,例如'的/ dev/sdf1'? – 2011-12-21 10:29:18

+0

是什麼讓你認爲38錯了?這對我來說聽起來像是一個合理的數字。有沒有可能mkfs.vfat沒有按照你的要求去做? – Stewart 2011-12-21 10:29:43

+1

@FrédéricHamidi 實際上,整個磁盤的「/ dev/sdf」是FAT32。 – Felastine 2011-12-21 10:34:57

回答

0

嘗試運行:

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

然後:

$ hd /tmp/x.bin 

或者

$ od -tx2 /tmp/x.bin 

和郵政業第一線。

有可能是你的fattools增加了6個額外的保留扇區。然後他們在顯示數據之前減去它們。

-1
unsigned short *i;     //2 byte unsigned integer pointer 
char tmp[1024]; 
[...] 
i = &tmp;       //point j at those 2 bytes 

tmpchar[]&tmp東西的順序char**。 再次想一想,您不希望&在這裏。