User32.dll o Kernel32.dll non viene inizializzato

Questo articolo descrive un problema per cui 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 si riceve uno dei messaggi di errore seguenti:

Inizializzazione del sistema> di libreria <dinamica\system32\user32.dll non riuscita. Il processo termina in modo anomalo. 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 di sicurezza corretto alla finestra e al desktop associati al processo.

  • Il sistema ha esaurito l'heap del desktop.

Ulteriori informazioni

  • Causa 1

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

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

  • Causa 2

    Il sistema ha esaurito l'heap del desktop.

    A ogni oggetto desktop del 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 del desktop da un buffer di 48 MEGABYTE (MB) a livello di sistema. Oltre agli heap del desktop, anche i driver della stampante e i driver di carattere usano questo buffer.

    I desktop sono associati alle stazioni finestra. Una postazione finestra può contenere zero o più desktop. È possibile modificare le dimensioni dell'heap del desktop allocato per un desktop associato a una 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 in 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

Nelle diverse versioni 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 del desktop. Questi SharedSection valori vengono specificati in kilobyte. Sono disponibili impostazioni separate per i desktop associati a 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, metodo o attività viene illustrata la procedura per modificare il Registro di sistema. Poiché l'errata modifica del Registro di sistema può causare seri problemi, Di conseguenza, attenersi scrupolosamente alla procedura indicata. Per una maggiore protezione, eseguire il backup del Registro di sistema prima di modificarlo. In questo modo sarà possibile ripristinare il Registro di sistema se si verifica un problema. Per ulteriori informazioni su come eseguire backup e ripristino del Registro di sistema, vedere Backup e ripristino del Registro di sistema in Windows.

Il primo SharedSection valore (1024) è la dimensione dell'heap condivisa comune a tutti i desktop. Include la tabella di 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 del desktop per ogni desktop associato alla stazione finestra interattiva 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 finestra interattiva usa l'heap desktop predefinito di 3.072 KB. Per impostazione predefinita, il sistema crea i tre desktop seguenti in Winsta0:

  • Winlogon

  • Predefinita

    Il desktop 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 postazione finestra e il desktop vengono ereditati dal processo padre. Tutti i servizi eseguiti con l'account LocalSystem con l'opzione Consenti al servizio di interagire con desktop selezionata useranno Winsta0\Default. Tutti questi processi condivideranno l'heap del desktop associato al desktop applicazione predefinito.

  • Screen saver

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

Il terzo valore SharedSection è la dimensione dell'heap del desktop per ogni desktop associato a una finestra non interattiva. Se questo valore non è presente, le dimensioni dell'heap del desktop per le stazioni di finestre non interattive saranno uguali a quella specificata 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 del 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 finestra non interattiva creata da Gestione controllo servizi (SCM). Pertanto, 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 non è selezionata l'opzione Consenti al servizio di interagire con il desktop condividono l'heap desktop del desktop predefinito nella stazione windows del servizio non interattivo (Service-0x0-3e7$).

L'heap totale del desktop usato nelle stazioni delle finestre 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. Valori più piccoli limiteranno il numero di hook, menu, stringhe e finestre che possono essere creati in un desktop. D'altra parte, l'aumento del secondo o del 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 creati in un desktop.

Poiché SCM crea un nuovo desktop nella 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 il terzo valore SharedSection è 128. Qualsiasi tentativo di usare un valore più piccolo userà invece 128.

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

Nota

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

  • Se l'heap del 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 del desktop.

  • Se l'heap totale del desktop 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 del desktop.

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

  • Si è in un ambiente di 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 (32 bit x86)
  • 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 Standard Edition (32 bit 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