문제

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:를 나타냅니다).아마도 당신이 원하는 것이 아닐 것입니다).어떻게 해야 할지 모르겠지만 포맷되지 않은 드라이브가 하나만 연결되어 있는 경우 각 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