如何在Windows XP和更高版本上导致BSOD?


14

有没有办法在Windows XP和更新版本上以编程方式引起BSOD?怎么样?

顺便说一句,只是为了澄清,这不是出于恶意目的。客户端要求能够以这种方式关闭/重新启动其LAN上的终端。当我问为什么时,他们说,因为它比正常的重新启动要快... :)

(我很好奇那些将程序迁移到超级用户的人不理解的是“以编程方式”的哪一部分。)


18
如果找到与编写驱动程序无关的驱动程序,请通知Microsoft,以便他们进行修复。
Erik

13
嗯 由于某种原因,它比正常重启的速度更快-不一定能正常关闭。如果您的程序关闭非常慢,那么中断它可能不是问题。如果您强行关闭或放弃任何与I / O硬件过于接近的东西,则可能会导致文件系统损坏等。请考虑将其等同于网络控制的重启电源的方法(我想这是可以出售的,可能会解决)您的问题……)

12
您的客户需要制度化,他的精神状况需要医疗团队的密切配合。
Darin Dimitrov

9
救护车通常也比自己开车去医院要快。但这并不是使其成为首选的旅行方式。
FreeAsInBeer 2011年

8
告诉您的客户按住电源按钮6秒钟。或者只是拉动电源线,那会更快。
汉斯·帕桑

Answers:


15

可以告知键盘驱动程序引起BSOD:

HKLM\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters

或(对于较旧的PS / 2键盘)

HKLM\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

还有设置一个REG_DWORD名为CrashOnCtrlScroll1

下次重新启动后,您可以通过Ctrl+ ScrollLk+ 强制蓝屏ScrollLk。在这种情况下,错误检查代码将为0xE2(MANUALLY_INITIATED_CRASH)。

如果您确实需要编程方法,则需要在该计算机上的某些驱动程序中查找漏洞,或者编写并安装一个调用的简单驱动程序KeBugCheckKeBugCheckEx

玩得开心 ;)

旁注:故意为驱动程序编写者或即使在处理恶意软件时导致崩溃,这非常有用。如果将系统配置为创建全内存转储,则将获得正在运行的系统的映像,可以对其进行进一步分析。考虑类似死锁的情况,在这种情况下调试器不一定在所有情况下都可以提供帮助。


4
这是真的?如果可以的话那太酷了!(不,我不想在任何计算机上进行测试。)
Andreas Rejbrand 2011年

3
是的,这实际上不是在开玩笑。这是驱动程序编写者使用了一段时间的东西,尽管我从脑海中一直不记得注册表位置是什么。不得不在我的笔记中查找它。
0xC0000022L

通过使用Ram或内部Hardisk键入printscreen或内存过多,我遇到了bsod。也许也利用系统。
Tech-IO


1

不知道确切的原因,但我相信Vista和7将默认关闭系统故障并且不显示BSOD。


可以,我想要那种行为。
陶Szelei

1
@FreeAsInBeer:实际上,这是因为您的系统设置告诉它在崩溃后重新启动。可以在计算机属性的“高级”选项卡中更改此设置。另外,如今创建的故障转储通常默认情况下是小型转储,这就是为什么重新启动如此之快以至于您根本看不到蓝屏的原因。但是,在那里,相信我;)
0xC0000022L

1
@STATUS_ACCESS_DENIED:我知道,我只是让他知道此变量的默认值设置为不显示BSOD,因此他知道如果没有按预期获得该属性,则要检查该属性。
FreeAsInBeer 2011年

@FreeAsInBeer:足够:)
0xC0000022L

1

通常,当操作系统或硬件内部发生严重错误时,会发生BSOD。从本质上讲,要使其中任何一个内部出错都非常困难,因为操作系统作者和硬件供应商都不喜欢糟糕的软件工程师使他们的产品看起来很糟糕并破坏用户体验的原因。

编写驱动程序是与操作系统和硬件足够接近并引起这种错误的几种方法之一。当然,在没有有目的的知识和管理特权的情况下,通常不会安装这种驱动程序,因此将其用于恶意目的非常困难。有了这种访问权限,如果没有BSOD或这种四处走动的手段,您可能会遭受更大的伤害。


1

蓝屏死机是内核恐慌。这意味着内核的一部分,操作系统的核心确实做了一些不好的事情。它可能是乱涂乱画的内存,它可能执行了本不应该包含的代码。以编程方式,您需要在内核空间中获取代码,然后以某种方式按需触发它。产品服务器有点冒险。

普通的Windows计算机在进程和内核中具有很多状态。无论需要进行什么清理以保持状态一致,都可以将其短路。

具体来说,BSOD是(通常)内核(或驱动程序)错误,内核处于错误状态,如此糟糕的感觉是它无法清理并宁愿重新启动,只是因为它没有而失去任何良好状态知道什么是好的,什么是坏的。任何缓冲区都无法刷新到磁盘。然后它将尝试在重新启动时进行清理,但是在关机/紧急情况下丢失了很多上下文,因此这将是保守的清除,必须从紧急情况中选择好坏的余数。

因此,关闭时您的一些优势在启动时就消失了,因为现在它需要弄清楚它的支腿从下面被切掉的位置。它需要运行chkdsk并清理处于部分写入状态的所有磁盘块。USB磁盘缓存很多。您可以关闭缓存,这样可以减少崩溃时丢失数据的可能性,但是如果不缓存,则可能会降低速度。您愿意丢失哪些文件?

简而言之,这是一个坏主意。即使发生清理,任何发生这种情况的生产机器也可能处于不稳定状态。这是不好的。

我只是说要关机然后重新启动。您将失去任何您认为是第一次需要重建服务器的时间节省,因为它无法启动或程序无法启动。


你错过了重点。在调试您编写的驱动程序问题时,有充分的理由导致按需产生BSOD。但是,我认为,由于其性质,这个问题不应该从SO迁移到这里。
0xC0000022L 2012年

@STATUS_ACCESS_DENIED我同意您的声明,但是如果您还记得最初的问题,它与调试无关,而是关闭系统的快捷方式。我认为这不是一个很好的理由。
Rich Homolka'3

0

不得不提及的是,杀死csrss.exe进程将使BSOD失效。但不是在最新的Windows(8、8.1)上。


这可以通过应用来完成。任何人都可以在Visual Studio Express中制作这样的应用程序(免费)。
pbies

这是代码0xC000021A(STATUS_SYSTEM_PROCESS_TERMINATED),顺便说一句。
0xC0000022L 2016年

0

来自https://www.mpgh.net/forum/showthread.php?t=1100477的代码段 适用于Windows 10.17134

#include <windows.h>
#pragma comment(lib, "ntdll.lib")

extern "C" NTSTATUS NTAPI RtlAdjustPrivilege(ULONG Privilege, BOOLEAN Enable, BOOLEAN CurrentThread, PBOOLEAN OldValue);
extern "C" NTSTATUS NTAPI NtRaiseHardError(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask,
PULONG_PTR Parameters, ULONG ValidResponseOptions, PULONG Response);

void BlueScreen()
{
    BOOLEAN bl;
    ULONG Response;
    RtlAdjustPrivilege(19, TRUE, FALSE, &bl); // Enable SeShutdownPrivilege
    NtRaiseHardError(STATUS_ASSERTION_FAILURE, 0, 0, NULL, 6, &Response); // Shutdown
}

在事件日志中似乎没有任何痕迹。在minidump中肯定会有痕迹吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.