2017-10-08 108 views
-3

我有下面的代碼:C++ ReadFile的崩潰問題

HANDLE hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 
    OPEN_EXISTING, 0, NULL); 
std::cout << "File Handle: " << hFile << std::endl; 

DWORD fileSize = GetFileSize(hFile, NULL); 
PVOID fileBuffer = VirtualAlloc(NULL, fileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
if (!fileBuffer) std::cout << "Couldn't allocate memory " << GetLastError() << std::endl; 
// Read the DLL 
if (!ReadFile(hFile, fileBuffer, fileSize, NULL, NULL)) std::cout << "Failed to read file " << GetLastError() << std::endl; 

我KernelBase.dll每個我打電話ReadFile的時候得到一個訪問衝突(0000005)。 此外,的CreateFile顯示

File Handle: 0000000000000040 

所有的時間,我也不太清楚,如果這是正常的正常處理與否。

Full Code, with error from debugger, VS2017

編輯:如果我打印的文件的大小,它示出了18

+0

該代碼工作正常,我讀一個160MB左右的文件。如果錯誤出現在您未顯示的代碼中,您可能會顯示一個完整的示例。 –

+0

我試着只執行我從主函數上面發佈的代碼(沒有其他任何東西),它仍然崩潰 – NVMESSD

+0

發佈完整的代碼和任何錯誤,你在問題的正文中得到的文本。 –

回答

4

從ReadFile的的MSDN文檔:

lpNumberOfBytesRead [出,可選]

指針到 接收使用同步hFile 參數時讀取的字節數。在執行任何工作或錯誤檢查之前,ReadFile將此值設置爲零。如果這是一個異步的 操作以避免可能的錯誤結果,請對此參數使用NULL。 僅當lpOverlapped參數不爲NULL時,此參數才能爲NULL。有關更多 信息,請參閱備註部分。

試試這個:

DWORD read; 
if (!ReadFile(hFile, fileBuffer, fileSize, &read, NULL)) std::cout << "Failed to read file " << GetLastError() << std::endl; 
+1

是的,我剛剛看到並撤消了我的評論。當它爲空時,它不會在Windows 10上引起任何問題。也許OP是在一個較舊的操作系統上,當byteRead ptr爲空時會崩潰......這只是一個猜測。 – selbie

+0

@selbie - 是的,在舊的Windows版本* ReadFile *寫入* lpNumberOfBytesRead *如果* lpOverlapped *爲0。從8.1開始(或者可能是7,我現在不檢查)* ReadFile *檢查* lpNumberOfBytesRead *爲0值,而不是在這種情況下寫入它 – RbMm