尝试修改数组时出现写访问冲突
Write access violation when trying to modify array
来自
资源的文件被传递给函数 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;
}
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 尝试修改数组时出现写访问冲突
- C++,为什么在修改新分配的对象后会出现访问冲突
- Visual Studio 在修改传递到函数中的指针时C++访问冲突