User32.dllまたはKernel32.dllが初期化されない
この記事では、アプリケーションによって実行される CreateProcess
、または CreateProcessAsUser
失敗する可能性がある問題について説明します。
適用対象: 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 アカウントで実行されるすべてのサービスは、非アクティブサービス ウィンドウ ステーション (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
フィードバック
フィードバックの送信と表示