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 を順番に開きIOCTL_DISK_GET_DRIVE_LAYOUT_EX
、コマンドとして DeviceIOControl() を呼び出すことで可能になるはずです。
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
}
しかし、それは単なる推測です。
CreateFileでデバイス ファイルを開き、ReadFile / readFileExを使用する必要があります。CloseHandleでファイルを閉じることを忘れないでください
「物理ディスクとボリューム」まで下にスクロールします。Vista のセキュリティ制限は、ファイルシステムのないボリュームには適用されないことに注意してください。そのため、Vista でも指定した条件下で問題ありません。