User32.dll 或 Kernel32.dll 没有初始化

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 184802
症状
可能失败的应用程序所执行的CreateProcessCreateProcessAsUser和您收到下列错误消息之一:
<system>的动态库初始化失败的 \system32\user32.dll。该进程正在异常终止。 </system>
<system>的动态库初始化失败的 \system32\kernel32.dll。该进程正在异常终止。 </system>

另外,失败的进程返回退出代码 128 或以下错误:
ERROR_WAIT_NO_CHILDREN
原因
由于以下原因之一而出现此故障:
  • 执行的进程不具有正确的安全访问与进程相关联的桌面和窗口站。
  • 系统已超出桌面堆运行。
更多信息

原因 1

执行的进程不具有正确的安全访问与进程相关联的桌面和窗口站。

将传递到CreateProcessCreateProcessAsUser的 STARTUPINFO 结构的 lpDesktop 成员指定的窗口站和桌面与执行进程相关联。执行的进程必须到指定的窗口站和桌面上的正确的安全访问。

有关如何解决安全问题的窗口站和桌面上单击下面的文章编号以查看 Microsoft 知识库中相应的文章:
165194 CreateProcessAsUser() windowstations 和台式机

原因 2

系统已超出桌面堆运行。

桌面系统上的每个对象都有一个与之相关联的桌面堆。桌面的对象使用堆存储菜单、 挂钩、 字符串和窗口。在 Windows Server 2003 和 Windows XP 32 位系统将桌面堆分配从系统级 48 兆字节 (MB) 缓冲区。除了桌面堆打印机驱动程序和字体驱动程序也使用此缓冲区。

桌面是与窗口站相关联。窗口站可以包含零个或多个桌面。您可以更改桌面堆分配的桌面与该键关联的窗口站通过更改以下注册表值的大小。

注意:不建议使用/3GB开关。在 Boot.ini 文件中指定了/3GB开关。仅适用于 32 位操作系统支持/3GB开关。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
在 Windows Server 2003 和 Windows XP 32 位此注册表值的默认数据将类似于以下内容 (全部在一行):
   %SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows   SharedSection=1024,3072,512 Windows=On SubSystemType=Windows   ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3   ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off   MaxRequestThreads=16				

在不同版本的 Windows 中的此注册表值默认数据将如下所示:

适用于 Windows Vista RTM (32 位)
SharedSection=1024,3072,512

Windows Vista SP1、 Windows 7、 Windows 8、 Windows 8.1 (32 位) 和 Windows Server 2008 (32 位)
SharedSection=1024,12288,512

对于 Windows Vista Windows 7 Windows 8、 Windows 8.1 (64 位)、 Windows Server 2008、 Windows Server 2008 R2、 Windows Server 2012 和 Windows Server 2012 R2 (64 位)
SharedSection=1024,20480,768

以下的数值"SharedSection ="控制桌面堆分配的方式。这些SharedSection值是以千字节为单位指定的。有单独与交互式和非交互式窗口站的桌面设置。

注意:如果您更改了注册表中的SharedSection值必须重新启动系统以使更改生效。

重要:此部分、 方法或任务包含一些介绍如何修改注册表的步骤。但是,如果不正确地修改了注册表,可能会出现严重的问题。因此,请确保仔细按照下列步骤操作。为增加保护,对其进行修改之前备份注册表。然后,您可以在出现问题时还原注册表。有关如何备份和还原注册表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
322756 如何在 Windows 中备份和还原注册表

第一个SharedSection值 (1024) 是常见到所有桌面共享的堆大小。这包括全局句柄表。此表保存到窗口、 菜单、 图标、 光标,等的句柄和共享的系统设置。它不太可能您以往任何时候都需要更改此值。

第二个SharedSection值是为"交互"窗口站 WinSta0 与关联的每个桌面桌面堆大小。如挂钩、 菜单、 字符串、 对象的用户和 windows 使用此桌面堆中的内存。它不太可能您以往任何时候都需要更改此值。

在交互式窗口站中创建每个桌面使用 3,072 KB 的默认桌面堆。默认情况下系统在 Winsta0 中创建以下三个台式机:
  • Winlogon
  • 默认
    所有 theprocesses STARTUPINFO.lpDesktop结构成员中为其指定"Winsta0\default"将都使用"默认值"应用程序的桌面。当 lpDesktop 结构成员即空窗口站和桌面上都继承自父进程。通过选中允许服务与桌面交互]启动选项来执行在 LocalSystem 帐户下的所有服务将都使用"Winsta0\Default"。所有这些进程都将共享桌面堆与"默认"应用程序的桌面相关联。
  • 屏幕保护程序
    当屏幕保护程序显示在交互式窗口 (WinSta0) 创建桌面屏幕保护程序。
第三个的SharedSection值是桌面的程序与"非交互式"窗口站每个桌面堆大小。如果没有此值设置为非交互式窗口站的桌面堆的大小将与交互式窗口站 (即第二个SharedSection值) 为指定的大小相同。

如果仅存在的两个SharedSection值多于您可以添加第三个值指定的台式机创建非交互式窗口站内的桌面堆大小。

在用户帐户下执行的每个服务进程将在非交互式窗口站创建由服务控制管理器 (SCM) 收到新的桌面。因此每个服务所执行的用户帐户将使用桌面堆中第三个SharedSection值指定千字节数。在本地系统帐户下执行的所有服务时允许服务与桌面交互]选定的共享桌面设置为非交互式服务窗口站 (服务-0x0-3e7$) 中的"默认值"桌面堆。

交互式和非交互式窗口站内正使用总桌面堆必须适合缓冲区。

减少第二次或第三个SharedSection值将增加桌面可创建相应的窗口站内的数。较小的值会限制数挂钩、 菜单、 字符串和可以在桌面上创建的窗口。上而增加第二个或第三个SharedSection值将减少数可以创建的桌面。但这也会增加挂钩、 菜单、 字符串和可以在桌面上创建的窗口的数目。

由于 SCM 在非交互式窗口站为每个用户帐户下运行的服务进程中创建一个新桌面更大的第三个SharedSection值将减少数可以在系统成功运行的用户帐户服务。对于第二个或第三个SharedSection值可以指定的最小值为 128。任何尝试使用较小的值 willinstead 使用 128。

桌面堆分配了 User32.dll 当一个进程所需的用户对象。如果应用程序即不依赖于 User32.dll 将不会占用桌面堆。

注意:在 Windows Server 2003 中的特定事件当以下条件之一为真时在系统日志中记录:
  • 完整的桌面堆时将记录以下事件:

    事件类型: 警告
    事件源: Win32k
    事件类别: 无
    事件 ID: 243
    日期: 日期
    时间: 时间
    用户: 不适用
    计算机: 服务器名
    说明: 桌面堆分配失败。

    在这种情况下增加桌面堆大小。
  • 如果总的桌面堆的系统级缓冲区大小,会记录下面的事件:

    事件类型: 警告
    事件源: Win32k
    事件类别: 无
    事件 ID: 244
    日期: 日期
    时间: 时间
    用户: 不适用
    计算机: 服务器名
    说明: 创建一个桌面由于缺少桌面堆栈失败。

    在这种情况下减少桌面堆大小。
在 Windows Server 2003 系统级缓冲区是 20 MB 以下条件之一为真时:
  • 要在终端服务环境中。
  • 在 Boot.ini 文件中指定了/3GB开关。

警告:本文已自动翻译

属性

文章 ID:184802 - 上次审阅时间:06/14/2015 19:52:00 - 修订版本: 1.0

Microsoft Win32 Application Programming Interface

  • kbdll kbkernbase kbprb kbsecurity kbmt KB184802 KbMtzh
反馈