Я пытаюсь реализовать эквивалент 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 (или сбой) при чтении после конца диска.
Заранее спасибо.