User32.dll eller Kernel32.dll initieras inte

Den här artikeln beskriver ett problem där ett program som körs av CreateProcess eller CreateProcessAsUser kan misslyckas.

Gäller för: Microsoft Windows
Ursprungligt KB-nummer: 184802

Symptom

Ett program som körs av CreateProcess eller CreateProcessAsUser kan misslyckas, och du får något av följande felmeddelanden:

Initieringen av det dynamiska bibliotekssystemet <>\system32\user32.dll misslyckades. Processen avslutas onormalt. Initieringen av det dynamiska bibliotekssystemet <>\system32\kernel32.dll misslyckades. Processen avslutas onormalt.

Dessutom returnerar den misslyckade processen slutkod 128 eller följande:

error:ERROR_WAIT_NO_CHILDREN

Orsak

Det här felet inträffar av någon av följande orsaker:

  • Den utförda processen har inte korrekt säkerhetsåtkomst till fönsterstationen och skrivbordet som är associerade med processen.

  • Datorn fick slut på skrivbordshög.

Mer information

  • Orsak 1

    Den utförda processen har inte korrekt säkerhetsåtkomst till fönsterstationen och skrivbordet som är associerade med processen.

    LpDesktop-medlemmen i STARTUPINFO-strukturen som skickas till CreateProcess eller CreateProcessAsUser anger fönsterstationen och skrivbordet som är associerade med den utförda processen. Den utförda processen måste ha rätt säkerhetsåtkomst till den angivna fönsterstationen och skrivbordet.

  • Orsak 2

    Datorn fick slut på skrivbordshög.

    Varje skrivbordsobjekt i systemet har en skrivbords heap som är associerad med den. Skrivbordsobjektet använder heap för att lagra menyer, krokar, strängar och fönster. I Windows Server 2003 och Windows XP 32-bitars allokerar systemet skrivbords heap från en systemomfattande buffert på 48 MEGABYTE (MB). Förutom skrivbordshögar använder även skrivardrivrutiner och teckensnittsdrivrutiner den här bufferten.

    Stationära datorer är associerade med fönsterstationer. En fönsterstation kan innehålla noll eller flera skrivbord. Du kan ändra storleken på skrivbordshögen som är allokerad för ett skrivbord som är associerat med en fönsterstation genom att ändra följande registervärde.

    Obs!

    Vi rekommenderar inte att du använder /3GB-växeln. Växeln /3GB anges i Boot.ini-filen. /3GB-växeln stöds endast för 32-bitars operativsystem. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

I Windows Server 2003 och Windows XP 32-bitars liknar standarddata för det här registervärdet följande (alla på en rad):

%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

I olika versioner av Windows liknar standarddata för det här registervärdet följande:

  • För Windows Vista RTM (32-bitars)

    SharedSection=1024,3072,512
    
  • För Windows Vista SP1, Windows 7, Windows 8, Windows 8.1 (32-bitars) och Windows Server 2008 (32-bitars)

    SharedSection=1024,12288,512
    
  • För Windows Vista, Windows 7, Windows 8, Windows 8.1 (64-bitars), Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 och Windows Server 2012 R2 (64-bitars)

    SharedSection=1024,20480,768
    

De numeriska värden som följer SharedSection= styr hur skrivbordshögen allokeras. Dessa SharedSection värden anges i kilobyte. Det finns separata inställningar för stationära datorer som är associerade med interaktiva och icke-interaktiva fönsterstationer.

Obs!

Om du ändrar SharedSection värdena i registret måste du starta om systemet för att ändringarna ska börja gälla.

Viktigt

Det här avsnittet, metoden eller uppgiften innehåller steg som beskriver hur du ändrar registret. Det kan uppstå allvarliga problem om du gör detta felaktigt. Följ därför instruktionerna noga, och säkerhetskopiera registret innan du gör några ändringar i det. Då kan du återställa registret om det uppstår problem. Mer information om hur du säkerhetskopierar och återställer registret finns i Hur du säkerhetskopierar och återställer registret i Windows.

Det första SharedSection värdet (1024) är den delade heapstorleken som är gemensam för alla skrivbord. Detta inkluderar den globala referenstabellen. Den här tabellen innehåller referenser till fönster, menyer, ikoner, markörer och så vidare samt delade systeminställningar. Det är osannolikt att du någonsin skulle behöva ändra det här värdet.

Det andra SharedSection värdet är storleken på skrivbordshögen för varje skrivbord som är associerat med den interaktiva fönsterstationen WinSta0. Användarobjekt som hooks, menyer, strängar och fönster förbrukar minne i den här skrivbordshögen. Det är osannolikt att du någonsin skulle behöva ändra det här värdet.

Varje skrivbord som skapas i den interaktiva fönsterstationen använder standardskrivbordshögen på 3 072 kB. Som standard skapar systemet följande tre skrivbord i Winsta0:

  • Winlogon

  • Standard

    Programskrivbordet Standard används av alla processer som Winsta0\default anges i startupinfo.lpDesktop-strukturmedlemmen. När lpDesktop-strukturmedlemmen är NULL ärvs fönsterstationen och skrivbordet från den överordnade processen. Alla tjänster som körs under LocalSystem-kontot med alternativet Tillåt att tjänsten interagerar med skrivbordet har valts använder Winsta0\Default. Alla dessa processer delar den skrivbords-heap som är associerad med standardprogramsskrivbordet.

  • Skärmsläckare

    Skrivbordet för skärmsläckaren skapas i den interaktiva fönsterstationen (WinSta0) när en skärmsläckare visas.

Det tredje SharedSection-värdet är storleken på skrivbordshögen för varje skrivbord som är associerat med en icke-interaktiv fönsterstation. Om det här värdet inte finns är storleken på skrivbords heapen för icke-interaktiva fönsterstationer samma storlek som den storlek som anges för interaktiva fönsterstationer (dvs. det andra SharedSection-värdet).

Om det bara finns två SharedSection-värden kan du lägga till ett tredje värde för att ange storleken på skrivbordshögen för stationära datorer som skapas i icke-interaktiva fönsterstationer.

Varje tjänstprocess som körs under ett användarkonto får ett nytt skrivbord i en icke-interaktiv fönsterstation som skapas av Service Control Manager (SCM). Därför förbrukar varje tjänst som körs under ett användarkonto antalet kilobyte skrivbords heap som anges i det tredje SharedSection-värdet. Alla tjänster som körs under LocalSystem-kontot när Tillåt tjänsten att interagera med skrivbordet inte har valts delar skrivbordshögen för standardskrivbordet i windows-stationen för icke-interaktiva tjänster (Service-0x0-3e7$).

Den totala skrivbordshögen som används i de interaktiva och icke-interaktiva fönsterstationerna måste rymmas i bufferten.

Om du minskar det andra eller tredje SharedSection-värdet ökar antalet skrivbord som kan skapas i motsvarande fönsterstationer. Mindre värden begränsar antalet krokar, menyer, strängar och fönster som kan skapas på ett skrivbord. Om du å andra sidan ökar det andra eller tredje SharedSection-värdet minskar du antalet skrivbord som kan skapas. Detta ökar dock också antalet krokar, menyer, strängar och fönster som kan skapas på ett skrivbord.

Eftersom SCM skapar ett nytt skrivbord i den icke-interaktiva fönsterstationen för varje tjänstprocess som körs under ett användarkonto, minskar ett större tredje SharedSection-värde antalet användarkontotjänster som kan köras på systemet. Det minsta som kan anges för det andra eller tredje SharedSection-värdet är 128. Om du försöker använda ett mindre värde används i stället 128.

Skrivbords heap allokeras av User32.dll när en process behöver användarobjekt. Om ett program inte är beroende av User32.dll används inte skrivbords heap.

Obs!

I Windows Server 2003 loggas den specifika händelsen i systemloggen när något av följande villkor är sant:

  • Om skrivbords-heapen blir full loggas följande händelse:

    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.
    

    I det här fallet ökar du storleken på skrivbordets heap.

  • Om den totala skrivbordshögen blir den systemomfattande buffertstorleken loggas följande händelse:

    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.
    

    I det här fallet minskar du storleken på skrivbordshögen.

I Windows Server 2003 är en systemomfattande buffert 20 MB när något av följande villkor är sant:

  • Du befinner dig i en Terminal Services-miljö.
  • Växeln /3GB anges i Boot.ini-filen.

Gäller för

  • 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-bitars x86)
  • Microsoft Windows Server 2003 Datacenter x64 Edition
  • Microsoft Windows Server 2003 Enterprise Edition (32-bitars x86)
  • Microsoft Windows Server 2003 Enterprise x64 Edition
  • Microsoft Windows Server 2003 Standard Edition (32-bitars 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