注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

GDI内核栈的初始化问题  

2012-01-30 00:51:51|  分类: sr |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
GDI内核栈的初始化在win32k.sys中完成。

前段时间,写了这样一段代码:
创建线程部分

m_thread_handle=CreateThread(NULL, NULL, ThreadProc, this, CREATE_SUSPENDED, &m_thread_id);
if (m_thread_handle==NULL)
{
return -1;
}

try
{
throw(0);
}
catch(INT)
{
ResumeThread(m_thread_handle);

INT i=0;
int times=SLEEP_WAIT_CONTINUE/SLEEP_WAIT_CONTINUE_UNIT;
while (m_hhook==NULL && i++<times)
{
m_hhook=SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, m_thread_id);
if (m_hhook!=NULL)
{
break;
}

Sleep(SLEEP_WAIT_CONTINUE_UNIT);
}

PostThreadMessage(m_thread_id, THREAD_MESSAGE_INIT, 0, 0);
}

//线程函数
DWORD CProcessModuleCheckerSelf::ThreadProcFunction()
{
if(GetForegroundWindow()==NULL)
{
}

int times=SLEEP_WAIT_CONTINUE/SLEEP_WAIT_CONTINUE_UNIT;
INT i=0;
while (m_hhook==NULL && i++<times)
{
Sleep(SLEEP_WAIT_CONTINUE_UNIT);
}

if (m_hhook==NULL)
{
return -1;
}

MSG msg={0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

Release();

return 0;
}

这段代码的红色部分,是核心代码,也是最不起眼的代码。一般人如果照着写,都会删除它。但是,熟悉Windows系统内核的都知道它的作用。——当然了,这里也是可以去掉的。



        GDI内核栈资源的初始化。在系统启动时,当XP的进度条显示完毕之后,系统创建了smss进程,smss进程加载win32k.sys,从而完成windows子系统内核模块的加载。
        所以,在smss进程创建的初始阶段,任何对User32.dll的调用都是无效的,任何试图加载kernel32.dll乃至user32.dll的操作,都会导致系统无法启动。

By:zhanyonhu
  评论这张
 
阅读(517)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016