User32.dll 또는 Kernel32.dll 초기화되지 않음

  • 아티클
  • 2023. 07. 17.
  •  

이 문서의 내용

  1. 증상
  2. 원인
  3. 추가 정보
  4. 적용 대상

이 문서에서는 애플리케이션이 실행 CreateProcessCreateProcessAsUser 되거나 실패할 수 있는 문제를 설명합니다.

적용 대상: Microsoft Windows
원래 KB 번호: 184802

증상

실행 CreateProcess 중이거나 CreateProcessAsUser 실패할 수 있는 애플리케이션이며 다음 오류 메시지 중 하나를 수신합니다.

동적 라이브러리 <시스템>\system32\user32.dll 초기화하지 못했습니다. 프로세스가 비정상적으로 종료됩니다. 동적 라이브러리 <시스템>\system32\kernel32.dll 초기화하지 못했습니다. 프로세스가 비정상적으로 종료됩니다.

또한 실패한 프로세스는 종료 코드 128 또는 다음을 반환합니다.

error:ERROR_WAIT_NO_CHILDREN

원인

이 오류는 다음 이유 중 하나로 발생합니다.

  • 실행된 프로세스에는 프로세스와 연결된 창 스테이션 및 데스크톱에 대한 올바른 보안 액세스 권한이 없습니다.
  • 시스템에 데스크톱 힙이 부족했습니다.

추가 정보

  • 원인 1실행된 프로세스와 연결된 창 스테이션 및 데스크톱에 CreateProcess 전달되거나 CreateProcessAsUser 지정되는 STARTUPINFO 구조체의 lpDesktop 멤버입니다. 실행된 프로세스에는 지정된 창 스테이션 및 데스크톱에 대한 올바른 보안 액세스 권한이 있어야 합니다.
  • 실행된 프로세스에는 프로세스와 연결된 창 스테이션 및 데스크톱에 대한 올바른 보안 액세스 권한이 없습니다.
  • 원인 2시스템의 모든 데스크톱 개체에는 연결된 데스크톱 힙이 있습니다. 데스크톱 개체는 힙을 사용하여 메뉴, 후크, 문자열 및 창을 저장합니다. Windows Server 2003 및 Windows XP 32비트에서 시스템은 시스템 전체 48MB(메가바이트) 버퍼에서 데스크톱 힙을 할당합니다. 데스크톱 힙 외에도 프린터 드라이버 및 글꼴 드라이버도 이 버퍼를 사용합니다.

    참고

    /3GB 스위치를 사용하지 않는 것이 좋습니다. /3GB 스위치는 Boot.ini 파일에 지정됩니다. /3GB 스위치는 32비트 운영 체제에서만 지원됩니다. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

  • 데스크톱은 창 스테이션과 연결됩니다. 창 스테이션에는 0개 이상의 데스크톱이 포함될 수 있습니다. 다음 레지스트리 값을 변경하여 창 스테이션과 연결된 데스크톱에 할당된 데스크톱 힙의 크기를 변경할 수 있습니다.
  • 시스템에 데스크톱 힙이 부족했습니다.

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과 연결된 각 데스크톱의 데스크톱 힙 크기입니다. 후크, 메뉴, 문자열 및 창과 같은 사용자 개체는 이 데스크톱 힙에서 메모리를 사용합니다. 이 값을 변경해야 할 가능성은 거의 없습니다.

대화형 창 스테이션에서 만든 각 데스크톱은 3,072KB의 기본 데스크톱 힙을 사용합니다. 기본적으로 시스템은 Winsta0에서 다음 세 개의 데스크톱을 만듭니다.

  • Winlogon
  • 기본
  • 기본 애플리케이션 데스크톱은 STARTUPINFO.lpDesktop 구조체 멤버에 지정된 모든 프로세스 Winsta0\default 에서 사용됩니다. lpDesktop 구조체 멤버가 NULL이면 창 스테이션과 데스크톱이 부모 프로세스에서 상속됩니다. 서비스가 데스크톱과 상호 작용하도록 허용 시작 옵션이 선택된 LocalSystem 계정에서 실행되는 모든 서비스가 사용됩니다 Winsta0\Default. 이러한 모든 프로세스는 기본 애플리케이션 데스크톱과 연결된 데스크톱 힙을 공유합니다.
  • 화면 보호기
  • 화면 보호기가 표시되면 화면 보호기 데스크톱이 대화형 창 스테이션(WinSta0)에 만들어집니다.

세 번째 SharedSection 값은 비자동 창 스테이션과 연결된 각 데스크톱에 대한 데스크톱 힙의 크기입니다. 이 값이 없으면 비대화형 창 스테이션의 데스크톱 힙 크기는 대화형 창 스테이션(즉, 두 번째 SharedSection 값)에 지정된 크기와 동일합니다.

두 개의 SharedSection 값만 있는 경우 세 번째 값을 추가하여 비활성 창 스테이션에서 만든 데스크톱의 데스크톱 힙 크기를 지정할 수 있습니다.

사용자 계정으로 실행되는 모든 서비스 프로세스는 SCM(서비스 제어 관리자)에서 만든 비대화형 창 스테이션에서 새 데스크톱을 받게 됩니다. 따라서 사용자 계정으로 실행되는 각 서비스는 세 번째 SharedSection 값에 지정된 데스크톱 힙의 킬로바이트 수를 사용합니다. 서비스가 데스크톱과 상호 작용할 수 있도록 허용이 선택되지 않은 경우 LocalSystem 계정으로 실행되는 모든 서비스는 비자동 서비스 창 스테이션(Service-0x0-3e7$)에서 기본 데스크톱의 데스크톱 힙을 공유합니다.

대화형 및 비대화형 창 스테이션에서 사용되는 총 데스크톱 힙은 버퍼에 맞아야 합니다.

두 번째 또는 세 번째 SharedSection 값을 줄이면 해당 창 스테이션에서 만들 수 있는 데스크톱 수가 증가합니다. 값이 작을수록 데스크톱에서 만들 수 있는 후크, 메뉴, 문자열 및 창의 수가 제한됩니다. 반면에 두 번째 또는 세 번째 SharedSection 값을 늘리면 만들 수 있는 데스크톱 수가 줄어듭니다. 그러나 이렇게 하면 바탕 화면에서 만들 수 있는 후크, 메뉴, 문자열 및 창의 수도 증가합니다.

SCM은 사용자 계정으로 실행되는 모든 서비스 프로세스에 대해 비자동성 창 스테이션에 새 데스크톱을 만들기 때문에 세 번째 SharedSection 값이 크면 시스템에서 성공적으로 실행될 수 있는 사용자 계정 서비스의 수가 줄어듭니다. 두 번째 또는 세 번째 SharedSection 값에 대해 지정할 수 있는 최소값은 128입니다. 더 작은 값을 사용하려는 모든 시도는 대신 128을 사용합니다.

프로세스에 사용자 개체가 필요한 경우 데스크톱 힙은 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에서는 다음 조건 중 하나가 true인 경우 시스템 전체 버퍼는 20MB입니다.

  • 터미널 서비스 환경에 있습니다.
  • /3GB 스위치는 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 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비트 x86)
  • Microsoft Windows Server 2003 Datacenter x64 Edition
  • Microsoft Windows Server 2003 Enterprise Edition(32비트 x86)
  • Microsoft Windows Server 2003 Enterprise 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
Posted by gurupia
,