异常0xc000041d的抛出过程
为了说明这个过程,我们必须写一个示例程序,如下:
#include "stdafx.h"
#include <tchar.h>
#include <stdio.h>
#include <Windows.h> #pragma comment(lib, "user32") WNDPROC oldproc = NULL; LRESULT CALLBACK newproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
throw ;
return oldproc(hwnd, uMsg, wParam, lParam);
} int _tmain(int argc, TCHAR *argv[])
{
HWND hWnd = CreateWindowEx(, TEXT("STATIC"), TEXT("Name"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, NULL, NULL);
oldproc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)newproc); UpdateWindow(hWnd); system("pause");
}
将上面的程序在vs建立工程编译运行,得到如下结果

退出,在vs里按下快捷建F11,程序中断后,给函数ZwRaiseException下断点

按F5运行程序,程序中断,观察到程序停在了_NtRaiseException@12

看下调用栈

可以看到此时正在抛出第一个异常,也就是真正的异常 throw 0;
按F5 继续运行程序,程序又中断了,可以看到此时又中断在_NtRaiseException@12,看下栈

这是第二次抛出异常,也就是抛出0xc000041d,我们观察下函数ntdll.dll!_LdrpLogFatalUserCallbackException@8() 
在这里里,填充了EXCEPTION_RECORD结构,紧接着调用了_NtRaiseException@12抛出异常。
简单来说,当程序产生了一个异常,首先走的还是正常的异常分发流程,当没有得到处理,又是在Windows系统的用户回调里发生的,会分发给_KiUserCallbackExceptionHandler去处理,_KiUserCallbackExceptionHandler里会调用_LdrpLogFatalUserCallbackException,_LdrpLogFatalUserCallbackException里会重新填充EXCEPTION_RECORD结构抛出异常0xc000041d。
异常0xc000041d的抛出过程的更多相关文章
- 异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)的抛出过程
新建一个c#控制工程,就用自动生成的代码,不用补任何代码,如下: using System; using System.Collections.Generic; using System.Linq; ...
- Atitti 跨语言异常的转换抛出 java js
Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...
- C++ EH Exception(0xe06d7363)----抛出过程
C++ EH Exception是Windows系统VC++里对c++语言的throw的分类和定义,它的代码就是0xe06d7363.在VC++里其本质也是SEH结构化异常机制.在我们分析用户崩溃的例 ...
- day 2 异常传递 ,抛出
1.异常的传递 def test1(): print("---test1--") print(num) print('---test1 over---') def test2(): ...
- ORACLE 存储过程异常捕获并抛出
for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...
- java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法
package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...
- JS异常捕获和抛出
try...catch 用来异常捕获(主要适用于IE5以上内核的浏览器,也是最常用的异常捕获方式) 使用onerror时间捕获异常,这种捕获方式是比较古老的一中方式,目前一些主流的浏览器暂不支持这种 ...
- EXCEPTION_HIJACK(0xe0434f4e)异常的抛出过程
样例工程 在VS2013里新建一个C#控制台工程,写下如下代码: using System; using System.Collections.Generic; using System.Linq; ...
- java-异常-自定义异常异常类的抛出throws
1 package p1.exception; 2 /* 3 * 对于角标是整数不存在,可以用角标越界表示, 4 * 对于负数为角标的情况,准备用负数角标异常来表示. 5 * 6 * 负数角标这种异常 ...
随机推荐
- Android 权限的一些细节
Android 权限的一些细节 1 哪些app属于system app?为了区分privilege app和system app,这里先说明system app是什么,避免之后的讨论概念混乱. 在Pa ...
- The underlying connection was closed: An unexpected error occurred on a receive
解决方法 webRequest.KeepAlive = false; ServicePointManager.ServerCertificateValidationCallback += (s, ce ...
- drf之组件(认证、权限、排序、过滤、分页等)和xadmin、coreapi
认证Authentication 可以在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_fr ...
- Beego 学习比较8:SQL语句
SQL语句 1> 常用的SQL语句 1->新增 insert into 表名(字段A,字段B,…) Values(字段A值,字段B值,…) 2->更新 update 表名 ...
- 18、git提交代码并将develop分支合并到master分支上
提交合并代码流程: git add .git commit -m ''git pushgit checkout mastergit merge develop //将develop 分支与master ...
- 99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?
本文转载自公众号:石彬的架构笔记,阅读大约需要8分钟. 作者:李瑞杰 目前就职于阿里巴巴,资深 JVM 研究人员 在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我 ...
- Linux命令ping
原文 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常. 语法 ping(选项 ...
- Laravel实现用户的注册、登录
一.安装 Laravel(使用 Laravel5.5) 通过 Composer 创建项目 composer create-project --prefer-dist laravel/laravel s ...
- 修改pyechart生成的HTML内容大小方法
1.目前安装pyechart后生成的图片默认大小为 width=800, height=400, 如图 2.想修改内容大小:找到C:\python\Lib\site-packages\pyechart ...
- k8s 挂载卷介绍(四)
kubernetes关于pod挂载卷的知识 首先要知道卷是pod资源的属性,pv,pvc是单独的资源.pod 资源的volumes属性有多种type,其中就包含有挂载pvc的类型.这也帮我理清了之间的 ...