通过Hook API的方式捕获程序异常时发现一个问题,代码片段如下:
if (addr)
{
...
VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
}
问题描述:以上代码在32位/64位XP、Win7及32位Win8上可以正常工作,但在64位Win8上执行时,WriteProcessMemory会出现违规访问的错误。看起来是访问权限的问题。
解决方法:将VirtualProtect换成VirtualProtectEX并设置权限为PAGE_EXECUTE_READWRITE即可。
如下:
if (addr)
{
...
VirtualProtectEx(GetCurrentProcess(), addr, size, PAGE_EXECUTE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtectEx(GetCurrentProcess(), addr, size, dwOldFlag, &dwTempFlag);
}
Hook API的方法请参考:http://blog.csdn.net/bopzhou/article/details/6708572