阅读:3303回复:3
请教各位高手,使用IoDeleteDevice 删除的device的extension还可以继续使用吗?
请问各位高手,使用IoDeleteDevice 删除的device的extension还可以继续使用吗?
事情是这样的,我帮一个老外改BUG, 发现程序中有一个DriverObject 在被使用IoDeleteDevice删除后,仍然保留了指向extension的指针; 后面的程序继续使用该指针访问extension,跟踪发现此时extension已经被修改,但是我不知道是在什么地方改的。 当然在使用此指针的时候BSOD了 我想请教一下,在执行IoDeleteDevice(deviceObject)的时候,extension 是否一并被释放了。 我注意到IoCreateDevice中有一个参数是extension的size,请问extension是此时分配的吗? 老外对我说只要没有使用ExFreePool or ExFreePoolWithTag 释放此部分内存就可以使用,是这样的吗? 因为程序是老外写的,我还是一个新手,沟通非常困难,请各位高手帮助 |
|
最新喜欢:yeaipi... |
沙发#
发布于:2008-09-02 09:19
IoCreateDevice的时候系统会在ObCreateObject生成设备对象的时候生成一块DEVOBJECT+DEVOBJ_EXTENSION+设备扩展大小(内存对齐)的一块内存,所以不用你自己来管理.设备对象作为对象管理器的一部分,由后者来管理,当其引用计数为0的时候,对象管理器会自动释放其所对应内存,而IoDeleteDevice只是减少其引用计数而已,所以调用该函数后,你可能还是可以访问其指针,及扩展指针。不过作为良好的习惯,我们还是不要那么做得好。建议你用SOFTICE的BPM来进行内存访问断点,看在哪里访问修改了该处内容。
|
|
|
板凳#
发布于:2008-09-02 13:26
引用第1楼wowocock于2008-09-02 09:19发表的 : 感谢wowocock ,讲得很明白。还有一个问题 就是是否有方法得到“计数器”的当前值是多少,以便确认内存是否在执行IoDeleteDevice后释放。 另外,计数器是否会在Driver以外的地方被+1,我在程序中只找到一处obReferenceObject, 但是此语句是在一个if语句中,跟踪证明此函数不会被执行到。这是否就说明在IoDeleteDevice后,计数器就为0了? DeviceObject->ReferenceCount为什么总是0?好像ObreferenceObject不起作用? |
|
地板#
发布于:2008-09-03 16:19
对象的引用计数并不是只有你的程序中直接REFERENCE才会影响,你调用的函数其中可能也会对其修改,作为对象你可以查看对象头中的的引用计数。
|
|
|