Чтение неформатированных данных - PullRequest
2 голосов
/ 17 сентября 2008

В C, используя стандартный Windows API, как лучше всего читать неформатированный диск? В частности, у меня есть MMC или SD-карта с данными, но без файловой системы (не FAT16, не FAT32, только необработанные данные). Если бы был простой способ открыть всю карту для побайтного двоичного доступа, это было бы здорово.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 17 сентября 2008

Я бы пошел с

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 () на физическом диске может вернуть ИСТИНА, даже если байты не читаются (или, может быть, у меня просто драйвер с ошибкой).

Проблема, которая остается, заключается в том, чтобы определить номер вашего диска (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 голос
/ 17 сентября 2008

Ссылка на функцию CreateFile в MSDN

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

1 голос
/ 17 сентября 2008

Вы должны открыть файл устройства с помощью CreateFile и затем использовать ReadFile / readFileEx . Не забудьте закрыть файл с помощью CloseHandle

...