Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SetUnhandledExceptionFilter x64?_C++ - Fatal编程技术网

C++ SetUnhandledExceptionFilter x64?

C++ SetUnhandledExceptionFilter x64?,c++,C++,我正在尝试设置UnhandledExceptionFilter来处理进程中的异常 将SetUnhandledExceptionFilter设置为内存中的my function alloc(带页面\u EXECUTE\u READWRITE的VirtualAlloc) 其他内存中的其他函数崩溃,我希望Windows在内存中调用我的异常句柄 它在Win32中工作属性,但当我在Win32中构建它时,它会崩溃,但windows没有使用SetUnhandledExceptionFilter设置调用函数 #

我正在尝试设置UnhandledExceptionFilter来处理进程中的异常

  • 将SetUnhandledExceptionFilter设置为内存中的my function alloc(带页面\u EXECUTE\u READWRITE的VirtualAlloc)
  • 其他内存中的其他函数崩溃,我希望Windows在内存中调用我的异常句柄
  • 它在Win32中工作属性,但当我在Win32中构建它时,它会崩溃,但windows没有使用SetUnhandledExceptionFilter设置调用函数

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    LONG WINAPI OurSetUnhandledExceptionFilter(EXCEPTION_POINTERS * ExceptionInfo)
    {
        cout << "Gotcha!" << endl;
        Sleep(-1);
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    
    void Exception()
    {
        SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)OurSetUnhandledExceptionFilter);
        MessageBox(0, TEXT("Exception"), 0, 0);
    }
    
    typedef void (*fException)(void);
    
    DWORD WINAPI xf(LPVOID x)
    {
        fException a = (fException)x;
        a();//Call fException
    
        //Crash
        char *p = 0;
        p[1] = 0;//<-
    
        return 0;
    }
    
    int main()
    {
        LPVOID nef = VirtualAlloc(0, (INT64)main - (INT64)xf, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
        memcpy(nef, xf, (INT64)main - (INT64)xf);
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)nef, Exception, 0, 0);
        Sleep(-1);
        return 0;
    }
    
    #包括
    #包括
    使用名称空间std;
    长WINAPI OurSetUnhandledExceptionFilter(异常指针*ExceptionInfo)
    {
    
    cout
    memcpy
    执行此代码看起来不太合适。代码可能在到达
    SetUnhandledExceptionFilter
    调用之前就崩溃了,或者调用提供了从未调用过的无效回调。这在调试器下应该很容易看到。MSVC不会生成位置无关的代码,它会生成可重定位的code。第一个问题是这没有发生。它死的原因是异常处理在x64中的实现方式非常不同,它使用了一个搜索指令地址的函数表。您无法可靠地执行此操作。也不能确定
    main
    是否在
    xf
    之后-检查编译的co对函数类型的转换是一个很好的方法,可以让编译器不要告诉你是否有错误的签名。我是用release构建的,它正确地显示了MessageBox