質問

C で、標準の Windows API を使用して、フォーマットされていないディスクを読み取る最良の方法は何ですか?具体的には、私は MMC または SDカード データはありますが、ファイル システムはありません (FAT16 や FAT32 ではなく、生データのみです)。バイトごとのバイナリ アクセスのためにカード全体を開く簡単な方法があれば、それは素晴らしいでしょう。

ありがとう!

役に立ちましたか?

解決

私は一緒に行きます

HANDLE drive = CreateFile(_T("\\.\PhysicalDrive0"), GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
// error handling
DWORD br = 0;
DISK_GEOMETRY dg;
DeviceIOControl(drive, IOCTL_DISK_GET_DRIVE_GEOMETRY, 0, 0, &dg, sizeof(dg), &br, 0);
//
LARGE_INTEGER pos;
pos.QuadPart = static_cast<LONGLONG>(sectorToRead) * dg.BytesPerSector;
SetFilePointerEx(drive, pos, 0, FILE_BEGIN);
const bool success = ReadFile(drive, sectorData, dg.BytesPerSector, &br) && br == dg.BytesPerSector;
//
CloseHandle(drive);

セクタが正常に読み取られたことを確認するには、読み取ったバイト数が読み取ろうとしたバイト数に対応していることを確認する必要があることに注意してください。私の経験では、物理ディスク上の ReadFile() は、バイトが読み取られていない場合でも (または、ドライバーにバグがあるだけかもしれません)、TRUE を返すことがあります。

残る問題は、ドライブ番号を特定することです (この例で使用されている 0 は C:それはおそらくあなたが望んでいることではありません)。それを行う方法はわかりませんが、フォーマットされていないドライブが1つだけ接続されている場合は、各PhysicalDriveを順番に開き、DeviceIOControl()を呼び出すことで可能になるはずです。 IOCTL_DISK_GET_DRIVE_LAYOUT_EX コマンドとして:

DRIVE_LAYOUT_INFORMATION_EX dl;
DeviceIOControl(drive, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, 0, 0, &dl, sizeof(dl), &br, 0);
if(dl.PartitionStyle == PARTITION_STYLE_RAW)
{
  // found correct disk
}

しかし、それは単なる推測です。

他のヒント

MSDN の CreateFile 関数リファレンス

「物理ディスクとボリューム」まで下にスクロールします。Vista のセキュリティ制限はファイルシステムのないボリュームには適用されないため、指定した条件下であれば Vista でも問題ありません。

デバイスファイルを開く必要があります ファイルの作成 そして使用します ファイルの読み取り/readFileEx. 。ファイルを閉じることを忘れないでください クローズハンドル

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top