Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается проблема, из-за которой приложение, выполняемое CreateProcess
или CreateProcessAsUser
, может привести к сбою.
Применимо к: Microsoft Windows
Исходный номер базы знаний: 184802
Симптомы
Приложение, которое выполняется CreateProcess
или CreateProcessAsUser
, может завершиться ошибкой, и вы получите одно из следующих сообщений об ошибке:
Инициализация динамической библиотеки <system>\system32\user32.dll завершилась неудачно. Процесс завершается аномально. Инициализация динамической библиотеки <системы>\system32\kernel32.dll не удалась. Процесс завершается аномально.
Кроме того, неудачный процесс возвращает код выхода 128 или следующий:
ошибка:ERROR_WAIT_NO_CHILDREN (ожидание без детей)
Причина
Эта ошибка возникает по одной из следующих причин:
У выполняемого процесса нет правильного уровня безопасности для оконной станции и рабочего стола, связанные с этим процессом.
Система исчерпала предел памяти для рабочего стола.
Дополнительные сведения
Причина 1
У выполняемого процесса нет правильного уровня безопасности для оконной станции и рабочего стола, связанные с этим процессом.
Элемент lpDesktop структуры STARTUPINFO, который передается
CreateProcess
илиCreateProcessAsUser
задает станцию окон и рабочий стол, связанные с выполненным процессом. Выполняемый процесс должен иметь надлежащий уровень безопасности доступа к указанной оконной станции и рабочему столу.Причина 2
Система исчерпала предел памяти для рабочего стола.
Каждый объект рабочего стола в системе имеет кучу рабочего стола, связанную с ним. Объект рабочего стола использует кучу для хранения меню, перехватчиков, строк и окон. В Windows Server 2003 и Windows XP 32-разрядной система выделяет десктопный стек из буфера размером 48 мегабайт (МБ). Помимо кучи настольных компьютеров, драйверы принтера и драйверы шрифтов также используют этот буфер.
Рабочие столы связаны с оконными станциями. Станция окон может содержать ноль или больше рабочих столов. Размер кучи рабочего стола, выделенной для рабочего стола, связанного с оконной станцией, можно изменить, изменив значение следующего параметра реестра.
Замечание
Мы настоятельно не рекомендуем использовать переключатель /3GB. Параметр /3GB указан в файле Boot.ini. Параметр /3GB поддерживается только для 32-разрядных операционных систем.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
В Windows Server 2003 и Windows XP 32-разрядная версия данные по умолчанию для этого значения реестра будут выглядеть следующим образом (все в одной строке):
%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 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.
Десктопный heap выделяется ресурсом User32.dll, когда процесс нуждается в пользовательских объектах. Если приложение не зависит от User32.dll, оно не будет использовать память рабочего стола.
Замечание
В Windows Server 2003 конкретный случай регистрируется в системном журнале, если одно из следующих условий имеет значение true:
Если куча рабочего стола заполняется, регистрируется следующее событие:
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 МБ, если одно из следующих условий имеет значение true:
- Вы находитесь в среде служб терминалов.
- Параметр /3GB указан в файле Boot.ini.
Применимо к
- Microsoft Windows XP Professional
- Microsoft Windows XP Home Edition
- Windows Vista Ultimate
- Windows Vista Enterprise
- Windows Vista Business
- Windows Vista Домашняя премиум
- Windows 7 Ultimate
- Windows 7 Корпоративная
- Windows 7 Профессиональный
- Windows 7 Домашняя расширенная версия
- Windows 8 Корпоративная
- Windows 8 Pro, 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-версия
- Microsoft Windows Server 2003 выпуск Standard (32-разрядная версия x86)
- Microsoft Windows Server 2003 Standard x64 Edition
- Windows Server 2008 Datacenter
- Windows Server 2008 Корпоративная
- Центр обработки данных Windows Server 2008 R2
- Windows Server 2008 R2 Enterprise
- Windows Server 2008 Standard
- Windows Server 2012 Datacenter;
- Windows Server 2012 Standard
- Центр обработки данных Windows Server 2012 R2
- Windows Server 2012 R2 Standard