这里好奇:是否可以在Windows XP / Vista下使用.net托管代码调用Windows蓝屏死机?如果有可能,示例代码是什么?
仅仅为了记录,这不是出于任何恶意目的,我只是想知道实际杀死操作系统需要什么样的代码。
答案 0 :(得分:15)
键盘的东西可能是一个不错的选择,但如果您需要通过代码执行,请继续阅读...
你真的不需要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可能有一些特殊规定)。我自己没有测试过。
答案 1 :(得分:4)
我不知道它是否真的有用,我确定您需要管理员权限,但您可以设置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
重新启动
答案 2 :(得分:3)
我不得不说不。您必须p / invoke并与内核空间中的驱动程序或其他代码进行交互。虽然在未来的Windows版本中有一些关于托管驱动程序的讨论,但.NET代码远离这个领域。再等几年,你可以像我们的无管理朋友一样崩溃。
答案 3 :(得分:2)
据我所知,真正的BSOD要求内核模式代码失败。 Vista仍然具有BSOD,但它们的频率较低,因为新的驱动程序模型在内核模式下的驱动程序较少。任何用户模式失败都会导致您的应用程序被杀死。
您无法在内核模式下运行托管代码。所以如果你想要BSOD,你需要使用PInvoke。但即使这样也很困难。你需要做一些非常花哨的PInvokes才能在内核模式下获得barf。
但在成千上万的SO用户中,可能有人这样做了: - )
答案 4 :(得分:2)
您可以使用OSR Online的工具来触发内核崩溃。我自己从未尝试过,但我想你可以通过标准的.net Process类运行它:
答案 5 :(得分:1)
我曾经设法在Windows XP上使用.NET 1.1中的System.Net.Sockets不负责任地生成BSOD。我可以相当频繁地重复它,但遗憾的是那是几年前的事情,我不记得我是如何触发它的,或者已经有源代码了。
答案 6 :(得分:1)
在directx8或directx9中使用directshow尝试实时视频输入,大多数调用都转到内核模式视频驱动程序。当从实时视频捕获源运行回调过程时,我成功地获得了大量蓝屏,特别是如果你的回调需要很长时间,可以暂停整个内核驱动程序。
答案 7 :(得分:1)
当托管代码可以访问有故障的内核驱动程序时,它可能会导致错误检查。但是,直接导致BSOD的是内核驱动程序(例如,uffe的DirectShow BSOD,Terence Lewis的套接字BSOD,或者在将BitTorrent与某些网络适配器一起使用时看到的BSOD)。
对特权低级资源的直接用户模式访问可能会导致错误检查(例如,在Device\PhysicalMemory
上涂鸦,如果它没有首先损坏您的硬盘; Vista不允许用户模式访问物理记忆)。
如果您只想要转储文件,Mendelt建议使用WinDbg比利用内核驱动程序中的错误要好得多。遗憾的是,本地内核调试不支持.dump
命令,因此您需要通过串行或1394连接的第二台PC,或通过虚拟串行端口连接的VM。 LiveKd可能是单PC选项,如果您不需要内存转储的状态完全自洽。
答案 8 :(得分:0)
不幸的是,我知道如何做到这一点,因为我们服务器上的.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;
}
如果有人想知道我为什么要复制蓝屏,那就没什么恶意了。我已经修改了我们的日志类来接受一个参数告诉它write direct to disk,因为尽管调用了.Flush(),但BSOD之前的操作没有出现在日志中。我复制了服务器崩溃以测试日志记录更改。 VM正式崩溃,但是日志工作正常。
编辑:杀死csrss.exe似乎是导致蓝屏的原因。根据评论,这可能发生在内核代码中。
答案 9 :(得分:0)
这个不需要任何内核模式驱动程序,只需要一个SeDebugPrivilege。您可以按NtSetInformationProcess
或RtlSetProcessIsCritical
设置流程的关键,然后停止您的流程。您将在杀死csrss.exe时看到相同的错误检查代码,因为您在流程上设置了相同的“关键”标记。
答案 10 :(得分:0)
我发现,如果您具有管理员权限,则可以运行taskkill /F /IM svchost.exe
。这试图一次杀死几乎所有服务主机。