我正在尝试安装某种第一次机会异常处理程序,它可以在取消保护(VirtualProtect()
)内存页面后恢复执行。
(我正在尝试安装一些观察点;不,VirtualAlloc函数设置观察点的可能性不我需要的东西;在那里我无法动态设置和取消设置内存的观察状态区域/页)
我在过去几天里已经阅读了很多关于这些SEH的事情,但实际上我发现的最多的是设置函数本地异常处理程序等....
如果我没错,我需要设置一些名为FS[0]
的东西(线程本地?)。
我想知道如何安装全局第一次机会(=恢复代码和重试最后一条指令的可能性)异常处理程序,它可以捕获硬件异常(如访问冲突)。
P.s。:我可以使用Assembly,C或C ++,但不能使用C#等。
注意:我通过SIGSEGV上的sigaction在POSIX系统下完成所有工作,但据我所知,Windows上没有这样的东西......
答案 0 :(得分:2)
#include <windows.h>
#include <stdio.h>
int xfilter(EXCEPTION_POINTERS *xp) {
int rc;
EXCEPTION_RECORD *xr = xp->ExceptionRecord;
CONTEXT *xc = xp->ContextRecord;
if(xr->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {
++xc->Eip;//Advanced by one(Probably xc->Eip += 2)//http://msdn.microsoft.com/en-us/library/ms679284(v=vs.85).aspx
rc = EXCEPTION_CONTINUE_EXECUTION;
} else {
rc = EXCEPTION_CONTINUE_SEARCH;
}
return rc;
}
int main() {
EXCEPTION_POINTERS * xp;
char *p = NULL;
__try {
fprintf(stderr, "%s", "before\n");
*p = 'X';//Access Violation
fprintf(stderr, "%s", "after\n");
}
__except(xfilter(xp = GetExceptionInformation())) {
fprintf(stderr, "%s", "Exception occurred\n");//NO EXECUTE WHEN EXCEPTION_CONTINUE_EXECUTION
}
return 0;
}
/* result
before
after
*/