2008-09-17 4 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 :는 사용자가 원하지 않는 것임). 어떻게해야할지 모르겠지만 형식이 지정되지 않은 드라이브 하나만 연결하면 각각의 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 
} 

하지만 그것은 단지 추측입니다.

1

CreateFile function reference on MSDN

스크롤 파일을 닫습니다 잊지 마세요 - 당신은 괜찮을거야, 그래서 파일 시스템없이 voulmes 적용되지 않는 비스타의 보안 제한 사항에주의 심지어 당신이 준 조건 하에서 비스타에서도.