次の方法で共有


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

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

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

現象

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

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

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

error:ERROR_WAIT_NO_CHILDREN

原因

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

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

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

詳細

  • 原因 1

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

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

  • 原因 2

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

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

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

    Note

    /3 GB スイッチを使用することはお勧めしません。 /3GB スイッチは、Boot.ini ファイルで指定されます。 /3GB スイッチは、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 値はキロバイト単位で指定されます。 対話型ウィンドウ ステーションと非対話型ウィンドウ ステーションに関連付けられているデスクトップには、個別の設定があります。

Note

レジストリの SharedSection 値を変更する場合は、システムを再起動して変更を有効にする必要があります。

重要

このセクション、方法、またはタスクには、レジストリの編集方法が記載されています。 レジストリを誤って変更すると、深刻な問題が発生することがあります。 したがって、次の手順を注意深く実行してください。 保護のために、レジストリを変更する前に、バックアップします。 その後、問題が起こった場合は、レジストリを復元できます。 レジストリのバックアップと復元方法の詳細は、「Windows のレジストリのバックアップおよび復元の方法」を参照してください。

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

2 番目の SharedSection 値は、 interactive ウィンドウ ステーション 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に依存していない場合、デスクトップ ヒープは使用されません。

Note

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 です。

  • ターミナル サービス環境にいます。
  • /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