Re: [問題] 如何用C寫讀取Partition Table的方法?

看板C_and_CPP作者 (小風)時間14年前 (2009/11/24 20:36), 編輯推噓6(600)
留言6則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《rruy (YA賈修動畫真好看)》之銘言: : 小弟目前 有些資訊內容 需要從Partition Table內取得 : 例如: 現在格式 (ext3 ,fat32 ,fat16..等等資訊) : 除了讀取Partition Table外我真的想不知道如何取得了 : 上網查了一下 還是對讀取Partition Table沒有頭緒 : 要怎麼讀出來呢? : 又不像一般文字檔?也不知道該去哪邊找? : 有沒有大大能給個頭緒 方向 感謝 : 我只知道linux下用fdisk 裡面去看 看的到Partition Table : 不過程式中也沒辦法這樣去看? : Partition Table內哪個數字代表哪個值我知道 : 可是我就是不知道如何去讀到Partition Table : 拜託各位大大 能給點提示 感恩 以下的範例僅適用於 Linux 系統, 不適用 Windows. int fd; unsigned char mbr[512], *p_table; /* 用 open() 就可以開了, 如果有寫入的必要, 請把 O_RDONLY 改 * 成 O_RDWR. 以下只是以 /dev/sda 為例, 你的 disk 可能是 * /dev/hda 或者其他的. */ if ((fd = open("/dev/sda", O_RDONLY)) < 0) { /* error handling */ } /* 讀取 MBR, MBR 位於 disk 的前 512 bytes */ if (read(fd, mbr, 512) != 512) { /* error handling */ } close(fd); /* MBR 的 512 bytes 裡前 446 個 bytes 是裝 bootloader 及一些 * OS specific parameters 用的, 後面 66 bytes 裡, 除了最後兩 * 個 bytes (mbr[510], mbr[511]) 一定是 0x55 0xaa 之外, 其餘 * 64 bytes 即是 partition table */ p_table = &mbr[446]; 這 64 bytes 裡, 可容納 4 個 16 bytes 的 partition 資料, 簡述 如下: [ 0 ] bootable [ 1-3 ] CHS start [ 4 ] type [ 5-7 ] CHS end [ 8-11] sector start [12-15] total sectors A. 讀取 type 及 partition size type 位於上表之 [4] 的位置, 應該不會有什麼問題, 比較需要 留意的地方是 [12-15] 這個部份, [12-15] 裡存的值, 其實就是 partition size, 但是它是以 sector 為單位, 而且順序是 little endian. 因此要算出此 partition 的 bytes 數, 必須再乘以 sector size. 儘管 sector size 大都是 512 bytes. 但也有可能是 1024 或 2048 等不同的數值, 請利用 BLKSSZGET 查證, 例: int sector_size = 0; ioctl(fd, BLKSSZGET, &sector_size); B. Extended partition 及 EBR 在 [4] 如果讀出的 type 是 0x05, 則屬於 extended partition, 遇到這個 partition 時, 它實際的資料會存在 EBR (Extended Boot Record), EBR 和 MBR 的架構大致相同, 假如 /dev/sda2 為 extended partition, 則 EBR 就存在 /dev/sda2 的前 512 bytes. 而 EBR 的 後面 66 bytes 就是另一組 partition table. C. 讓 kernel 重讀 partition table 最後, 如果有更動 partition table 的內容, 請用 BLKRRPART 通知 kernel 重讀 partition table. 例: ioctl(fd, BLKRRPART); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.249.207.134

11/24 22:30, , 1F
推一個
11/24 22:30, 1F

11/24 22:42, , 2F
推強者:)
11/24 22:42, 2F

11/24 23:49, , 3F
推~
11/24 23:49, 3F

11/25 12:17, , 4F
11/25 12:17, 4F

11/25 13:05, , 5F
11/25 13:05, 5F

11/27 01:50, , 6F
推~~
11/27 01:50, 6F
文章代碼(AID): #1B2zCpZ8 (C_and_CPP)
文章代碼(AID): #1B2zCpZ8 (C_and_CPP)