窗口与线程的关系
2023-10-26
24
0
一个GUID线程,会对应一个消息队列。该队列就在THREADINFO结构体中的MessageQueue中。
消息的产生与发送
SP++会在GetMessage中挂一个钩子,所以会收到消息。
- 键盘 / 鼠标
- SendMessage/PostMessage
- 系统产生
在Win32k.sys中有2个线程InitInputImg:
- 鼠标监控线程 KeyboardThreadMain
- 键盘监控线程 MouseThreadMain
以上线程会把产生的消息挂入到窗口所对应的消息队列。
监控线程找到目标GUID线程
使用IDA跟踪CreateWindow最后到系统调用,系统调用至Win32k.sys中。
窗口
任意一窗口(包括对话框中的按钮,控件等)都有一内核结构体WINDOWS_OBJECT结构体。
_WINDOWS_OBJECT
{
...
PTHREADINFO pti;//指向所属线程的THREADINFO
WNDPROC lpfnWndProc //窗口过程(窗口消息回调函数)
...
}
总结
- 窗口是在内核中创建的
- 窗口句柄是全局的(所有进程均可以用)
- 一个线程可以有多个窗口,但每个窗口只能属于一个线程。
相关文章:https://zhuanlan.zhihu.com/p/526850180?utm_id=0