2010-02-28 90 views
2

當Windows準備進入休眠狀態時,我放下筆記本電腦,結果硬盤驅動器發生了磁頭崩潰。 (教會我下次使用自由落體傳感器來獲取硬盤驅動器和/或筆記本電腦。)無論如何,運行SpinRite以嘗試恢復數據導致磁盤上的所有備用扇區全部用完到目前爲止可回收的部門。 SpinRite現在仍在運行,但由於不再有備用扇區可供使用,我認爲除了告訴我所有壞道在哪裏之外,這將是徒勞無益的。如何在Windows中使用DeviceIoControl()讀取各個扇區/羣集?

無論如何,我正在計劃編寫一個應用程序來試圖從硬盤中恢復數據。從我過去的碎片整理中,我知道我可以使用FSCTL_GET_RETRIEVAL_POINTERS來找出任何給定文件的邏輯簇號。

我該如何着手嘗試讀取該實際羣集的扇區?通過MSDN列出的磁盤,文件和音量設備控制代碼,我沒有遇到任何事情,因爲我知道實際的集羣數據。

我是否應該甚至懶得試圖在低級別閱讀?我是否應該通過SetFilePointer()和ReadFile()調用來獲得適當的集羣大小偏移到文件中並讀取集羣大小的塊?

如果我正在嘗試讀取的文件有壞扇區,NTFS會將整個文件標記爲壞,並阻止我在將來訪問該文件?如果是這樣,我該如何告訴NTFS不要將該文件標記爲壞或已死? (請記住,HD現在沒有備用扇區需要重新映射。)

我是否應該清除我的* nix知識並弄清楚如何從/ dev /中讀取?

更新:我找到了我自己的問題的答案。 :-)解決方案是在卷句柄上而不是文件句柄上執行SetFilePointer()和ReadFile()。

回答

2

我找到了自己問題的答案。 :-)解決方案是在卷句柄上而不是文件句柄上執行SetFilePointer()和ReadFile()。

+0

'SetFilePointer'真的可以在卷控制器上工作嗎?我不知道... – Mehrdad 2011-03-20 06:35:51

+0

你可以分享代碼嗎?有一些數學我做錯了.. – lalli 2011-09-16 05:46:46

+0

爲什麼你必須訪問卷句柄,而不是文件句柄? – 2015-12-26 21:45:06