User32.dll lub Kernel32.dll nie inicjuje

W tym artykule opisano problem polegający na tym, że aplikacja jest wykonywana przez CreateProcess aplikację lub CreateProcessAsUser może zakończyć się niepowodzeniem.

Dotyczy: Microsoft Windows
Oryginalny numer KB: 184802

Symptomy

Aplikacja, która jest wykonywana przez CreateProcess program lub CreateProcessAsUser może zakończyć się niepowodzeniem, i otrzymasz jeden z następujących komunikatów o błędach:

Inicjowanie systemu> bibliotek <dynamicznych\system32\user32.dll nie powiodło się. Proces kończy się nietypowo. Inicjowanie systemu> bibliotek <dynamicznych\system32\kernel32.dll nie powiodło się. Proces kończy się nietypowo.

Ponadto zakończony niepowodzeniem proces zwraca kod zakończenia 128 lub następujący:

error:ERROR_WAIT_NO_CHILDREN

Przyczyna

Ten błąd występuje z jednej z następujących przyczyn:

  • Wykonany proces nie ma poprawnego dostępu do stacji okien i pulpitu, które są skojarzone z procesem.

  • W systemie zabrakło sterty pulpitu.

Więcej informacji

  • Przyczyna 1

    Wykonany proces nie ma poprawnego dostępu do stacji okien i pulpitu, które są skojarzone z procesem.

    Element członkowski lpDesktop struktury STARTUPINFO, który jest przekazywany lub CreateProcessCreateProcessAsUser określa stację okien i pulpit skojarzony z wykonanym procesem. Wykonany proces musi mieć prawidłowy dostęp zabezpieczeń do określonej stacji okien i pulpitu.

  • Przyczyna 2

    W systemie zabrakło sterty pulpitu.

    Każdy obiekt pulpitu w systemie ma stertę pulpitu, która jest z nim skojarzona. Obiekt pulpitu używa sterty do przechowywania menu, elementów zaczepienia, ciągów i okien. W systemach Windows Server 2003 i Windows XP 32-bitowych system przydziela sterty pulpitu z buforu 48 megabajtów (MB) całego systemu. Oprócz stert pulpitu, sterowniki drukarek i sterowniki czcionek również używają tego buforu.

    Pulpity są skojarzone ze stacjami okien. Stacja okienna może zawierać zero lub więcej pulpitów. Rozmiar sterty pulpitu przydzielonej dla pulpitu skojarzonego ze stacją okien można zmienić, zmieniając następującą wartość rejestru.

    Uwaga

    Nie zaleca się używania przełącznika /3GB. Przełącznik /3GB jest określony w pliku Boot.ini. Przełącznik /3GB jest obsługiwany tylko w przypadku 32-bitowych systemów operacyjnych. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

W systemach Windows Server 2003 i Windows XP 32-bitowych domyślne dane dla tej wartości rejestru będą podobne do następujących (wszystkie w jednym wierszu):

%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

W różnych wersjach systemu Windows domyślne dane dla tej wartości rejestru będą podobne do następujących:

  • Dla systemu Windows Vista RTM (32-bitowy)

    SharedSection=1024,3072,512
    
  • W systemach Windows Vista z dodatkiem SP1, Windows 7, Windows 8, Windows 8.1 (32-bitowe) i Windows Server 2008 (32-bitowe)

    SharedSection=1024,12288,512
    
  • W systemach Windows Vista, Windows 7, Windows 8, Windows 8.1 (64-bitowe), Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 i Windows Server 2012 R2 (64-bitowe)

    SharedSection=1024,20480,768
    

Wartości liczbowe, które są następujące SharedSection= , kontrolują sposób przydzielania sterty pulpitu. Te SharedSection wartości są określane w kilobajtach. Istnieją oddzielne ustawienia dla pulpitów, które są skojarzone z interaktywnymi i nieinteraktywnymi stacjami okien.

Uwaga

Jeśli zmienisz SharedSection wartości w rejestrze, musisz ponownie uruchomić system, aby zmiany zaczęły obowiązywać.

Ważna

W tej sekcji, metodzie lub w tym zadaniu podano informacje dotyczące modyfikowania rejestru. Niepoprawne zmodyfikowanie rejestru może jednak być przyczyną poważnych problemów. Dlatego należy uważnie wykonywać podane czynności. Dla większego bezpieczeństwa przed zmodyfikowaniem rejestru należy wykonać jego kopię zapasową. Dzięki temu będzie można przywrócić rejestr w przypadku wystąpienia problemu. Aby uzyskać więcej informacji na temat sposobu tworzenia kopii zapasowych, przywracania i modyfikowania rejestru, zobacz artykuł Tworzenie kopii zapasowych i przywracanie rejestru systemu Microsoft Windows.

Pierwsza SharedSection wartość (1024) to wspólny rozmiar sterty wspólny dla wszystkich pulpitów. Obejmuje to globalną tabelę dojścia. Ta tabela zawiera dojścia do okien, menu, ikon, kursorów itd. i udostępnionych ustawień systemu. Jest mało prawdopodobne, że kiedykolwiek trzeba będzie zmienić tę wartość.

Druga SharedSection wartość to rozmiar sterty pulpitu dla każdego pulpitu skojarzonego z interakcyjną stacją okien WinSta0. Obiekty użytkownika, takie jak haki, menu, ciągi i okna, zużywają pamięć w tej stercie pulpitu. Jest mało prawdopodobne, że kiedykolwiek trzeba będzie zmienić tę wartość.

Każdy pulpit utworzony w interakcyjnej stacji okien używa domyślnej sterty pulpitu wynoszącej 3072 KB. Domyślnie system tworzy następujące trzy pulpity w winsta0:

  • Winlogon

  • Domyślne

    Domyślny pulpit aplikacji będzie używany przez wszystkie procesy Winsta0\default określone w elemencie struktury STARTUPINFO.lpDesktop. Gdy element członkowski struktury lpDesktop ma wartość NULL, stacja okien i pulpit są dziedziczone z procesu nadrzędnego. Wszystkie usługi wykonywane w ramach konta LocalSystem z wybraną opcją Zezwalaj usłudze na interakcję z uruchamianiem pulpitu będą używać polecenia Winsta0\Default. Wszystkie te procesy będą współużytkować stertę pulpitu skojarzoną z domyślnym pulpitem aplikacji.

  • Wygaszacza ekranu

    Pulpit wygaszacza ekranu jest tworzony w interaktywnej stacji okien (WinSta0) po wyświetleniu wygaszacza ekranu.

Trzecia wartość SharedSection to rozmiar sterty pulpitu dla każdego pulpitu skojarzonego z nieinteraktywną stacją okienną. Jeśli ta wartość nie jest obecna, rozmiar sterty pulpitu dla nieinteraktywnych stacji okien będzie taki sam jak rozmiar określony dla interakcyjnych stacji okien (czyli druga wartość SharedSection).

Jeśli istnieją tylko dwie wartości SharedSection, możesz dodać trzecią wartość, aby określić rozmiar sterty pulpitu dla pulpitów utworzonych w stacjach okien nieinteraktywnych.

Każdy proces usługi wykonywany na koncie użytkownika otrzyma nowy pulpit w nieinteraktywnej stacji okien utworzonej przez Menedżera kontroli usługi (SCM). W związku z tym każda usługa wykonywana na koncie użytkownika będzie korzystać z liczby kilobajtów sterty pulpitu określonej w trzeciej wartości SharedSection. Wszystkie usługi wykonywane w ramach konta LocalSystem, gdy pozycja Zezwalaj usłudze na interakcję z pulpitem nie są zaznaczone, współużytkują stertę pulpitu domyślnego w nieinteraktywnej stacji okien usług (Service-0x0-3e7$).

Łączna sterta pulpitu używana w interakcyjnych i nieinteraktywnych stacjach okien musi zmieścić się w buforze.

Zmniejszenie drugiej lub trzeciej wartości SharedSection zwiększy liczbę pulpitów, które można utworzyć w odpowiednich stacjach okiennych. Mniejsze wartości ograniczą liczbę elementów zaczepienia, menu, ciągów i okien, które można utworzyć na pulpicie. Z drugiej strony zwiększenie drugiej lub trzeciej wartości SharedSection zmniejszy liczbę pulpitów, które można utworzyć. Jednak spowoduje to również zwiększenie liczby elementów zaczepienia, menu, ciągów i okien, które można utworzyć na pulpicie.

Ponieważ usługa SCM tworzy nowy pulpit w nieinteraktywnej stacji okien dla każdego procesu usługi uruchomionego na koncie użytkownika, większa trzecia wartość SharedSection zmniejszy liczbę usług kont użytkowników, które można pomyślnie uruchomić w systemie. Wartość minimalna, którą można określić dla drugiej lub trzeciej wartości SharedSection, wynosi 128. Każda próba użycia mniejszej wartości będzie zamiast tego używać wartości 128.

Sterta pulpitu jest przydzielana przez User32.dll, gdy proces wymaga obiektów użytkownika. Jeśli aplikacja nie jest zależna od User32.dll, nie będzie korzystać ze sterty pulpitu.

Uwaga

W systemie Windows Server 2003 określone zdarzenie jest rejestrowane w dzienniku systemu, gdy spełniony jest jeden z następujących warunków:

  • Jeśli sterta pulpitu stanie się zapełniona, rejestrowane jest następujące zdarzenie:

    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.
    

    W tym przypadku zwiększ rozmiar sterty pulpitu.

  • Jeśli łączna sterta pulpitu staje się rozmiarem buforu całego systemu, rejestrowane jest następujące zdarzenie:

    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.
    

    W tym przypadku zmniejsz rozmiar sterty pulpitu.

W systemie Windows Server 2003 bufor dla całego systemu wynosi 20 MB, gdy spełniony jest jeden z następujących warunków:

  • Jesteś w środowisku usług terminalowych.
  • Przełącznik /3GB jest określony w pliku Boot.ini.

Informacje zawarte w tym artykule dotyczą

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