加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(161)

发布时间:2020-12-15 04:59:02 所属栏目:百科 来源:网络整理
导读:NtUserCreateWindowEx 函数主要用来创建一个窗口显示。在 Win32k.sys 里的代码如下: #001 HWND APIENTRY #002 NtUserCreateWindowEx(DWORD dwExStyle, #003 PUNICODE_STRING UnsafeClassName, #004 PUNICODE_STRING UnsafeWindowName, #005 DWORD dwStyle,

NtUserCreateWindowEx函数主要用来创建一个窗口显示。在Win32k.sys里的代码如下:

#001 HWND APIENTRY

#002 NtUserCreateWindowEx(DWORD dwExStyle,

#003 PUNICODE_STRING UnsafeClassName,

#004 PUNICODE_STRING UnsafeWindowName,

#005 DWORD dwStyle,

#006 LONG x,

#007 LONG y,

#008 LONG nWidth,

#009 LONG nHeight,

#010 HWND hWndParent,

#011 HMENU hMenu,

#012 HINSTANCE hInstance,

#013 LPVOID lpParam,

#014 DWORD dwShowMode,

#015 BOOL bUnicodeWindow,

#016 DWORD dwUnknown)

#017 {

#018 NTSTATUS Status;

#019 UNICODE_STRING WindowName;

#020 UNICODE_STRING ClassName;

#021 HWND NewWindow;

#022 DECLARE_RETURN(HWND);

#023

#024 DPRINT("Enter NtUserCreateWindowEx(): (%d,%d-%d,%d)/n",x,y,nWidth,nHeight);

用户界面临界区进入。

#025 UserEnterExclusive();

#026

获取窗口类的名称。

#027 /* Get the class name (string or atom) */

#028 Status = MmCopyFromCaller(&ClassName,UnsafeClassName,sizeof(UNICODE_STRING));

#029 if (! NT_SUCCESS(Status))

#030 {

#031 SetLastNtError(Status);

#032 RETURN( NULL);

#033 }

#034 if (ClassName.Length != 0)

#035 {

#036 Status = IntSafeCopyUnicodeStringTerminateNULL(&ClassName,UnsafeClassName);

#037 if (! NT_SUCCESS(Status))

#038 {

#039 SetLastNtError(Status);

#040 RETURN( NULL);

#041 }

#042 }

#043 else if (! IS_ATOM(ClassName.Buffer))

#044 {

#045 SetLastWin32Error(ERROR_INVALID_PARAMETER);

#046 RETURN(NULL);

#047 }

#048

拷贝窗口的名称。

#049 /* safely copy the window name */

#050 if (NULL != UnsafeWindowName)

#051 {

#052 Status = IntSafeCopyUnicodeString(&WindowName,UnsafeWindowName);

#053 if (! NT_SUCCESS(Status))

#054 {

#055 if (! IS_ATOM(ClassName.Buffer))

#056 {

#057 ExFreePoolWithTag(ClassName.Buffer,TAG_STRING);

#058 }

#059 SetLastNtError(Status);

#060 RETURN( NULL);

#061 }

#062 }

#063 else

#064 {

#065 RtlInitUnicodeString(&WindowName,NULL);

#066 }

#067

调用函数co_IntCreateWindowEx来创建窗口。

#068 NewWindow = co_IntCreateWindowEx(dwExStyle,&ClassName,&WindowName,dwStyle,nHeight,

#069 hWndParent,hMenu,hInstance,lpParam,dwShowMode,bUnicodeWindow);

#070

清空窗口名称和窗口类名称的缓冲区。

#071 if (WindowName.Buffer)

#072 {

#073 ExFreePoolWithTag(WindowName.Buffer,TAG_STRING);

#074 }

#075 if (! IS_ATOM(ClassName.Buffer))

#076 {

#077 ExFreePoolWithTag(ClassName.Buffer,TAG_STRING);

#078 }

#079

返回创建的新窗口。

#080 RETURN( NewWindow);

#081

#082 CLEANUP:

#083 DPRINT("Leave NtUserCreateWindowEx,ret=%i/n",_ret_);

#084 UserLeave();

#085 END_CLEANUP;

#086 }

#087

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读