7

私はたくさんグーグルで検索しましたが、この問題に対する答えが見つかりませんでした...

不適切に閉じられたファイルを修正し、それに応じて FAT テーブルを書き込む 1GB SD カードを読み取る C++ コンソール アプリケーションがあります。SD カードは、カスタム メイド デバイス内のファームウェアによって最初に書き込まれます。Xp までは問題なく動作し、Win Vista/7 では動作しなくなりました。権限の昇格を試みました。管理者アカウント タイプ内で、「管理者として実行」メソッドを使用して cmd ウィンドウを起動しましたが、うまくいきませんでした。私はまた、最高の利用可能な権限を要求するマニフェストを試しましたが、うまくいきませんでした。

「Windows Vista では、ユーザー モード プロセスからディスクにアクセスすることはまったく許可されていません。この動作をバイパスする方法を知っている人はいますか?

私は回避策に取り組んでいますが、これが不可能かどうかを知りたいです

編集:

これは私の最初の投稿なので、リンクの問題についてはよくわかりません...しかし、スパムにはまったく反応しません...コミュニティ主導のサイトで質問しているだけです:)

コードは次のようになります

hDevice = CreateFile(buffer,GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL); 

次に、SD から BTB 情報を読み取り、不適切に閉じられたファイルを探します。

最後にSDに書き込もうとすると

WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0)

アクセスが拒否されました (エラー #5)

CreateFile() の文字列は \.\g: です。これは、g の文字が私のマシンの SD カードに対応しているためです。すべて問題なく動作し、前に述べたように XP で動作します。FSCTL_LOCK_VOLUME を使用した DeviceIoControl も使用してみましたが、mem fault エラーが発生します。

これが理解に役立つことを願っています。

4

2 に答える 2

2

これは、パス文字列「buffer」が原因だと思います。私は同じ問題に遭遇しました。デバイス アクセスを取得するために使用しているパスは、この "\\.\PhysicalDrive%d" %d のように見える必要があります。%d はドライブの 10 進数です。

Vista 以降、この文字列は大文字と小文字を区別します。スペルを確認してください。以前の XP と同様に、管理者権限も必要です。

ボリュームについては、. 文字は「\\.\G:」のように大文字にする必要があります。

また、SD カードをボリュームとしてではなくデバイスとしてアクセスする方がはるかに優れていることにも注意してください。Windows が SD カードをマウントすると、書き込みキャッシュがマウントされたファイル システムが存在する可能性があるためです。

さらに、データの読み取り/書き込みを行うバッファーはページにアラインされ、読み取りはセクターサイズの倍数である必要があることを忘れていました。VirtualAlloc() はこれを行います

于 2010-08-30T20:33:20.773 に答える
0

生データを書き込む前に、ボリュームをマウント解除する必要があります。

MSDN から:

ボリュームにマウントされたファイル システムがない場合、または次の条件のいずれかに該当する場合、ボリューム ハンドルへの書き込みは成功します。

  • 書き込むセクタはブートセクタです。
  • 書き込まれるセクタは、ファイル システム領域の外に存在します。
  • FSCTL_LOCK_VOLUME または FSCTL_DISMOUNT_VOLUME を使用して、ボリュームを明示的にロックまたはマウント解除しました。
  • ボリュームには実際のファイル システムはありません。(つまり、RAW ファイルシステムがマウントされています。)

次の条件のいずれかに該当する場合、ディスク ハンドルへの書き込みは成功します。

  • 書き込まれるセクターがボリュームのエクステント内にありません。
  • 書き込まれるセクターはマウントされたボリューム内に収まりますが、FSCTL_LOCK_VOLUME または FSCTL_DISMOUNT_VOLUME を使用してボリュームを明示的にロックまたはマウント解除しました。
  • 書き込むセクタは、RAW 以外のファイル システムがマウントされていないボリューム内に収まるようにします。

サンプルコード:

BOOL bResult = DeviceIoControl(hDevice,                // device to be queried
                               FSCTL_DISMOUNT_VOLUME,  // operation to perform
                               NULL, 0,                // no input buffer
                               pdg, sizeof(*pdg),      // output buffer
                               &junk,                  // # of bytes returned
                               (LPOVERLAPPED)NULL);    // synchronous I/O
于 2012-01-26T18:23:09.123 に答える