Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: 学习   发起时间: 2009-02-03 17:04 下午   回复: 7

Print Search
帖子排序:    
   2009-02-03, 17:04 下午
study 离线,最后访问时间: 2009/2/3 17:01:44 学习

发帖数前150位
注册: 2009-02-03
发 贴: 6
Smile [:)] windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Reply Quote

windbg如何查看HWND的数据结构?如何在窗口过程上下断点?

谢谢各位!


IP 地址: 已记录   报告
   2009-02-04, 13:51 下午
study 离线,最后访问时间: 2009/2/3 17:01:44 学习

发帖数前150位
注册: 2009-02-03
发 贴: 6
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Reply Quote
咋没人理俺呀?
IP 地址: 已记录   报告
   2009-02-04, 23:32 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Reply Quote
HWND就是一个整型,dd就可以显示它的值了。
窗口过程有很多,看你想调试哪个?
如果是系统默认的窗口类,其窗口函数是USER32!DefWindowProcA
如果是对话框,其窗口函数是USER32!DefDlgProcA
对于MFC程序,MFC的默认窗口过程是MFC42D!CWnd::WindowProc
如果是程序员自己注册的窗口类,那么窗口函数是注册时登记的
如果你只是跟踪MFC程序中对某个消息事件的处理方法,那么就对OnXXX设置断点。

BTW,如果希望得到答案更快速和精确,那么最好把问题描述的详细些,比如你是想解决什么样的问题呢?不会是想考考高网的水平吧?^_^
IP 地址: 已记录   报告
   2009-02-05, 09:11 上午
study 离线,最后访问时间: 2009/2/3 17:01:44 学习

发帖数前150位
注册: 2009-02-03
发 贴: 6
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Reply Quote
:),谢谢张老师的回答。
俺不是考查高网的水平,但俺的问题也不至于那么菜呀。

第一个问题:
HWND是四个字节的数值,但通过这个整数如何获取窗口的各种属性呢?比如显示、大小、ID、Parent、PID、TID等等等等。
如同HOBJECT,对应着一个GDITableEntry一样,通过HOBJECT可以了解更多的信息。
在使用windbg查找解决应用层问题的时候,往往现场很难重现,或者重现后界面已经不可见,根据堆栈,了解某些HWND的各种属性对解决问题很重要,从HWND如何了解这些就成了比较关键的手段。在windows2000上,windbg带了一个gdi的命令库,但xp以后版本中没有了。
如何去做?
HWND应该也对应着一个数据结构吧,却没有搜索到相关资料,即使MS不公开HWND的资料,也应该有人研究一把的呀。

第二个问题:
对一个标准windows窗口,她的默认窗口过程被SetWindowLongPtr修改后,那些SendMessage造成的直接窗口过程调用是应该在DefWindowProc之前的吧,如果没有第三方的符号库,如何在这个窗口过程的某个条件上断下来?


IP 地址: 已记录   报告
   2009-02-05, 12:59 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Reply Quote
这样的问题就make much more sense
对于问题1,是希望得到下面这样的信息吧?
Window 00400e7a
Name HeapMfc
Class #32770
WndProc 00000000
Style WS_SYSMENU WS_DLGFRAME WS_BORDER WS_CLIPSIBLINGS WS_VISIBLE WS_POPUP
ExStyle WS_EX_DLGMODALFRAME WS_EX_WINDOWEDGE WS_EX_LEFT WS_EX_LTRREADING WS_EX_RIGHTSCROLLBAR WS_EX_CONTROLPARENT WS_EX_APPWINDOW
HInstance 00400000
ParentWnd 00000000
Id 00000000
UserData 00000000
Unicode FALSE
ThreadId 000006c4
ProcessId 0000163c
那可以使用Skywing编写的扩展模块,模块名叫sdbgext.dll,上面的结果就是用它得到的:
0:001> !sdbgext.hwnd 0x00400e7a
对于第二个问题,可以先读出设置的新过程的地址(相当于GetWindowLongPtr)是什么,然后对其设置条件断点。

IP 地址: 已记录   报告
   2009-02-05, 13:34 下午
study 离线,最后访问时间: 2009/2/3 17:01:44 学习

发帖数前150位
注册: 2009-02-03
发 贴: 6
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Reply Quote
哈,谢谢张老师,看来俺这次的描述让大家理解了。
都怪俺孤陋寡闻,现在才知道有sdbgext扩展,还没有用过她。
怕各位笑话,不敢再问这个模块怎样能获得了,自己搜搜了。

第一个问题正如你所说的。需要得到这样信息。看你贴的例子里面,对应HWND,咋没有其Position和Rect信息呀。

第二个问题的解决方案中牵出俺不会的另一个问题:.call指令调用GetWindowLongPtr如何传参数?
IP 地址: 已记录   报告
   2009-02-05, 16:00 下午
study 离线,最后访问时间: 2009/2/3 17:01:44 学习

发帖数前150位
注册: 2009-02-03
发 贴: 6
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Reply Quote
还有,看了sdbgext的源码,对hwnd命令,里面采用的GetWindowLongPtr获取各种属性,但独有WndProc不能取到,而spy++则可以取到,貌似MS的spy++也是用GetWindowLongPtr获取的呀,难道spy++用的其他方式?

我原以为sdbgext源码里面会列出HWND与内核中未公开数据结构那个对应关系。:(
IP 地址: 已记录   报告
   2009-02-05, 16:13 下午
study 离线,最后访问时间: 2009/2/3 17:01:44 学习

发帖数前150位
注册: 2009-02-03
发 贴: 6
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Reply Quote
还有,这个扩展很好,但不足之处在于,命令对应完全转储的dmp则不能使用。
比如一个最简单的例子就是,我想知道某个转储中的窗口的位置是不是跑到了九霄云外。
如果能从内存数据中分析就好了。
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.