2017-03-23 11 views
0

私は、バイナリでディスクイメージファイルを読み込んで、各パーティション、そのタイプ、開始セクタとサイズを表示するためにパーティションエントリテーブルをチェックする小さなプログラムを書いています。バイナリファイルの全64バイトを読むにはどうすればよいですか?

これまでのところ、最初の16バイトは正確に読み取られましたが、残りのパーティションエントリは認識されないか、何らかのエラーがあります。 enter image description here EDIT: 結果は、このような出力の最初の行はこのように見えるようになっている:私は

`Partition 0: Type: FAT-16 Start: 63 Size: 518760` 

何をしないのですか?すべてのパーティションエントリが適切な結果を与えるようにコードを修正するにはどうすればよいですか?

using namespace std; 
#include <iostream> 
#include <fstream> 

struct Partition { char type; int start_sect; int size; } part_entry[4]; // 4 x partition table entry 


int main(int argc, char *argv[]) 
{ 
//DECLARATIONS 
int i, offset = 26, not_exist = 0; 
char buf_part_table[64], vol_type[12]; 
char* diskdata; 
int n; 
streampos begin, end; 


ifstream diskimage; 
diskimage.open("Sample_1.dd", ios::in | ios::binary | ios::out); 


diskdata = new char[begin]; 
begin = diskimage.tellg(); 
diskdata = new char[begin]; 
diskimage.seekg(446, ios::beg); 

diskimage.read(buf_part_table, 64); 


for (i = 0; i < 4; i++) 
{ 
    part_entry[i].type = *(char*)(buf_part_table + 0x04 + (i * offset)); 

    if (part_entry[i].type == 0) not_exist++; 

    part_entry[i].start_sect = *(int*)(buf_part_table + 0x08 + (i * offset)); 

    part_entry[i].size = *(int*)(buf_part_table + 0x0C + (i * offset)); 

    switch (part_entry[i].type) 
    { 
    case 00: strcpy(vol_type, "NOT-VALID"); 
     break; 
    case 06: strcpy(vol_type, "FAT-16"); 
     break; 
    case 07: strcpy(vol_type, "NTFS"); 
     break; 
    case 0x0B: strcpy(vol_type, "FAT-32"); 
     break; 
    default: strcpy(vol_type, "NOT-DECODED"); 
     break; 
    } 

    cout << "Partition " << i << ":" << " Type:" << vol_type << " Start: " << part_entry[i].start_sect << " Size: " << part_entry[i].size << endl; 

} 

return 0; 
} 
+0

テキストの画像を(特にリンクとして)掲載するのではなく、実際のテキストをテキストとしてテキストの本文にコピーして貼り付けてください。また、予期しない出力がある場合は、実際の出力だけでなく、期待される*出力も確認できます。 –

+0

'buf_part_table + 0xXX +(i * offset)'と 'i == 3'は64バイトから離れています。 「オフセット」は26ではなく16でなければならない? – em2er

+1

[テキストは画像に投稿されていません](https://meta.stackoverflow.com/q/303812/995714) –

答えて

1

不要なプログラムを読むことができず、デバッグが難しくなります。 ブートセクタ全体を一度に読むことができ、必要なコンテンツを表示することができます。 は、ここに私の簡単な例である

#include <iostream> 
#include <fstream> 
#include <cstdint> 
#include <cstddef> 
#include <iomanip> 

using namespace std; 

struct partition_t { 
    uint8_t status; 
    uint8_t start_CHS[3]; 
    uint8_t type; 
    uint8_t end_CHS[3]; 
    uint32_t start_LBA; 
    uint32_t size_LBA; 
} __attribute__((packed)); 

struct mbr_t 
{ 
    uint8_t  bootstrap[446]; 
    partition_t partitions[4]; 
    uint16_t signature; 
} __attribute__((packed)); 

int main(int argc, char *argv[]) 
{ 
    mbr_t mbr; 
    ifstream diskimage; 
    diskimage.open("/tmp/mbr.dd", ios::in | ios::binary); 
    diskimage.read(reinterpret_cast<char*>(&mbr), sizeof(mbr)); 
    diskimage.close(); 

    for(int idx = 0 ; idx < 4 ; idx++) 
    { 
     string bootable = (mbr.partitions[idx].status == 128) ? "yes" : "no"; 
     cout << " bootable : " << setw(5) << bootable << 
       " type : " << setw(5) << (int)mbr.partitions[idx].type << 
       " start LBA : " << setw(10) << mbr.partitions[idx].start_LBA << 
       " size : " << setw(10) << mbr.partitions[idx].size_LBA << endl; 
    } 

    return 0; 
} 

右、読みやすいです(それはファイルが存在する場合、いくつかは、それはいくつかのフィールドなどのためのmemcpyを使用する必要があります文句を言うことが確認されませんか)?

+0

実際に読むのはそれほど簡単ではありませんが、必要な情報は表示されますが、必要な形式ではないことがわかります。型をintからstringに関連付ける必要があります。ここで、intは事前定義された型例えばFAT-16、FAT-32、NTFS、 – AdetunjiOp

+0

です。これは例です。パーティションタイプのような新しい機能をストリングに追加するのは簡単です。主な目標は、あいまいな読み取りとポインタ演算を減らすことでした。 – Anty

+0

'__attribute __((packed));' 「パックされた」とは、定義されていないものとして表示されます。 'setw(5)<< 'これは、オペレータ" << "がこれらのオペランドと一致しないことを示します。 どうすれば解決できますか? – AdetunjiOp

関連する問題