2011-07-29 3 views
2

Windows에서 dd를 구현하려고합니다. [설명 : dd의 if/dev/hda of =/dev/hdb 기능을 복제하려고합니다. Windows 설치를 더 큰 HD로 마이그레이션하기 위해서입니다. 기괴하게 충분히, 나는이 접근 방식을 두 번 성공적으로 사용했습니다. - G]ReadFile은 PhysicalDrive 끝 부분에서 EOF를 알리지 않습니다.

프로그램이 작동하지만 (대상 디스크에 복사 된 원본 데이터로 끝납니다.) 자체적으로 종료되지는 않습니다. 전체 원본 디스크를 읽은 후에야 만 tskill해야합니다.

CreateFile 호출에서 "\\. \ PhysicalDriveX"구문을 사용하여 원본 및 대상 실제 드라이브를 열고 잠그는 데 아무런 문제가 없습니다.

내 문제는 원본 드라이브 데이터의 끝을 성공적으로 감지하는 것입니다.

// 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시) TRUE 반환하지만, 0 읽은 바이트 수 (nRead)를 설정에서 ReadFile에 의해 신호된다

은 현재 내가 사용 32K 덩어리를 읽고 있어요 이것은 내 서투른 while() 문에서 시도한 것입니다.

ReadFile은 원본 PhysicalDrive의 유효한 데이터 끝을지나 읽으면 null 바이트 블록을 반환하는 것으로 보입니다.

언제 읽을 수 있는지 알 수있는 올바른 방법은 무엇입니까? - 시작하기 전에 IOCTL_DISK_GET_LENGTH_INFO를 사용해야합니까? ReadFile은 디스크 끝을 지나서 읽을 때 EOF (또는 실패)를보고해야하므로 조금 중복됩니다.

미리 감사드립니다.

답변

0

MSDN에 따르면 ERROR_HANDLE_EOF에 대해 GetLastError를 확인해야합니다. 아마 이것은 도움이 될 것입니다. 이 경우에도 0을 반환해야합니다.

+1

흠, 잘 모르겠습니다. SDK 설명서에 따르면 ReadFile이 FALSE를 반환하면 GetLastError를 호출하기 만하면되며 OVERLAPPED IO가 수행되는 경우 EOF를 검색하는 데 필요합니다. 내 ReadFile 호출의 마지막 매개 변수는 NULL 포인터입니다. 동기 IO를 수행 중입니다. – Gerard

관련 문제