ReadFile не сигнализирует EOF в конце PhysicalDrive - PullRequest
2 голосов
/ 29 июля 2011

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

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

1 Ответ

0 голосов
/ 29 июля 2011

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

...