Pregunta

En C, utilizando la API estándar de Windows, ¿cuál es la mejor manera de leer un disco sin formato?En concreto tengo un MMC o tarjeta SD con datos, pero sin sistema de archivos (ni FAT16, ni FAT32, solo datos sin procesar).Si hubiera una manera sencilla de abrir toda la tarjeta para acceso binario byte a byte, sería genial.

¡Gracias!

¿Fue útil?

Solución

yo iría 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);

Tenga en cuenta que para verificar que ha leído correctamente un sector, debe verificar que el recuento de bytes leídos corresponda al número de bytes que desea leer, es decir,en mi experiencia, ReadFile() en un disco físico puede devolver VERDADERO incluso cuando no se leen bytes (o tal vez solo tengo un controlador con errores).

El problema que queda es determinar el número de unidad (0, como se usa en mi ejemplo, se refiere a C:que probablemente no sea lo que quieres).No sé cómo hacer eso, pero si solo tiene una unidad conectada que no está formateada, debería ser posible abriendo cada unidad física en orden y llamando a DeviceIOControl() con IOCTL_DISK_GET_DRIVE_LAYOUT_EX como 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
}

Pero eso es sólo una suposición.

Otros consejos

Referencia de la función CreateFile en MSDN

Desplácese hacia abajo hasta "Discos físicos y volúmenes". Tenga en cuenta que las restricciones de seguridad en Vista no se aplican a volúmenes sin un sistema de archivos, por lo que estará bien incluso en Vista bajo las condiciones que ha indicado.

Tienes que abrir el archivo del dispositivo con Crea un archivo y luego usar Leer archivo/leerFileEx.No olvides cerrar el archivo con CerrarManillar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top