怎样让我的电脑蓝屏和自动重启之后不会自动重启

如何让你的电脑蓝屏 - CSDN博客
如何让你的电脑蓝屏
一、蓝屏概述
当系统发生了非常严重的错误时,系统会以蓝屏的形式停止工作。一般驱动程序中如果出现了空指针等错误,都有可能引发蓝屏。我们可以编写驱动程序实现一个蓝屏炸弹。
二、环境搭建
编译驱动程序需要大量的头文件、库文件。这些文件并没有附带在Visual Studio中。因此,如果需要编写驱动程序,需要先下载安装Windows Driver Development Kit(即DDK)。下载地址:&下载后用虚拟光驱加载安装。
三、编写驱动程序
我从《Windows驱动开发技术详解》摘录了一段代码,贴在下面。
/*********************************************************
* 文件名称:Driver.h
* 完成日期:
*********************************************************/
#pragma once
#ifdef __cplusplus
extern &C&
#include &NTDDK.h&
#ifdef __cplusplus
#define PAGEDCODE code_seg(&PAGE&)
#define LOCKEDCODE code_seg()
#define INITCODE code_seg(&INIT&)
#define PAGEDDATA data_seg(&PAGE&)
#define LOCKEDDATA data_seg()
#define INITDATA data_seg(&INIT&)
#define arraysize(p) (sizeof(p)/sizeof((p)[0]))
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT pD
UNICODE_STRING ustrDeviceN //设备名称
UNICODE_STRING ustrSymLinkN //符号链接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// 函数声明
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);
Driver.cpp
/********************************************
* 文件名称:Driver.cpp
* 完成日期:
*********************************************/
#include &Driver.h&
/****************************************************
* 函数名称:DriverEntry
* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
* 参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
pRegistryPath:驱动程序在注册表的中的路径
* 返回 值:返回初始化驱动状态
*****************************************************/
#pragma INITCODE
extern &C& NTSTATUS DriverEntry (IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
KdPrint((&Enter DriverEntry/n&));
KeBugCheckEx(0xxxxx);
//注册其他驱动调用函数入口
pDriverObject-&DriverUnload = HelloDDKU
pDriverObject-&MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchR
pDriverObject-&MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchR
pDriverObject-&MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchR
pDriverObject-&MajorFunction[IRP_MJ_READ] = HelloDDKDispatchR
//创建驱动设备对象
status = CreateDevice(pDriverObject);
KdPrint((&DriverEntry end/n&));
/************************************************
* 函数名称:CreateDevice
* 功能描述:初始化设备对象
* 参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
* 返回 值:返回初始化状态
************************************************/
#pragma INITCODE
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject)
PDEVICE_OBJECT pDevO
PDEVICE_EXTENSION pDevE
//创建设备名称
UNICODE_STRING devN
RtlInitUnicodeString(&devName,L&//Device//MyDDKDevice&);
//创建设备
status = IoCreateDevice( pDriverObject, sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
&pDevObj );
if (!NT_SUCCESS(status))
pDevObj-&Flags |= DO_BUFFERED_IO;
pDevExt = (PDEVICE_EXTENSION)pDevObj-&DeviceE
pDevExt-&pDevice = pDevO
pDevExt-&ustrDeviceName = devN
//创建符号链接
UNICODE_STRING symLinkN
RtlInitUnicodeString(&symLinkName,L&//??//HelloDDK&);
pDevExt-&ustrSymLinkName = symLinkN
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status))
IoDeleteDevice( pDevObj );
return STATUS_SUCCESS;
/************************************************
* 函数名称:HelloDDKUnload
* 功能描述:负责驱动程序的卸载操作
* 参数列表:
pDriverObject:驱动对象
* 返回 值:返回状态
*************************************************/
#pragma PAGEDCODE
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
PDEVICE_OBJECT pNextO
KdPrint((&Enter DriverUnload/n&));
pNextObj = pDriverObject-&DeviceO
while (pNextObj != NULL)
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
pNextObj-&DeviceE
//删除符号链接
UNICODE_STRING pLinkName = pDevExt-&ustrSymLinkN
IoDeleteSymbolicLink(&pLinkName);
pNextObj = pNextObj-&NextD
IoDeleteDevice( pDevExt-&pDevice );
/***********************************************
* 函数名称:HelloDDKDispatchRoutine
* 功能描述:对读IRP进行处理
* 参数列表:
pDevObj:功能设备对象
pIrp:从IO请求包
* 返回 值:返回状态
************************************************/
#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
KdPrint((&Enter HelloDDKDispatchRoutine/n&));
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp-&IoStatus.Status =
pIrp-&rmation = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint((&Leave HelloDDKDispatchRoutine/n&));
蓝屏是由KeBugCheck或KeBugCheckEx这两个函数引发的。这两个函数的原型如下:
VOID KeBugCheck(IN ULONG
BugCheckCode);
VOID KeBugCheckEx(IN ULONG
BugCheckCode,
IN ULONG_PTR
BugCheckParameter1,
IN ULONG_PTR
BugCheckParameter2,
IN ULONG_PTR
BugCheckParameter3,
IN ULONG_PTR
BugCheckParameter4);
其中KeBugCheckEx函数的第一个参数和KeBugCheck中的参数是一样的。关于这些参数,从下面一张蓝屏的图片中就能看出其作用了。
打开开始菜单,找到DDK的目录,展开Build Environment,选择与你电脑符合的编译环境。比如我的电脑是 Windows Vista x86。注意,有两个版本Checked和Free,类似与VC++中的Debug和Release版本。这里我们选择Free,可以去掉所有的调试符号,减小代码的文件尺寸。
在编译之前,我们需要准备两个文件,makefile和Sources
makefile只需一行:
!INCLUDE $(NTMAKEENV)/makefile.def
继承DDK默认配置
而Sources文件需要指明文件类型以及相关包含文件的路径
TARGETNAME=HelloDDK
TARGETTYPE=DRIVER
TARGETPATH=OBJ
INCLUDES=$(BASEDIR)//
$(BASEDIR)/inc//
SOURCES=Driver.cpp/
有了这些文件,我们就可以开始编译驱动程序了。
在编译环境的命令行窗口中,进入你存放源代码的目录,并执行build命令。如果编译成功的话你可以在当前目录下看到一个新的文件夹,进入最里层,你就能找到HelloDDK.sys这个驱动程序了。
由于这个驱动程序的作用是让电脑蓝屏,尽管并不会对你的电脑造成什么损害,但是在测试前请务必保存好你正在工作的文档,退出所有程序。电脑蓝屏了以后,你就只能重启了。
驱动程序不像应用程序那样可以直接运行。因此我们还需要一个加载程序来加载驱动程序。限于篇幅,本文对此不展开详细讨论。一下仅给出程序代码,同样来自《Windows驱动开发技术详解》一书。
#include &windows.h&
#include &winsvc.h&
#include &conio.h&
#include &stdio.h&
#define DRIVER_NAME &HelloDDK&
#define DRIVER_PATH &HelloDDK.sys&
//装载NT驱动程序
BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
char szDriverImagePath[256];
//得到完整的驱动路径
GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);
BOOL bRet = FALSE;
SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
//打开服务控制管理器
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( hServiceMgr == NULL )
//OpenSCManager失败
printf( &OpenSCManager() Faild %d ! /n&, GetLastError() );
bRet = FALSE;
goto BeforeL
//OpenSCManager成功
printf( &OpenSCManager() ok ! /n& );
//创建驱动所对应的服务
hServiceDDK = CreateService( hServiceMgr,
lpszDriverName, //驱动程序的在注册表中的名字
lpszDriverName, // 注册表驱动程序的 DisplayName 值
SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
szDriverImagePath, // 注册表驱动程序的 ImagePath 值
NULL, NULL, NULL, NULL, NULL);
//判断服务是否失败
if( hServiceDDK == NULL )
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
//由于其他原因创建服务失败
printf( &CrateService() Faild %d ! /n&, dwRtn );
bRet = FALSE;
goto BeforeL
//服务创建失败,是由于服务已经创立过
printf( &CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! /n& );
// 驱动程序已经加载,只需要打开
hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );
if( hServiceDDK == NULL )
//如果打开服务也失败,则意味错误
dwRtn = GetLastError();
printf( &OpenService() Faild %d ! /n&, dwRtn );
bRet = FALSE;
goto BeforeL
printf( &OpenService() ok ! /n& );
printf( &CrateService() ok ! /n& );
//开启此项服务
bRet= StartService( hServiceDDK, NULL, NULL );
if( !bRet )
DWORD dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )
printf( &StartService() Faild %d ! /n&, dwRtn );
bRet = FALSE;
goto BeforeL
if( dwRtn == ERROR_IO_PENDING )
//设备被挂住
printf( &StartService() Faild ERROR_IO_PENDING ! /n&);
bRet = FALSE;
goto BeforeL
//服务已经开启
printf( &StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! /n&);
bRet = TRUE;
goto BeforeL
bRet = TRUE;
//离开前关闭句柄
BeforeLeave:
if(hServiceDDK)
CloseServiceHandle(hServiceDDK);
if(hServiceMgr)
CloseServiceHandle(hServiceMgr);
//卸载驱动程序
BOOL UnloadNTDriver( char * szSvrName )
BOOL bRet = FALSE;
SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
SERVICE_STATUS SvrS
//打开SCM管理器
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( hServiceMgr == NULL )
//带开SCM管理器失败
printf( &OpenSCManager() Faild %d ! /n&, GetLastError() );
bRet = FALSE;
goto BeforeL
//带开SCM管理器失败成功
printf( &OpenSCManager() ok ! /n& );
//打开驱动所对应的服务
hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );
if( hServiceDDK == NULL )
//打开驱动所对应的服务失败
printf( &OpenService() Faild %d ! /n&, GetLastError() );
bRet = FALSE;
goto BeforeL
printf( &OpenService() ok ! /n& );
//停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) )
printf( &ControlService() Faild %d !/n&, GetLastError() );
//打开驱动所对应的失败
printf( &ControlService() ok !/n& );
//动态卸载驱动程序。
if( !DeleteService( hServiceDDK ) )
//卸载失败
printf( &DeleteSrevice() Faild %d !/n&, GetLastError() );
//卸载成功
printf( &DelServer:eleteSrevice() ok !/n& );
bRet = TRUE;
BeforeLeave:
//离开前关闭打开的句柄
if(hServiceDDK)
CloseServiceHandle(hServiceDDK);
if(hServiceMgr)
CloseServiceHandle(hServiceMgr);
void TestDriver()
//测试驱动程序
HANDLE hDevice = CreateFile(&////.//HelloDDK&,
GENERIC_WRITE | GENERIC_READ,
OPEN_EXISTING,
if( hDevice != INVALID_HANDLE_VALUE )
printf( &Create Device ok ! /n& );
printf( &Create Device faild %d ! /n&, GetLastError() );
CloseHandle( hDevice );
int main(int argc, char* argv[])
//加载驱动
BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH);
if (!bRet)
printf(&LoadNTDriver error/n&);
//加载成功
printf( &press any to create device!/n& );
TestDriver();
//这时候你可以通过注册表,或其他查看符号连接的软件验证。
printf( &press any to unload the driver!/n& );
//卸载驱动
UnloadNTDriver(DRIVER_NAME);
if (!bRet)
printf(&UnloadNTDriver error/n&);
将此程序编译后和驱动程序放在同一个目录。运行即可蓝屏。
看到那湛蓝的屏幕了没?重新启动吧~(事实上如果蓝屏了,你是看不到这句话的……)
本文已收录于以下专栏:
相关文章推荐
昨天电脑出现蓝屏,所以今天就从网上找到一篇蓝屏代码来,以便以后出现蓝屏却不知道为什么。文章有点多,可以直接查找。
代码 含意 
0 0x0;作业完成。 
1 0x0000000...
最近有很多人问:为什么电脑系统重装之后,重启电脑出现蓝屏的现象,电脑无法正常进入系统。像这样的问题应该如何去解决呢?其实方法还是很简单的,下面小编就将电脑系统重装出现蓝屏的解决方法分享给大家吧。
0X0000000 操作完成
0X0000001 不正确的函数
0X0000002 系统找不到指定的文件
0X0000003 系统找不到指定的路径
0X0000004 系统无法打开文件
蓝屏后---自己应该做的几点首先呢,我们依旧要遵循先软后硬的原则:1.查询停机码把蓝屏中密密麻麻的E文记下来,接着到其他电脑中上网,进入微软帮助与支持网站:http://support.microso...
1.故障检查信息 ***STOP 0xxCxFDE38AF9,0xx7E8B0EB4) KMODE_EXCEPTION_NOT_HANDLED ...
玩电脑的都知道,宁愿电脑死机,黑屏,都不愿意蓝屏,因为什么了,因为产生蓝屏的问题实在是太多了。前几日,经我手上维修过一台电脑,就是蓝屏,可是谁叫你遇上了,干吧!不就是蓝吗,不怕搞不定,只怕不会搞(狂汗...
出现电脑蓝屏情况时,可以根据蓝屏代码的提示确定具体问题所在:推荐阅读:探讨交流:电脑蓝屏代码分析及解决方案
电脑蓝屏的常见原因汇总如下:
内存条接触不良或内存损坏导致电脑蓝屏
在系统运行...
(转载自格格物_新浪博客)
   前天遭遇XP蓝屏崩溃,代码是stop:c000021a,结果上网都不好上。用手机搜索了好多,终于看到了比较牛也感觉比较正确的解释,备案如下,有兴趣的朋友也可以看看...
我们常常在使用电脑中,有时会碰到电脑蓝屏,我们经常束手无策,不知道为什么会蓝屏?有些蓝屏后自动重启能正常进入系统,那么我们就可以借助工具进行分析。而有些可能需要进入到安全模式或者pe系统才会正常,那么...
使用Windows出现蓝色屏幕是经常的事,而且每每因为不清楚错误的来源而频繁重新安装系统,劳神费时。下列收集了一些Windows死机密码,供大家参考。
0x;操作完成
0x;不正确...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字) 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
电脑开机后蓝屏 重启后无法进入系统
下载积分:600
内容提示:电脑开机后蓝屏 重启后无法进入系统
文档格式:PDF|
浏览次数:503|
上传日期: 14:19:00|
文档星级:
全文阅读已结束,如果下载本文需要使用
 600 积分
下载此文档
该用户还上传了这些文档
电脑开机后蓝屏 重启后无法进入系统
关注微信公众号1.突然有一天,刚开机进入系统2分钟左右,突然蓝屏,重启后发现软驱似乎除了故障,开机检测软驱的时候支支的响的异常,而且偶尔还提示需要按F1才能进入系统,也就是说,蓝屏的发生和软驱的异常是同时出现的2.这天以后,几乎每天第一次开机进入系统之后,在5分钟之内都会蓝屏一次,我按reset重启一次后,就没事了,怎么用都不会蓝屏!为什么呢?3.这个蓝屏与软驱故障有没有关系呢?但是疑问的是,如果有关系,为什么蓝屏的时候基本都是在我浏览网页或QQ发来消息的瞬间蓝屏,而我当时并没有操作软驱,看似又好像与软驱没有关系。。。4.但又费解的是,为什么一次蓝屏重启系统后,就再也不会犯了
现在软驱都没怎么用了&&建议你吧软驱的和数据线拔掉试试……
可能是系统崩溃引起的,你先重做系统,不行再换根。如果内存有问题的话在安装系统过程中会不断文件丢失,请注意!
系统文件丢了
我把软驱从Bios设置里关了,windows下的设备管理器中的软盘驱动器也停止了,开机自检已经不检测软驱了,可是还是蓝屏
我有个朋友有个电脑也是这样的,换过了,还是这样,重新装系统了,也是,不知道怎么解决了,,,,,,一直郁闷中!!!!!
我朋友那个都没有软驱和光驱,哎,怎么搞啊。
您需要登录后才可以发帖
其他登录方式:

我要回帖

更多关于 怎么让电脑蓝屏 的文章

 

随机推荐