最近在写windows驱动的时候发现有一个偶发蓝屏现象,打了一个full dump。记录分析的流程,便于以后查阅。

1 由上面的图片可以见到,蓝屏错误码是DRIVR_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS。查询微软文档 “https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0xce–driver-unloaded-without-cancelling-pending-operations”,可知该错误表示:驱动程序未能在卸载前取消挂起的操作。初步方向就是:程序卸载的时候有一些操作正在执行中,没等操作执行完驱动就退出了。
chatgpt回答如下:

DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 是一个 Windows 操作系统的蓝屏错误代码,表示驱动程序卸载时存在未取消挂起操作的错误。
通常情况下,在卸载驱动程序之前,需要确保所有正在进行的操作都已经完成或被取消。否则,可能会导致错误的操作或系统崩溃等问题。如果驱动程序卸载时存在未取消挂起操作,就会触发 DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 错误,并导致系统崩溃。
为了避免这种错误,驱动程序在卸载之前必须正确处理所有正在进行的操作,并将它们取消或等待它们完成。在取消挂起操作时,应该使用正确的同步机制,以避免竞态条件和其他同步问题。
如果发生了 DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 错误,可以尝试以下几种方法来解决问题:
检查驱动程序的代码,确保在卸载之前正确处理所有正在进行的操作,并将它们取消或等待它们完成。需要检查所有可能导致挂起操作的代码路径,并确保在适当的时间取消或等待这些操作。
使用正确的同步机制来避免竞态条件和其他同步问题。在取消或等待挂起操作时,应该使用适当的同步机制,例如互斥量、信号量、事件等,以确保线程安全和正确性。
使用调试工具来分析错误。可以使用 Microsoft 的调试工具来分析 DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 错误,以确定错误的原因和位置。例如,可以使用 Windows 调试器 (WinDbg) 或 Visual Studio 调试器来分析错误。
更新驱动程序或操作系统。如果 DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 错误是由驱动程序或操作系统的 Bug 导致的,可以尝试更新驱动程序或操作系统来解决问题。
需要注意的是,DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 错误可能会导致系统崩溃,因此需要尽快解决问题,以确保系统的稳定性和安全性。

2 用windbg打开memory.dmp,执行!analyze -v,可以看到错误堆栈如下所示。

可以看到此时驱动已经被卸载掉(Unloaded状态)了,遂利用ida计算驱动基址+偏移可得如下

查看源码可得崩溃函数是KernelApcInjectCallback,也就是apc的回调函数。
KeInitializeApc(
pInjectApc, (PKTHREAD)pThread,
OriginalApcEnvironment, &KernelApcInjectCallback,
NULL, (PKNORMAL_ROUTINE)(ULONG_PTR)pUserFunc, UserMode, Arg1);

3 利用!process查看当前进程的信息,可以看到是git.exe。

再!process bc18查看详细信息,观察堆栈,正是上面!analyze -v分析出来的异常堆栈。

4 根据上面信息就可以基本可以认为是,当git做apc注入的时候,用户做了手动卸载驱动的操作。此时由于apc注入的操作已经被挂起了,所以直接退出驱动会导致异常。至于为什么是偶发,是因为卸载驱动不是一个经常性操作,而且刚好碰上有进程注入未执行完的操作的概率较低。

5 基于这个结论,尝试复现该问题。在KeInitializeApc之前 和 KeInsertQueueApc之后分别执行休眠5秒的操作(目的是为了阻塞这个操作)。重新安装驱动,执行一个git clone操作,然后卸载驱动,等待一会之后发现,蓝屏了。重复多次,稳定复现。如此可得出结论:是因为该线程操作未正确取消导致的问题。

6 解决方法:添加计数器机制(或者其它同步机制)。在DriverUnload的时候判断该计数器的值,如果不满足,则等待条件满足之后再继续往下执行。

7 总结:驱动和进程不同,进程崩溃只会影响进程本身,而且也非常好调试。驱动则是难调试,问题难复现,所以在写驱动时一定要小心。openedr是个不错的参考对象,edrdrv用C++风格封装了一层,对这种同步问题,以及内存管理问题都做了一层兜底。

DRIVR_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 蓝屏分析相关推荐

  1. windbg抓一个windows蓝屏分析

    前言 一直以来挺稳定,但还是小概率事件意外出现某machine突然蓝屏了.查看windows事件查看器提示计算机已经从检测错误后重新启动.检测错误: 0x0000009f (0x00000000000 ...

  2. DPC_WATCHDOG_VIOLATION蓝屏分析

    文章目录 DPC_WATCHDOG_VIOLATION蓝屏分析 1. 背景 1. 分析 1.1 初步分析 1.2 DPC WATCHDOG 1.3 DPC超时时间获取 1.4 分析 2. 总结 DPC ...

  3. DRIVER_POWER_STATE_FAILURE蓝屏分析

    本文主要对 DRIVER_POWER_STATE_FAILURE蓝屏分析_xdesk的专栏-CSDN博客_driver_power_state_failure 的一些说明,大佬写得太跳跃了,一些地方不 ...

  4. win10 蓝屏分析-fwpkclnt.sys ( fwpkclnt+1361 )

    WIN10蓝屏分析---fwpkclnt.sys损坏 1.下载fwpkclnt文件:下载地址内涵使用教程. 2.修改系统 C:\Windows\System32\drivers文件夹的权限. 3.复制 ...

  5. 服务器2003蓝屏A5修复,求助windows 2003 蓝屏分析

    各位大神,对于分析蓝屏DUMP文件小弟还是初步接触阶段,希望能得到大家的指导,在此非常感谢. 以下是一台windows 2003 系统的蓝屏产生的dump文件. Windows Server 2003 ...

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

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

  7. 蓝屏分析_电脑突发蓝屏现象?教你如何快速修复

    近日,win7系统遭遇大面积蓝屏崩溃现象,360紧急跟进,根据目前部分用户反馈,初步判断蓝屏是由于系统中的某个硬件驱动程序或者木马病毒,导致了Windows7系统的smss.exe进程停止,进而触发蓝 ...

  8. 计算机蓝屏分析报告,报告蓝屏: 如何提供内存转储(Memory Dump)文件

    如果您在使用我们的软件产品时遇到蓝屏或自动重启的问题,我们的技术支持可能要求提供蓝屏相关的内存转储文件以便分析.请参照以下步骤提供内存转储文件. 步骤 1. 禁止自动重启 在控制面板打开系统,在高级页 ...

  9. 计算机蓝屏分析报告,Win7 又蓝屏了 附上分析报告,高手帮我看看!

    Win7 又蓝屏了 附上分析报告,高手帮我看看! Microsoft (R) Windows Debugger Version 6.11.0001.404 AMD64 Copyright (c) Mi ...

最新文章

  1. scanf函数和cin的区别、类的数组、C++排序函数
  2. [转载]html5教程
  3. BugkuCTF-Misc:细心的大象
  4. 开发人员MySQL调优-理论篇
  5. 精简 opencv python_基于Python的OpenCV人脸检测!简直不要太简单!
  6. 21秋期末考试财务会计(一)10166k2
  7. Lake Counting(信息学奥赛一本通-T1249)
  8. Oracle 与 MySql 区别
  9. 关于安全校验代码的一些心得
  10. Redis为什么可以支持那么大的并发访问量?为什么redis没有单点并发瓶颈?
  11. 前端教程:如何实现前端录音功能
  12. Aras innovator: TOC目录简单汉化方法
  13. Linear algebra4---duality2
  14. 大学生活这样过,校招 offer 飞来找
  15. puppet的使用:ERB模板介绍
  16. 热设计功耗(TDP)与功耗(P)
  17. Android开发支付集成——微信集成
  18. 【LOJ574】「LibreOJ NOI Round #2」黄金矿工
  19. c++编程 设置桌面壁纸以及设置壁纸失效的解决办法
  20. intellidea写java_用IntellIDEA开发JSP的一些总结 | 学步园

热门文章

  1. 良品铺子三只松鼠财报之争:网红零食里的“冰火两重天”
  2. 安卓手机使用vnc服务远程控制电脑教程
  3. 2019 阿里巴巴云栖大会 - Alibaba Apsara
  4. android实现简单的记账功能
  5. Linux获取机器码
  6. 超详细的golang学习指南,golang知识图谱
  7. 阿里内部的互联网三高架构是真的牛批!腾讯百度根本模仿不来
  8. 2020-10-22希腊字母发音对照表及其latex命令
  9. 遇见InterruptedException异常,怎么办?
  10. linux centos cvs,在centos中配置cvs