ReadFile 未正确读取字节

Posted

技术标签:

【中文标题】ReadFile 未正确读取字节【英文标题】:ReadFile not reading the bytes correctly 【发布时间】:2019-03-25 21:57:07 【问题描述】:

我正在尝试使用 readfile 读取文件,将其存储到一个宽数组中,然后将其写入另一个文件。问题是,当我将它们并排放在 HxD 中时,一些字节是正确的(例如文本),但其他一切都完全不同。我也运行不了

struct a

    BYTE* buff;
    long siz;
;

int main()

    HANDLE hFile;
    a struct_a;

    if (hFile = CreateFileW(L"C:\\Windows\\System32\\notepad.exe", GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr))
    
        long lFileSize = GetFileSize(hFile, nullptr);

        if (lFileSize)
        
            struct_a.siz = lFileSize;
            struct_a.buff = new BYTE[struct_a.siz];

            if (ReadFile(hFile, struct_a.buff, struct_a.siz,
                nullptr, nullptr))
            
                CloseHandle(hFile);
            

        
    

    HANDLE h = CreateFileA("C:\\Users\\USER\\Desktop\\notepad_new.exe", GENERIC_WRITE, FILE_SHARE_WRITE, nullptr,
        CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr);

    WriteFile(h, struct_a.buff, struct_a.siz, nullptr, nullptr);

return 0;

我希望它能够正确读取文件,然后写入并让我能够运行它。


作为奖励,我还尝试在读取文件后在文件末尾写一些字节

struct_a.buff[struct_a.siz - 5] = L'A';

但它从未出现在任何地方。但是当我尝试在开头写它(删除括号)时,它写得很好。

编辑:我后来尝试阅读它,它奇怪地阅读了正确的字母

编辑 2: 问题图片:

【问题讨论】:

听起来很像您不想将文件作为文本文件处理,而应将其视为二进制数据。 解释进一步的伙伴 你们能告诉我我的问题是什么,而不是对我投反对票吗?我不是专家,但我尽我所能自己制作所有东西,所以我认为可能会出现一些错误 尚未投票。但是,您的代码示例缺少信息可能会让选民灰心。这可能不是您实际程序的真实表示。值得注意的是,我们看不到这些读取和写入是否发生在同一个函数中,或者究竟是在哪里定义了struct_a。关于您的“奖金”测试,这敲响了警钟。如果您没有看到任何更改,那么您可能从未真正写过(也许文件已经打开?)——打开文件后检查句柄是否有效,如果没有则发出错误。关于二进制模式,有必要避免换行转换。 实际上,“奖金”的问题是您分配了一个wchar_t 数组。不要将您的文件读取为wchar_t 值!文件大小以 字节 为单位。当您在 wchar_t 数组中寻址 size-5 元素时,这已经超出了文件的末尾。 【参考方案1】:

截图中左边的文件是一个 32 位的 EXE 文件。您突出显示的不同字节是文件中IMAGE_NT_HEADERS 结构的地址。

在地址 0xFC,这个结构的 4 个字节,2 个字节是 4C 01。这是 IMAGE_FILE_HEADERS 中的 Machine 字段,这个值表示机器是“i386”(即 32 位程序)。

在正确的文件中,地址改为0xEC,字节为64 86,即“AMD64”(即这是一个64位程序)。

您的程序可能是 32 位程序,因此它访问 System32 的 32 位版本,因为 Windows 功能称为file system redirection(感谢 Paul Sanders 提供的链接)。在 64 位 Windows 上,32 位程序将 System32 重定向到不同的文件夹(实际上称为 SysWOW64) - 根据此表:

                   32-bit System32        64-bit System32

32-bit program   C:\Windows\System32    C:\Windows\sysnative
64-bit program   C:\Windows\SysWOW64    C:\Windows\System32

您可以通过从 sysnative 读取 notepad.exe,或将其与 SysWOW64 中的而不是 System32 中的比较,或将您的程序编译为 64 位来解决此问题。

【讨论】:

你说的非常对,我不敢相信我没有看到这个。我什至有一个 ReadProcessMemory 调用返回不匹配的长度,因为我试图从 x86 编译的 exe 访问 x64 进程。非常感谢

以上是关于ReadFile 未正确读取字节的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中的 ReadFile()

Createfile2、ReadFile 和 WriteFile;为啥 ReadFile 不读取我在 WriteFile 中写的内容?

在 Meteor 中使用 fs 模块获取未捕获的 TypeError _fs2.default.readFile 不是函数

readfile & file_get_contents异同

WinAPI ReadFile 返回损坏的数据[关闭]

使用 ReadFile 时访问冲突读取位置