- PR -

C言語でハードディスクに直接書き込む方法

1
投稿者投稿内容
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2009-02-25 13:58
Windows環境でハードディスクに直接読み書きするためのテスト目的で、
以下のようなプログラムを作成しましたが、
読み込みはうまくいくものの書き込みができません。

どこが問題かご指摘いただけないでしょうか。
プログラムの修正箇所を最低限にできればよりベストだと考えています。

コード:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 512

int
main (int argc, char *argv[])
{
  FILE *fpr, *fpw;
  char buf[BUFSIZE];

  if (argc < 3)
    {
      printf ("Invalid arguments\n");
      return 1;
    }

  if (! strcmp (argv[1], "/dev/zero"))
    memset (buf, 0, BUFSIZE);
  else
    {
      fpr = fopen (argv[1], "rb");

      if (fpr == NULL)
        {
          perror ("Cannot open file R.\n");
          return 1;
        }
    }

  fpw = fopen (argv[2], "wb");

  if (fpw == NULL)
    {
      perror ("Cannot open file W.\n");
      return 1;
    }

  if (! strcmp (argv[1], "/dev/zero"))
    while (fwrite (buf, BUFSIZE, 1, fpw) != 0);
  else
    while (fread (buf, BUFSIZE, 1, fpr) != 0)
      fwrite (buf, BUFSIZE, 1, fpw);

  fclose(fpr);
  fclose(fpw);

  return 1;
}



a.exe \\.\PhysicalDrive2 c:\log.txt
==> それらしいもの (log.txt) が作成されている。

a.exe c:\log.txt \\.\PhysicalDrive2
==> 「\\.\PhysicalDrive2」について、Invalid Argument エラーが出力されて書き込めない。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-25 15:50
これフォーマットするプログラムですか?
windows環境で引数2個以上で物理ドライブを2つ目に指定すると、
フォーマットされそうな気がするんですが。
そのまま実行するのは少々危険な感じがするので実行してませんが、


引用:

読み込みはうまくいくものの書き込みができません。



読み込みはスキップされているだけで
メモリを初期化しているだけでしょう。
(読み込みはうまく行ってないと思います)

# 追記修正
# すいません、strcmpの戻り値勘違いしてました。読み込めてると思います。


引用:

a.exe c:\log.txt \\.\PhysicalDrive2
==> 「\\.\PhysicalDrive2」について、Invalid Argument エラーが出力されて書き込めない。


とありますが、「Invalid Argument」引数の個数をチェックしている箇所で出力しているようですので、2個以上引数指定していれば出ない気がします。



[ メッセージ編集済み 編集者: デューン 編集日時 2009-02-25 19:22 ]
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2009-02-25 16:25
返信ありがとうございます。

> これフォーマットするプログラムですか?

最終的にそういうプログラムにすることを想定しています。

> とありますが、「Invalid Argument」引数の個数をチェックしている箇所で出力している
> ようですので、2個以上引数指定していれば出ない気がします。

不足していてすみません。実際の出力はこんな感じです。

コード:

D:\>a.exe c:\log.txt \\.\PhysicalDrive2
Cannot open file W.
: Invalid argument <== プログラムの方は Invalid arguments、複数形

D:\>



あと、引数がともに通常のファイル名の場合は期待通りコピーされることを確認しています。


[ メッセージ編集済み 編集者: あんとれ 編集日時 2009-02-25 16:25 ]
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-25 16:48
ファイルオープンモードの問題だと思います。
wbの場合は新規作成となるので×
wb+もクリアできず×です。


ちなみに、成功するとそのハードディスクのMBRは壊れ、
特に起動ドライブだった場合は起動しなくなると思いますので
仮想環境などで行うといいでしょう。

# a.exe c:\log.txt \\.\PhysicalDrive2
# 理解されていると思いますが、という字面からは一見ファイルコピーに見えますけどそうはなりません。

あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2009-02-25 17:07
引用:

ファイルオープンモードの問題だと思います。
wbの場合は新規作成となるので×
wb+もクリアできず×です。



ソースを大幅に書き換えない限り書き込みできないのでしょうか?

引用:

ちなみに、成功するとそのハードディスクのMBRは壊れ、
特に起動ドライブだった場合は起動しなくなると思いますので
仮想環境などで行うといいでしょう。

# a.exe c:log.txt \.PhysicalDrive2
# 理解されていると思いますが、という字面からは一見ファイルコピーに見えますけどそうはなりません。



3番目のHDDの先頭にlog.txtの内容が書き込まれ、後ろの部分はそのままになると認識しているのですが・・・

ちなみに、テスト用のハードディスクは設置したばかりの仮想HDD (VMware) でまだデータが入っていません。

よろしくお願いします。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-25 17:19
引用:

ソースを大幅に書き換えない限り書き込みできないのでしょうか?


いえ、rb+でなら成功するかもしれないと思っています。
(読み書きモード+ファイル存在時はなにもしない)

引用:

3番目のHDDの先頭にlog.txtの内容が書き込まれ、後ろの部分はそのままになると認識しているのですが・・・


HDDの先頭はフォーマットによって、MBRやパーティションなどの情報が入っています。
後ろの部分はそのままですが先頭の情報が失われると、Windows用ドライブとして認識しなくなる可能性もあります。
(もう一度フォーマットすればいいだけですし、物理アクセス専用のドライブであれば問題ないと思います)

# 仮想ディスクなら特に問題ないですね。
# 物理ディスクでやっている場合、ミスで大惨事というのがありえますので老婆心ながら指摘したまでです。

あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2009-02-25 17:45
ご指摘のとおり "rb+" を指定したところうまくいきました。
"r+" と "w" の違い、いまいち理解していませんでした。

ありがとうございました!
1

スキルアップ/キャリアアップ(JOB@IT)