电脑蓝屏实例故障总览(更新中)
的有关信息介绍如下:电脑蓝屏是电脑常见故障之一,故障现象看似雷同,但故障原因各有不同,所以比较棘手和难处理。
记住重新启动之后要在系统属性里面,关闭蓝屏自动重启。否则看不到蓝屏界面,无法得到蓝屏错误信息(尤其是XP系统要读取minidmp之类的文件十分麻烦),也就无法对症下药进行解决。设置方法:开始——运行(Win7及以上按win徽标+r),输入msconfig,回车,依次展开HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl,在右侧找到AutoReboot,双击,将数值数据设置为0
0 0x0000 作业完成。
1 0x0001 不正确的函数。
2 0x0002 系统找不到指定的档案。
3 0x0003 系统找不到指定的路径。
4 0x0004 系统无法开启档案。
5 0x0005 拒绝存取。
6 0x0006 无效的代码。
7 0x0007 储存体控制区块已毁。
8 0x0008 储存体空间不足,无法处理这个指令。
9 0x0009 储存体控制区块位址无效。
10 0x000a 环境不正确。
11 0x000b 尝试载入一个格式错误的程式。
12 0x000c 存取码错误。
13 0x000d 资料错误。
14 0x000e 储存体空间不够,无法完成这项作业。
15 0x000f 系统找不到指定的磁碟机。
16 0x0010 无法移除目录。
17 0x0011 系统无法将档案移到 其他的磁碟机。
18 0x0012 没有任何档案。
19 0x0013 储存媒体为著侧防写状态。
20 0x0014 系统找不到指定的装置。
21 0x0015 装置尚未就绪。
22 0x0016 装置无法识别指令。
23 0x0017 资料错误 (cyclic redundancy check)
24 0x0018 程式发出一个长 度错误的指令。
25 0x0019 磁碟机在磁碟找不到 持定的磁区或磁轨。
26 0x001a 指定的磁碟或磁片无法存取。
27 0x001b 磁碟机找不到要求的磁区。
28 0x001c 印表机没有纸。
29 0x001d 系统无法将资料写入指定的磁碟机。
30 0x001e 系统无法读取指定的装置。
31 0x001f 连接到系统的某个装置没有作用。
32 0x0020 the process cannot access the file because it is being used by another process.
33 0x0021 档案的一部份被锁定, 现在无法存取。
34 0x0022 磁碟机的磁片不正确。 请将 %2 (volume serial number: %3) 插入磁碟机 %1。
36 0x0024 开启的分享档案数量太多。
38 0x0026 到达档案结尾。
39 0x0027 磁碟已满。
50 0x0032 不支援这种网路要求。
51 0x0033 远端电脑无法使用。
52 0x0034 网路名称重复。
53 0x0035 网路路径找不到。
54 0x0036 网路忙碌中。
55 0x0037 the specified network resource or device is no longer available.
56 0x0038 the network bios command limit has been reached.
57 0x0039 网路配接卡发生问题。
58 0x003a 指定的伺服器无法执行要求的作业。
59 0x003b 网路发生意外错误。
60 0x003c 远端配接卡不相容。
61 0x003d 印表机伫列已满。
62 0x003e 伺服肺凤器的空间无法储存等候列印的档案。
63 0x003f 等候列印的档案已经删除。
64 0x0040 指定的网路名称无法使用。
65 0x0041 拒绝存取网路。
66 0x0042 网路资源类型错误。
67 0x0043 网路名称找不到。
68 0x0044 超过区域电脑网路配接卡的名称限制。
69 0x0045 超过网路 bios 作业阶段的限制。
70 0x0046 远端伺服器已经暂停或者正在起始中。
71 0x0047 由于连线数目已达上限,此时无法再连线到这台远端电脑。
72 0x0048 指定的印表机或磁碟装置已经暂停作用。
80 0x0050 档案已经存在。
82 0x0052 无法建立目录或档案。付驾珠
83 0x0053 int 24 失败
84 0x0054 处理这项要求的储存体无法使用。
85 0x0055 近端装置名称已经在使用中。
86 0x0056 指定的网路密码错误。
87 0x0057 参数错误。
88 0x0058 网路发生资料写入错误。
89 0x0059 此时系统无法执行其他行程。
100 0x0064 无法建立其他的系统 semaphore。
101 0x0065 属于其他行程专用的 semaphore 。
102 0x0066 semaphore 已经设定,而且无法关闭。
103 0x0067 无法指定 semaphore 。
104 0x0068 在岔断时间无法要求专用的 semaphore 。
105 0x0069 此 semaphore 先前的拥有权已经结束。
106 0x006a 请将磁片插入 %1。
107 0x006b 因为代用的磁片尚未插入,所以程式已经停止。
108 0x006c 磁碟正在使用中或被锁定。
109 0x006d pipe 已经中止。
110 0x006e 系统无法开启指定的 装置或档案。
111 0x006f 档名太长。
112 0x0070 磁碟空间不足。
113 0x0071 没有可用的内部档案识别字。
114 0x0072 目标内部档案识别字不正确。
117 0x0075 由应用程式所执行的 ioctl 呼叫 不正确。
118 0x0076 写入验证参数值不正确。
119 0x0077 系统不支援所要求的指令。
120 0x0078 此项功能仅在 win32 模式有效。
121 0x0079 semaphore 超过逾时期间。
122 0x007a 传到系统呼叫的资料区域 太小。
123 0x007b 档名、目录名称或储存体标签语法错误。
124 0x007c 系统呼叫层次不正确。
125 0x007d 磁碟没有设定标签。
126 0x007e 找不到指定的模组。
127 0x007f 找不到指定的程序。
128 0x0080 没有子行程可供等待。
129 0x0081 %1 这个应用程式无法在 win32 模式下执行。
130 0x0082 attempt to use a file handle to an open disk partition for an
operation other than raw disk i/o.
131 0x0083 尝试将档案指标移至档案开头之前。
132 0x0084 无法在指定的装置或档案,设定档案指标。
133 0x0085 join 或 subst 指令 无法用于 内含事先结合过的磁碟机。
134 0x0086 尝试在已经结合的磁碟机,使用 join 或 subst 指令。
135 0x0087 尝试在已经替换的磁碟机,使 用 join 或 subst 指令。
136 0x0088 系统尝试删除 未连结过的磁碟机的连结关系。
137 0x0089 系统尝试删除 未替换过的磁碟机的替换关系。
138 0x008a 系统尝试将磁碟机结合到已经结合过之磁碟机的目录。
139 0x008b 系统尝试将磁碟机替换成已经替换过之磁碟机的目录。
140 0x008c 系统尝试将磁碟机替换成已经替换过之磁碟机的目录。
141 0x008d 系统尝试将磁碟机 subst 成已结合的磁碟机 目录。
142 0x008e 系统此刻无法执行 join 或 subst。
143 0x008f 系统无法将磁碟机结合或替换同一磁碟机下目录。
144 0x0090 这个目录不是根目录的子目录。
145 0x0091 目录仍有资料。
146 0x0092 指定的路径已经被替换过。
147 0x0093 资源不足,无法处理这项 指令。
148 0x0094 指定的路径这时候无法使用。
149 0x0095 尝试要结合或替换的磁碟机目录,是已经替换过的的目标。
150 0x0096 config.sys 档未指定系统追踪资讯,或是追踪功能被取消。
151 0x0097 指定的 semaphore事件 dosmuxsemwait 数目不正确。
152 0x0098 dosmuxsemwait 没有执行;设定太多的 semaphore。
153 0x0099 dosmuxsemwait 清单不正确。
154 0x009a 您所输入的储存媒体标 元长度限制。
155 0x009b 无法建立其他的执行绪。
156 0x009c 接收行程拒绝接受信号。
157 0x009d 区段已经被舍弃,无法被锁定。
158 0x009e 区段已经解除锁定。
159 0x009f 执行绪识别码的位址不正确。
160 0x00a0 传到 dosexecpgm 的引数字串不正确。
161 0x00a1 指定的路径不正确。
162 0x00a2 信号等候处理。
164 0x00a4 系统无法建立执行绪。
167 0x00a7 无法锁定档案的部份范围。
170 0x00aa 所要求的资源正在使用中。
173 0x00ad 取消范围的锁定要求不明显。
174 0x00ae 档案系统不支援自动变更锁定类型。
180 0x00b4 系统发现不正确的区段号码。
182 0x00b6 作业系统无法执行 %1。
183 0x00b7 档案已存在,无法建立同一档案。
186 0x00ba 传送的旗号错误。
187 0x00bb 指定的系统旗号找不到。
188 0x00bc 作业系统无法执行 %1。
189 0x00bd 作业系统无法执行 %1。
190 0x00be 作业系统无法执行 %1。
191 0x00bf 无法在 win32 模式下执行 %1。
192 0x00c0 作业系统无法执行 %1。
193 0x00c1 %1 不是正确的 win32 应用程式。
194 0x00c2 作业系统无法执行 %1。
195 0x00c3 作业系统无法执行 %1。
196 0x00c4 作业系统无法执行 这个应用程式。
197 0x00c5 作业系统目前无法执行 这个应用程式。
198 0x00c6 作业系统无法执行 %1。
199 0x00c7 作业系统无法执行 这个应用程式。
200 0x00c8 程式码的区段不可以大于或等于 64kb。
201 0x00c9 作业系统无法执行 %1。
202 0x00ca 作业系统无法执行 %1。
203 0x00cb 系统找不到输入的环境选项。 \r
205 0x00cd 在指令子目录下,没有任何行程有信号副处理程式。
206 0x00ce 档案名称或副档名太长。
207 0x00cf ring 2 堆叠使用中。
208 0x00d0 输入的通用档名字元 * 或 ? 不正确, 或指定太多的通用档名字元。
209 0x00d1 所传送的信号不正确。
210 0x00d2 无法设定信号处理程式。
212 0x00d4 区段被锁定,而且无法重新配置。
214 0x00d6 附加到此程式或动态连结模组的动态连结模组太多。
215 0x00d7 can’’’’’’’’t nest calls to loadmodule.
230 0x00e6 the pipe state is invalid.
231 0x00e7 所有的 pipe instances 都在忙碌中。
232 0x00e8 the pipe is being closed.
233 0x00e9 no process is on the other end of the pipe.
234 0x00ea 有更多可用的资料。
240 0x00f0 作业阶段被取消。
254 0x00fe 指定的延伸属性名称无效。
255 0x00ff 延伸的属性不一致。
259 0x0103 没有可用的资料。
266 0x010a 无法使用 copy api。
267 0x010b 目录名称错误。
275 0x0113 延伸属性不适用于缓冲区。
276 0x0114 在外挂的档案系统上的延伸属性档案已经毁损。
277 0x0115 延伸属性表格档满。
278 0x0116 指定的延伸属性代码无效。
282 0x011a 外挂的这个档案系统不支援延伸属性。
288 0x0120 意图释放不属于叫用者的 mutex。
298 0x012a semaphore 传送次数过多。
299 0x012b 只完成 read/writeprocessmemory 的部份要求。
317 0x013d 系统找不到位于讯息档 %2 中编号为 0x%1 的讯息。
487 0x01e7 尝试存取无效的位址。
534 0x0216 运算结果超过 32 位元。
535 0x0217 通道的另一端有一个行程在接送资料。
536 0x0218 等候行程来开启通道的另一端。
994 0x03e2 存取延伸的属性被拒。
995 0x03e3 由于执行绪结束或应用程式要求,而异常终止 i/o 作业。
996 0x03e4 重叠的 i/o 事件不是设定成通知状态。
997 0x03e5 正在处理重叠的 i/o 作业。
998 0x03e6 对记忆体位置的无效存取。
999 0x03e7 执行 inpage 作业发生错误。
1001 0x03e9 递回太深,堆叠满溢。
1002 0x03ea 视窗无法用来传送讯息。
1003 0x03eb 无法完成这项功能。
1004 0x03ec 旗号无效。
1005 0x03ed 储存媒体未含任何可辨识的档案系统。 请确定以载入所需的系统驱动程式,而且该储存媒体并未毁损。
1006 0x03ee 储存该档案的外部媒体发出警告, 表示该已开启档案已经无效。
1007 0x03ef 所要求的作业无法在全萤幕模式下执行。
1008 0x03f0 an attempt was made to reference a token that does not exist.
1009 0x03f1 组态系统登录资料库毁损。
1010 0x03f2 组态系统登录机码无效。
1011 0x03f3 无法开启组态系统登录机码。
1012 0x03f4 无法读取组态系统登录机码。
1013 0x03f5 无法写入组态系统登录机码。
1014 0x03f6 系统登录资料库中的一个档案必须使用记录或其他备份还原。 已经还原成功。
1015 0x03f7 系统登录毁损。其中某个档案毁损、或者该档案的 系统映对记忆体 内容毁损、会是档案无法复原。
1016 0x03f8 系统登录起始的 i/o 作业发生无法复原的错误。 系统登录无法读入、写出或更新,其中的一个档案 内含系统登录在记忆体中的内容。
1017 0x03f9 系统尝试将档案载入系统登录或将档案还原到系统登录中, 但是,指定档案的格式不是系统登录档的格式。
1018 0x03fa 尝试在标示为删除的系统登录机码,执行不合法的操作。
1019 0x03fb 系统无法配置系统登录记录所需的空间。
1020 0x03fc 无法在已经有子机码或数值的系统登录机码建立符号连结。
1021 0x03fd 无法在临时机码下建立永久的子机码。
1022 0x03fe 变更要求的通知完成,但资讯 并未透过呼叫者的缓冲区传回。呼叫者现在需要自行列举档案,找出变更的地方。
1051 0x041b 停止控制已经传送给其他服务 所依峙的一个服务。
1052 0x041c 要求的控制对此服务无效
1053 0x041d the service did not respond to the start or control request in a timely fashion.
1054 0x041e 无法建立服务的执行绪。
1055 0x041f 服务资料库被锁定。
1056 0x0420 这种服务已经在执行。
1057 0x0421 帐户名称错误或者不存在。
1058 0x0422 指定的服务暂停作用,无法启动。
1059 0x0423 指定循环服务从属关系。
1060 0x0424 指定的服务不是安装进来的服务。
1061 0x0425 该服务项目此时无法接收控制讯息。
1062 0x0426 服务尚未启动。
1063 0x0427 无法连线到服务控制程式
根据您的电脑蓝屏故障,对比上面的代码,找到故障源。方面排查问题。
如果蓝屏代码固定是一个,就要考虑是,软件或者病毒方面的问题。
如果代码是不固定,就要考虑下,硬件方面的故障。重点是排查内存。
具体可以参考系列实际的案例。和您的电脑对比下,有助于大家尽快找到问题并解决。以下实际案例都是来自网络,被客户证实真的蓝屏原因,和有效的处理方法。
类别Ⅰ 硬件驱动问题包括:
0x0000000A IRQL_NOT_LESS_OR_EQUAL0x0000001E KMODE_EXCEPTION_NOT_HANDLED
0x00000050 PAGE_FAULT_IN_NONPAGED_AREA
0x0000008E KERNEL_MODE_EXCEPTION_NOT_HANDLED0x000000B4 VIDEO_DRIVER_INIT_FAILURE (常在开机时出现)
0x000000C5 DRIVER_CORRUPTED_EXPOOL0x000000D1 DRIVER_IRQL_NOT_LESS_OR_EQUAL(此代码也有可能是系统故障或者中毒)
0x00000116 VIDEO_TDR_ERROR(显卡驱动问题)
这几个错误代码蓝屏基本上都是硬件驱动程序错误导致的,解决办法也很简单,安装最新的公版非beta硬件驱动。如果无法进入系统而又需要在线下载驱动程序,可以尝试使用带网络连接的安全模式进行下载。
类型Ⅱ 硬件出伤
包括:
0x0000001A MEMORY_MANAGEMENT(硬盘或内存损坏,可能是硬盘/内存老化,内存接触不良,硬盘单次使用过于频繁等)
0x00000023 FAT_FILE_SYSTEM (硬盘FAT16/FAT32格式分区碎片过多,出现坏道或者出现物理损坏)
0x00000024 NTFS_FILE_SYSTEM(硬盘NTFS格式分区碎片过多,出现坏道或者出现物理损坏)
0x00000051 REGISTRY_ERROR(注册表出现问题,多有可能是硬盘出现问题)
0x0000007F UNEXPECTED_KERNEL_MOED_TRAP(硬件超频,过热,与主板不兼容等)
0x0000009C MACHINE_CHECK_EXCEPTION(CPU超频过度)
0x0000009F DRIVER_POWER_STATE_FAILURE(电源硬伤)
0x000000ED UNMOUNTABLE_BOOT_VOLUME(硬盘坏道或损坏,常在开机时出现)
0x000000F4 CRITICAL_OBJECT_TERMINATION(内存问题)
0x00000124 IRQL_NOT_LESS_OR_EQUAL(电源或者散热无法带动或很好地兼容CPU,多发生于高配组装台式机)
如果遇到这些错误代码,说明你的机子对应的硬件可能受到了损伤,必须还原其状态、返厂修复或者更换。
硬盘碎片可以在资源管理器窗口右键单击磁盘驱动器进行清理,硬盘坏道可以打开系统运行(快捷键win+r),输入chkdsk *:/f(*是驱动卷号,如C盘即chkdsk C:/f)并回车运行。
类型Ⅲ 软件问题(含系统、BIOS、中毒问题)包括:
0x0000003B SYSTEM_SERVICE_EXCEPTION0x0000005E CRITICAL_SERVICE_FAILED
0x0000007B INACESSIBLE_BOOT_DEVICE0x0000007E SYSTEM_THREAD_EXCEPTION_NOT_HANDLED(多发生于雨林木风等改装系统,亦有可能是电脑中毒引起)
0x000000A5 ACPI_BIOS_ERROR0x000000C2 BAD_POOL_CALLER
0xC000021 A STATUS_SYSTEM_PROCESS_TERMINATED
(常发生于开机时,以Win8及以上系统为多)如果遇到这些错误代码(0xA5、0x7B除外),首先进行杀毒,若杀毒后仍未解决,说明你的某些软件与系统不兼容,或者你的系统出现了问题,需要进行排查。尤其注意蓝屏时运行的程序。检查它们的更新,如果依然不能解决问题就将其卸载;如果是系统问题,可以先更改部分注册表对应值(具体方法需百度,比如0x7E在修改HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Intelppm的start值为4后即有解决可能),如还不能解决问题,则不得不重做系统。0xA5问题则需要升级bios,具体方法请根据电脑(bios)品牌百度查询。0x7B问题则先需要设置bios的SATA Mode改为IDE兼容,再按照上述解决办法进行排错。这个代码基本不会出现在Windows Vista及以上的系统中,因为出现此错误代码的原因是Windows XP不自带AHCI硬盘驱动而导致“不认识”AHCI硬盘,而Vista及以上系统则自带这个驱动。
类型Ⅳ 综合问题包括:
0x00000012 TRAP_CAUSE_UNKNOWN
0x00000019 BAD_POOL_HEADER如果遇到这两个蓝屏码,那么恭喜你,因为你的系统可能遇到了上面三个类型中的一个问题,也可能同时遇到了上面三个类型中的几个问题。必须将上面三个类型的问题全部排查一次。可以尝试使用系统事件查看器(运行EventVWR)查看问题来源。
一、0X0000000A 这个蓝屏代码和硬件无关,是驱动和软件有冲突造成的,最早发现这个代码是因为公司的DELL机器的USB键盘和QQ2007的键盘加密程序有冲突发现的这个问题。也在IBM T系列笔记本上装驱动失误产生过。 如果您的机器蓝屏了,而且每次都是这个代码请想一想最近是不是更新了什么软件或者什么驱动了,把它卸载再看一下。一般情况下就能够解决,如果实在想不起来,又非常频繁的话,那么没办法,重新做系统吧。
二、0X0000007B 这个代码和硬盘有关系,不过不用害怕,不是有坏道了,是设置问题或者病毒造成的硬盘引导分区错误。 如果您在用原版系统盘安装系统的时候出这个问题,那说明您的机器配置还是比较新的,作为老的系统盘,不认这么新的硬盘接口,所以得进BIOS把硬盘模式改成IDE兼容模式。当然了,现在人们都用ghost版的操作系统,比较新的ghost盘是不存在这个问题的。 如果您的操作系统使用了一段时间了,突然有一天出现这个问题了,那么对不起,病毒... 以下内容为百度知道操作系统分类管理员Ctangel个人总结,并非网络复制,全是个人日常工作中遇到并且明确确定原因的。如需复制请注明出处。这里列举几个典型的蓝屏故障的原因和解决办法。
三、0X000000ED 这个故障和硬盘有关系,系统概率比较大,硬盘真坏的概率比较小。我弄过不下二十个这个代码的蓝屏机器了,其中只有一个是硬盘真的有坏道了。剩下的都是卷出了问题,修复即可,这也是为数不多的可以修复的蓝屏代码之一。 修复方法是找原版的系统安装盘(或者金手指V6那个pe启动界面里就带控制台修复)。这里说用系统盘的方法,把系统盘放入光驱,启动到安装界面,选择按R进入控制台修复,进入控制台后会出现提示符C:\ 大家在这里输入 chkdsk -r 然后它就会自动检测并修复问题了,修复完成之后重新启动计算机就可以进入系统了,进入系统之后最好先杀毒,然后再重新启动一下试一下,如果正常了那就没问题了,如果还出这个代码,那就说明硬盘有问题了,需要更换,或者把有问题的地方单独分区,做成隐藏分区,用后面的空间来装系统。
四、0X0000007E、0X0000008E 这俩代码多是病毒造成的,杀毒即可。正常模式进不去可以开机按F8进安全模式。当然也有可能是内存造成的,可以尝试重新插拔内存,一般这代码内存损坏概率不大。
五、0X00000050 硬件故障,硬盘的可能性很大。如果每次都出这一个代码,首先换一块硬盘试一下机器能不能正常启动,如果测试硬盘没问题,再试内存,内存也试过的话,换CPU,总之这必是硬件故障。
六、coooo21a C开头的故障,它报的错很邪乎,报未知硬件故障,不过出这类C开头的代码多半与硬件无关。基本是与系统同时启动的一些驱动!或者服务的问题,举一个例子,一次我给一个笔记本的F盘改成了E盘,结果再启动就出这类C开头的代码,最后发现插上一个U盘就能正常启动,因为插上U盘系统里就有F盘了,然后我发现了隐藏的文件,是开机的时候系统写入的。我拔掉这个U盘这问题就又出现,后来把E盘改回F问题就没有了,想来是什么和系统一起启动的软件留在F盘一些文件,没有了它就会自己建,但是连F盘都没有了,也就只能报错了,所以看到这类蓝屏可以照比。
七、每次蓝屏的代码都不一样 这样的问题,基本上是硬件造成的,尤其以内存为第一个需要怀疑的对象,更换内存尝试,第二可能性是CPU虽然这东西不爱坏,可是从06年到现在我也遇到俩了,其他硬件基本上不会造成蓝屏代码随便变的情况。
八、偶尔蓝屏,而且代码一闪而过重新启动的问题 这个是有有两种可能 1、以XP为例,在我的电脑上点击鼠标右键选择属性,找到高级选项卡,找到下面的启动和故障修复项,点击设置。再弹出的窗口里找到中间‘系统失败’处有三个选项,第三项自动重新启动,把这项的勾选取消掉,以后再出问题蓝屏就会停住了。 2、已经做过上面的设置,但是还是会一闪而过重新启动的,那就是显卡或者CPU过热造成的,打开机箱查看散热风扇和散热器的状态吧。 另外开机就蓝屏看不见代码一闪而过然后自己重新启动的情况。这个时候已经不可能在系统里进行第一步的设置了,那么就要在机器启动的时候按F8,选择启动失败后禁用重新启动这项,选择之后启动失败了,系统就会停在蓝屏代码那里了,这样大家就可以照着蓝屏代码来查看问题了。
九、其他蓝屏代码 参考第七项,一般首先做系统确认是不是系统的问题,然后以以下顺序测试硬件,首先是内存可能性最大,然后是CPU,之后是硬盘,最后是显卡,主板基本不会蓝屏。
蓝屏模块是ntkrpamp.exe,蓝屏代码是IRQL_GT_ZERO_AT_SYSTEM_SERVICEWDK上的解释是:The IRQL_GT_ZERO_AT_SYSTEM_SERVICE bug check has a value of 0x0000004A. This indicates that a thread is returning to user mode from a system call when its IRQL is still above PASSIVE_LEVEL. 意思是返回用户层的时候IRQL >PASSIVE_LEVEL,那也就是说一般就是在DISPATCH级别了,这个驱动一直跑着正常的,就是前几天改了一个多线程资源竞争,用锁不当导致蓝屏的问题,用KSPIN_LOCK的时候,会提升中断到DISPATCH,所以可能是我没释放锁,一查果然是的,有一个分支返回之前没释放锁;
所以基本上蓝屏都是我们驱动引起,首先从自己问题找起,准备建一个蓝屏库,以后犯错也好有个可借鉴的地方,今天就写这个吧,赶了两个星期项目了,累跨了,看下海贼王的剧场版最强之Z,过段时间把以前遇到的蓝屏也加进来。
1.蓝屏代码IRQL_GT_ZERO_AT_SYSTEM_SERVICE
WDK:The IRQL_GT_ZERO_AT_SYSTEM_SERVICE bug check has a value of 0x0000004A. This indicates that a thread is returning to user mode from a system call when its IRQL is still above PASSIVE_LEVEL.
问题原因:线程里的某一个函数调用里用到了KSPIN_LOCK,获取了,但没有释放掉,导致中断级别在DISPATCH级别,这个时候运行环境切换回User Mode,IRQL>PASSIVE_LEVEL,导致蓝屏。
2.蓝屏代码IRQL_NOT_LESS_OR_EQUAL
WDK:The IRQL_NOT_LESS_OR_EQUAL bug check has a value of 0x0000000A. This indicates that Microsoft Windows or a kernel-mode driver accessed paged memory at DISPATCH_LEVEL or above.
这个蓝屏的话,是遇到比较多的,情况也各有不同;
(1)帮同事调自己建的同步IRP,结果Debug驱动没有问题,Release驱动就直接蓝屏,蓝屏代码就是这个,而且每次
都蓝屏在不同的驱动模块,蓝屏代码却不变,后来发现IoBuildSynchronousFsdRequest这个构建同步IRP的时候传入的事件没有初始化KeInitializeEvent,这样的事件理论上是无效的,底下驱动SetEvent的时候肯定会蓝屏,至于Debug没有蓝屏,可能Debug会给Event赋一个值;
(2)这次蓝屏是因为我先调用KeAcquireSpinLock,获取到了一把自旋锁,这样的话驱动会把IRQL 提升到了DISPATCH_LEVEL级别了,而在释放这把自旋锁之前,我又调用了IoDeleteDevice这个函数,而这个函数在WDK的定义上写明的IRQL:<=APC_LEVEL,所以发生了蓝屏,但是这个不是每次都能发生,这个不知道原因了。
3.DRIVER_PAGE_FAULT_IN_FREED_SPECIAL_POOL
The DRIVER_PAGE_FAULT_IN_FREED_SPECIAL_POOL bug check has a value of 0x000000D5. This indicates that a driver has referenced memory which was earlier freed.
(1)这个蓝屏引起的是DISK一个驱动,本以为系统disk掉了之后,我释放对应的驱动设备对象,系统也不会再发对应掉了的那块磁盘的任何irp下来,结果不了,还真发下来了。结果是空指针调用从而引发蓝屏;
(2)我这次也是,一个Irp已经被释放了,我在另一个线程里又调用了。
4. ASSERT 引起的蓝屏
ASSERT宏只在Debug编译的时候才有意义,在Release编译的时候是不起任何作用的,在Debug版本中如果没有调式器连接,当ASSERT不满足的时候,则会蓝屏,如果有调式器连接的话,调式器会显示相应的信息,如果输入g的话则会继续运行系统;
5.DRIVER_VERIFIER_IOMANAGER_VIOLATION
The DRIVER_VERIFIER_IOMANAGER_VIOLATION bug check has a value of 0x000000C9. This is the bug check code for all Driver VerifierI/O Verificationviolations
Q1:这个蓝屏是由于开启了verifier.exe中验证IO的功能,蓝屏原因根据蓝屏中参数显示来判断原因;我的这次蓝屏是因为The driver calledIoCompleteRequestwith a status marked as pending (or equal to -1).,由于定义了一个status,到结束这个irp的时候还是没有任何地方赋值给它,导致结束的时候这个值是-1,然后IRP complete的时候以-1来结束被verifier检查到而导致蓝屏;
Q2:第二个情况和第一个情况又很大不同,根据蓝屏参数Arg1:0000021dAnIRP dispatch handler has not properly detached from the stack below it upon receiving a remove IRP. (Device object, dispatch routine, and IRP specified.)这个意思是remove device 的时候处理不当,这点我有点想喷微软了,当然很多大牛书上和我处理IRP_MN_REMOVE_DEVICE的方式时一样的,先置一个标记位然后在线程里处理(因为自己拦截的IO还有些没处理,所以要等处理完这些IO再删除设备),但是这种处理方式不被微软认证认可,微软要求必须在IRP_MN_REMOVE_DEVICE指令下来的时候将设备IoDetachDevice和IoDeleteDevice,无奈,为了过微软认证,必须修改代码,上述的两个函数和下发Remove Irp都必须放在IoReleaseRemoveLockAndWait后面,否则也会蓝屏,这也是WDK上定义的;
Q3 :调用IoBuildDeviceIoControlRequest函数的时候中断在dispatch级别导致出错,不开启verifier系统不会蓝屏,只是线程会卡主,在dump中微软给出的解释是驱动发送一个IRP,但是这个IRP的major code 不符合的其对应的IRQL
6.PNP_DETECTED_FATAL_ERROR
The PNP_DETECTED_FATAL_ERROR bug check has a value of 0x000000CA. This indicates that the Plug and Play Manager encountered a severe error, probably as a result of a problematic Plug and Play driver.
这个蓝屏引起的原因,根据蓝屏参数的不同而不同,我这里arg1 =00000001,就是在枚举设备的时候检测到了两个device id 一样的设备,导致不是id唯一而引起的蓝屏;具体操作是我们公司软件做快照,然后回滚到源盘所在的那台服务器,导致出现两块guid一样的磁盘而蓝屏;
7.SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION
The SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION bug check has a value of 0x000000C1. This indicates that the driver wrote to an invalid section of the special pool.
引起这个蓝屏的原因是因为访问了非法的内存区域,一般都是越界;正常情况下我这个驱动虽然访问越界了,但是并不引起蓝屏,是在开了verifier对驱动检测特殊池的时候才发现问题的;原本代码最后例图:
这里对pInstanceName->Buffer分配了34个字节的分页内存,然后调用swprintf给内容赋值,L"%.8X_%.8X"这个长度是36因为,最后还有一个‘\0’结尾,所以这里访问了越界的内容,但是到这里还没有蓝屏,CWmiContext::WmiQueryReginfo这个函数是成功调用的,因为这个模块是系统调用的,所以WDK的规范释放也是系统调用函数里的,最后释放ExFreePool这个Buffer地址的时候蓝屏了,当时报的是WMiLib.sys驱动,我追踪汇编最后才发现释放的是我驱动里分配的地址;为什么是释放的时候才蓝屏呢,这可能要归结于Special Pool的检测了,指定了Special Pool检测之后会在分配的内存前后都加入一段标记,在释放的时候检测标记是否是原来的标记,如果不是,说明内存访问非法了;
8.开启Verifier无法关机,屏幕变灰屏;
开启Verifier对驱动检测特殊池,!Verifier看的时候池分配都是好的,但是就是关不了机(没有dump,只能靠分析了),刚开始以为是IRP_MJ_SHUTDOWN,IRP_MJ_POWER,这些指令没处理好,导致最后无法关机,但调式的时候发现这几个指令都正常处理完毕,同事努力调式发现IRP_MN_DEVICE_USAGE_NOTIFICATION,这个指令IocallDriver之后一直没返回,卡在这里了,没开Verifier的时候是好的,那也就是说这个指令处理不符合微软的要求了,这个指令我们一般就处理TypePaging,其他的两个类型,我们是直接PassThough的,仔细阅读微软关于这个指令的文档,当类型是TypeDumpFile和TypeHibernation的时候下发前需要Clear DO_POWER_PAGE标志,果然加上这个标志之后就过了Verifier不在灰屏了