Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
Windows内核调试
windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
学习
2009-02-03, 17:04 下午
windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
谢谢各位!
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
学习
2009-02-04, 13:51 下午
咋没人理俺呀?
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
格蠹老雷
2009-02-04, 23:32 下午
HWND就是一个整型,dd就可以显示它的值了。
窗口过程有很多,看你想调试哪个?
如果是系统默认的窗口类,其窗口函数是USER32!DefWindowProcA
如果是对话框,其窗口函数是USER32!DefDlgProcA
对于MFC程序,MFC的默认窗口过程是MFC42D!CWnd::WindowProc
如果是程序员自己注册的窗口类,那么窗口函数是注册时登记的
如果你只是跟踪MFC程序中对某个消息事件的处理方法,那么就对OnXXX设置断点。
BTW,如果希望得到答案更快速和精确,那么最好把问题描述的详细些,比如你是想解决什么样的问题呢?不会是想考考高网的水平吧?^_^
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
学习
2009-02-05, 09:11 上午
:),谢谢张老师的回答。
俺不是考查高网的水平,但俺的问题也不至于那么菜呀。
第一个问题:
HWND是四个字节的数值,但通过这个整数如何获取窗口的各种属性呢?比如显示、大小、ID、Parent、PID、TID等等等等。
如同HOBJECT,对应着一个GDITableEntry一样,通过HOBJECT可以了解更多的信息。
在使用windbg查找解决应用层问题的时候,往往现场很难重现,或者重现后界面已经不可见,根据堆栈,了解某些HWND的各种属性对解决问题很重要,从HWND如何了解这些就成了比较关键的手段。在windows2000上,windbg带了一个gdi的命令库,但xp以后版本中没有了。
如何去做?
HWND应该也对应着一个数据结构吧,却没有搜索到相关资料,即使MS不公开HWND的资料,也应该有人研究一把的呀。
第二个问题:
对一个标准windows窗口,她的默认窗口过程被SetWindowLongPtr修改后,那些SendMessage造成的直接窗口过程调用是应该在DefWindowProc之前的吧,如果没有第三方的符号库,如何在这个窗口过程的某个条件上断下来?
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
格蠹老雷
2009-02-05, 12:59 下午
这样的问题就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)是什么,然后对其设置条件断点。
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
学习
2009-02-05, 13:34 下午
哈,谢谢张老师,看来俺这次的描述让大家理解了。
都怪俺孤陋寡闻,现在才知道有sdbgext扩展,还没有用过她。
怕各位笑话,不敢再问这个模块怎样能获得了,自己搜搜了。
第一个问题正如你所说的。需要得到这样信息。看你贴的例子里面,对应HWND,咋没有其Position和Rect信息呀。
第二个问题的解决方案中牵出俺不会的另一个问题:.call指令调用GetWindowLongPtr如何传参数?
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
学习
2009-02-05, 16:00 下午
还有,看了sdbgext的源码,对hwnd命令,里面采用的GetWindowLongPtr获取各种属性,但独有WndProc不能取到,而spy++则可以取到,貌似MS的spy++也是用GetWindowLongPtr获取的呀,难道spy++用的其他方式?
我原以为sdbgext源码里面会列出HWND与内核中未公开数据结构那个对应关系。:(
Re: windbg如何查看HWND的数据结构?如何在窗口过程上下断点?
学习
2009-02-05, 16:13 下午
还有,这个扩展很好,但不足之处在于,命令对应完全转储的dmp则不能使用。
比如一个最简单的例子就是,我想知道某个转储中的窗口的位置是不是跑到了九霄云外。
如果能从内存数据中分析就好了。