如何在不出现 WER 对话框的情况下使 Windows-7 上的进程崩溃?

2024-03-19

是否有可能在不出现 Windows 错误报告 (WER) 对话框的情况下使 Windows-7 上的常规用户模式进程崩溃? (当 WER 正常启用且未应用任何特定标志时。)

注:我是not有兴趣禁用WER,我对崩溃场景感兴趣WER 尚未启动,尽管它应该启动Windows“静默”终止应用程序。

在 Windows XP 上,编写一个 C 或 C++ 应用程序(在用户模式下)非常简单,它会弄乱自己的地址空间,这样当最终引发访问冲突(或其他未处理的 Win32 异常)时,Windows XP 将只是默默地终止进程而不通知用户:

...
void stackbreaker() {
    printf("%s\n", __FUNCTION__);
    // global/static buffer
    static char buf[128] = "In a hole in the ground there lived a hobbit. And it burrowed through your stack. It even built a round door into you function.";
    // Get address on the stack
    char local;
    char* stack = &local;
    // nuke the stack:
    memcpy(stack - 64, buf, sizeof(buf));
    // Kaboom. No user defined unhandled exception filter will be called. Stack nuked.
    // Process will terminate silently on Windows XP.
    // But on Windows-7 you still get the WER dialog.
}
...

在一个简单的 C++ 项目中调用上述函数(在发布模式下——测试时注意那些编译器优化——而不是在调试器下运行)将:

  • 在 XP 下,静默终止该进程。
  • 在 Windows-7 下显示 WER 崩溃对话框。
  • 旁白:在任何情况下,它都不会调用您自己的未处理的异常过滤器,即使您通过SetUnhandledExceptionFilter

What I am wondering now is whether - under Windows 7 - the WER mechanism has been implemented in a way that I always get an error dialog for a crash[a] in my application, or whether there exist process corruption scenarios even in Windows 7, that will prevent the WER dialog from popping up?


我将添加一些我所做的阅读:

在书里通过 C/C++ 的 Windows(第五版,Richter,Nasarre) http://www1.wintellect.com/Resources/Details/86他们描述了“故障过程”中发生的情况(第 711 页):

  1. 异常过滤器。
  2. ...
  3. ...
  4. 内核检测到未处理的异常
  5. 阻止 ALPC 调用 Wer Service
  6. WER 报告开始生效。
  7. ...

现在,他们指出 Win7 的做法与 Windows XP 不同(引用本书第 710 页:)

...从 Windows Vista 开始,UnhandledExceptionFilter函数不再向 MS 的服务器发送错误报告。反而。内核检测到异常不是由用户模式线程处理的(步骤4)...

所以这意味着,有根本没办法一个进程“崩溃”——在 Vista 及更高版本中——以一种阻止 WER 启动的方式。我试图确认或反驳这一点。


[a]:显然,通过调用各种方法之一,可以轻松地“杀死”进程而不留下任何痕迹*exit or terminate*功能。问题是,如果您可以排除这样的终止原因,(如何)可能以阻止显示 WER 对话框的方式使 Win7 上的用户模式进程“崩溃”。


我查看了我的 Windows Internals 版本,但其中没有关于这个主题的太多内容。在早期版本中,Windows 错误报告例程发生在崩溃线程的上下文中。这意味着如果堆栈被丢弃(如您的示例中所示),它可能无法运行。

在 Vista 及更高版本中,它在崩溃线程的外部运行。此外,内核本身还负责在进程崩溃时通知 WER(通过高级本地过程调用)。

根据 Windows Internals 的说法,这些更改解决了进程消失的问题。我只能相信他们的话。显然,如果 WER 服务本身损坏(或停止),您仍然会遇到无声的崩溃。

EDIT

来自 Windows 内部原理,第 5 版,第 122 页:

在 Windows Vista 之前,我们描述的所有 [WER] 操作都必须发生在崩溃线程的上下文中...在某些类型的崩溃中...未处理的异常过滤器本身崩溃。这种“无声进程死亡”没有记录在任何地方。 ... Windows Vista 和更高版本改进了 WER 机制,如果未处理的异常过滤器本身崩溃,则通过从崩溃的线程外部执行此工作。

第 124 页:

...所有 Windows 进程现在都有一个错误端口,该端口实际上是由 WER 服务注册的 ALPC 端口对象。内核...将使用此端口向 WER 服务发送消息,然后该服务将分析崩溃的进程。 ...这解决了进程静默死亡的所有问题...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不出现 WER 对话框的情况下使 Windows-7 上的进程崩溃? 的相关文章

  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • 如何从具有管理员权限的应用程序接收键盘输入到非管理员应用程序?

    我编写了一个应用程序 该应用程序具有覆盖类型的窗口 可以通过热键显示和隐藏该窗口 而另一个应用程序具有焦点 所述另一个应用程序是一个以管理员权限运行的 DirectX 游戏 我已经尝试了 3 种可能的解决方案 以便在其他应用程序中按下我的热
  • 使用createremotethread注入dll

    createremotethread如何在进程内执行dll 它使用的参数之一是 loadlibraryA 所以我得到了它在进程中执行 loadlibrary 函数的部分 然后它应该将上下文切换到内核模式 dll 是否由具有 loadlibr
  • 完整的端到端教程 C++ 与 MYSQL Server 5.5

    我花了几个小时寻找关于如何使用 MYSQL Server 5 5 进行查询的完整端到端教程 这是使用 Visual Studio 2010 Express 的 Visual C 控制台应用程序 有人看过这个设置的实际工作教程吗 当所有内容都
  • 如何使用 COMMTIMEOUTS 等待字节可用但读取多个字节?

    我有一个 C 串行端口类 它具有用于读取操作的非阻塞和阻塞模式 对于阻塞模式 COMMTIMEOUTS cto GetCommTimeouts m hFile cto Set the new timeouts cto ReadInterva
  • 任务失败,因为找不到“sgen.exe”

    尝试在 Visual Studio 2008 Professional Edition 中构建项目时出现以下错误 任务失败 因为未找到 sgen exe 或者未安装正确的 Microsoft Windows SDK 该任务正在注册表项 HK
  • 有没有办法使用 win API 获取 HRESULT 值的字符串表示形式?

    win API 中是否有函数可用于提取 HRESULT 值的字符串表示形式 问题是 MSDN 中并未记录所有返回值 例如执行默认应用程序域 http msdn microsoft com en us library ms164411 asp
  • 不使用 DAO 压缩 Microsoft Access 数据库

    我用CDatabase类开一个ACCDB访问数据库 司机是 T Microsoft Access Driver mdb accdb 我可以打开并使用数据库 已经这样做很多年了 if DatabaseExist m strMDBPath AJ
  • 如何在 Win32 中获取特定的 TIME_ZONE_INFORMATION 结构?

    Win32 GetTimeZoneInformation 函数返回控制面板中设置的系统本地时区 如何获取另一个特定时区 有没有一个电话可以做到这一点 Tony 根据this http msdn microsoft com en us lib
  • WIN32,C++:是否可以在不隐藏窗口的情况下对窗口进行动画处理?

    我有一个编辑控件 一个文本字段 我想要为其设置动画 我想要的动画是它滑出 为该文本字段创建一条额外的线 我可以为我的文本字段设置动画并使其变大 但是要显示滑动动画 我首先必须隐藏它 这意味着整个文本字段会滑出 就像第一次从无到有一样 而不是
  • 使用 Python 将 Excel 中的图表导出为图像

    我一直在尝试将 Excel 中的图表导出为 Python 中的图像文件 JPG 或 ING 我正在查看 WIn32com 这是我到目前为止所拥有的 import win32com client as win32 excel win32 ge
  • 列表分隔符脚本

    如何从命令行更改列表分隔符 通常我必须编辑以下字段 控制面板 更改键盘或其他输入法 其他设置 我想创建一个 VBScript 单击它会自动更改 to 还有另一个可以返回的 一个脚本就足够了 该设置存储在注册表值中HKCU ControlPa
  • 如何将CString转换为整数和浮点数? [复制]

    这个问题在这里已经有答案了 我正在尝试转换CStringint 和 float 但无法找到任何 C 库函数来完成此操作 请帮忙 正确的UNICODE 符合规定的方式MFC如下 CString sInt T 10 int n ttoi sIn
  • 新显卡上的 nvoglv32.dll 中的绘制调用崩溃

    几天前 由于一些硬件更改 我设置了计算机并安装了新的 Windows 8 副本 其中 我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660 再次设置 Visual Studio 11 后 我从 Github 下载了
  • 从 java 与 C++ 程序通信

    我想从 java 中执行外部 exe 程序 exe 是一个 CLI 应用程序 它在运行时 scanf 中获取输入并根据输入进行输出 我可以使用 java 调用要执行的程序 Process p Runtime getRuntime exec
  • 为什么 cygwin 无法读取我的主目录中的 .ssh/config 文件?

    我正在使用 cygwin 并且正在尝试设置 ssh config 文件 Cygwin 的文件夹位于我的 C 驱动器中 我的主目录是 C Users USER 我注意到 当我编辑 C Users USER ssh config 时 cygwi
  • 如何使用 microsoft Visual C++ 编写调用 JNI 的代码 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我如何编写C代码microsoft
  • 更换 I 过滤器

    我目前正在使用 IFilters 从各种文件 word excel tiff pdf 等 中提取文本 据我所知 IFilter 已在 Windows 8 中停止使用 是否有人对如何在不安装本机应用程序的情况下提取文本有任何建议 如果有什么用
  • MFC 中标题栏上的关闭按钮

    在基于 Vc 6 0 对话框的 MFC 应用程序中 我不希望我的用户通过按窗口本身右上角的按钮 X 以及 Alt F4 来关闭窗口 我想显示一个消息框 你真的想关闭应用程序吗 如果用户单击 确定 按钮 则应用程序必须关闭 否则 如果用户单击
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐