Windows下的全局异常处理程序(访问冲突)

时间:2014-03-16 11:24:54

标签: c windows exception-handling access-violation

我正在尝试安装某种第一次机会异常处理程序,它可以在取消保护(VirtualProtect())内存页面后恢复执行。

(我正在尝试安装一些观察点;不,VirtualAlloc函数设置观察点的可能性我需要的东西;在那里我无法动态设置和取消设置内存的观察状态区域/页)

我在过去几天里已经阅读了很多关于这些SEH的事情,但实际上我发现的最多的是设置函数本地异常处理程序等....

如果我没错,我需要设置一些名为FS[0]的东西(线程本地?)。


TL;博士

我想知道如何安装全局第一次机会(=恢复代码和重试最后一条指令的可能性)异常处理程序,它可以捕获硬件异常(如访问冲突)。

P.s。:我可以使用Assembly,C或C ++,但不能使用C#等。


注意:我通过SIGSEGV上的sigaction在POSIX系统下完成所有工作,但据我所知,Windows上没有这样的东西......

1 个答案:

答案 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
*/