如果我有一个函数foo(),我想使用VirtualProtectEx()来更改属性 函数foo()中的变量。
喜欢这个 VirtualProtectEx(GetCurrentProcess(),p,sizeof(DWORD),PAGE_READONLY和&old;);
当我设置“PAGE_READONLY”并进行编译时,按摩将显示访问冲突。
如果我设置“PAGE_READWRITE”,它将成功执行。
有什么问题?
答案 0 :(得分:0)
代码的问题是p
存储在堆栈中。通过调用VirtualProtectEx
,它将影响整个页面,而不仅仅是p
(每个内存页面是不能进一步分段的最小实体)。因此,如果您尝试仅更改p
的权限,则会更改整个页面的权限(在您的情况下为整个堆栈)。如果您将堆栈设置为只读,则无法再执行您的程序并导致您遇到内存访问冲突异常。因此,为了解决这个问题,请考虑在堆中分配p
并在完成后释放它们。