Windows消息队列
+ -

窗口与线程的关系

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 //窗口过程(窗口消息回调函数)
...
}

154326523614
154350906825

总结

  • 窗口是在内核中创建的
  • 窗口句柄是全局的(所有进程均可以用)
  • 一个线程可以有多个窗口,但每个窗口只能属于一个线程。

相关文章:https://zhuanlan.zhihu.com/p/526850180?utm_id=0

0 篇笔记 写笔记

Win32窗口程序自定义控制台输出
习惯了使用printf之类的控制台输出,而在以winmain入口的用户界面程序中要调试输出很不方便。当然,微软也提供了 OutputDebugString的函数让大家使用,但是,使用OutputDebugString的成本也很高。首先各个函数只支持字符串输出,你想输出个变量也得自己格式化,再调用。其......
Windows内核线程睡眠
许多读者一定使用过Sleep函数。这能使程序停下一段时间。许多需要连续、长期执行,但是又不希望占太多CPU使用率的任务,可以在中间加入睡眠。这样能使CPU使用率大大降低。即使睡眠的时间非常短(几十个毫秒)。在驱动中也可以睡眠。使用到的内核函数的原型如下: NTSTATUS Ke......
Windows内核驱动创建线程
有时候需要使用线程来完成一个或者一组任务。这些任务可能耗时过长,而开发者又不想让当前系统停止下来等待。在驱动中停止等待很容易使整个系统陷入“停顿”,最后可能只能重启电脑。但一个单独的线程长期等待,还不至于对系统造成致命的影响。另一些任务是希望长期、不断的执行,比如不断写入日志。为此启动一个特殊的线程......
Windows驱动线程创建与退出
在应用层时,我们可以使用CreateThread来创建一个线程,这时如果创建成功,会退回一个线程句柄。而当创建的这个线程退出时,这个线程变为激活态,即我们可以通过WatiForSingleObject返回WAIT_OBJECT_0.如:HANDLE hThread = CreateThread(......
CreateThreadpoolWork线程
PTP_WORK WINAPI CreateThreadpoolWork( __in PTP_WORK_CALLBACK pfnwk, __in_out_opt PVOID pv, __in_opt PTP_CALLBACK_ENVIRON pcbe);......
Windows内核线程休眠KeSleep函数
//传入的数据若为1000,则 睡眠的时间为: 1000 * 100 ns * 10 *1000 =1sVOID KeSleep(LONG msec){ #define DELAY_ONE_MICROSECOND (-10) #define DELAY_ONE_MILLI......
Windbg观察窗口的NTSTATUS将十进制改为十六进制显示
在Windbg里调试驱动时,NTSTATUS Status的值总显示为on-1**的十进制形式,非常不利于我们查看其对应的问题。如下:这时,我们只需要使用dd命令显示变量的值即可。2: kd> dd sffff8000`56fbf840 c0000010 fffff803 000000......
SavedApcState与线程挂靠
_KTHREAD线程0x258地址处: +0x258 SavedApcState : _KAPC_STATE +0x258 SavedApcStateFill : [43] UChar此为备份SavedApcState,用于当线程挂靠到别的进程时,保存当前进程的APC State......
PsExitSpecialApc线程的退出示例
在上一节KiInsertQueueApc中,可以看到有一个特殊的APC,其为PsExitSpecialApc,表示线程退出的APC. if (Apc->NormalRoutine) { /* Normal APC; is it the Thread Termin......
窗口线程的关系
一个GUID线程,会对应一个消息队列。该队列就在THREADINFO结构体中的MessageQueue中。消息的产生与发送SP++会在GetMessage中挂一个钩子,所以会收到消息。键盘 / 鼠标SendMessage/PostMessage系统产生在Win32k.sys中有2个线程Ini......
线程ETHREAD
每个线程在内核都有一个对应的结构体:ETHREAD,ETHREAD的第一个成员为KTHREAD.1: kd> dt _ETHREADnt!_ETHREAD +0x000 Tcb : _KTHREAD +0x5e0 CreateTime : ......
线程等待链表/调度链表
线程3种状态:正在运行就绪等待等待线程链表阻塞的线程在等待线程链表中。KTHREAD结构体中: +0x0d8 WaitListEntry : _LIST_ENTRY +0x0d8 SwapListEntry : _SINGLE_LIST_ENTRY当一个线程处于等待状......
模拟线程切换ThreadSwitch源代码(X86)
ThreadSwitch.cpp// ThreadSwitch.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "ThreadCor......
Windows内核进程&线程函数大全
1. PEPROCESS NTAPI PsGetCurrentProcess2. HANDLE NTAPI PsGetCurrentProcessId(VOID) 3. variable PsGetCurrentThreadId4. define PsGetCur......
Windows内核线程切换
线程切换的函数是:KiSwapThread,该函数内部调用 KiSwapContext进行堆栈信息的切换。ReactOS的源代码如下:LONG_PTR FASTCALL KiSwapThread(IN PKTHREAD Thread,IN PKPRCB Prcb ) { ......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!