INVALID_PROCESS_DETACH_ATTEMPT (6)
Arguments:
Arg1: 00000000
Arg2: 00000000
Arg3: 00000000
Arg4: 00000000

Debugging Details:
------------------

CUSTOMER_CRASH_COUNT: 2

DEFAULT_BUCKET_ID: DRIVER_FAULT

BUGCHECK_STR: 0x6

PROCESS_NAME: BAVSvc.exe

LAST_CONTROL_TRANSFER: from 80508d2f to 805376df

STACK_TEXT:
ba6e5be0 80508d2f 00000006 8a715818 00000000 nt!KeBugCheck+0x14
ba6e5c00 8062cfd8 ba6e5c18 8a715818 00000000 nt!KeUnstackDetachProcess+0x118
ba6e5c50 f745664d 8a3105e8 8a6bdbb0 00000001 nt!MmProbeAndLockProcessPages+0x6a
ba6e5d54 ba711870 8ab61818 ba71708c e4446410 fltMgr!FltSendMessage+0x1db
ba6e5dac 80576320 00000000 00000000 00000000 Bfilter!ScUnInitExcludePath
ba6e5ddc 804ec7b9 ba7118a0 00000000 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16

深入内部,看是什么条件触发的蓝屏. 分析KeUnstackDetachProcess(x)里面的关键代码片段
.text:0041D02F cmp byte ptr [esi+165h], 0
.text:0041D036 jz loc_431CA1
.text:0041D03C cmp byte ptr [esi+48h], 0
.text:0041D040 jnz loc_431CA1
.text:0041D046 lea eax, [esi+34h]
.text:0041D049 cmp [eax], eax
.text:0041D04B jnz loc_431CA1
.text:0041D051 lea eax, [esi+3Ch]
.text:0041D054 cmp [eax], eax
.text:0041D056 jnz loc_431CA1

.text:00431CA1 loc_431CA1: ; CODE XREF: KeUnstackDetachProcess(x)+3Dj
.text:00431CA1 ; KeUnstackDetachProcess(x)+47j ...
.text:00431CA1 push 6 ; BugCheckCode
.text:00431CA3 call _KeBugCheck@4 ; KeBugCheck(x)

可见有四个条件导致 INVALID_PROCESS_DETACH_ATTEMPT 蓝屏,首先我们要排查是走到哪个分支出现问题.这里 esi 是存储当前线程对象的指针.
[esi+165h] 是取线程里 ApcStateIndex 的值, 看内存的值
0: kd> db @esi+165 l1
8ab544ed 01
也就是ApcStateIndex的值为1,不是因为ApcStateIndex错误导致的蓝屏,继续[esi+48h],是取线程里面ApcState->KernelApcInProgress的值,查看内存
0: kd> db @esi+48 l1
8ab543d0 00
ApcState->KernelApcInProgress的值为0,不是因为ApcState->KernelApcInProgress错误导致的蓝屏, 继续分析下面指令
.text:0041D046 lea eax, [esi+34h]
.text:0041D049 cmp [eax], eax
.text:0041D04B jnz loc_431CA1

0: kd> ? @esi+34
Evaluate expression: -1967832132 = 8ab543bc

0: kd> dd 8ab543bc l1
8ab543bc 8a3f6254

eax的值为 8ab543bc, [8ab543bc]的值为 8a3f6254, cmp [eax], eax 比较结果不相等导致蓝屏.其实这里就是判断当前线程的内核APC列表是否为空,不为空的话就蓝屏了.也就是系统往我们的线程KiInsertQueueApc插入一个内核APC,导致链表不为空,在KeUnstackDetachProcess出了问题。观察线程的线程的一些APC字段,发现 KernelApcPending 的值为1,说明KiInsertQueueApc没调用到KiDeliverApc, 很可能是APC 被禁止Deliver,调用ExAcquireFastMutex就可以禁止内核APC投递.不要调用ExAcquireFastMutex应该可以解决这类问题,但现在还有一个问题: 谁会往这个调用FltSendMessage的内核线程投递APC ?内核APC的一个主要作用是从系统空间拷贝I/O操作结果和状态信息到线程虚拟内存空间的一个缓冲中,所以有可能是FltSendMessage内部同步出现BUG.导致这个函数返回后,应用层再应答数据回来,会往这个DELAY线程插APC. 这种情况最有可能是应用层扫描出现了延迟导致.

暂时XP SP3可行的解决办法:
1 不要在一个线程里循环调用FltSendMessage
2 调用之前FltSendMessage不要调用ExAcquireFastMutex
3 只利用FltSendMessage来发送异步消息,就是不用等应用层应答结果,这样系统是不会往我们线程插入APC的.

【原创】FltSendMessage蓝屏分析的更多相关文章

  1. 【原创】FltGetFileNameInformation蓝屏分析

    FAULTING_IP: nt!SeCreateAccessStateEx+5b80564184 848788000000 test byte ptr [edi+88h],al TRAP_FRAME: ...

  2. 电脑蓝屏分析教程,附工具WinDbg(x86 x64)6.12.0002.633下载

    我们常常在使用电脑中,有时会碰到电脑蓝屏,我们经常束手无策,不知道为什么会蓝屏?有些蓝屏后自动重启能正常进入系统,那么我们就可以借助工具进行分析.而有些可能需要进入到安全模式或者pe系统才会正常,那么 ...

  3. WinDbug之DUMP蓝屏分析

    Microsoft (R) Windows Debugger Version 6.2.8400.0 X86Copyright (c) Microsoft Corporation. All rights ...

  4. 一次真实的蓝屏分析 ntkrnlmp.exe

    故事背景: 话说我一直都是远程公司的电脑,在我晚上11点敲代码敲得正爽的时候,被远程的主机挂掉了,毫无征兆的挂掉了,我特么还好有闲着没事就ctrl + s保存代码的习惯,要不然白敲了那么久,我以为是公 ...

  5. 记一次Windows蓝屏分析

    大半夜收到此类信息,应该是让所有系统管理员最头大的事情了 首先我快速通过iDRAC,发现服务器发生了重启操作,并得到相关日志信息 通过Dell的官方解释,确定了该问题是OS层面的异常导致.打开Wind ...

  6. 关闭win10 自动更新 及蓝屏解决办法

    "控制面板-管理工具-服务"(或在"此电脑"鼠标右键,点击"管理"),找到Windows Update项目后,将"启动类型&quo ...

  7. Win 10 蓝屏,出现DRIVER_POWER_STATE_FAILURE的解决方法

    笔者个人笔记本电脑,用的是华硕的飞行堡垒FZ系列,上个月装了个Ubuntu的系统,之后换回Windows后,电脑疯狂蓝屏,错误代码只有这个DRIVER_POWER_STATE_FAILURE.一开始我 ...

  8. 记一次解决关机蓝屏 | MULTIPLE_IRP_COMPLETE_REQUESTS | klflt.sys

    已经解决蓝屏问题,原因是卡巴斯基安全软件驱动导致,需要卸载卡巴斯基安全软件,详细过程如下. 一.关机时蓝屏 Win10系统,在关机动画快结束时突然蓝屏,提示:你的设备遇到问题,需要重启,终止代码:MU ...

  9. 蓝屏 Dump文件分析方法

    WinDbg使用有点麻烦,还要符号表什么的.试了下,感觉显示很乱,分析的也不够全面... 试试其他的吧!今天电脑蓝屏了,就使用其dump文件测试,如下: 1.首先,最详细的,要属Osr Online这 ...

随机推荐

  1. swiper按钮点击无效及控制器无效问题

    点击箭头图片切换的同时,下面小图标也会随着切换,同理下面小图标切换时,上面也随着滚动. 示例代码如下: <!-- Swiper --> <div class="swiper ...

  2. python matplotlib绘制六种可视化图表

    1. 折线图 绘制折线图,如果你数据不是很多的话,画出来的图将是曲折状态,但一旦你的数据集大起来,比如下面我们的示例,有100个点,所以我们用肉眼看到的将是一条平滑的曲线. 这里我绘制三条线,只要执行 ...

  3. 通过Nginx统计网站的PV、UV、IP

    转载:通过Nginx统计网站的PV.UV.IP 概念 UV:独立访客:以cookie为依据,假设一台电脑装有3个不同的浏览器,分别打开同一个页面,将会产生3个UV.PV:访问量:页面每访问或刷新一次, ...

  4. linux c 错误的捕获

    经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因.这个时候使用 ...

  5. CSS基础 布局

    1.布局的基本位置 top         距离上边的距离right       距离右边的距离bottom   距离下边的距离left         距离左边的距离 去掉布局时 html 的3mm ...

  6. 05 Windows编程——Windows程序框架

    源码 #include<Windows.h> LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARA ...

  7. Linux命令——cp、rm、mv、touch、file、dir

    cp copy 拷贝文件 拷贝过程不指定目标文件名 则目标文件名和源文件名一样 [root@WebServer ~]# cp /91xueit/teacher.txt 51cto/ 拷贝过程指定目标文 ...

  8. NLP学习(1)---Glove模型---词向量模型

    一.简介: 1.概念:glove是一种无监督的Word representation方法. Count-based模型,如GloVe,本质上是对共现矩阵进行降维.首先,构建一个词汇的共现矩阵,每一行是 ...

  9. WCF 使用Stream模式进行文件上传 --节选自Packt.Net.Framework.4.5.Expert.Programming.Cookbook

    使用Stream上传文件 文件上传功能是web程序/服务上常用和必须的功能,WCF也不例外.在4.0版本之前,WCF仅仅提供了buffered模式上传文件.从4.0版本之后,WCF开始提供了Strea ...

  10. [ 转载 ] Java基础

    1.String a = “123”; String b = “123”; a==b的结果是什么? 这包含了内存,String存储方式等诸多知识点.ans:同样序列的字符串直接量为一个实例,所以其实引 ...