Cygwin gccからハードディスクなどに直接リードライトを行う(アブソリュートディスクリード・ライト)

ドライブへの直接アクセス方法について

ファイルシステムを利用せず、ドライブに対して直接アクセスしたい場合、Visual C++では、CreateFile()関数を使用するとあります。
CygwinのgccにはCreateFile()関数はありませんが、fopen()関数が内部でCreateFile()を呼び出していると考え、ためしに以下の内容で実験してみました。
結果としては、ちゃんとアクセスできましたので、記事としてまとめます。
この方法は、手順を間違えるとドライブのデータを破壊してしまう可能性があります。
十分注意してご使用ください。

論理ドライブへの直接アクセスについて

MSDNライブラリの情報によると、論理ドライブ(パーティション)への直接アクセスは、CreateFile関数を使用し、
"\\.\c:"の様に使用するとあります。実は、gccのfopenでも同様の引数で論理ドライブにアクセスできます。

int main(void){
    FILE* fp;
    // c:ドライブをオープンする
    fp = fopen("\\\\.\\c:","rb");

これで、パーティションにアクセスできます。
freadやfwrite、fseekなども使用できます。

物理ドライブへの直接アクセスについて

物理ドライブへのアクセスは、以下のようにします。

int main(void){
    FILE* fp;
    // PHYSICALDRIVE1ドライブをオープンする
    fp = fopen("\\\\.\\PHYSICALDRIVE1","rb");

このように指定する場合には、ドライブのセクタ0(MBR=Master Boot Record)からアクセスできます。

また、セクタサイズがsの場合、セクタxにシークさせるには、以下のように指定します。

    fseek(fp,x*s;0);

Author: projectc3@gmail.com
Last modified: Sun Jul 31 06:15:38 JST 2005