DRIVR_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 蓝屏分析
最近在写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 蓝屏分析相关推荐
- windbg抓一个windows蓝屏分析
前言 一直以来挺稳定,但还是小概率事件意外出现某machine突然蓝屏了.查看windows事件查看器提示计算机已经从检测错误后重新启动.检测错误: 0x0000009f (0x00000000000 ...
- DPC_WATCHDOG_VIOLATION蓝屏分析
文章目录 DPC_WATCHDOG_VIOLATION蓝屏分析 1. 背景 1. 分析 1.1 初步分析 1.2 DPC WATCHDOG 1.3 DPC超时时间获取 1.4 分析 2. 总结 DPC ...
- DRIVER_POWER_STATE_FAILURE蓝屏分析
本文主要对 DRIVER_POWER_STATE_FAILURE蓝屏分析_xdesk的专栏-CSDN博客_driver_power_state_failure 的一些说明,大佬写得太跳跃了,一些地方不 ...
- win10 蓝屏分析-fwpkclnt.sys ( fwpkclnt+1361 )
WIN10蓝屏分析---fwpkclnt.sys损坏 1.下载fwpkclnt文件:下载地址内涵使用教程. 2.修改系统 C:\Windows\System32\drivers文件夹的权限. 3.复制 ...
- 服务器2003蓝屏A5修复,求助windows 2003 蓝屏分析
各位大神,对于分析蓝屏DUMP文件小弟还是初步接触阶段,希望能得到大家的指导,在此非常感谢. 以下是一台windows 2003 系统的蓝屏产生的dump文件. Windows Server 2003 ...
- 一次真实的蓝屏分析 ntkrnlmp.exe
故事背景: 话说我一直都是远程公司的电脑,在我晚上11点敲代码敲得正爽的时候,被远程的主机挂掉了,毫无征兆的挂掉了,我特么还好有闲着没事就ctrl + s保存代码的习惯,要不然白敲了那么久,我以为是公 ...
- 蓝屏分析_电脑突发蓝屏现象?教你如何快速修复
近日,win7系统遭遇大面积蓝屏崩溃现象,360紧急跟进,根据目前部分用户反馈,初步判断蓝屏是由于系统中的某个硬件驱动程序或者木马病毒,导致了Windows7系统的smss.exe进程停止,进而触发蓝 ...
- 计算机蓝屏分析报告,报告蓝屏: 如何提供内存转储(Memory Dump)文件
如果您在使用我们的软件产品时遇到蓝屏或自动重启的问题,我们的技术支持可能要求提供蓝屏相关的内存转储文件以便分析.请参照以下步骤提供内存转储文件. 步骤 1. 禁止自动重启 在控制面板打开系统,在高级页 ...
- 计算机蓝屏分析报告,Win7 又蓝屏了 附上分析报告,高手帮我看看!
Win7 又蓝屏了 附上分析报告,高手帮我看看! Microsoft (R) Windows Debugger Version 6.11.0001.404 AMD64 Copyright (c) Mi ...
最新文章
- scanf函数和cin的区别、类的数组、C++排序函数
- [转载]html5教程
- BugkuCTF-Misc:细心的大象
- 开发人员MySQL调优-理论篇
- 精简 opencv python_基于Python的OpenCV人脸检测!简直不要太简单!
- 21秋期末考试财务会计(一)10166k2
- Lake Counting(信息学奥赛一本通-T1249)
- Oracle 与 MySql 区别
- 关于安全校验代码的一些心得
- Redis为什么可以支持那么大的并发访问量?为什么redis没有单点并发瓶颈?
- 前端教程:如何实现前端录音功能
- Aras innovator: TOC目录简单汉化方法
- Linear algebra4---duality2
- 大学生活这样过,校招 offer 飞来找
- puppet的使用:ERB模板介绍
- 热设计功耗(TDP)与功耗(P)
- Android开发支付集成——微信集成
- 【LOJ574】「LibreOJ NOI Round #2」黄金矿工
- c++编程 设置桌面壁纸以及设置壁纸失效的解决办法
- intellidea写java_用IntellIDEA开发JSP的一些总结 | 学步园