Question

En C, à l'aide de l'API Windows standard, quel est le meilleur moyen de lire un disque non formaté? Plus précisément, je possède une MMC ou Carte SD avec des données, mais aucun système de fichiers (ni FAT16, ni FAT32, uniquement des données brutes). S'il existait un moyen simple d'ouvrir la carte entière pour un accès binaire octet par octet, ce serait formidable.

Merci!

Était-ce utile?

La solution

je voudrais aller avec

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

Veuillez noter que pour vérifier que vous avez bien lu un secteur, vous devez vous assurer que le nombre d'octets lus correspond au nombre d'octets que vous souhaitez lire, c'est-à-dire que, selon mon expérience, ReadFile () sur un disque physique peut renvoyer TRUE même si aucun octet n'est lu (ou peut-être que j'ai juste un pilote buggy).

Le problème qui reste est de déterminer votre numéro de lecteur (0, comme dans mon exemple, fait référence à C: ce qui n’est probablement pas ce que vous voulez). Je ne sais pas comment faire cela, mais si vous n'avez qu'un seul lecteur connecté qui n'est pas formaté, il devrait être possible d'appeler en ouvrant chaque lecteur PhysicalDrive dans l'ordre et en appelant DeviceIOControl () avec IOCTL_DISK_GET_DRIVE_LAYOUT_EX comme une commande:

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
}

Mais ce n'est qu'une supposition.

Autres conseils

Référence de la fonction CreateFile sur MSDN

Faites défiler jusqu'à "Disques et volumes physiques". - notez que les restrictions de sécurité sur Vista ne s'appliquent pas aux voulmes sans système de fichiers, donc tout ira bien même sur Vista dans les conditions que vous avez indiquées.

Vous devez ouvrir le fichier de périphérique avec CreateFile puis utilisez ReadFile / < a href = "http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx" rel = "nofollow noreferrer"> readFileEx . N'oubliez pas de fermer le fichier avec CloseHandle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top