当windbg !drvobj扩展命令失效时...

如题,当"!drvobj"命令失效时怎么办?调试ddk sample:wdffeatrued驱动时遇到这个问题,现象如下:

kd> lml
start    end        module name
8201e000 82082000   hal        (private pdb symbols)  D:\symbols\win10Rs2x86\halmacpi.pdb\4E9BD9D216E244095545EAFA3EF6563F1\halmacpi.pdb
82082000 82703000   nt         (private pdb symbols)  D:\symbols\win10Rs2x86\ntkrpamp.pdb\70298DDA981447F18AE18C7DF819303A1\ntkrpamp.pdb
85e60000 85f53000   mcupdate_GenuineIntel   (pdb symbols) D:\symbols\win10Rs2x86\mcupdate_GenuineIntel.pdb\FB614FE599FDFA11D5E1125EEC6DF07A1\mcupdate_GenuineIntel.pdb  
a8220000 a822a000   wdffeatured   (private pdb symbols)  c:\winddk\windows-driver-samples-master\general\toaster\toastdrv\kmdf\func\featured\debug\wdffeatured.pdb

不要怀疑是符号不匹配的原因!lml明确的告诉我,已经加载匹配的符号。然而很不幸"!drvobj"的输出不尽人意:

kd> !drvobj wdffeatured
Driver object (a8220000) is for:
a8220000: is not a driver object

起初以为windbg对32位WDF驱动支持不好,就让同事帮忙验证一我的猜测,很显然,我猜错了!那怎么办?试试间接途径:!wdfdriverinfo可以显示驱动程序WDFDRIVER句柄值:

kd> !wdfkd.wdfdriverinfo  wdffeatured
----------------------------------
Default driver image name: wdffeatured
WDF library image name: Wdf01000
 FxDriverGlobals  0xa5bef778
 WdfBindInfo      0xa822404c
   Version        v1.15 build(0000)
----------------------------------
WDFDRIVER: 0x4f59f678  ;<---------句柄值

    !WDFDEVICE 0x5a412d88 (FDO)
        Pnp/Power State: WdfDevStatePnpStarted, WdfDevStatePowerDx, WdfDevStatePwrPolWaitingUnarmed
        context:  dt 0xa5bed400 FDO_DATA (size is 0x28 bytes)
        EvtCleanupCallback a8225380 wdffeatured!ToasterEvtDeviceContextCleanup

从句柄值用!wdfhandle获得框架对象地址:

kd> !wdfhandle 0x4f59f678 ;<----上一步!wdfdriverinfo获得的句柄值

Dumping WDFHANDLE 0x4f59f678
=============================
Handle type is WDFDRIVER
Refcount: 1
Contexts:
    <no associated contexts or attribute callbacks>

!wdfobject 0xb0a60980 
kd> !wdfobject 0xb0a60980 ;<-----FxDriver对象地址

The type for object 0xb0a60980 is FxDriver
State: FxObjectStateCreated (0x1)
!wdfhandle 0x4f59f678

dt FxDriver 0xb0a60980

Contexts:
    <no associated contexts or attribute callbacks>

FxDriver中保存Driver_Object对象指针,感觉离目标很近了:

kd> dt FxDriver 0xb0a60980
Wdf01000!FxDriver
   +0x044 m_DriverObject   : MxDriverObject ;这两个成员怎么看都觉得是DriverEntry的参数!
   +0x048 m_RegistryPath   : _UNICODE_STRING "\REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\wdffeatured"
  

FxDriver+0x44处保存了Driver_Object对象指针,地址0xb0a60980+0x44处并不是真正的Driver_Object,得再进行一次访存取地址:

kd> dd 0xb0a60980+0x44 L4
b0a609c4  8e54baf8 00780076 ae984c38 b5bc8801
kd> dt MxDriverObject 8e54baf8 
Wdf01000!MxDriverObject
   +0x000 m_DriverObject   : 0x00a80004 _DRIVER_OBJECT

最后在0x8e54baf8 处取到Driver_Object地址(这个地址看着还算靠谱),再试一下!drvobj命令,总算没有白费功夫,曲线达成目标:

kd> !drvobj 8e54baf8 7
Driver object (8e54baf8) is for:
 \Driver\wdffeatured
Driver Extension List: (id , addr)
(862ecd8a a4a06068)  
Device Object list:
b0a90390  

DriverEntry:   a82224e0	wdffeatured!FxDriverEntry
DriverStartIo: 00000000	
DriverUnload:  a82225cc	wdffeatured!FxStubDriverUnload
AddDevice:     862b09de	Wdf01000!FxDriver::AddDevice

Dispatch routines:
[00] IRP_MJ_CREATE                      862918a0	Wdf01000!FxDevice::DispatchWithLock
[01] IRP_MJ_CREATE_NAMED_PIPE           862918a0	Wdf01000!FxDevice::DispatchWithLock
[02] IRP_MJ_CLOSE                       862918a0	Wdf01000!FxDevice::DispatchWithLock
[03] IRP_MJ_READ                        862918a0	Wdf01000!FxDevice::DispatchWithLock
[04] IRP_MJ_WRITE                       862918a0	Wdf01000!FxDevice::DispatchWithLock
[05] IRP_MJ_QUERY_INFORMATION           862918a0	Wdf01000!FxDevice::DispatchWithLock
[06] IRP_MJ_SET_INFORMATION             862918a0	Wdf01000!FxDevice::DispatchWithLock
[07] IRP_MJ_QUERY_EA                    862918a0	Wdf01000!FxDevice::DispatchWithLock
[08] IRP_MJ_SET_EA                      862918a0	Wdf01000!FxDevice::DispatchWithLock
[09] IRP_MJ_FLUSH_BUFFERS               862918a0	Wdf01000!FxDevice::DispatchWithLock
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION    862918a0	Wdf01000!FxDevice::DispatchWithLock
[0b] IRP_MJ_SET_VOLUME_INFORMATION      862918a0	Wdf01000!FxDevice::DispatchWithLock
[0c] IRP_MJ_DIRECTORY_CONTROL           862918a0	Wdf01000!FxDevice::DispatchWithLock
[0d] IRP_MJ_FILE_SYSTEM_CONTROL         862918a0	Wdf01000!FxDevice::DispatchWithLock
[0e] IRP_MJ_DEVICE_CONTROL              862918a0	Wdf01000!FxDevice::DispatchWithLock
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     862918a0	Wdf01000!FxDevice::DispatchWithLock
[10] IRP_MJ_SHUTDOWN                    862918a0	Wdf01000!FxDevice::DispatchWithLock
[11] IRP_MJ_LOCK_CONTROL                862918a0	Wdf01000!FxDevice::DispatchWithLock
[12] IRP_MJ_CLEANUP                     862918a0	Wdf01000!FxDevice::DispatchWithLock
[13] IRP_MJ_CREATE_MAILSLOT             862918a0	Wdf01000!FxDevice::DispatchWithLock
[14] IRP_MJ_QUERY_SECURITY              862918a0	Wdf01000!FxDevice::DispatchWithLock
[15] IRP_MJ_SET_SECURITY                862918a0	Wdf01000!FxDevice::DispatchWithLock
[16] IRP_MJ_POWER                       862918a0	Wdf01000!FxDevice::DispatchWithLock
[17] IRP_MJ_SYSTEM_CONTROL              862918a0	Wdf01000!FxDevice::DispatchWithLock
[18] IRP_MJ_DEVICE_CHANGE               862918a0	Wdf01000!FxDevice::DispatchWithLock
[19] IRP_MJ_QUERY_QUOTA                 862918a0	Wdf01000!FxDevice::DispatchWithLock
[1a] IRP_MJ_SET_QUOTA                   862918a0	Wdf01000!FxDevice::DispatchWithLock
[1b] IRP_MJ_PNP                         862918a0	Wdf01000!FxDevice::DispatchWithLock

下篇预告:

好久没有更新WDF框架分析了,不是我断更了,是WDF驱动的WDFIOQUEUE实在太复杂。大家留意一下!drvobj wdffeatured输出中关于驱动DISPATCH处理函数的原型----齐刷刷统一着装为:Wdf01000!FxDevice::DispatchWithLock。这是WDF框架中分析IoQueue重要的一环,且听我下回分解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Windbg 6.12.0002.633 是Microsoft官方提供的Windows调试工具。它是一种强大的调试器,用于分析和诊断Windows操作系统中发生的问题。Windbg可以用于调试用户模式和内核模式的应用程序。 作为一种高级调试工具,Windbg提供了各种功能和命令,以帮助开发人员定位和修复软件中的bug。它可以在程序崩溃捕获详细的调试信息,并分析导致崩溃的原因。通过使用Windbg,开发人员可以查看变量的值、调用栈、线程状态等信息,以便更好地理解程序的执行过程和内部结构。 除了基本的调试功能外,Windbg还提供了一些高级的功能,如内存分析、性能分析和追踪。开发人员可以使用Windbg来分析程序的内存使用情况,查找内存泄露和内存损坏问题。此外,Windbg还可以用于分析程序的性能瓶颈,帮助开发人员找到性能优化的方向。 总之,Windbg是一个强大的调试工具,可以帮助开发人员解决软件中出现的各种问题。通过使用Windbg,开发人员可以深入了解程序的内部机制,准确地定位问题,并快速地进行修复。 ### 回答2: Windbg6.12.0002.633是微软开发的一款调试工具,主要用于Windows操作系统的内核和应用程序的调试。它是Windows驱动程序开发和崩溃分析领域最受欢迎的调试工具之一。 Windbg6.12.0002.633具有强大的调试功能和丰富的调试命令,能够提供全面的调试信息和分析能力。它可以与符号服务器和调试扩展进行集成,以便更好地支持各种调试场景。 Windbg6.12.0002.633通过分析可执行文件的运行状态,可以帮助开发人员快速定位和解决程序中的bug和崩溃问题。它可以提供堆栈跟踪信息,显示线程状态和资源使用情况,查看内存中的变量和对象等等。开发人员可以通过这些信息提高调试效率,加快问题解决的速度。 此外,Windbg6.12.0002.633还拥有强大的内核调试功能,可以用于分析Windows内核驱动程序的运行情况。它可以与微软内核模式调试器KD一起使用,提供对内核服务、驱动程序和操作系统的完全访问权,使开发人员可以深入了解和调试系统的内部工作原理。 总之,Windbg6.12.0002.633是一款功能强大的调试工具,对于开发人员来说是一个宝贵的资源。它可以帮助开发人员提高调试效率,解决程序中的问题,提升软件质量。 ### 回答3: Windbg 6.12.0002.633是一款由微软提供的高级调试工具。它是一种非常强大而且灵活的工具,广泛应用于Windows操作系统的开发与调试过程中。 首先,Windbg 6.12.0002.633可以用于对应用程序、驱动程序或操作系统进行调试。它提供了各种功能来帮助开发人员分析应用程序或系统在运行的问题。通过Windbg,开发人员可以查看具体的错误信息,堆栈跟踪,寄存器状态等,以便更好地理解代码执行的情况。 其次,Windbg 6.12.0002.633还支持远程调试功能。这意味着开发人员可以通过网络连接到远程计算机并进行调试。这对于调试在远程服务器上运行的应用程序或系统特别有用。远程调试功能使得开发人员可以在实际环境中进行调试,从而更好地解决问题。 此外,Windbg 6.12.0002.633还内置了一些实用的调试命令。这些命令可以用于查看和修改内存,设置断点,单步执行代码等。这些命令的强大功能可以帮助开发人员快速定位并解决问题。 总之,Windbg 6.12.0002.633是一款功能强大且灵活的调试工具,它可以帮助开发人员解决应用程序或系统中的问题。无论是本地调试还是远程调试,Windbg都能提供全面的支持,并以其丰富的功能和实用的命令帮助开发人员更好地理解和解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值