ReadFile не сигнализирует об EOF в конце PhysicalDrive

Я пытаюсь реализовать эквивалент dd в Windows. [Уточнение: я пытаюсь воспроизвести if = / dev / hda of = / dev / hdb функциональность dd, чтобы перенести установку Windows на более крупный HD. Как ни странно, я уже пару раз успешно использовал этот подход. - Г]

Программа работает (я получаю исходные данные, скопированные на целевой диск), но не завершается сама по себе - мне нужно выполнить ее, как только я уверен, что весь исходный диск был прочитан.

У меня нет проблем с открытием и блокировкой исходного и целевого физических дисков с помощью синтаксиса "\\. \ PhysicalDriveX" в вызове CreateFile.

Моя проблема заключается в успешном обнаружении конца данных исходного диска.

В настоящее время я читаю фрагменты размером 32К, используя:

// doesn't work - won't detect End-of-valid drive data and reads endlessly
while (( success = ReadFile(hInfile, buffer, BUFSIZE, &nRead, NULL )) && nRead != 0) {
    // ... write the data to the target drive; break if it fails.
    // ... write a progress indicator to the console
}

// should execute but never does
if (! success) {
    // an error occurred, do cleanup.
}
else {
    // all done, unlock & close filehandles
    puts("ta da!");
}

EOF для «нормального» файла (во время синхронного io) сигнализируется ReadFile, возвращающим TRUE, но устанавливающим количество прочитанных байтов (nRead) равным 0. Это то, что я пытаюсь сделать в моем неуклюжем операторе while ().

ReadFile, похоже, возвращает блоки нулевых байтов после того, как он прочитал конец действительных данных на исходном PhysicalDrive.

Как правильно узнать, когда перестать читать? - должен ли я использовать IOCTL_DISK_GET_LENGTH_INFO перед тем, как начать? Это просто кажется немного избыточным, поскольку ReadFile должен сообщать EOF (или сбой) при чтении после конца диска.

Заранее спасибо.


person Gerard    schedule 29.07.2011    source источник


Ответы (1)


Согласно MSDN, вы должны проверить с GetLastError для ERROR_HANDLE_EOF. Может это поможет. Хотя в этом случае он также должен вернуть 0.

person Heinrich Ulbricht    schedule 29.07.2011
comment
Хммм, я в этом не уверен. Согласно документации SDK, GetLastError необходимо вызывать только в том случае, если ReadFile возвращает FALSE, и это требуется только для обнаружения EOF, если выполняется OVERLAPPED IO. Последний параметр моего вызова ReadFile - это ПУСТОЙ указатель; Я выполняю синхронный ввод-вывод. - person Gerard; 01.08.2011