Вопрос

Как лучше всего прочитать неформатированный диск в C, используя стандартный API Windows?В частности, у меня есть ММК или SD Card с данными, но без файловой системы (не 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:что, вероятно, не то, что вам нужно).Я не знаю, как это сделать, но если у вас подключен только один диск, который не отформатирован, это должно быть возможно, вызвав открытие каждого физического диска по порядку и вызвав 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
}

Но это всего лишь предположение.

Другие советы

Справочник по функции CreateFile в MSDN

Прокрутите вниз до «Физические диски и тома» — обратите внимание, что ограничения безопасности в Vista не распространяются на файлы без файловой системы, поэтому с вами все будет в порядке даже в Vista при заданных вами условиях.

Вам необходимо открыть файл устройства с помощью СоздатьФайл а затем использовать ЧтениеФайла/readFileEx.Не забудьте закрыть файл с помощью ЗакрытьРучка

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top