User32.dll o Kernel32.dll no se inicializa

En este artículo se describe un problema en el que una aplicación ejecutada por CreateProcess o CreateProcessAsUser puede producir un error.

Se aplica a: Microsoft Windows
Número de KB original: 184802

Síntomas

Una aplicación ejecutada por CreateProcess o CreateProcessAsUser puede producir un error y recibe uno de los siguientes mensajes de error:

Error al inicializar el sistema> de biblioteca <dinámica\system32\user32.dll. El proceso termina de forma anómala. Error al inicializar el sistema> de biblioteca <dinámica\system32\kernel32.dll. El proceso termina de forma anómala.

Además, el proceso con errores devuelve el código de salida 128 o lo siguiente:

error:ERROR_WAIT_NO_CHILDREN

Causa

Este error se produce por una de las siguientes razones:

  • El proceso ejecutado no tiene acceso de seguridad correcto a la estación de ventana y al escritorio asociados al proceso.

  • El sistema se quedó sin montón de escritorio.

Más información

  • Causa 1

    El proceso ejecutado no tiene acceso de seguridad correcto a la estación de ventana y al escritorio asociados al proceso.

    El miembro lpDesktop de la estructura STARTUPINFO que se pasa a CreateProcess o CreateProcessAsUser especifica la estación de ventana y el escritorio asociados al proceso ejecutado. El proceso ejecutado debe tener acceso de seguridad correcto a la estación de ventana y al escritorio especificados.

  • Causa 2

    El sistema se quedó sin montón de escritorio.

    Cada objeto de escritorio del sistema tiene un montón de escritorio asociado. El objeto de escritorio usa el montón para almacenar menús, enlaces, cadenas y ventanas. En Windows Server 2003 y Windows XP de 32 bits, el sistema asigna un montón de escritorio desde un búfer de 48 megabytes (MB) para todo el sistema. Además de los montones de escritorio, los controladores de impresora y los controladores de fuentes también usan este búfer.

    Los escritorios están asociados a estaciones de ventana. Una estación de ventana puede contener cero o más escritorios. Puede cambiar el tamaño del montón de escritorio que se asigna para un escritorio asociado a una estación de ventana cambiando el siguiente valor del Registro.

    Nota:

    No se recomienda usar el modificador /3GB. El modificador /3GB se especifica en el archivo Boot.ini. El modificador /3GB solo se admite para sistemas operativos de 32 bits. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

En Windows Server 2003 y Windows XP de 32 bits, los datos predeterminados de este valor del Registro serán similares a los siguientes (todos en una línea):

%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

En diferentes versiones de Windows, los datos predeterminados de este valor del Registro serán similares a los siguientes:

  • Para Windows Vista RTM (32 bits)

    SharedSection=1024,3072,512
    
  • Para Windows Vista SP1, Windows 7, Windows 8, Windows 8.1 (32 bits) y Windows Server 2008 (32 bits)

    SharedSection=1024,12288,512
    
  • Para Windows Vista, Windows 7, Windows 8, Windows 8.1 (64 bits), Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 y Windows Server 2012 R2 (64 bits)

    SharedSection=1024,20480,768
    

Los valores numéricos que siguen SharedSection= controlan cómo se asigna el montón de escritorio. Estos SharedSection valores se especifican en kilobytes. Hay configuraciones independientes para los escritorios que están asociados a estaciones de ventana interactivas y no interactivas.

Nota:

Si cambia los SharedSection valores en el Registro, debe reiniciar el sistema para que los cambios surtan efecto.

Importante

Esta sección, método o tarea contiene pasos que le indican cómo modificar el Registro. No obstante, pueden producirse problemas graves si modifica el registro de manera incorrecta. En consecuencia, asegúrese de seguir estos pasos cuidadosamente. Para mayor protección, cree una copia de seguridad del registro antes de modificarlo. Después, puede restaurar el registro si se produce un problema. Para obtener más información sobre cómo hacer una copia de seguridad del Registro y cómo restaurarlo, consulte Cómo realizar una copia de seguridad del Registro y restaurarlo en Windows.

El primer SharedSection valor (1024) es el tamaño del montón compartido común a todos los escritorios. Esto incluye la tabla de identificador global. Esta tabla contiene identificadores para ventanas, menús, iconos, cursores, etc., y la configuración del sistema compartido. Es poco probable que alguna vez tenga que cambiar este valor.

El segundo SharedSection valor es el tamaño del montón de escritorio para cada escritorio asociado a la estación de ventana interactiva WinSta0. Los objetos de usuario, como enlaces, menús, cadenas y ventanas, consumen memoria en este montón de escritorio. Es poco probable que alguna vez tenga que cambiar este valor.

Cada escritorio que se crea en la estación de ventana interactiva usa el montón de escritorio predeterminado de 3072 KB. De forma predeterminada, el sistema crea los tres escritorios siguientes en Winsta0:

  • Winlogon

  • Predeterminada

    Todos los procesos para los que Winsta0\default se especifica en el miembro de estructura STARTUPINFO.lpDesktop usarán el escritorio de la aplicación predeterminada. Cuando el miembro de la estructura lpDesktop es NULL, la estación de ventana y el escritorio se heredan del proceso primario. Todos los servicios que se ejecutan en la cuenta LocalSystem con la opción de inicio Permitir que el servicio interactúe con el escritorio seleccionada usarán Winsta0\Default. Todos estos procesos compartirán el montón de escritorio asociado al escritorio de la aplicación predeterminada.

  • Protector de pantalla

    El escritorio del protector de pantalla se crea en la estación de ventana interactiva (WinSta0) cuando se muestra un protector de pantalla.

El tercer valor de SharedSection es el tamaño del montón de escritorio para cada escritorio asociado a una estación de ventana no interactiva. Si este valor no está presente, el tamaño del montón de escritorio para las estaciones de ventana no interactivas será el mismo que el tamaño especificado para las estaciones de ventana interactivas (es decir, el segundo valor SharedSection).

Si solo hay dos valores SharedSection, puede agregar un tercer valor para especificar el tamaño del montón de escritorio para los escritorios creados en estaciones de ventana no interactivas.

Todos los procesos de servicio que se ejecutan en una cuenta de usuario recibirán un nuevo escritorio en una estación de ventana no interactiva creada por el Administrador de control de servicios (SCM). Por lo tanto, cada servicio que se ejecuta en una cuenta de usuario consumirá el número de kilobytes del montón de escritorio especificado en el tercer valor SharedSection. Todos los servicios que se ejecutan en la cuenta LocalSystem cuando no se selecciona Permitir que el servicio interactúe con el escritorio comparten el montón de escritorio del escritorio predeterminado en la estación de Windows de servicio no interactivo (Service-0x0-3e7$).

El montón de escritorio total que se usa en las estaciones de ventana interactivas y no interactivas debe caber en el búfer.

La disminución del segundo o tercer valor de SharedSection aumentará el número de escritorios que se pueden crear en las estaciones de ventana correspondientes. Los valores más pequeños limitarán el número de enlaces, menús, cadenas y ventanas que se pueden crear en un escritorio. Por otro lado, el aumento del segundo o tercer valor de SharedSection reducirá el número de escritorios que se pueden crear. Sin embargo, esto también aumentará el número de enlaces, menús, cadenas y ventanas que se pueden crear en un escritorio.

Dado que SCM crea un nuevo escritorio en la estación de ventana no interactiva para cada proceso de servicio que se ejecuta en una cuenta de usuario, un tercer valor de SharedSection más grande reducirá el número de servicios de cuenta de usuario que se pueden ejecutar correctamente en el sistema. El mínimo que se puede especificar para el segundo o tercer valor de SharedSection es 128. Cualquier intento de usar un valor más pequeño en su lugar usará 128.

El montón de escritorio lo asigna User32.dll cuando un proceso necesita objetos de usuario. Si una aplicación no depende de User32.dll, no consumirá el montón de escritorio.

Nota:

En Windows Server 2003, el evento específico se registra en el registro del sistema cuando se cumple una de las condiciones siguientes:

  • Si el montón de escritorio se llena, se registra el siguiente evento:

    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.
    

    En este caso, aumente el tamaño del montón de escritorio.

  • Si el montón de escritorio total se convierte en el tamaño del búfer de todo el sistema, se registra el siguiente evento:

    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.
    

    En este caso, reduzca el tamaño del montón de escritorio.

En Windows Server 2003, un búfer de todo el sistema es de 20 MB cuando se cumple una de las condiciones siguientes:

  • Se encuentra en un entorno de Terminal Services.
  • El modificador /3GB se especifica en el archivo Boot.ini.

Se aplica a

  • Microsoft Windows XP Professional
  • Microsoft Windows XP Home Edition
  • Windows Vista Ultimate
  • Windows Vista Enterprise
  • Windows Vista Business
  • Windows Vista Home Premium
  • Windows 7 Ultimate
  • Windows 7 Enterprise
  • Windows 7 Professional
  • Windows 7 Home Premium
  • Windows 8 Enterprise
  • Windows 8 Pro, Windows 8
  • Windows 8.1 Enterprise
  • Windows 8.1 Pro
  • Windows 8.1
  • Microsoft Windows Server 2003 Datacenter Edition (x86 de 32 bits)
  • Microsoft Windows Server 2003 Datacenter x64 Edition
  • Microsoft Windows Server 2003 Enterprise Edition (x86 de 32 bits)
  • Microsoft Windows Server 2003 Enterprise x64 Edition
  • Microsoft Windows Server 2003 Standard Edition (x86 de 32 bits)
  • 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 Centro de datos
  • Windows Server 2012 R2 Standard