User32.dll或Kernel32.dll未初始化

本文介绍由或CreateProcessAsUser可能失败的应用程序执行CreateProcess的问题。

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

现象

由或CreateProcessAsUser可能失败执行CreateProcess的应用程序,你会收到以下错误消息之一:

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

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

error:ERROR_WAIT_NO_CHILDREN

原因

发生此失败的原因之一:

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

  • 系统耗尽了桌面堆。

详细信息

  • 原因 1

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

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

  • 原因 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 值以 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 旗舰版
  • Windows Vista 企业版
  • Windows Vista 商用版
  • Windows Vista Home Premium
  • Windows 7 Ultimate
  • 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