[教训]异步IRP中,IoSetCompletionRoutine()要在IoCallDriver()的前面,不然底层驱动完成了读写之后,找不到完成例程,会导致出错。看似简单,不小心却可能带来大麻烦。

[经过]修改驱动,需要把原来较大的IO切成小IO发给磁盘驱动,结果改完后一读写数据就蓝屏,百思不得其解。折腾了很长时间之后,才发现在RwBuildIrpAndCallDriver()函数里,IoSetCompletionRoutine()在IoCallDriver()的前面。遂做修改,调整顺序,数据读写正常。

其实在DUMP文件中,通过对堆栈调用和崩溃位置的分析,应该可以早点看出问题来。

下附DUMP分析:

0: kd> !analyze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
******************************************************************************* IRQL_NOT_LESS_OR_EQUAL (a)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high. This is usually
caused by drivers using improper addresses.
If a kernel debugger is available get the stack backtrace.
Arguments:
Arg1: 000000e8, memory referenced
Arg2: 00000002, IRQL
Arg3: 00000001, bitfield :
bit 0 : value 0 = read operation, 1 = write operation
bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status)
Arg4: 80a0da16, address which referenced memory Debugging Details:
------------------ WRITE_ADDRESS: 000000e8 CURRENT_IRQL: 2 FAULTING_IP:
hal!KeAcquireInStackQueuedSpinLock+26
80a0da16 8711 xchg edx,dword ptr [ecx] DEFAULT_BUCKET_ID: DRIVER_FAULT BUGCHECK_STR: 0xA PROCESS_NAME: Idle TRAP_FRAME: 8087924c -- (.trap 0xffffffff8087924c)
ErrCode = 00000002
eax=808792d4 ebx=00000000 ecx=000000e8 edx=808792d4 esi=00000000 edi=8a500c88
eip=80a0da16 esp=808792c0 ebp=808792e0 iopl=0 nv up ei pl nz ac po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010212
hal!KeAcquireInStackQueuedSpinLock+0x26:
80a0da16 8711 xchg edx,dword ptr [ecx] ds:0023:000000e8=????????
Resetting default scope LAST_CONTROL_TRANSFER: from 80a0da16 to 8086c6d0 STACK_TEXT:
8087924c 80a0da16 badb0d00 808792d4 00000001 nt!KiTrap0E+0x238
808792c0 8082519e 8a500c88 8a500c48 00000000 hal!KeAcquireInStackQueuedSpinLock+0x26
808792e0 8081a518 8a500c88 00000000 00000000 nt!KeInsertQueueApc+0x20
80879314 ba108c70 80879344 ba108f54 8a797030 nt!IopfCompleteRequest+0x1d8
8087931c ba108f54 8a797030 8a500c48 00000001 CLASSPNP!ClassCompleteRequest+0x11
80879344 8081a3e2 00000000 87eed5d8 898ab488 CLASSPNP!TransferPktComplete+0x180
80879374 b9dfc8f8 8aac49e0 87eed5d8 808793b8 nt!IopfCompleteRequest+0xa2
80879384 b9dfc436 8a436d80 00000001 00000000 SCSIPORT!SpCompleteRequest+0x5e
808793b8 b9dfc6f7 8aac49e0 8a436d80 80879427 SCSIPORT!SpProcessCompletedRequest+0x632
80879428 8086de5f 8aac499c 8aac4928 00000000 SCSIPORT!ScsiPortCompletionDpc+0x2b5
80879450 8086dd44 00000000 0000000e 00000000 nt!KiRetireDpcList+0x61
80879454 00000000 0000000e 00000000 00000000 nt!KiIdleLoop+0x28 STACK_COMMAND: kb FOLLOWUP_IP:
CLASSPNP!ClassCompleteRequest+11
ba108c70 5d pop ebp SYMBOL_STACK_INDEX: 4 SYMBOL_NAME: CLASSPNP!ClassCompleteRequest+11 FOLLOWUP_NAME: MachineOwner MODULE_NAME: CLASSPNP IMAGE_NAME: CLASSPNP.SYS DEBUG_FLR_IMAGE_TIMESTAMP: 41107ec2 FAILURE_BUCKET_ID: 0xA_CLASSPNP!ClassCompleteRequest+11 BUCKET_ID: 0xA_CLASSPNP!ClassCompleteRequest+11 Followup: MachineOwner
---------

异步IRP的教训(已附DUMP)的更多相关文章

  1. 如何解救在异步Java代码中已检测的异常

    Java语言通过已检测异常语法所提供的静态异常检测功能非常实用,通过它程序开发人员可以用很便捷的方式表达复杂的程序流程. 实际上,如果某个函数预期将返回某种类型的数据,通过已检测异常,很容易就可以扩展 ...

  2. C# Socket-TCP异步编程原理详解附源码

    目录 目录异步原理主要方法源码Server源码:Client源码实验效果(广播为例)参考博客 TOC 异步原理 套接字编程原理:延续文件作用思想,打开-读写-关闭的模式. C/S编程模式如下: Ø 服 ...

  3. 用ionic快速开发hybird App(已附源码,在下面+总结见解)

    1.ionic简介 ionic 是用于敏捷开发APP的解决方案.核心思路是:利用成熟的前端开发技术,来写UI和业务逻辑.也就是说,就是一个H5网站,这个区别于react-native,native.即 ...

  4. [转] libcurl异步方式使用总结(附流程图)

    文为转载,原文地址:libcurl异步方式使用总结 实习期间用到了libcurl来做HTTPS双向认证,用的是异步方式,简单总结一下. libcurl这个库的同步方式很简单,不做介绍,而异步方式很难理 ...

  5. c#编写的基于Socket的异步通信系统--SanNiuSignal.DLL已开源

    自从推出了SanNiuSignal.DLL,用户反映还是满好的;为了更好的服务于大家,我已经修复了很多BUG,同时把这个DLL开源;下面就先来介绍下 使用这个DLL开发出的简单的通信系统;如图: 想使 ...

  6. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

  7. Task异步编程

    Task异步编程中,可以实现在等待耗时任务的同时,执行不依赖于该耗时任务结果的其他同步任务,提高效率. 1.Task异步编程方法签名及返回值: a) 签名有async 修饰符 b) 方法名以 Asyn ...

  8. 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]

    看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...

  9. .NET4.5 异步编程 async和await

    msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...

随机推荐

  1. kvm虚拟机vnc配置

    通过vnc方式访问虚拟主机上的KVM虚拟机 通过虚拟主机的IP地址与端口进行访问 1.  修改qemu.conf # vi /etc/libvirt/qemu.conf vnc_listen = &q ...

  2. 利用kibana学习 elasticsearch restful api (DSL)

    利用kibana学习 elasticsearch restful api (DSL) 1.了解elasticsearch基本概念Index: databaseType: tableDocument: ...

  3. CocosCreator 2.1.2 Shader组件

    本篇文章相关导读: 新版ShaderHelper,支持 Creator 2.1.2 ! 社区大佬揭开 Creator 2.1.2 材质系统的神秘面纱! 为什么要选择使用TypeScript,看了就知道 ...

  4. MVC+Ninject+三层架构+代码生成 -- 总结(六、邏輯層)

    1.邏輯層的方法應該與數據層的方法一一對應.邏輯層返回的結果都是用接口IResult封裝,用於項目轉換時,能減少變化的代碼量. 2.邏輯層都需要繼承 BaseLogic 類 public class ...

  5. 我得新博客上线了采用Vue+Layui的结合开发,后台采用asp.net mvc

    地址:www.zswblog.xyz 写完这个博客项目我真的很开心! 希望博客园的大佬们能去看看,如果可以希望帮我在Layui的年度案例点一个赞,谢谢! 地址:https://fly.layui.co ...

  6. c#ADO.NET 执行带参数及有返回数据

    直接上代码,这个过程中有个数据SqlDataReader转为 DataTable的过程,当中为什么这样,是应为我直接绑定DataSource的时候没有数据,网人家说直接绑定但是没效果,我就转换了一下. ...

  7. Matplotlib 绘图与可视化 一些控件的介绍和属性,反正就是乱七八糟的

    这个链接里有下面这个图(图里还有超链接):https://matplotlib.org/3.1.1/api/artist_api.html#matplotlib.artist.Artist 各种图例: ...

  8. Python——XPath提取某个标签下所有文本

    /text()获取指定标签下的文本内容,//text()获取指定标签下的文本内容,包括子标签下的文本内容,比较简单的是利用字符串相加: room_infos = li.xpath('.//a[@cla ...

  9. 24个Jvm面试题总结及答案

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被 ...

  10. 1.Shell特殊位置变量

    $0    文件名及路径 $1,$2    参数1,参数2 , 也可以用${1}  和 ${2} 来表示 $#    传递给脚本或函数的参数个数 $$    当前Shell进程ID $?    判断上 ...