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, 0, 0, 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, lpRc, 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, hDC, &SafeRect, hFont, hIcon, &SafeStr, uFlags);
#042 }
#043 else
#044 Ret = UserDrawCaption(pWnd, hDC, &SafeRect, hFont, hIcon, NULL, uFlags);
#045 }
这里是异常出错处理。
#046 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
#047 {
#048 SetLastNtError(_SEH2_GetExceptionCode());
#049 }
#050 _SEH2_END;
#051
#052 UserLeave();
#053 return Ret;
#054 }