2017-06-07 66 views
0

我正在用ReadFile讀取卷(邏輯驅動器)。我使用DeviceIoContro l和FSCTL_ALLOW_EXTENDED_DASD_IO代碼,因爲我想要訪問所有(包括最後一個)字節,並且嘗試讀取最後512個字節(ReadFile成功,但報告0字節讀取)並且看到了使用它的建議。不幸的是,ReadFile在調用DeviceIoControl之後調用失敗。 在代碼中,它看起來像這樣(所有的成功都檢查了簡潔省略):捲上的ReadFile在ERROR_INVALID_PARAMETER失敗後失敗FSCTL_ALLOW_EXTENDED_DASD_IO

HANDLE fd; 
    DWORD junk; 
    int lenToBeRead = 0x1000; 
    DWORD nread; 
    char* alignedBuf = new char[lenToBeRead]; 

    fd = CreateFile("path to volume", FILE_READ_DATA, 
     FILE_SHARE_READ | FILE_SHARE_WRITE, 
     NULL, OPEN_EXISTING, 0, NULL)) //success 

    DeviceIoControl(fd, FSCTL_ALLOW_EXTENDED_DASD_IO, 
     NULL, 0, NULL, 0, &junk, (LPOVERLAPPED) NULL) //success 

    ReadFile(fd, alignedBuf, (DWORD) lenToBeRead, &nread, NULL) 
    // fails with 0x57 code, ERROR_INVALID_PARAMETER 

與FD處理所有的工作是同步的。

編輯。我解決了這個問題。我正在嘗試讀取最後一個字節。所以我的卷的長度爲L = 0x...200,我的位置是pos = L - 0x200。在我做了FSCTL_ALLOW_EXTENDED_DASD_IO之前所做的事情 - 我剪切lenToBeRead以適合剩餘空間(因此,如果它是0x1000,它將更改爲0x200),因爲我發現ReadFile不保證將所有字節讀取到EOF在lenToBeRead的情況下大於當前句柄位置剩餘的字節量。這沒有幫助,ReadFile仍然返回成功和讀取0字節。我刪除了該修復程序,然後使用FSCTL_ALLOW_EXTENDED_DASD_IO,它將ReadFile發送給我,然後ERROR_INVALID_PARAMETERlenToBeRead = 0x1000。我完全忘記了第一次修復,並且現在和現在都記得它的工作原理。

+0

'ERROR_INVALID_PARAMETER'更快,因爲'lenToBeRead'或文件偏移量,您從中嘗試讀取是無效的。然而這個數據你沒有顯示 – RbMm

+0

你確定你正在嘗試閱讀的部門實際存在嗎?當您嘗試從物理驅動器而不是邏輯卷中讀取相同的扇區時會發生什麼? –

+0

@RbMm就是這樣。我忘了把'lenToBeRead'剪切成適合剩餘的空間。我編輯了我的問題來添加這些數據。謝謝。 – lyosha

回答

0

我找到了解決方案並將其添加到問題主體。 使用ReadFile時需要注意的一點是控制參數(長度)以避免跨越文件的邊界。 在做FSCTL_ALLOW_EXTENDED_DASD_IO的事情之前,我曾嘗試將其作爲修復程序,但它並沒有幫助。但FSCTL_ALLOW_EXTENDED_DASD_IO事情和邊界檢查的結合給了我想要的結果 - 我可以讀最後的字節。