2012-10-17 110 views
2

我搜索了很多以獲得寫入 - 引導扇區(主文件表)的訪問權限。我使用了CreateFile函數,寫訪問參數如GENERIC_WRITE。然後用SetFilePointerWriteFile寫在一個特定的內存地址上。但我總是得到的是System.AccessViolationException(Windows 7)。我在這裏做錯了什麼?VC++ - 如何獲得寫入NTFS引導扇區的權限?

我想知道是否有任何替代CreateFile - WriteFile函數來獲取wrtie - 訪問引導扇區?

或者我在想如果有任何方法使用Interrup服務例程在VC++(C++/Cli)中寫入特定的磁盤扇區?

+0

ISR與.net?祝你好運。 – Dani

+0

http://www.codeproject.com/Questions/279229/Code-in-C-to-Access-the-master-boot-record-MBR – rkosegi

回答

3

根據Microsoft KB,你必須在"\\.\PhysicalDriveN",其中N是從零開始的物理驅動器索引調用CreateFileFILE_SHARE_READFILE_SHARE_WRITE。然後,您可以將整個驅動器作爲一個巨大的文件訪問。您必須成爲您機器上的管理員才能使用!

您可以使用CreateFile() 應用程序編程接口(API)與這些設備名稱 打開一個物理或邏輯驅動器,前提是您有適當的訪問權限的驅動 (也就是,你必須是管理員)。您必須同時使用 CreateFile()FILE_SHARE_READFILE_SHARE_WRITE標誌才能獲得對變頻器的訪問 。

一旦邏輯或物理驅動器被打開,然後您可以對整個驅動器上的數據執行直接I/O操作。在執行 直接磁盤I/O時,您必須以設備的扇區大小和扇區邊界的多個扇區進行尋道,讀取和寫入操作。使用IOCTL_DISK_GET_DRIVE_GEOMETRY調用DeviceIoControl() 可獲取每個扇區的字節數,扇區數,每個磁道的扇區數等等,以便您可以計算您需要的緩衝區大小。

更新:我做了一些研究,我發現了Vista的開始,你必須得在捲上的鎖或卸除它。否則寫入會失敗。在the docs微軟稱:

如果直接寫,有一個安裝的文件系統卷,你 必須首先獲得對卷的獨佔訪問。否則,您可能會因爲 應用程序的寫入操作與來自 文件系統的其他更改相沖突而導致數據損壞或系統不穩定,從而導致數據損壞或系統不穩定,並且該卷的內容保留不一致的 狀態,從而導致風險 。爲防止出現這些問題,Windows Vista及更高版本中進行了以下更改 :

如果卷沒有安裝的文件系統,或者如果以下某個條件爲真:

  • 要寫入的扇區是引導扇區。
  • 要寫入的扇區位於文件系統空間之外。
  • 您已使用FSCTL_LOCK_VOLUMEFSCTL_DISMOUNT_VOLUME明確鎖定或卸除了卷。
  • 該卷沒有實際的文件系統。 (換句話說,它有一個RAW文件系統安裝。)

如果滿足下列條件之一爲真在磁盤手柄的寫操作將成功:

  • 扇區寫入做不在音量範圍內。
  • 待寫入的扇區位於已裝入的卷內,但您已使用FSCTL_LOCK_VOLUMEFSCTL_DISMOUNT_VOLUME明確鎖定或卸除卷。
  • 要寫入的扇區位於未裝入除RAW以外的文件系統的卷內。
+0

關於您的更新:這表示您不需要鎖定/卸除如果你只是寫引導扇區,只要你通過音量手柄書寫音量,不是嗎? – hvd

+0

@ hvd,原始問題中沒有足夠的信息。目前還不清楚OP是打開一個卷還是一個物理驅動器。他也可能錯誤地寫入其他地區。鎖定音量並查看問題是否消失很容易。 – detunized

+0

當然,雖然我沒有看到如何嘗試寫入文件系統數據可能導致「AccessViolationException」:幾乎可以肯定地指示不正確使用指針。 – hvd