尝试修改数组时出现写访问冲突

Write access violation when trying to modify array

本文关键字:访问冲突 修改 数组      更新时间:2023-10-16
来自

资源的文件被传递给函数 Change 应该 XOR 每个字节值,但随后我收到写入访问冲突错误。

INT CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, INT nCmdShow)
{
    HRSRC hRes = FindResource(NULL, L"FILE", RT_RCDATA);
    if (hRes == NULL)
    {
        // print error
    }
    DWORD resSize = SizeofResource(NULL, hRes);
    HGLOBAL resData = LoadResource(NULL, hRes);
    byte *file = reinterpret_cast<byte*>(LockResource(resData));
    Change(file, resSize);
    return 0;
}
void Change(byte *data, int size)
{
    for (int i = 0; i < size; ++i)
    {
        data[i] ^= 2;
    }
}

资源存在于只读内存中,不能直接写入它们。

修改资源内容的唯一方法是使用 UpdateResource()(除非您直接WriteFile()磁盘上的可执行文件(,但不能在属于活动正在运行的进程的资源上使用其中任何一个,因为可执行文件作系统锁定。

因此,执行您正在尝试的操作的唯一方法是在可写内存中分配资源数据的单独副本,然后您可以对该副本执行任何您想要的操作,例如:

INT CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
{
    HRSRC hRes = FindResource(NULL, L"FILE", RT_RCDATA);
    if (hRes == NULL)
    {
        // print error
    }
    else
    {
        DWORD resSize = SizeofResource(NULL, hRes);
        HGLOBAL resData = LoadResource(NULL, hRes);
        LPVOID resDataPtr = LockResource(resData);
        byte *copy = new byte[resSize];
        memcpy(copy, resDataPtr, resSize);
        Change(copy, resSize);
        delete[] copy;
    }
    return 0;
}