Pergunta

Em C, usando a API do Windows padrão, que é a melhor forma de ler um disco não formatado?Especificamente, eu tenho um MMC ou Cartão SD com os dados, mas nenhum sistema de arquivos (não FAT16, FAT32 não, apenas dados brutos).Se houvesse uma maneira simples de abrir a carta inteira para byte por byte binário de acesso, que seria ótimo.

Obrigado!

Foi útil?

Solução

Eu iria com

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

Por favor, note que, a fim de verificar de que você acabou de ler com êxito de um setor, você deve verificar que a leitura contagem de bytes corresponde ao número de bytes que você queria ler, i.é.na minha experiência ReadFile() em um disco físico pode retornar VERDADEIRO mesmo quando não há bytes são lidos (ou talvez eu só tenho um condutor de carroça).

O problema que permanece é o de determinar a sua unidade de número (0, como é utilizado no meu exemplo refere-se ao C:que é provavelmente o que você quer).Eu não sei como fazer isso, mas se você tiver apenas um drive conectado que não está formatado, deveria ser possível chamando a abertura de cada PhysicalDrive em ordem e chamar DeviceIOControl() com IOCTL_DISK_GET_DRIVE_LAYOUT_EX como um 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
}

Mas isso é apenas um palpite.

Outras dicas

Função CreateFile referência no MSDN

Desloque-se para "Física de Discos e Volumes" - observe as restrições de segurança no Vista não se aplicam para voulmes sem um sistema de arquivos, então você vai ficar bem, mesmo em Vista sob as condições que você tem dado.

Você tem que abrir o arquivo de dispositivo com CreateFile e, em seguida, usar ReadFile/readFileEx.Não se esqueça de fechar o ficheiro com CloseHandle

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top