Win32k(1) 图形线程的初始化

很久以前看ROS的笔记,跟windows不一样的地方不少,最近没时间看这块了= = 先贴上来备份


第一部分 图形线程的初始化

综述一下——

 

图形通信对象(user object)以线程为单位。这个线程是图形线程,调用表就是ssdt shadow,包含了图形系统调用,三环由user32提供,0环由win32k支持。

 

线程包含窗口,桌面,普通窗口,各种控件,都是窗口。窗口有一个wndproc,用来相应各种消息。

 

线程有若干个消息队列,分别负责接收和发送同步send消息,异步post消息,ROS中有七个。

 

线程内的窗口公用一组消息队列,消息本身知名发送到哪个窗口。

 

图形对象有这么几个元素,有所属关系?这点纯YY没细看:

windows工作站>桌面>一般窗口

 

窗口是窗口类的成员,窗口类是创建窗口的模板。之前说了窗口属于线程,而窗口类处于进程。

 

一.PsConvertToGuiThread

    更换更大的内核栈

 

    调用PspW32ProcessCalloutPspW32ThreadCallout创建ethread.W32PROCESS ethread.W32THREAD结构

 

调用表切换到shadow

二.Win32kProcessCallback 初始化

 

1.分配eprocess->Win32Process

 

这个结构是PROCESSINFOROS自己定义的

 

typedefstruct_PROCESSINFO

{

W32PROCESS;

 

  PCLS pclsPrivateList;

  PCLS pclsPublicList;

DWORDdwRegisteredClasses;

/* ReactOS */

LIST_ENTRYClassList;

LIST_ENTRYMenuListHead;

  FAST_MUTEX PrivateFontListLock;

LIST_ENTRYPrivateFontListHead;

  FAST_MUTEX DriverObjListLock;

LIST_ENTRYDriverObjListHead;

struct_KBL*KeyboardLayout; //THREADINFO only

W32HEAP_USER_MAPPINGHeapMappings;

}PROCESSINFO;

 

 

2、映射MmMapViewOfSection(GlobalUserHeapSection

 

全局的图形对象句柄表(跟一下GdiQueryTable可以知道这个表的位置),存储于Win32Process.HeapMappings

 

也存储于Process->Peb->GdiSharedHandleTable

 

PS:这个句柄表 WINDOWS下这个结构是

typedefstruct _GDITableCell

{

    void          *  pKernel;

    unsignedshort  _nProcess; // NT/2000 switch orderfor _nProcess, _nCount

    unsignedshort  _nCount;

    unsignedshort   nUpper;

    unsignedshort   nType;

    void          * pUser;

} GDITableCell, *PGDITableCell;

 

除了gdi句柄表,还有一个全局句柄表是user句柄表,后面遍历全局钩子的时候会看到。

 

三.Win32kThreadCallback

 

分配Win32Thread

 

 

指定线程的桌面和工作站,消息队列struct_USER_MESSAGE_QUEUE* MessageQueue;

,键盘布局等

 

PS

最后贴一下消息队列的结构

typedefstruct _tagTHREADINFO         {

/*0x0BC*/     struct _tagQ* pq;// input queue

/*0x0E0*/     struct _tagSMS* psmsSent;// send queue(sent)

/*0x0E4*/     struct _tagSMS* psmsCurrent;// send queue(current

/*0x0E8*/     struct _tagSMS* psmsReceiveList;// sendqueue (received)

/*0x174*/     struct _tagMLISTmlPost;// post queue

} tagTHREADINFO, *PtagTHREADINFO;

 

 

阅读全文
类别:内核 查看评论
posted on 2012-03-26 14:02  retme  阅读(550)  评论(0编辑  收藏  举报