2011-07-29 20 views
2

我試圖在Windows中實現dd等效功能。 [澄清:我試圖複製dd的=/dev/hdb =/dev/hdb功能,以便將Windows安裝遷移到更大的HD。奇怪的是,我現在已經成功地使用了這種方法。 - G]ReadFile在PhysicalDrive結束時不發送EOF信號

該程序工作(我結束了源數據複製到目標磁盤),但不會自行終止 - 我必須叮噹它,一旦我確定整個源磁盤已被讀取。

我在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同步期間),通過信號發送的ReadFile返回TRUE,但字節的讀取(NREAD)的數量設置爲0:

目前我使用讀32K組塊這是我在笨拙的while()語句中嘗試的。

ReadFile似乎一旦讀取了源物理驅動器上有效數據的末尾後,就會返回空字節塊。

知道何時停止閱讀的正確方法是什麼? - 我應該在開始之前使用IOCTL_DISK_GET_LENGTH_INFO嗎?它看起來有點多餘,因爲ReadFile應該在讀取磁盤末尾時報告EOF(或失敗)。

在此先感謝。

回答

0

根據MSDN你必須檢查GetLastError ERROR_HANDLE_EOF。也許這有幫助。儘管如此,它也應該返回0。

+1

嗯,我不確定這件事。根據SDK文檔,如果ReadFile返回FALSE,則只需要調用GetLastError,並且僅在執行OVERLAPPED IO時才需要檢測EOF。我的ReadFile調用的最後一個參數是一個NULL指針;我正在執行同步IO。 – Gerard