这里好奇:是否可以在Windows XP / Vista下使用.net托管代码调用Windows蓝屏死机?如果有可能,示例代码是什么?

仅仅为了记录,这不是出于任何恶意目的,我只是想知道实际杀死操作系统需要什么样的代码。

有帮助吗?

解决方案

键盘的东西可能是一个不错的选择,但如果您需要通过代码执行,请继续阅读...

你真的不需要barf,本身你需要做的就是找到KeBugCheck(Ex)函数并调用它。

http://msdn.microsoft.com/en-us/library/ ms801640.aspx http://msdn.microsoft.com/en-us/library/ms801645.aspx

对于手动启动的崩溃,您希望使用0xE2(MANUALLY_INITIATED_CRASH)或0xDEADDEAD(MANUALLY_INITIATED_CRASH1)作为错误检查代码。它们被明确保留用于该用途。

然而,找到这个功能可能会有点棘手。 Windows DDK可能有所帮助(检查Ntddk.h) - 我目前没有它可用,我现在似乎无法找到决定性信息 - 我认为它在ntoskrnl.exe中或ntkrnlpa.exe,但我不确定,目前还没有工具来验证它。

您可能会发现编写一个简单的C ++应用程序或调用该函数的东西更容易,然后运行它。

请注意,我假设 Windows不会阻止您从用户空间访问该功能(.NET可能有一些特殊规定)。我自己没有测试过。

其他提示

我不知道它是否真的有用,我确定您需要管理员权限,但您可以设置CrashOnCtrlScroll注册表项,然后使用SendKeys发送CTRL + Scroll Lock + Scroll Lock。

但是我相信这个来自键盘驱动程序,所以我猜一个简单的SendKeys不够好你需要以某种方式挂钩键盘驱动程序(听起来很乱)或检查CrashDump有一个可以使用P / Invoke调用的API。

http://support.microsoft.com/kb/244139

HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\ i8042prt \参数,点击 名称:CrashOnCtrlScroll
数据类型:REG_DWORD
价值:1
重新启动

我不得不说不。您必须p / invoke并与内核空间中的驱动程序或其他代码进行交互。虽然在未来的Windows版本中有一些关于托管驱动程序的讨论,但.NET代码远离这个领域。再等几年,你可以像我们的无管理朋友一样崩溃。

据我所知,真正的BSOD要求内核模式代码失败。 Vista仍然具有BSOD,但它们的频率较低,因为新的驱动程序模型在内核模式下的驱动程序较少。任何用户模式失败都会导致您的应用程序被杀死。

您无法在内核模式下运行托管代码。所以如果你想要BSOD,你需要使用PInvoke。但即使这样也很困难。你需要做一些非常花哨的PInvokes才能在内核模式下获得barf。

但在成千上万的SO用户中,可能有人这样做了: - )

您可以使用OSR Online的工具来触发内核崩溃。我自己从未尝试过,但我想你可以通过标准的.net Process类运行它:

http://www.osronline.com/article.cfm?article=153

我曾经设法在Windows XP上使用.NET 1.1中的System.Net.Sockets不负责任地生成BSOD。我可以相当频繁地重复它,但遗憾的是那是几年前的事情,我不记得我是如何触发它的,或者已经有源代码了。

在directx8或directx9中使用directshow尝试实时视频输入,大多数调用都转到内核模式视频驱动程序。当从实时视频捕获源运行回调过程时,我成功地获得了大量蓝屏,特别是如果你的回调需要很长时间,可以暂停整个内核驱动程序。

当托管代码可以访问有故障的内核驱动程序时,它可能会导致错误检查。但是,直接导致BSOD的是内核驱动程序(例如,uffe的DirectShow BSOD,Terence Lewis的套接字BSOD,或者在将BitTorrent与某些网络适配器一起使用时看到的BSOD)。

对特权低级资源的直接用户模式访问可能会导致错误检查(例如,如果它没有首先破坏您的硬盘,则会在 Device \ PhysicalMemory 上涂鸦; Vista不会允许用户模式访问物理内存)。

如果您只想要转储文件,Mendelt建议使用WinDbg比利用内核驱动程序中的错误要好得多。遗憾的是,本地内核调试不支持 .dump 命令,因此您需要通过串行或1394连接的第二台PC,或通过虚拟串行端口连接的VM。如果您不这样做, LiveKd 可能是单PC选项需要内存转储的状态完全自洽。

这个不需要任何内核模式驱动程序,只需要一个SeDebugPrivilege。您可以通过 NtSetInformationProcess ,或 RtlSetProcessIsCritical 并且只是杀死你的过程。您将杀死csrss.exe时会看到相同的错误检查代码,因为您设置相同的“关键”在你的过程中标记。

不幸的是,我知道如何做到这一点,因为我们服务器上的.NET服务导致蓝屏。 (注意:Windows Server 2008 R2,而不是XP / Vista)。

我简直不敢相信.NET程序是罪魁祸首,但确实如此。此外,我刚刚在虚拟机中复制了BSOD。

违规代码会导致0x00000f4:

string name = string.Empty; // This is the cause of the problem, should check for IsNullOrWhiteSpace

foreach (Process process in Process.GetProcesses().Where(p => p.ProcessName.StartsWith(name, StringComparison.OrdinalIgnoreCase)))
{
    Check.Logging.Write("FindAndKillProcess THIS SHOULD BLUE SCREEN " + process.ProcessName);
    process.Kill();
    r = true;
}

如果有人想知道我为什么要复制蓝屏,那就没什么恶意了。我已经修改了我们的日志类来接受一个参数告诉它直接写入磁盘尽管调用了.Flush(),因此BSOD之前的操作没有出现在日志中。我复制了服务器崩溃以测试日志记录更改。 VM正式崩溃,但是日志工作正常。

编辑:杀死 csrss.exe 似乎是导致蓝屏的原因。根据评论,这可能发生在内核代码中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top