gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:43:54 26 4
gpt4 key购买 nike

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

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

最近几天我读了很多关于这些 SEH 的东西,但实际上我能找到的大部分是关于设置函数本地异常处理程序等....

如果我没记错的话,我需要以某种方式设置一个名为 FS[0] 的东西(它是线程本地的?)。


tl;博士

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

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


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

最佳答案

#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
*/

关于c - Windows下的全局异常处理程序(访问冲突),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22436191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com