原因
对于对象的当前状态,对象的引用计数是非法的。
每次驱动程序使用指向对象的指针时,驱动程序都会调用内核例程以将对象的引用计数增加一。
当驱动程序处理完指针后,驱动程序调用另一个内核例程将引用计数减一。
驱动程序必须匹配对增加(引用)和减少(取消引用)引用计数的例程的调用。
此错误检查是由对象的引用计数不一致引起的。
通常,不一致是由驱动程序多次减少对象的引用计数引起的,从而进行另外的取消引用对象的调用。
之所以会发生此错误检查,是因为对象的引用计数变为零而对象的句柄仍处于打开状态。
当对象的引用计数降到零以下时,无论是否有对象的打开句柄,也可能发生这种情况。
REFERENCE_BY_POINTER 参数
参数 | 描述 |
---|---|
1 | 其引用计数正在降低的对象的对象类型。 |
2 | 正在降低引用计数的对象。 |
3 | 保留 |
4 | 保留 |
REFERENCE_BY_POINTER 错误检查的值为 0x00000018.
这表明对象的引用计数对于对象的当前状态是非法的。
解决方法
确保驱动程序匹配对增加和减少对象引用计数的例程的调用。
确保驱动程序不会对取消引用对象的例程进行另外调用(请参阅参数 2)。
我们可以使用调试器来帮助分析此问题。
有关详细信息,请参阅使用 Windows 调试器 (WinDbg) 的故障转储分析。
!analyze 调试扩展显示有关错误检查的信息,有助于确定根本原因。
详细步骤查看我们的教程 在windows 中使用WinDBG 调试dmp文件
要查找对象的句柄和指针计数,请使用 !object debugger 命令。
kd> !object address
其中 address 是参数 2 中给出的对象的地址。
我们还可以在导致此停止代码的代码中设置一个断点,并尝试单步前进到出错的代码中。
如果我们不具备使用 Windows 调试器来解决此问题的能力,我们可以使用一些基本的故障排除技术。
- 检查事件查看器中的系统日志以获取可能有助于识别导致此错误检查的设备或者驱动程序的其他错误消息。
- 如果在错误检查消息中识别出驱动程序,请禁用该驱动程序或者与制造商联系以获取驱动程序更新。
- 确认安装的任何新硬件都与安装的 Windows 版本兼容。例如,我们可以在 Windows 10 规范中获取有关所需硬件的信息。
- 有关其他常规故障排除信息,请参阅蓝屏数据。