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

来源:互联网 发布:notepad pro mac 编辑:程序博客网 时间:2024/06/06 00:35

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


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

综述一下——

 

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

 

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

 

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

 

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

 

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

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

 

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

 

一.PsConvertToGuiThread

    更换更大的内核栈

 

    调用PspW32ProcessCallout,PspW32ThreadCallout创建ethread.W32PROCESS ethread.W32THREAD结构

 

调用表切换到shadow

二.Win32kProcessCallback 初始化

 

1.分配eprocess->Win32Process

 

这个结构是PROCESSINFO,ROS自己定义的


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 onlyW32HEAP_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;