异常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 * 负数角标这种异常 ...
 
随机推荐
- MATBLAB学习笔记----基础绘图
			
整理自台大生机系郭彦甫.MATLAB系列教程,吐血推荐看这个视频,非计算机专业也能看懂,全程干货 MATLAB图形来自于“数据”,MATLAB不能理解函数. MATLAB绘图原理: 1.在特定范围生成 ...
 - Linux常用命令wc
			
wc名字来源: wc -- word, line, character, and byte count The wc utility displays the number of lines, wor ...
 - JavaScript入门(一)
			
JavaScript入门篇—开篇 Document对象 1Document对象表示当前页面,HTML在浏览器中是以DOM形式表示为树形结构.Document是DOM树的根节点.(因此需要查找DOM树中 ...
 - 任意图像尺寸变成目标尺寸(包含相应的boxes的变换)
			
def image_preporcess(image, target_size, gt_boxes=None): image = cv2.cvtColor(image, cv2.COLOR_BGR2R ...
 - Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间
			
Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间 一丶URLconf配置 ...
 - dubbo循序渐进 - 什么是RPC
			
RPC的核心并不在于使用什么协议.RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里.通过RPC能解耦服务,这才是使用RPC的真正目的.RPC的原理 ...
 - 【转载】Windows系统电脑通过命令msinfo32查看系统信息
			
在Windows操作系统中,可以使用msinfo32的操作命令查看操作系统相关信息,通过msinfo32命令可以查看到系统摘要,包括硬件资源.组件.软件环境等系统信息.其中系统摘要包括冲突/共享.DM ...
 - selenium 开启开发者工具(F12)
			
selenium 开启开发者工具(F12) options = webdriver.ChromeOptions(); options.add_argument("--auto-open-de ...
 - JAVA - Windows下JDK自动设置脚本
			
CMD窗口如果使用下面脚本代码出现乱码,则按照下文处理后,就可以了: https://www.cnblogs.com/sunylat/p/11308037.html @echo off echo ** ...
 - python3常用的内置函数
			
数学相关 abs(a) : 求取绝对值.abs(-1) max(list) : 求取list最大值.max([1,2,3]) min(list) : 求取list最小值.min([1,2,3]) su ...