我已获得以下代码:
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;
每次调用ReadFile时,我都会在KernelBase.dll中遇到访问冲突(0xC0000005)。 此外,CreateFile显示
File Handle: 0000000000000040
一直以来,我都不太确定这是否是正常的手柄。
Full Code, with error from debugger, VS2017
编辑:如果我打印文件大小,则显示18。
答案 0 :(得分:5)
来自ReadFile的MSDN文档:
lpNumberOfBytesRead [out,optional]
指向变量的指针 接收使用同步hFile时读取的字节数 参数。在进行任何工作之前,ReadFile将此值设置为零 错误检查。如果此参数是异步的,则对此参数使用NULL 操作以避免可能的错误结果。 此参数可以 仅当lpOverlapped参数不为NULL 时才为NULL。更多 信息,请参阅备注部分。
试试这个:
DWORD read;
if (!ReadFile(hFile, fileBuffer, fileSize, &read, NULL)) std::cout << "Failed to read file " << GetLastError() << std::endl;