2

ブート セクタ (マスター ファイル テーブル) への書き込みアクセスを取得するために、多くの検索を行いました。CreateFileのような書き込みアクセス パラメータを持つ関数を使用しましGENERIC_WRITEた。次に、特定のメモリ アドレスに書き込むために使用SetFilePointerします。WriteFileしかし、私がいつも得るのはSystem.AccessViolationException(Windows 7)です。ここで何か間違っていますか?

ブート セクタへの wrtie アクセスを取得するための CreateFile - WriteFile 関数に代わるものがあるかどうか知りたいですか?

または、Interrup Service Routine を使用して VC++ (C++/Cli) の特定のディスク セクターに書き込む方法があるかどうか考えていました。

4

1 に答える 1

3

Microsoft KBによるとCreateFileFILE_SHARE_READFILE_SHARE_WRITEonを呼び出す必要があります。"\\.\PhysicalDriveN"ここで、Nはゼロベースの物理ドライブ インデックスです。その後、ドライブ全体を 1 つの巨大なファイルとしてアクセスできます。これが機能するには、マシンの管理者である必要があります!

CreateFile() ドライブへの適切なアクセス権がある (つまり、管理者である必要がある) 場合は、これらのデバイス名を使用してアプリケーション プログラミング インターフェイス (API) を使用して物理ドライブまたは論理ドライブを開くことができます。ドライブにアクセスするには、フラグCreateFile() FILE_SHARE_READとフラグの両方を使用する必要があります 。FILE_SHARE_WRITE

論理ドライブまたは物理ドライブが開かれると、ドライブ全体のデータに対して直接 I/O を実行できます。ダイレクト ディスク I/O を実行する場合は、デバイスのセクター サイズの倍数とセクター境界でシーク、読み取り、および書き込みを行う必要があります。IOCTL_DISK_GET_DRIVE_GEOMETRY を使用して DeviceIoControl() を呼び出し、セクターあたりのバイト数、セクター数、トラックあたりのセクターなどを取得して、必要なバッファーのサイズを計算できるようにします。

更新:調査を行ったところ、Vista を起動するには、ボリュームのロックを取得するか、マウントを解除する必要があることがわかりました。そうしないと、書き込みが失敗します。ドキュメントでマイクロソフトは次のように述べています。

ファイル システムがマウントされているボリュームに直接書き込む場合は、最初にそのボリュームへの排他アクセスを取得する必要があります。そうしないと、アプリケーションの書き込みがファイル システムからの他の変更と競合し、ボリュームの内容が一貫性のない状態のままになる可能性があるため、データの破損やシステムの不安定性が生じる危険性があります。これらの問題を回避するために、Windows Vista 以降では次の変更が行われました。

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

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

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

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