繁体   English   中英

ReadFile无法正确读取字节

[英]ReadFile not reading the bytes correctly

我正在尝试使用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:问题图片: 在此处输入图片说明

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

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

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

您的程序可能是32位程序,由于Windows称为文件系统重定向的功能 (感谢Paul Sanders提供了链接),因此它可以访问System32的32位版本。 在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位来解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM