User32.dll ou Kernel32.dll não inicializa

Este artigo descreve um problema em que um aplicativo executado por CreateProcess ou CreateProcessAsUser pode falhar.

Aplica-se a: Microsoft Windows
Número de KB original: 184802

Sintomas

Um aplicativo que é executado por CreateProcess ou CreateProcessAsUser pode falhar e você recebe uma das seguintes mensagens de erro:

Falha na inicialização do sistema> de biblioteca <dinâmica\system32\user32.dll falha. O processo está terminando anormalmente. Falha na inicialização do sistema> de biblioteca <dinâmica\system32\kernel32.dll falha. O processo está terminando anormalmente.

Além disso, o processo com falha retorna o código de saída 128 ou o seguinte:

error:ERROR_WAIT_NO_CHILDREN

Motivo

Essa falha ocorre por um dos seguintes motivos:

  • O processo executado não tem acesso de segurança correto à estação de janela e à área de trabalho associadas ao processo.

  • O sistema ficou sem pilha de área de trabalho.

Mais informações

  • Causa 1

    O processo executado não tem acesso de segurança correto à estação de janela e à área de trabalho associadas ao processo.

    O membro lpDesktop da estrutura STARTUPINFO que é passada para CreateProcess ou CreateProcessAsUser especifica a estação de janela e a área de trabalho que estão associadas ao processo executado. O processo executado deve ter acesso correto à área de trabalho e à estação de janela especificada.

  • Causa 2

    O sistema ficou sem pilha de área de trabalho.

    Cada objeto de área de trabalho no sistema tem um heap de área de trabalho associado a ele. O objeto desktop usa o heap para armazenar menus, ganchos, cadeias de caracteres e janelas. No Windows Server 2003 e no Windows XP de 32 bits, o sistema aloca o heap de área de trabalho de um buffer de 48 megabytes (MB) em todo o sistema. Além de heaps de área de trabalho, drivers de impressora e drivers de fonte também usam esse buffer.

    As áreas de trabalho estão associadas a estações de janela. Uma estação de janela pode conter zero ou mais áreas de trabalho. Você pode alterar o tamanho do heap da área de trabalho alocado para uma área de trabalho associada a uma estação de janela alterando o valor do registro a seguir.

    Observação

    Não recomendamos que você use a opção /3GB. A opção /3GB é especificada no arquivo Boot.ini. O comutador de /3 GB tem suporte apenas para sistemas operacionais de 32 bits. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

No Windows Server 2003 e no Windows XP de 32 bits, os dados padrão desse valor de registro serão semelhantes aos seguintes (todos em uma linha):

%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

Em diferentes versões do Windows, os dados padrão para esse valor de registro se assemelham ao seguinte:

  • Para Windows Vista RTM (32 bits)

    SharedSection=1024,3072,512
    
  • Para Windows Vista SP1, Windows 7, Windows 8, Windows 8.1 (32 bits) e 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 e Windows Server 2012 R2 (64 bits)

    SharedSection=1024,20480,768
    

Os valores numéricos que seguem SharedSection= controlam como o heap da área de trabalho é alocado. Esses SharedSection valores são especificados em quilobytes. Há configurações separadas para áreas de trabalho associadas a estações de janela interativas e não interinterativas.

Observação

Se você alterar os SharedSection valores no registro, deverá reiniciar o sistema para que as alterações entrem em vigor.

Importante

Esta seção, método ou tarefa contém etapas que descrevem como modificar o Registro. Entretanto, sérios problemas poderão ocorrer caso você modifique o Registro incorretamente. Portanto, siga essas etapas cuidadosamente. Para mais proteção, faça o backup do registro antes de modificá-lo. Em seguida, você poderá restaurar o registro se ocorrer um problema. Para saber mais sobre como fazer o backup e restaurar o registro, consulte Como fazer o backup e restaurar o registro no Windows.

O primeiro SharedSection valor (1024) é o tamanho de heap compartilhado comum a todas as áreas de trabalho. Isso inclui a tabela de identificadores globais. Esta tabela contém alças para janelas, menus, ícones, cursores e assim por diante e configurações do sistema compartilhado. É improvável que você tenha que alterar esse valor.

O segundo SharedSection valor é o tamanho do heap da área de trabalho para cada área de trabalho associada à estação de janela interativa WinSta0. Objetos de usuário como ganchos, menus, cadeias de caracteres e janelas consomem memória neste heap de área de trabalho. É improvável que você tenha que alterar esse valor.

Cada área de trabalho criada na estação de janela interativa usa o heap de área de trabalho padrão de 3.072 KB. Por padrão, o sistema cria as três áreas de trabalho a seguir no Winsta0:

  • Winlogon

  • Padrão

    A área de trabalho de aplicativo padrão será usada por todos os processos para os quais Winsta0\default é especificado no membro da estrutura STARTUPINFO.lpDesktop. Quando o membro da estrutura lpDesktop é NULL, a estação de janela e a área de trabalho são herdadas do processo pai. Todos os serviços executados na conta LocalSystem com a opção Permitir que o Serviço interaja com a inicialização da Área de Trabalho selecionada usarão Winsta0\Default. Todos esses processos compartilharão o heap de área de trabalho associado à área de trabalho de aplicativo padrão.

  • Proteção de tela

    A área de trabalho de salvamento de tela é criada na estação de janela interativa (WinSta0) quando um protetor de tela é exibido.

O terceiro valor sharedSection é o tamanho do heap da área de trabalho para cada área de trabalho associada a uma estação de janela não interativa. Se esse valor não estiver presente, o tamanho do heap da área de trabalho para estações de janela não interinterativas será igual ao tamanho especificado para estações de janela interativas (ou seja, o segundo valor sharedSection).

Se apenas dois valores sharedSection estiverem presentes, você poderá adicionar um terceiro valor para especificar o tamanho do heap da área de trabalho para áreas de trabalho criadas em estações de janela não interativas.

Cada processo de serviço executado em uma conta de usuário receberá uma nova área de trabalho em uma estação de janela não interativa criada pelo SCM (Service Control Manager). Portanto, cada serviço executado em uma conta de usuário consumirá o número de quilobytes de heap de área de trabalho especificado no terceiro valor sharedSection. Todos os serviços executados na conta LocalSystem quando Permitir que o Serviço Interaja com a Área de Trabalho não são selecionados compartilham o heap de área de trabalho da área de trabalho Padrão na estação windows de serviço não interinterativo (Service-0x0-3e7$).

O heap de área de trabalho total que está sendo usado nas estações de janela interativas e não interinterativas deve caber no buffer.

Diminuir o segundo ou terceiro valor sharedSection aumentará o número de áreas de trabalho que podem ser criadas nas estações de janela correspondentes. Valores menores limitarão o número de ganchos, menus, cadeias de caracteres e janelas que podem ser criados em uma área de trabalho. Por outro lado, o aumento do segundo ou terceiro valor sharedSection diminuirá o número de áreas de trabalho que podem ser criadas. No entanto, isso também aumentará o número de ganchos, menus, cadeias de caracteres e janelas que podem ser criados em uma área de trabalho.

Como o SCM cria uma nova área de trabalho na estação de janela nãointerativa para cada processo de serviço em execução em uma conta de usuário, um terceiro valor de SharedSection maior reduzirá o número de serviços de conta de usuário que podem ser executados com êxito no sistema. O mínimo que pode ser especificado para o segundo ou terceiro valor sharedSection é 128. Qualquer tentativa de usar um valor menor usará 128.

O heap da área de trabalho é alocado por User32.dll quando um processo precisa de objetos de usuário. Se um aplicativo não depender de User32.dll, ele não consumirá heap de área de trabalho.

Observação

No Windows Server 2003, o evento específico é registrado no log do Sistema quando uma das seguintes condições é verdadeira:

  • Se o heap da área de trabalho ficar cheio, o seguinte evento será registrado:

    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.
    

    Nesse caso, aumente o tamanho do heap da área de trabalho.

  • Se o heap de área de trabalho total se tornar o tamanho do buffer em todo o sistema, o seguinte evento será registrado:

    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.
    

    Nesse caso, diminua o tamanho do heap da área de trabalho.

No Windows Server 2003, um buffer em todo o sistema é de 20 MB quando uma das seguintes condições é verdadeira:

  • Você está em um ambiente dos Serviços terminais.
  • A opção /3GB é especificada no arquivo Boot.ini.

Aplicável 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 Edição Enterprise (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 Datacenter
  • Windows Server 2012 R2 Standard