해결책
나는 함께 갈 것이다
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
}
그러나 그것은 단지 추측일 뿐이다.
다른 팁
"물리적 디스크 및 볼륨"까지 아래로 스크롤합니다. Vista의 보안 제한은 파일 시스템이 없는 볼륨에는 적용되지 않으므로 지정한 조건에서는 Vista에서도 문제가 없습니다.
다음을 사용하여 장치 파일을 열어야 합니다. 파일 생성 그런 다음 사용 파일 읽기/readFileEx.다음으로 파일을 닫는 것을 잊지 마세요. 닫기 핸들
제휴하지 않습니다 StackOverflow