Я пытаюсь реализовать эквивалент dd в Windows.[Пояснение: я пытаюсь воспроизвести функциональность if = / dev / hda of = / dev / hdb в dd, чтобы перенести установку Windows на больший HD.Как ни странно, я несколько раз успешно использовал этот подход.- G]
Программа работает (в результате я получаю исходные данные, скопированные на целевой диск), но не завершается сама собой - я должен пропустить ее, как только я уверен, что весь исходный диск прочитан.
У меня нет проблем с открытием и блокировкой исходного и целевого физических дисков с использованием синтаксиса "\\. \ 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 для «нормального» файла (во время синхронного ввода-вывода) сигнализируется ReadFile, возвращая TRUE, но установкаколичество прочитанных байтов (nRead) до 0. Это то, что я пытаюсь сделать в своем неуклюжем операторе while ().
Кажется, что ReadFile возвращает блоки нулевых байтов после того, как он прочитал после конца допустимых данныхна источнике PhysicalDrive.
Как правильно узнать, когда прекратить чтение?- следует ли мне использовать IOCTL_DISK_GET_LENGTH_INFO перед началом работы?Это просто кажется немного избыточным, так как ReadFile должен сообщать об EOF (или об ошибке) при чтении за концом диска.
Заранее спасибо.