2017-12-12 8 views
-2

私はHDDからGPTパーティションテーブルを削除するために、概念の証明としてプログラムを作成しようとしていました。C++でHDDからパーティションテーブルを削除

//Removes the first partition table in the beginning of the disk 
    ::lseek(fd, 0, SEEK_SET); 
    ::write(fd, '\0', GPT_PARTITION_TABLE_SIZE); 
    
    //Removes the backup partition in the end of the disk 
    ::lseek(fd, -GPT_PARTITION_TABLE_SIZE, SEEK_END); 
    ::write(fd, '\0', GPT_PARTITION_TABLE_SIZE); 

それがうまく動作するように見えたとしても、私はこの方法が正しくないことを友人から単語を持って、私は地元を使用する必要があります。ディスクを開いた後、短いそれをカットするために、私は次のような何かを書き込み用のバッファで、私のコードは正しい方法ではないwrite()へのポインタとしてNULLを使用しようとします。

私は彼が何を意味しているか理解するのにかなりの時間を費やしていますが、私はまだそれが得られるかどうかはわかりません。 これまで誰かが似たようなことを試みたことがありますか?

+1

あなたは、これが働きましたか?アドレス0から始まるランダムなメモリのパーティションサイズのチャンクを書いたようです。 – Neil

+0

''\ 0''を使って、あなたは何を*書く予定ですか?ゼロを書くつもりですか?どれくらい? –

+0

@Cooli 'write'の戻り値をチェックしませんでした。それは実際には失敗し、何も書かなかった。 – Ivan

答えて

4

コード行で:

::write(fd, '\0', GPT_PARTITION_TABLE_SIZE); 

writeに2番目の引数はconst void *あります。何が起こっているのかは、 NUL('\0')の値が定数0であり、したがってNULLと等価であるか、nullptr値に変換されていることです。 writeコールは、そのアドレスから始まるGPT_PARTITION_TABLE_SIZEバイトの読み取りを試みます。典型的なシステムでは、NULLのアドレスは文字通り0であり、通常はそこにマップされているページがなく、例外が発生します。オペレーティングシステムのカーネルや一部の組み込みシステムでは、アドレス0で読み込み可能なメモリが存在する可能性があり、そこにマップされているものを書き込む可能性があります。

は、コード例と比較:

char buffer[GPT_PARTITION_TABLE_SIZE]; 
memset(buffer, '\0', sizeof(buffer)); 
write(fd, buffer, sizeof(buffer)); 
関連する問題