我正在用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_PARAMETER
在lenToBeRead
= 0x1000。我完全忘記了第一次修復,並且現在和現在都記得它的工作原理。
'ERROR_INVALID_PARAMETER'更快,因爲'lenToBeRead'或文件偏移量,您從中嘗試讀取是無效的。然而這個數據你沒有顯示 – RbMm
你確定你正在嘗試閱讀的部門實際存在嗎?當您嘗試從物理驅動器而不是邏輯卷中讀取相同的扇區時會發生什麼? –
@RbMm就是這樣。我忘了把'lenToBeRead'剪切成適合剩餘的空間。我編輯了我的問題來添加這些數據。謝謝。 – lyosha