User32.dll 或 Kernel32.dll 未初始化

本文描述了一个问题,即由CreateProcessCreateProcessAsUser执行的应用程序可能会失败。

适用于: Microsoft Windows
原始 KB 数: 184802

症状

CreateProcessCreateProcessAsUser执行的应用程序可能会失败,并且您将收到以下错误消息之一:

动态库<system>\system32\user32.dll 初始化失败。 进程正在非正常终止。 动态库<系统>的初始化\system32\kernel32.dll 失败。 进程正在非正常终止。

此外,失败的进程返回退出代码 128 或以下代码:

错误:ERROR_WAIT_NO_CHILDREN

原因

出现这种失败的原因之一:

  • 执行的进程对与进程关联的窗口工作站和桌面没有正确的安全访问权限。

  • 系统的桌面堆内存已耗尽。

详细信息

  • 原因 1

    执行的进程对与进程关联的窗口工作站和桌面没有正确的安全访问权限。

    STARTUPINFO 结构体中的 lpDesktop 成员被传递给 CreateProcessCreateProcessAsUser,它指定了与执行进程相关联的窗口站和桌面。 执行的进程必须对指定的窗口工作站和桌面具有正确的安全访问权限。

  • 原因二

    系统的桌面堆内存已耗尽。

    系统上的每个桌面对象都有一个与之关联的桌面堆。 桌面对象使用堆来存储菜单、挂钩、字符串和窗口。 在 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 值以 KB 为单位指定。 桌面有单独的设置,这些设置与交互式和非交互窗口工作站相关联。

注释

如果更改 SharedSection 注册表中的值,则必须重启系统才能使更改生效。

重要

本部分、方法或任务包含说明如何修改注册表的步骤。 如果您错误地修改注册表,可能会出现严重问题。 因此,请确保仔细执行这些步骤。 作为额外保护措施,请在修改注册表之前先将其备份。 然后,如果出现问题,您可以恢复注册表。 有关如何备份和恢复注册表的更多信息,请参见如何在 Windows 中备份和恢复注册表

第一个 SharedSection 值 (1024) 是所有桌面通用的共享堆大小。 这包括全局句柄表。 此表保存窗口、菜单、图标、光标等元素的句柄,以及共享的系统设置。 不太可能必须更改此值。

第二个SharedSection值表示与交互式窗口站 WinSta0 关联的每个桌面的桌面堆的大小。 挂钩、菜单、字符串和窗口等用户对象使用此桌面堆中的内存。 不太可能必须更改此值。

在交互式窗口工作站中创建的每个桌面默认使用 3,072 KB 的桌面栈。 默认情况下,系统在 Winsta0 中创建以下三个桌面:

  • Winlogon

  • 违约

    所有在 STARTUPINFO.lpDesktop 结构成员中指定Winsta0\default的进程都将使用默认应用程序桌面。 当 lpDesktop 结构成员为 NULL 时,窗口工作站和桌面将从父进程继承。 选择“允许服务与桌面启动”选项交互的 LocalSystem 帐户下执行的所有服务都将使用 Winsta0\Default。 所有这些进程都将共享与默认应用程序桌面关联的桌面堆。

  • 屏幕保护

    显示屏幕保护程序时,屏幕保护程序桌面在交互式窗口工作站(WinSta0)中创建。

第三个 SharedSection 值是与非交互窗口工作站关联的每个桌面的桌面堆大小。 如果此值不存在,则非交互窗口工作站的桌面堆大小将与为交互式窗口工作站指定的大小(即第二个 SharedSection 值)相同。

如果只有两个 SharedSection 值存在,则可以添加第三个值来指定在非交互窗口工作站中创建的桌面堆的大小。

在用户帐户下执行的每个服务进程都将在由服务控制管理器(SCM)创建的非交互窗口工作站中接收一个新桌面。 因此,在用户帐户下执行的每个服务将消耗第三个 SharedSection 值中指定数量的桌面堆的千字节数。 如果未选择“允许服务与桌面交互”时,在 LocalSystem 帐户下执行的所有服务共享非交互服务窗口工作站(Service-0x0-3e7$)中默认桌面的桌面堆。

交互和非交互式窗口工作站中使用的桌面堆整体必须能够适配缓冲区。

减少第二个或第三个 SharedSection 值将增加可在相应窗口工作站中创建的桌面数。 较小的值将限制可在桌面中创建的挂钩、菜单、字符串和窗口数。 另一方面,增加第二或第三个 SharedSection 值将减少可创建的桌面数。 但是,这也会增加可在桌面中创建的挂钩、菜单、字符串和窗口的数量。

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

当进程需要用户对象时,User32.dll 分配桌面堆。 如果应用程序不依赖于 User32.dll,则不会消耗桌面内存堆。

注释

在 Windows Server 2003 中,当以下条件之一为 true 时,特定事件将记录在系统日志中:

  • 如果桌面堆已满,则会记录以下事件:

    Event Type: Warning
    Event Source: Win32k
    Event Category: None
    Event ID: 243
    Date: Date
    Time: Time
    User: N/A
    Computer: ServerName
    Description: A desktop heap allocation failed.
    

    在这种情况下,请增大桌面堆大小。

  • 如果桌面堆总数变为系统范围的缓冲区大小,则会记录以下事件:

    Event Type: Warning
    Event Source: Win32k
    Event Category: None
    Event ID: 244
    Date: Date
    Time: Time
    User: N/A
    Computer: ServerName
    Description: Failed to create a desktop due to desktop heap exhaustion.
    

    在这种情况下,请减小桌面堆大小。

在 Windows Server 2003 中,当以下条件之一为 true 时,系统范围的缓冲区为 20 MB:

  • 你位于终端服务环境中。
  • Boot.ini 文件中指定了 /3GB 开关。

适用于

  • Microsoft Windows XP Professional
  • Microsoft Windows XP 家庭版
  • Windows Vista Ultimate
  • Windows Vista 企业版
  • Windows Vista Business
  • Windows Vista 家庭高级版
  • Windows 7 旗舰版
  • Windows 7 企业版
  • Windows 7 专业版
  • Windows 7 家庭高级版
  • Windows 8 企业版
  • Windows 8 专业版、Windows 8
  • Windows 8.1 企业版
  • Windows 8.1 专业版
  • Windows 8.1
  • Microsoft Windows Server 2003 Datacenter Edition (32 位 x86)
  • Microsoft Windows Server 2003 Datacenter x64 版本
  • Microsoft Windows Server 2003 企业版 (32 位 x86)
  • Microsoft Windows Server 2003 企业版 x64 版本
  • Microsoft Windows Server 2003 标准版 (32 位 x86)
  • Microsoft Windows Server 2003 Standard x64 Edition
  • Windows Server 2008 Datacenter
  • Windows Server 2008 企业版
  • Windows Server 2008 R2 Datacenter
  • Windows Server 2008 R2 企业版
  • Windows Server 2008 标准版
  • Windows Server 2012 Datacenter
  • Windows Server 2012 Standard
  • Windows Server 2012 R2 Datacenter
  • Windows Server 2012 R2 Standard