2008-09-17 12 views
2

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

ありがとうございます!

答えて

4

私は

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をコマンドとして呼び出して可能でなければなりません:

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 
} 

しかしそれはちょうど推測です。

1

CreateFile function reference on MSDN

スクロールしてファイルを閉じることを忘れてはいけない - あなたは大丈夫ですので、ファイルシステムなしvoulmesには適用されませんVistaでセキュリティ制限に注意してください。あなたが与えた条件のもとでVista上でさえも。