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

適用対象: Microsoft Windows XP ProfessionalMicrosoft Windows XP Home EditionWindows Vista Ultimate

現象


CreateProcess または CreateProcessAsUser のいずれかを使用して実行されるアプリケーションが失敗し、以下のいずれかのエラー メッセージが表示されます。
ダイナミック リンク ライブラリ <system>\system32\user32.dll の初期化に失敗しました。 プロセスは異常終了します。
ダイナミック リンク ライブラリ <system>\system32\kernel32.dll の初期化に失敗しました。 プロセスは異常終了します。

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

原因


この問題は、以下のいずれかが原因で発生します。
  • 実行されたプロセスに、プロセスに関連付けられたウィンドウ ステーションやデスクトップへの適切なセキュリティ アクセス許可がない。
  • システムでデスクトップ ヒープが不足している。

詳細情報


原因 1

実行されたプロセスに、プロセスに関連付けられたウィンドウ ステーションやデスクトップへの適切なセキュリティ アクセス許可がない。

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

ウィンドウ ステーションおよびデスクトップに関するセキュリティの問題の解決方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。

165194 CreateProcessAsUser() ウィンドウ ステーションおよびデスクトップ

原因 2

システムでデスクトップ ヒープが不足している。

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

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

注: /3GB スイッチの使用はお勧めしません。 /3GB スイッチは boot.ini ファイルで指定します。 /3GB/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 の値は、KB 単位で指定されます。 この他に、対話型のウィンドウ ステーションに関連付けられたデスクトップに対する設定、および非対話型のウィンドウ ステーションに関連付けられたデスクトップに対する設定があります。

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

重要: このセクション、方法、またはタスクには、レジストリの変更方法が記載されています。 レジストリを誤って変更すると、深刻な問題が発生することがあります。 レジストリを変更する際には十分に注意してください。 万一に備えて、編集の前にレジストリをバックアップしてください。 問題が発生した場合でも、レジストリを復元できます。 レジストリのバックアップ方法および復元方法の詳細を参照するには、以下のサポート技術情報番号をクリックしてください。
322756 Windows でレジストリをバックアップおよび復元する方法

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

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

対話型のウィンドウ ステーションで作成される各デスクトップでは、3,072 KB のデフォルトのデスクトップ ヒープが使用されます。 デフォルトでは、システムにより、以下の 3 つのデスクトップが Winsta0 に作成されます。
  • Winlogon
  • 既定値  
    "Default" アプリケーション デスクトップは、STARTUPINFO.lpDesktop 構造体メンバで "Winsta0\default" が指定されているすべてのプロセスで使用されます。 lpDesktop 構造体メンバが "NULL" の場合は、ウィンドウ ステーションやデスクトップは親プロセスから継承されます。 LocalSystem アカウントで実行されていて、スタートアップ オプションの [デスクトップとの対話をサービスに許可] チェック ボックスがオンになっているすべてのサービスでは、"Winsta0\Default" が使用されます。 これらのすべてのプロセスで、"Default" アプリケーション デスクトップに関連付けられているデスクトップ ヒープが共有されます。
  • Screen saver  
    スクリーン セーバー デスクトップは、スクリーン セーバーが表示されたときに、対話型のウィンドウ ステーション (WinSta0) に作成されます。
SharedSection の 3 つ目の値は、"非対話型" のウィンドウ ステーションに関連付けられている各デスクトップのデスクトップ ヒープのサイズです。 この値が指定されていない場合、非対話型のウィンドウ ステーションに対するデスクトップ ヒープのサイズは、対話型のウィンドウ ステーションに指定されたサイズ (2 つ目の SharedSection の値) と同じです。

SharedSection の値が 2 つのみ指定されている場合は、3 つ目の値を追加して、非対話型のウィンドウ ステーションに作成されたデスクトップのデスクトップ ヒープのサイズを指定できます。

ユーザー アカウントで実行されているすべてのサービス プロセスは、サービス コントロール マネージャ (SCM) によって作成された非対話型のウィンドウ ステーションの新しいデスクトップを受け取ります。 このため、ユーザー アカウントで実行されている各サービスでは、SharedSection の 3 つ目の値で指定されているサイズ (KB 単位) のデスクトップ ヒープが使用されます。 LocalSystem アカウントで実行されていて、[デスクトップとの対話をサービスに許可] チェック ボックスがオフになっているすべてのサービスでは、非対話型サービスのウィンドウ ステーション (Service-0x0-3e7$) の "Default" デスクトップのデスクトップ ヒープが共有されます。

対話型および非対話型のウィンドウ ステーションで使用されるデスクトップ ヒープの合計サイズは、バッファのサイズ内に収める必要があります。

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

SCM により、ユーザー アカウントで実行されているサービス プロセスごとに、非対話型のウィンドウ ステーションに新しいデスクトップが作成されるため、SharedSection の 3 つ目の値を大きくして各デスクトップのサイズを大きくすると、システム上で正常に実行できるユーザー アカウント サービスの数が減少します。 SharedSection の 2 つ目または 3 つ目の値に指定できる最小値は 128 です。 128 より小さい値を指定しても、デフォルトの 128 に設定されます。

プロセスでユーザー オブジェクトが必要なときに User32.dll によってデスクトップ ヒープが割り当てられます。 アプリケーションが User32.dll に依存しない場合、そのアプリケーションではデスクトップ ヒープは使用されません。  

注: Windows Server 2003 では、以下のいずれかの条件に該当する場合、システム イベント ログに特定のイベントが記録されます。
  • デスクトップ ヒープがいっぱいになった場合は、以下のイベントが記録されます。この場合、デスクトップ ヒープのサイズを大きくします。
  • デスクトップ ヒープの合計サイズがシステム全体のバッファ サイズに達した場合は、以下のイベントが記録されます。この場合、デスクトップ ヒープのサイズを小さくします。
Windows Server 2003 では、以下のいずれかの条件に該当する場合、システム全体のバッファ サイズは 20 MB です。
  • ターミナル サービス環境を使用している。
  • boot.ini ファイルで /3GB スイッチを指定している。