2010-08-30 36 views
7

我GOOGLE了很多,我找不到任何回答這個問題......WriteFile的錯誤#5「拒絕訪問」低贏VISTA/7

我有一個C++控制檯應用程序讀取1GB的SD卡修復不正確關閉的文件並相應地寫入FAT表。 SD卡最初由定製設備中的固件寫入。 它工作正常到Xp並停止在Win Vista/7下工作。 我試圖提升權限:在管理員帳戶類型中,我使用「以管理員身份運行」方法啓動了cmd窗口,但沒有運氣。 我也嘗試了一個清單,要求最高可用特權,但沒有運氣。

我在某篇文章中讀到「Windows Vista不允許你從用戶模式進程訪問磁盤。有沒有人知道繞過這種行爲的任何方式?

我的解決辦法的工作,但是我想知道這是不可能或不

編輯:

這是我在這裏的第一篇文章,所以我不太明白有關連結的問題......但我不會reated任何垃圾郵件在所有...只是在一個comunity驅動的網站:)

代碼看起來像

hDevice = CreateFile(buffer,GENERIC_READ | GENERIC_WRITE, 
     FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL); 

然後我從SD中讀取BTB信息並查找和不正確地關閉文件。

試圖寫入SD

WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0) 

我得到拒絕訪問最後,當(錯誤#5)

上的CreateFile(字符串)是\ \ G:爲政函對應到我機器上的SD卡。所有這些工作都很好,正如我之前說的那樣,在XP上炒作。我也嘗試過使用:DeviceIoControl和FSCTL_LOCK_VOLUME,但這會導致mem錯誤。

希望這有助於理解和感謝所有幫助

+1

+1:「在工作區的工作」 ...... – Chubsdad 2010-08-30 13:40:05

+0

我們有了是從Vista/7訪問原始磁盤文件的方式 - 是怎麼回事能公用事業準備linux開機USB棒安裝他們的bootloader? – bdonlan 2010-08-30 13:49:14

+0

@andy,你可以發佈一些示例代碼來顯示你在做什麼,這樣我們可以看到什麼可能是錯的? – bdonlan 2010-08-30 13:51:17

回答

2

我認爲這是由於路徑字符串「緩衝」;我遇到了同樣的問題。 您用於獲取設備訪問權的路徑需要看起來像這個「\\。\ PhysicalDrive%d」 %d是驅動器的十進制數。

從這個字符串的Vista是CASE SENSITIVE。 檢查拼寫。您還需要管理員權限,就像在XP中一樣。

For Volumes ,.該信件需要大寫 例如「\\。\ G:」

另請注意,將SD卡作爲設備而不是捲來訪問要好得多,因爲如果Windows安裝它,可能會有一個文件系統掛載有寫入緩存。

此外:我忘了提及您讀/寫數據的緩衝區應該是頁面對齊的,並且讀取扇區大小的倍數。 VirtualAlloc()這樣做

+1

感謝您的編輯Balpha! 謝謝多米尼克你的答案:) 我認爲在CreateFile中lpFileName的語法總是以\\。\開頭,如http://msdn.microsoft.com/en-us/library/aa363858%28VS.85 %29.aspx 看來,大寫的大寫字母在我的情況下根本沒有幫助。 我也嘗試\\。\ PhysicalDriveXX(XX在我的情況是1),但稍後在 ReadFile(hDevice,inf_buffer,SD_SECTOR_SIZE,&tmp,0); 在inf_buffer中沒有返回任何內容,但是是空的。 但是CreateFile並沒有抱怨。這最後一個測試在XP下使用ms vC++ 6進行調試(dev機器) – andy 2010-08-31 15:21:28

+0

Thanks andy - 我輸入的路徑有兩個斜線,但斜線是一個轉義字符,所以您實際上必須輸入四才能得到兩個。我還記得有關緩衝區對齊的一點。 如果您可以打開文件,名稱和權限是正確的,如果讀取失敗,它是緩衝區大小/對齊和/或「鎖定」。 我認爲當你想寫時,鎖定更重要。 – 2010-08-31 16:45:37

0

在寫入原始數據之前,您必須卸除卷。

從MSDN:

上的卷手柄寫會成功,如果卷沒有安裝的文件系統,或者如果滿足下列條件之一爲真:

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

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

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

Sample code

BOOL bResult = DeviceIoControl(hDevice,    // device to be queried 
           FSCTL_DISMOUNT_VOLUME, // operation to perform 
           NULL, 0,    // no input buffer 
           pdg, sizeof(*pdg),  // output buffer 
           &junk,     // # of bytes returned 
           (LPOVERLAPPED)NULL); // synchronous I/O 
+5

始終在您的答案中包含*鏈接*到相關的MSDN文章/文檔。 – 2012-01-26 19:20:23