Domanda

In C, utilizzando l'API standard di Windows, qual è il modo migliore per leggere un disco non formattato?Nello specifico, ho un MMC O scheda SD con dati, ma senza file system (non FAT16, non FAT32, solo dati grezzi).Se esistesse un modo semplice per aprire l'intera carta per l'accesso binario byte per byte, sarebbe fantastico.

Grazie!

È stato utile?

Soluzione

Vorrei andare con

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);

Tieni presente che per verificare di aver letto correttamente un settore devi verificare che il conteggio dei byte letti corrisponda al numero di byte che desideri leggere, ovveronella mia esperienza ReadFile() su un disco fisico può restituire TRUE anche quando non viene letto alcun byte (o forse ho solo un driver difettoso).

Il problema che rimane è determinare il numero dell'unità (0 come viene utilizzato nel mio esempio si riferisce a C:che probabilmente non è quello che vuoi).Non so come farlo, ma se hai solo un'unità collegata che non è formattata, dovrebbe essere possibile chiamando l'apertura di ciascuna PhysicalDrive in ordine e chiamando DeviceIOControl() con IOCTL_DISK_GET_DRIVE_LAYOUT_EX come comando:

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
}

Ma è solo una supposizione.

Altri suggerimenti

Riferimento alla funzione CreateFile su MSDN

Scorri verso il basso fino a "Dischi e volumi fisici": nota che le restrizioni di sicurezza su Vista non si applicano ai volumi senza filesystem, quindi starai bene anche su Vista alle condizioni che hai fornito.

Devi aprire il file del dispositivo con CreaFile e poi utilizzare LeggiFile/leggiFileEx.Non dimenticare di chiudere il file con ChiudiHandle

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top