User32.dll 或 Kernel32.dll 未初始化

本文介绍由 CreateProcessCreateProcessAsUser 执行的应用程序可能会失败的问题。

适用于: Microsoft Windows
原始 KB 编号: 184802

症状

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

动态库 <系统的> 初始化\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 (MB) 缓冲区分配桌面堆。 除了桌面堆,打印机驱动程序和字体驱动程序也使用此缓冲区。

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

    注意

    建议不要使用 /3GB 开关。 /3GB 开关在 Boot.ini 文件中指定。 /3GB 开关仅支持 32 位操作系统。 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 中的注册表

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

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

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

  • Winlogon

  • 默认值

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

  • 屏幕保护程序

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

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

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

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

交互式和非交互窗口工作站中使用的桌面堆总数必须适合缓冲区。

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

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

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

注意

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

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

    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 中,当满足以下条件之一时,系统范围的缓冲区为 20 MB:

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

适用对象

  • Microsoft Windows XP Professional
  • Microsoft Windows XP 家庭版
  • Windows Vista Ultimate
  • Windows Vista Enterprise
  • Windows Vista Business
  • Windows Vista Home Premium
  • 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 Edition
  • Microsoft Windows Server 2003 Enterprise Edition (32 位 x86)
  • Microsoft Windows Server 2003 Enterprise x64 Edition
  • Microsoft Windows Server 2003 Standard Edition (32 位 x86)
  • Microsoft Windows Server 2003 Standard x64 Edition
  • Windows Server 2008 Datacenter
  • Windows Server 2008 Enterprise
  • Windows Server 2008 R2 Datacenter
  • Windows Server 2008 R2 Enterprise
  • Windows Server 2008 Standard
  • Windows Server 2012 Datacenter
  • Windows Server 2012 Standard
  • Windows Server 2012 R2 Datacenter
  • Windows Server 2012 R2 Standard