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

时间:2017-04-05 18:55:03

标签: winapi visual-c++

来自资源的文件传递给函数Change,它应该对每个字节值进行异或,但后来我得到了写访问冲突错误。

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;
    }
}

1 个答案:

答案 0 :(得分:1)

资源存在于只读内存中,您无法直接写入它们。

修改资源内容的唯一方法是使用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;
}