注:以下所说 windows 线程是指与调用了与图形用户界面相关的函数的线程,而 windows
进程则是包含 windows 线程的进程,以区别于一般的进程和线程
一个线程只有一个报文队列,但可以有多个窗口,每个窗口都有 WndProc 函数
窗口对象如下:
Typedef struct _WINDOW_OBJECT{
PW32THREADINFO ti;
PDESKTOP Desktop;
……
UNICODE_STRING WindowName;
……
RECT WindowRect;
……
//pointer to the owning thread’s message queue
PUSER_MESSAGE_QUEUE MessageQueue; //指向所属进程的消息队列
Struct _WINDOW_OBJECT *FirstChild;
Struct _WINDOW_OBJECT *LastChild;
Struct _WINDOW_OBJECT *NextSibling;
Struct _WINDOW_OBJECT *PrevSibling;
//ENTRY in the list of thread windows
LIST_ENTRY ThreadListEntry;
//Handle to the owner window
HWND hOwner;
……
WNDPROC WndProc; //消息处理函数
PRTHREAD OwnerThread; //指向具体窗口所属线程的 ETHREAD 结构
……
}WINDOW_OBJECT;
当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以
减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数
(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以
便它能够执行与用户界面有关的任务。因此进程在建立之初,并没有与用户界面相关的数
据结构,只有当进程中某一线程调用 win32k.sys 中的函数时,进程会转化为 windows 进程,
调用为 win2k.sys 的 线 程 则 转 化 为 windows 线 程 。 一 个 进 程 只 要 其 中 有 一 个 线 程 是
windows 线程,则就是 windows 进程。Windows 进程除了 EPROCESS 和 KPROCESS 外,
还 有 个 W32PROCESS 结 构 , 即 系 统 为 windows 进 程 所 分 配 的 另 外 一 些 资 源 。 且
EPROCESS 结构中的指针 Win32Process 指向这个数据结构。
当线程转化为 windows 线程时,系统会为线程分配一个 T H R E A D I N F O 结构
这个 T H R E A D I N F O 结构包含一组成员变量,利用这组成员,线程可以认为它是在自
己独占的环境中运行。T H R E A D I N F O 是一个内部的、未公开的数据结构,用来指定
线程的 投 递 消 息 队 列 ( posted-message queue ) 、 发 送 消 息 队 列 ( send-message
queue)、应答消息队列( r e p l y -message queue)、虚拟输入队列( virtualized-
input queue)、唤醒标志( wake flag)、以及用来描述线程局部输入状态的若干变量。