User32.dll или Kernel32.dll не инициализируется

В этой статье описывается проблема, из-за которой приложение, выполняемое или CreateProcessAsUser может завершиться сбоемCreateProcess.

Применимо к: Microsoft Windows
Исходный номер базы знаний: 184802

Симптомы

Приложение, которое выполняется или CreateProcessAsUser может завершиться сбоемCreateProcess, и вы получаете одно из следующих сообщений об ошибке:

Сбой инициализации системы> динамической библиотеки <\system32\user32.dll. Процесс ненормально завершается. Сбой инициализации системы> динамической библиотеки <\system32\kernel32.dll. Процесс ненормально завершается.

Кроме того, сбойный процесс возвращает код выхода 128 или следующий:

error:ERROR_WAIT_NO_CHILDREN

Причина

Этот сбой возникает по одной из следующих причин:

  • Выполняемый процесс не имеет правильного доступа к оконной станции и рабочему столу, связанным с процессом.

  • Система иссякла из кучи рабочего стола.

Дополнительная информация

  • Причина 1

    Выполняемый процесс не имеет правильного доступа к оконной станции и рабочему столу, связанным с процессом.

    Элемент lpDesktop структуры STARTUPINFO, который передается CreateProcess в или CreateProcessAsUser указывает станцию окон и рабочий стол, связанные с выполняемым процессом. Выполняемый процесс должен иметь правильный доступ к указанной оконной станции и рабочему столу.

  • Причина 2

    Система иссякла из кучи рабочего стола.

    С каждым объектом рабочего стола в системе связана куча рабочего стола. Классический объект использует кучу для хранения меню, перехватчиков, строк и окон. В 32-разрядной версии Windows Server 2003 и Windows XP система выделяет кучи компьютеров из буфера размером 48 МБ. Помимо кучи настольных компьютеров, этот буфер также используют драйверы принтера и драйверы шрифтов.

    Рабочие столы связаны с оконными станциями. Оконная станция может содержать ноль или больше рабочих столов. Размер кучи рабочего стола, выделенной для рабочего стола, связанного с оконной станцией, можно изменить, изменив следующее значение реестра.

    Примечание.

    Не рекомендуется использовать параметр /3 ГБ. Параметр /3 ГБ указан в файле Boot.ini. Параметр /3 ГБ поддерживается только для 32-разрядных операционных систем. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

В 32-разрядной версии Windows Server 2003 и Windows XP данные по умолчанию для этого значения реестра будут выглядеть следующим образом (все в одной строке):

%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

В разных версиях Windows данные по умолчанию для этого значения реестра будут выглядеть следующим образом:

  • Для Windows Vista RTM (32-разрядная версия)

    SharedSection=1024,3072,512
    
  • Для Windows Vista с пакетом обновления 1 (SP1), Windows 7, Windows 8, Windows 8.1 (32-разрядная версия) и Windows Server 2008 (32-разрядная версия)

    SharedSection=1024,12288,512
    
  • Для Windows Vista, Windows 7, Windows 8, Windows 8.1 (64-разрядная версия), Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 и Windows Server 2012 R2 (64-разрядная версия)

    SharedSection=1024,20480,768
    

Приведенные ниже SharedSection= числовые значения определяют способ выделения кучи рабочего стола. Эти SharedSection значения указываются в килобайтах. Существуют отдельные параметры для рабочих столов, связанных с интерактивными и неинтерактивными оконными станциями.

Примечание.

При изменении значений SharedSection в реестре необходимо перезапустить систему, чтобы изменения вступили в силу.

Важно!

В этот раздел, описание метода или задачи включены действия, содержащие указания по изменению параметров реестра. Однако неправильное изменение параметров реестра может привести к возникновению серьезных проблем. Поэтому следует в точности выполнять приведенные инструкции. Для дополнительной защиты создайте резервную копию реестра, прежде чем редактировать его. Так вы сможете восстановить реестр, если возникнет проблема. Для получения дополнительной информации о том, как создать резервную копию и восстановить реестр, см. статью Сведения о резервном копировании и восстановлении реестра Windows.

Первое SharedSection значение (1024) — это общий размер кучи, общий для всех рабочих столов. Сюда входит глобальная таблица дескрипторов. Эта таблица содержит дескрипторы для окон, меню, значков, курсоров и т. д., а также общие системные параметры. Маловероятно, что вам когда-либо придется изменить это значение.

Второе SharedSection значение — это размер кучи рабочего стола для каждого рабочего стола, связанного с интерактивной станцией окна WinSta0. Пользовательские объекты, такие как перехватчики, меню, строки и окна, потребляют память в этой кучи рабочего стола. Маловероятно, что вам когда-либо придется изменить это значение.

Каждый рабочий стол, созданный на станции интерактивного окна, использует кучи по умолчанию 3072 КБ. По умолчанию система создает следующие три рабочих стола в Winsta0:

  • Winlogon

  • По умолчанию

    Рабочий стол приложения по умолчанию будет использоваться всеми процессами, для которых Winsta0\default указано в элементе структуры STARTUPINFO.lpDesktop. Если элемент структуры lpDesktop имеет значение NULL, оконная станция и рабочий стол наследуются от родительского процесса. Все службы, выполняемые в учетной записи LocalSystem с выбранным параметром Разрешить службе взаимодействовать с запуском рабочего стола, будут использовать Winsta0\Default. Все эти процессы будут совместно использовать кучу рабочего стола, связанную с классическим приложением по умолчанию.

  • Программа-заставка

    Рабочий стол заставки создается на станции интерактивного окна (WinSta0) при отображении заставки.

Третье значение SharedSection — это размер кучи рабочего стола для каждого рабочего стола, связанного с неинтерактивной оконной станцией. Если это значение отсутствует, размер кучи рабочего стола для неинтерактивных оконных станций будет таким же, как и для интерактивных оконных станций (то есть второго значения SharedSection).

Если присутствует только два значения SharedSection, можно добавить третье значение, чтобы указать размер кучи рабочего стола для рабочих столов, созданных в неинтерактивных оконных станциях.

Каждый процесс службы, выполняемый под учетной записью пользователя, будет получать новый рабочий стол в неинтерактивной оконной станции, созданной диспетчером управления службами (SCM). Таким образом, каждая служба, выполняемая под учетной записью пользователя, будет потреблять количество килобайт кучи рабочего стола, указанное в третьем значении SharedSection. Все службы, выполняемые под учетной записью LocalSystem, когда не выбран параметр Разрешить службе взаимодействовать с рабочим столом, совместно используют кучи рабочего стола по умолчанию на неинтерактивной станции windows (Service-0x0-3e7$).

Общая куча рабочих столов, которая используется в интерактивных и неинтерактивных оконных станциях, должна помещаться в буфер.

Уменьшение второго или третьего значения SharedSection приведет к увеличению числа рабочих столов, которые можно создать в соответствующих оконных станциях. Меньшие значения ограничивают количество перехватчиков, меню, строк и окон, которые можно создать на рабочем столе. С другой стороны, увеличение второго или третьего значения SharedSection приведет к уменьшению числа рабочих столов, которые можно создать. Однако это также увеличит количество перехватчиков, меню, строк и окон, которые можно создать на рабочем столе.

Так как SCM создает новый рабочий стол на станции неинтерактивного окна для каждого процесса службы, выполняемого под учетной записью пользователя, большее третье значение SharedSection позволит сократить количество служб учетных записей пользователей, которые могут успешно выполняться в системе. Минимальное значение, которое можно указать для второго или третьего значения SharedSection, — 128. При любой попытке использовать меньшее значение вместо этого будет использоваться 128.

Кучи рабочего стола выделяется User32.dll, когда процессу требуются пользовательские объекты. Если приложение не зависит от User32.dll, оно не будет использовать кучи рабочего стола.

Примечание.

В Windows Server 2003 конкретное событие регистрируется в системном журнале при выполнении одного из следующих условий:

  • Если кучи рабочего стола становится полной, регистрируется следующее событие:

    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.
    

    В этом случае увеличьте размер кучи рабочего стола.

  • Если общая куча рабочего стола становится размером буфера по всей системе, регистрируется следующее событие:

    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.
    

    В этом случае уменьшите размер кучи рабочего стола.

В Windows Server 2003 системный буфер составляет 20 МБ, если выполняется одно из следующих условий:

  • Вы находитесь в среде служб терминалов.
  • Параметр /3 ГБ указан в файле Boot.ini.

Сфера применения

  • Microsoft Windows XP Professional
  • Microsoft Windows XP Home Edition
  • Windows Vista Ultimate
  • Windows Vista Enterprise
  • Windows Vista Business
  • Windows Vista Home Premium
  • Windows 7 Максимальная
  • Windows 7 Корпоративная
  • Windows 7 Профессиональная
  • Windows 7 Домашняя расширенная
  • Windows 8 Корпоративная
  • Windows 8 Профессиональная, Windows 8
  • Windows 8.1 Корпоративная
  • Windows 8.1 Профессиональная
  • Windows 8.1
  • Microsoft Windows Server 2003 Datacenter Edition (32-разрядная версия x86)
  • Microsoft Windows Server 2003 Datacenter x64 Edition
  • Microsoft Windows Server 2003 выпуск Enterprise (32-разрядная версия x86)
  • Microsoft Windows Server 2003 Корпоративная x64 Edition
  • Microsoft Windows Server 2003 Standard Edition (32-разрядная версия 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