gpt4 book ai didi

c++ - ReadFile 没有正确读取字节

转载 作者:行者123 更新时间:2023-11-27 22:35:15 40 4
gpt4 key购买 nike

我正在尝试使用 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

最佳答案

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

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

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

可能你的程序是一个 32 位程序,所以它访问 32 位版本的 System32,因为一个名为 file system redirection 的 Windows 功能(感谢 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 位来解决此问题。

关于c++ - ReadFile 没有正确读取字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55347009/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com