很久以前看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 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;