Condividi tramite


User32.dll o Kernel32.dll non inizializza

Questo articolo descrive un problema a causa del quale un'applicazione eseguita da CreateProcess o CreateProcessAsUser potrebbe non riuscire.

Si applica a: Microsoft Windows
Numero KB originale: 184802

Sintomi

Un'applicazione eseguita da CreateProcess o CreateProcessAsUser potrebbe non riuscire e viene visualizzato uno dei messaggi di errore seguenti:

Inizializzazione del sistema> di libreria <dinamica\system32\user32.dll non riuscita. Il processo termina in modo anomalo. L'inizializzazione del sistema> di libreria <dinamica\system32\kernel32.dll non è riuscita. Il processo termina in modo anomalo.

Inoltre, il processo non riuscito restituisce il codice di uscita 128 o il codice seguente:

error:ERROR_WAIT_NO_CHILDREN

Causa

Questo errore si verifica per uno dei motivi seguenti:

  • Il processo eseguito non dispone dell'accesso corretto alla stazione della finestra e al desktop associati al processo.

  • Il sistema ha esaurito l'heap desktop.

Ulteriori informazioni

  • Causa 1

    Il processo eseguito non dispone dell'accesso corretto alla stazione della finestra e al desktop associati al processo.

    Il membro lpDesktop della struttura STARTUPINFO passato o CreateProcess CreateProcessAsUser specifica la stazione della finestra e il desktop associati al processo eseguito. Il processo eseguito deve disporre dell'accesso corretto alla stazione di finestra e al desktop specificati.

  • Causa 2

    Il sistema ha esaurito l'heap desktop.

    A ogni oggetto desktop nel sistema è associato un heap desktop. L'oggetto desktop usa l'heap per archiviare menu, hook, stringhe e finestre. In Windows Server 2003 e Windows XP a 32 bit, il sistema alloca l'heap desktop da un buffer di 48 megabyte (MB) a livello di sistema. Oltre agli heap desktop, anche i driver della stampante e i driver dei tipi di carattere usano questo buffer.

    I desktop sono associati alle stazioni finestra. Una stazione finestra può contenere zero o più desktop. È possibile modificare le dimensioni dell'heap desktop allocato per un desktop associato a una stazione finestra modificando il valore del Registro di sistema seguente.

    Nota

    Non è consigliabile usare l'opzione /3GB. L'opzione /3GB viene specificata nel file Boot.ini. L'opzione /3GB è supportata solo per i sistemi operativi a 32 bit. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

In Windows Server 2003 e Windows XP a 32 bit, i dati predefiniti per questo valore del Registro di sistema saranno simili ai seguenti (tutti su una riga):

%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

In versioni diverse di Windows, i dati predefiniti per questo valore del Registro di sistema saranno simili ai seguenti:

  • Per Windows Vista RTM (32 bit)

    SharedSection=1024,3072,512
    
  • Per Windows Vista SP1, Windows 7, Windows 8, Windows 8.1 (32 bit) e Windows Server 2008 (32 bit)

    SharedSection=1024,12288,512
    
  • Per Windows Vista, Windows 7, Windows 8, Windows 8.1 (64 bit), Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 e Windows Server 2012 R2 (64 bit)

    SharedSection=1024,20480,768
    

I valori numerici che seguono SharedSection= controllano la modalità di allocazione dell'heap desktop. Questi SharedSection valori vengono specificati in kilobyte. Esistono impostazioni separate per i desktop associati alle stazioni finestra interattive e non interattive.

Nota

Se si modificano i SharedSection valori nel Registro di sistema, è necessario riavviare il sistema per rendere effettive le modifiche.

Importante

In questa sezione, nei passaggi del metodo o dell'attività viene illustrata la modalità di modifica del Registro di sistema. Se, tuttavia, si modifica il Registro di sistema in modo errato, possono verificarsi gravi problemi. Pertanto, assicurarsi di osservare attentamente la procedura seguente. Per una maggiore protezione, eseguire il backup del Registro di sistema prima di modificarlo. Successivamente, è possibile ripristinare il Registro di sistema se si verifica un problema. Per ulteriori informazioni su come eseguire il backup e il ripristino del Registro di sistema, vedi Come eseguire il backup e il ripristino del Registro di sistema in Windows.

Il primo SharedSection valore (1024) è la dimensione dell'heap condivisa comune a tutti i desktop. Ciò include la tabella handle globale. Questa tabella contiene handle per finestre, menu, icone, cursori e così via e impostazioni di sistema condivise. È improbabile che sia necessario modificare questo valore.

Il secondo SharedSection valore è la dimensione dell'heap desktop per ogni desktop associato alla stazione interattiva della finestra WinSta0. Gli oggetti utente, ad esempio hook, menu, stringhe e finestre, utilizzano memoria in questo heap desktop. È improbabile che sia necessario modificare questo valore.

Ogni desktop creato nella stazione interattiva della finestra usa l'heap desktop predefinito di 3.072 KB. Per impostazione predefinita, il sistema crea i tre desktop seguenti in Winsta0:

  • Winlogon

  • Predefiniti

    Il desktop dell'applicazione predefinito verrà usato da tutti i processi per i quali Winsta0\default è specificato nel membro della struttura STARTUPINFO.lpDesktop. Quando il membro della struttura lpDesktop è NULL, la stazione della finestra e il desktop vengono ereditati dal processo padre. Tutti i servizi eseguiti nell'account LocalSystem con l'opzione Consenti al servizio di interagire con desktop selezionato useranno Winsta0\Default. Tutti questi processi condivideranno l'heap desktop associato al desktop dell'applicazione predefinito.

  • Screen saver

    Il desktop dello screen saver viene creato nella stazione interattiva della finestra (WinSta0) quando viene visualizzato uno screen saver.

Il terzo valore SharedSection è la dimensione dell'heap desktop per ogni desktop associato a una stazione finestra non interattiva. Se questo valore non è presente, le dimensioni dell'heap desktop per le stazioni finestra non interattive saranno uguali alle dimensioni specificate per le stazioni finestra interattive, ovvero il secondo valore SharedSection.

Se sono presenti solo due valori SharedSection, è possibile aggiungere un terzo valore per specificare le dimensioni dell'heap desktop per i desktop creati in stazioni finestra non interattive.

Ogni processo di servizio eseguito con un account utente riceverà un nuovo desktop in una stazione finestra non interattiva creata da Service Control Manager (SCM). Di conseguenza, ogni servizio eseguito con un account utente utilizzerà il numero di kilobyte di heap desktop specificato nel terzo valore SharedSection. Tutti i servizi eseguiti con l'account LocalSystem quando consenti al servizio di interagire con il desktop non sono selezionati condividono l'heap desktop del desktop predefinito nella stazione di windows del servizio non interattivo (Service-0x0-3e7$).

L'heap desktop totale utilizzato nelle stazioni finestra interattive e non interattive deve rientrare nel buffer.

La riduzione del secondo o terzo valore SharedSection aumenterà il numero di desktop che possono essere creati nelle stazioni finestra corrispondenti. I valori più piccoli limitano il numero di hook, menu, stringhe e finestre che possono essere creati in un desktop. D'altra parte, l'aumento del secondo o terzo valore SharedSection ridurrà il numero di desktop che è possibile creare. Tuttavia, questo aumenterà anche il numero di hook, menu, stringhe e finestre che possono essere create in un desktop.

Poiché SCM crea un nuovo desktop nella stazione finestra non interattiva per ogni processo di servizio in esecuzione con un account utente, un terzo valore SharedSection più grande ridurrà il numero di servizi dell'account utente che possono essere eseguiti correttamente nel sistema. Il valore minimo che può essere specificato per il secondo o terzo valore SharedSection è 128. Qualsiasi tentativo di usare un valore più piccolo userà invece 128.

L'heap desktop viene allocato da User32.dll quando un processo richiede oggetti utente. Se un'applicazione non dipende da User32.dll, non utilizzerà l'heap desktop.

Nota

In Windows Server 2003, l'evento specifico viene registrato nel registro di sistema quando una delle condizioni seguenti è vera:

  • Se l'heap desktop diventa pieno, viene registrato l'evento seguente:

    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.
    

    In questo caso, aumentare le dimensioni dell'heap desktop.

  • Se l'heap del desktop totale diventa la dimensione del buffer a livello di sistema, viene registrato l'evento seguente:

    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.
    

    In questo caso, ridurre le dimensioni dell'heap desktop.

In Windows Server 2003, un buffer a livello di sistema è 20 MB quando si verifica una delle condizioni seguenti:

  • Si è in un ambiente Servizi terminal.
  • L'opzione /3GB viene specificata nel file Boot.ini.

Si applica 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 a 32 bit)
  • Microsoft Windows Server 2003 Datacenter x64 Edition
  • Microsoft Windows Server 2003 edizione Enterprise (x86 a 32 bit)
  • Microsoft Windows Server 2003 Enterprise x64 Edition
  • Microsoft Windows Server 2003 edizione Standard (x86 a 32 bit)
  • 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