ReadFile无法正确读取字节

时间:2019-03-25 21:57:08

标签: c++ winapi

我正在尝试使用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: 问题图片: enter image description here

1 个答案:

答案 0 :(得分:4)

屏幕截图中的左侧文件是32位EXE文件。您突出显示的字节是文件中IMAGE_NT_HEADERS结构的地址。

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

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

您的程序可能是32位程序,因此由于称为file system redirection的Windows功能而访问了System32的32位版本(感谢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中的notepad.exe进行比较,或者将程序编译为64位。