bowyee
驱动牛犊
驱动牛犊
  • 注册日期2002-12-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3303回复:3

请教各位高手,使用IoDeleteDevice 删除的device的extension还可以继续使用吗?

楼主#
更多 发布于:2008-09-02 08:25
请问各位高手,使用IoDeleteDevice 删除的device的extension还可以继续使用吗?


事情是这样的,我帮一个老外改BUG, 发现程序中有一个DriverObject 在被使用IoDeleteDevice删除后,仍然保留了指向extension的指针;

后面的程序继续使用该指针访问extension,跟踪发现此时extension已经被修改,但是我不知道是在什么地方改的。

当然在使用此指针的时候BSOD了

我想请教一下,在执行IoDeleteDevice(deviceObject)的时候,extension 是否一并被释放了。

我注意到IoCreateDevice中有一个参数是extension的size,请问extension是此时分配的吗?

老外对我说只要没有使用ExFreePool or ExFreePoolWithTag 释放此部分内存就可以使用,是这样的吗?

因为程序是老外写的,我还是一个新手,沟通非常困难,请各位高手帮助

最新喜欢:

yeaipingyeaipi...
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2008-09-02 09:19
IoCreateDevice的时候系统会在ObCreateObject生成设备对象的时候生成一块DEVOBJECT+DEVOBJ_EXTENSION+设备扩展大小(内存对齐)的一块内存,所以不用你自己来管理.设备对象作为对象管理器的一部分,由后者来管理,当其引用计数为0的时候,对象管理器会自动释放其所对应内存,而IoDeleteDevice只是减少其引用计数而已,所以调用该函数后,你可能还是可以访问其指针,及扩展指针。不过作为良好的习惯,我们还是不要那么做得好。建议你用SOFTICE的BPM来进行内存访问断点,看在哪里访问修改了该处内容。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bowyee
驱动牛犊
驱动牛犊
  • 注册日期2002-12-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-09-02 13:26
引用第1楼wowocock于2008-09-02 09:19发表的  :
IoCreateDevice的时候系统会在ObCreateObject生成设备对象的时候生成一块DEVOBJECT+DEVOBJ_EXTENSION+设备扩展大小(内存对齐)的一块内存,所以不用你自己来管理.设备对象作为对象管理器的一部分,由后者来管理,当其引用计数为0的时候,对象管理器会自动释放其所对应内存,而IoDeleteDevice只是减少其引用计数而已,所以调用该函数后,你可能还是可以访问其指针,及扩展指针。不过作为良好的习惯,我们还是不要那么做得好。建议你用SOFTICE的BPM来进行内存访问断点,看在哪里访问修改了该处内容。



感谢wowocock ,讲得很明白。还有一个问题

就是是否有方法得到“计数器”的当前值是多少,以便确认内存是否在执行IoDeleteDevice后释放。

另外,计数器是否会在Driver以外的地方被+1,我在程序中只找到一处obReferenceObject, 但是此语句是在一个if语句中,跟踪证明此函数不会被执行到。这是否就说明在IoDeleteDevice后,计数器就为0了?

DeviceObject->ReferenceCount为什么总是0?好像ObreferenceObject不起作用?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2008-09-03 16:19
对象的引用计数并不是只有你的程序中直接REFERENCE才会影响,你调用的函数其中可能也会对其修改,作为对象你可以查看对象头中的的引用计数。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部