微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

reactos操作系统实现(181)

NtUserDrawCaption是内核函数,主要用来实现显示窗口标题

#001 BOOL

#002 APIENTRY

#003 NtUserDrawCaption(HWND hWnd,

#004 HDC hDC,

#005 LPCRECT lpRc,

#006 UINT uFlags)

#007 {

这里主要调用函数NtUserDrawCaptionTemp来实现相应的功能

#008 return NtUserDrawCaptionTemp(hWnd,hDC,lpRc,NULL,uFlags);

#009 }

函数NtUserDrawCaptionTemp实现如下:

#001 BOOL

#002 APIENTRY

#003 NtUserDrawCaptionTemp(

#004 HWND hWnd,

#005 HDC hDC,

#006 LPCRECT lpRc,

#007 HFONT hFont,

#008 HICON hIcon,

#009 const PUNICODE_STRING str,

#010 UINT uFlags)

#011 {

#012 PWINDOW_OBJECT pWnd = NULL;

#013 RECT SafeRect;

#014 UNICODE_STRING SafeStr = {0};

#015 BOOL Ret = FALSE;

#016

进入临界区代码

#017 UserEnterExclusive();

#018

如果窗口句柄不为空,就获取窗口的对象。

#019 if (hWnd != NULL)

#020 {

#021 if(!(pWnd = UserGetwindowObject(hWnd)))

#022 {

#023 UserLeave();

#024 return FALSE;

#025 }

#026 }

#027

#028 _SEH2_TRY

#029 {

获取窗口的大小。

#030 ProbeForRead(lpRc,sizeof(RECT),sizeof(ULONG));

#031 RtlcopyMemory(&SafeRect,sizeof(RECT));

#032 if (str != NULL)

#033 {

获取窗口标题显示的字符串。

#034 SafeStr = ProbeForReadUnicodeString(str);

#035 if (SafeStr.Length != 0)

#036 {

#037 ProbeForRead(SafeStr.Buffer,

#038 SafeStr.Length,

#039 sizeof(WCHAR));

#040 }

调用函数UserDrawCaption显示窗口的标题

#041 Ret = UserDrawCaption(pWnd,&SafeRect,hFont,hIcon,&SafeStr,uFlags);

#042 }

#043 else

#044 Ret = UserDrawCaption(pWnd,uFlags);

#045 }

这里是异常出错处理。

#046 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)

#047 {

#048 SetLastNtError(_SEH2_GetExceptionCode());

#049 }

#050 _SEH2_END;

#051

#052 UserLeave();

#053 return Ret;

#054}

原文地址:https://www.jb51.cc/react/308340.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐