【Tmp】在完成例程中BSOD

本文探讨了在使用DriverVerifier工具进行内存校验时遇到的一个Crash问题:DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION (d6)。通过详细分析故障代码、调试信息和相关代码,找到了引发Crash的具体原因,并提出了相应的解决方案。

在写一个有关完成例程的driver时,遇到一个Crash:DRIVER_CORRUPTED_EXPOOL(C5)。Windbg直接分析dump file,不容易找到错误,因为错误发生的指令并非是我的Driver模块内。

 

挂上DriverVerifier后,设置special pool,Windbg 中analyze -v显示以下错误信息

 

DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION (d6)
N bytes of memory was allocated and more than N bytes are being referenced.
This cannot be protected by try-except.
When possible, the guilty driver's name (Unicode string) is printed on
the bugcheck screen and saved in KiBugCheckDriver.
Arguments:
Arg1: 86e69003, memory referenced
Arg2: 00000000, value 0 = read operation, 1 = write operation
Arg3: fac08771, if non-zero, the address which referenced memory.
Arg4: 00000000, (reserved)

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


READ_ADDRESS:  86e69003 Special pool

FAULTING_IP:
DynamicAttach+771
fac08771 0fb64203        movzx   eax,byte ptr [edx+3]

定位到我的完成例程中的代码:

  if (Irp->PendingReturned)
  {
 >    IoMarkIrpPending(Irp);
  }

 

IoMarkIrpPending宏: 

#define IoGetCurrentIrpStackLocation( Irp ) /
    ( (Irp)->Tail.Overlay.CurrentStackLocation )

#define IoMarkIrpPending( Irp ) ( /
   IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED )

看Arg3,就是fac08771处指令引发了Crash。

 

0: kd> ub fac08771
DynamicAttach+0x75a:
fac0875a 8b4860          mov     ecx,dword ptr [eax+60h]
fac0875d 894df0          mov     dword ptr [ebp-10h],ecx
fac08760 8b550c          mov     edx,dword ptr [ebp+0Ch]   //取完成例程第2个参数,即Irp
fac08763 0fb64221        movzx   eax,byte ptr [edx+21h]   // Irp->PendingReturned
fac08767 85c0            test    eax,eax
fac08769 7416            je      DynamicAttach+0x781 (fac08781)
fac0876b 8b4d0c          mov     ecx,dword ptr [ebp+0Ch]  //取完成例程第2个参数,即Irp
fac0876e 8b5160          mov     edx,dword ptr [ecx+60h]  //取(Irp)->Tail.Overlay.CurrentStackLocation
0: kd> u fac08771
DynamicAttach+0x771:
fac08771 0fb64203        movzx   eax,byte ptr [edx+3]     //取(Irp)->Tail.Overlay.CurrentStackLocation->Control时Crash
fac08775 83c801          or      eax,1

 

当取(Irp)->Tail.Overlay.CurrentStackLocation->Control时Crash,因为该地址是无效地址。所以为了避免Crash,之前要判断一下:

  if (Irp->PendingReturned)
  {

       if(MmIsAddressValid(&pIrpSp->Control))

            IoMarkIrpPending(Irp);
  }

不过这只是表面现象,未完待续。

随着人类对生命健康需求的不断增长,新药研发面临着前所未有的挑战。传统的药物研发流程通常耗时长达十年以上,耗资数十亿美元,且最终成功率极低,这在制药界被称为“反摩尔定律”困境。近年来,人工智能技术的飞速发展,特别是深度学习和大数据分析的广泛应用,为新药发现带来了革命性的契机。人工智能能够从海量的化学和生物数据中挖掘潜在规律,显著加速药物靶点发现、先导化合物优化等关键环节。在此背景下,本研究旨在设计并实现一个基于人工智能的新药发现辅助系统,以期为传统药物研发流程提供高效的智能化辅助工具,从而有效缩短研发周期并大幅降低研发成本。本研究以Python作为主要开发语言,深度结合PyTorch和TensorFlow两大主流深度学习框架,并集成RDKit化学信息学工具包,构建了一个功能完善的新药发现辅助系统。系统的核心目标是利用先进的人工智能技术辅助新药分子的设计与活性评估。在研究方法上,本文创新性地提出了一种融合多模态数据的新药发现算法。该算法综合处理分子的多种表示形式,包括一维的SMILES序列、二维的分子图结构以及三维的空间构象数据。通过构建多通道神经网络,系统能够有效提取并融合不同模态的特征,从而全面捕捉分子的理化性质与生物学活性之间的复杂非线性关系。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论 第3章 系统需求分析 第4章 系统总体设计 第5章 系统详细设计与实现 第6章 系统测试与分析 第7章 总结与展望 参考文献 附件-实现指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值