User32.dll または Kernel32.dll が初期化されない

この記事では、または によって実行されるCreateProcessCreateProcessAsUserアプリケーションが失敗する可能性がある問題について説明します。

適用対象: Microsoft Windows
元の KB 番号: 184802

現象

または CreateProcessAsUser によってCreateProcess実行されるアプリケーションが失敗し、次のいずれかのエラー メッセージが表示される場合があります。

動的ライブラリー <・システム> の初期化\system32\user32.dll 失敗しました。 プロセスが異常終了しています。 動的ライブラリー <・システム> の初期化\system32\kernel32.dll 失敗しました。 プロセスが異常終了しています。

さらに、失敗したプロセスは終了コード 128 または次を返します。

error:ERROR_WAIT_NO_CHILDREN

原因

このエラーは、次のいずれかの理由で発生します。

  • 実行されたプロセスには、プロセスに関連付けられているウィンドウ ステーションとデスクトップへの正しいセキュリティ アクセス権がありません。

  • システムがデスクトップ ヒープを使い果たしました。

詳細

  • 原因 1

    実行されたプロセスには、プロセスに関連付けられているウィンドウ ステーションとデスクトップへの正しいセキュリティ アクセス権がありません。

    実行されたプロセスに関連付けられているウィンドウ ステーションとデスクトップに CreateProcess 渡されるか、または CreateProcessAsUser 指定される STARTUPINFO 構造体の lpDesktop メンバー。 実行されるプロセスは、指定されたウィンドウ ステーションとデスクトップへの正しいセキュリティ アクセス権を持っている必要があります。

  • 原因 2

    システムがデスクトップ ヒープを使い果たしました。

    システム上のすべてのデスクトップ オブジェクトには、それに関連付けられているデスクトップ ヒープがあります。 デスクトップ オブジェクトは、ヒープを使用してメニュー、フック、文字列、ウィンドウを格納します。 Windows Server 2003 および Windows XP 32 ビットでは、システムはシステム全体の 48 メガバイト (MB) バッファーからデスクトップ ヒープを割り当てます。 デスクトップ ヒープに加えて、プリンター ドライバーとフォント ドライバーもこのバッファーを使用します。

    デスクトップはウィンドウ ステーションに関連付けられます。 ウィンドウ ステーションには、0 個以上のデスクトップを含めることができます。 次のレジストリ値を変更することで、ウィンドウ ステーションに関連付けられているデスクトップに割り当てられるデスクトップ ヒープのサイズを変更できます。

    注:

    /3 GB スイッチを使用することはお勧めしません。 /3 GB スイッチは、Boot.ini ファイルで指定されます。 /3 GB スイッチは、32 ビット オペレーティング システムでのみサポートされます。 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

Windows Server 2003 および Windows XP 32 ビットでは、このレジストリ値の既定のデータは次のようになります (すべて 1 行)。

%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) は、すべてのデスクトップに共通する共有ヒープ サイズです。 これには、グローバル ハンドル テーブルが含まれます。 次の表は、ウィンドウ、メニュー、アイコン、カーソルなどのハンドルと共有システム設定を保持します。 この値を変更する必要はほとんどありません。

2 番目 SharedSection の値は、 対話型 ウィンドウ ステーション WinSta0 に関連付けられている各デスクトップのデスクトップ ヒープのサイズです。 フック、メニュー、文字列、ウィンドウなどのユーザー オブジェクトは、このデスクトップ ヒープ内のメモリを消費します。 この値を変更する必要はほとんどありません。

対話型ウィンドウ ステーションで作成される各デスクトップでは、既定のデスクトップ ヒープ 3,072 KB が使用されます。 既定では、システムは Winsta0 に次の 3 つのデスクトップを作成します。

  • Winlogon

  • 既定値

    既定のアプリケーション デスクトップは、STARTUPINFO.lpDesktop 構造体メンバーで指定されているすべてのプロセス Winsta0\default で使用されます。 lpDesktop 構造体メンバーが NULL の場合、ウィンドウ ステーションとデスクトップは親プロセスから継承されます。 [サービスとデスクトップの対話を許可する] スタートアップ オプションが選択されている LocalSystem アカウントで実行されるすべてのサービスでは、 が使用 Winsta0\Defaultされます。 これらのプロセスはすべて、既定のアプリケーション デスクトップに関連付けられているデスクトップ ヒープを共有します。

  • スクリーン セーバー

    スクリーン セーバーが表示されると、スクリーン セーバー デスクトップが対話型ウィンドウ ステーション (WinSta0) に作成されます。

3 つ目の SharedSection 値は、非対話型ウィンドウ ステーションに関連付けられている各デスクトップのデスクトップ ヒープのサイズです。 この値が存在しない場合、非対話型ウィンドウ ステーションのデスクトップ ヒープのサイズは、対話型ウィンドウ ステーションに指定されているサイズ (つまり、2 番目の SharedSection 値) と同じになります。

SharedSection 値が 2 つだけ存在する場合は、3 番目の値を追加して、非インターアクティブウィンドウ ステーションで作成されるデスクトップのデスクトップ ヒープのサイズを指定できます。

ユーザー アカウントで実行されるすべてのサービス プロセスは、Service Control Manager (SCM) によって作成された非対話型ウィンドウ ステーションに新しいデスクトップを受け取ります。 そのため、ユーザー アカウントで実行される各サービスは、3 番目の SharedSection 値で指定されたデスクトップ ヒープのキロバイト数を使用します。 [サービスによるデスクトップとの対話を許可する] が選択されていない場合に LocalSystem アカウントで実行されるすべてのサービスは、非インターアクティブなサービス Windows ステーション (Service-0x0-3e7$) で既定のデスクトップのデスクトップ ヒープを共有します。

対話型ウィンドウ ステーションと非インターアクティブ ウィンドウ ステーションで使用されているデスクトップ ヒープの合計は、バッファーに収まる必要があります。

2 番目または 3 番目の SharedSection 値を減らすと、対応するウィンドウ ステーションに作成できるデスクトップの数が増えます。 値を小さくすると、デスクトップで作成できるフック、メニュー、文字列、ウィンドウの数が制限されます。 一方、2 番目または 3 番目の SharedSection 値を増やすと、作成できるデスクトップの数が減少します。 ただし、デスクトップで作成できるフック、メニュー、文字列、ウィンドウの数も増えます。

SCM は、ユーザー アカウントで実行されているすべてのサービス プロセスに対して非対話型ウィンドウ ステーションに新しいデスクトップを作成するため、3 番目の SharedSection 値を大きくすると、システムで正常に実行できるユーザー アカウント サービスの数が減ります。 2 番目または 3 番目の 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 MB です。

  • ターミナル サービス環境にいる。
  • /3 GB スイッチは、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