本文描述的問題是由 CreateProcess 或 CreateProcessAsUser 執行的應用程式可能會失敗。
適用於: Microsoft Windows
原始 KB 編號: 184802
癥狀
由 CreateProcess 或 CreateProcessAsUser 執行的應用程式可能會失敗,而且您會收到下列其中一個錯誤訊息:
動態連結庫 <系統> 初始化\system32\user32.dll 失敗。 進程異常終止。 動態連結庫 <系統> 初始化\system32\kernel32.dll 失敗。 進程異常終止。
此外,失敗的進程會傳回退出碼 128 或以下代碼:
錯誤:ERROR_WAIT_NO_CHILDREN
原因
發生此失敗的原因如下:
執行的進程沒有正確的安全性存取權來訪問與其相關聯的窗口工作站和桌面。
系統的桌面記憶體資源耗盡。
詳細資訊
原因一
執行的進程沒有正確的安全性存取權來訪問與其相關聯的窗口工作站和桌面。
傳遞至
CreateProcess或CreateProcessAsUser的 STARTUPINFO 結構的 lpDesktop 成員指定與已執行的程序相關聯的工作站和桌面。 執行的進程必須具有對指定視窗站和桌面的正確安全存取權。原因2
系統的桌面記憶體資源耗盡。
系統上的每個桌面物件都有與其相關聯的桌面堆積。 桌面物件會使用堆疊來儲存功能表、勾子、字元串和視窗。 在 Windows Server 2003 和 Windows XP 32 位元中,系統從全系統範圍內 48 兆字節的緩衝區中分配桌面堆疊。 除了桌面堆積之外,印表機驅動程式和字型驅動程式也會使用此緩衝區。
桌面與視窗站相關聯。 窗口站可以包含零或多個桌面。 您可以透過變更下列登錄值來改變配置給與視窗工作站相關聯桌面的桌面堆疊大小。
備註
不建議您使用 /3GB 參數。 /3GB 設定被指定於 Boot.ini 檔案中。 /3GB 開關僅支援 32 位元作業系統。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
在 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 值會以 KB 為單位指定。 桌面有個別的設定,這些設定與互動式和非互動式視窗工作站相關聯。
備註
如果您變更 SharedSection 登錄中的值,您必須重新啟動系統,變更才會生效。
這很重要
本節、方法或任務包含告訴您如何修改註冊表的步驟。 然而,如果不正確地修改登錄檔,可能會出現嚴重問題。 因此,請確保仔細遵循這些步驟。 為了增加保護,請在修改前備份登錄檔。 然後,如果發生問題,您可以還原登錄檔。 如需有關如何備份和還原登錄檔的詳細資訊,請參閱 如何在 Windows 中備份和還原登錄檔。
第一個 SharedSection 值 (1024) 是所有桌面通用的共享堆積大小。 這包括全域句柄數據表。 此表格會保存視窗、功能表、圖示、游標等等的控制代碼,以及共用系統設定。 您不太可能必須變更此值。
第二 SharedSection 個值是每個與 互動式 視窗站 WinSta0 相關聯的桌面堆積大小。 用戶物件,例如鉤子、功能表、字串和視窗會耗用此桌面堆積中的記憶體。 您不太可能必須變更此值。
在互動式視窗站台中建立的每個桌面都會使用預設桌面堆積 3,072 KB。 根據預設,系統會在 Winsta0 中建立下列三個桌面:
Winlogon
預設
所有在 STARTUPINFO.lpDesktop 樞結成員中指定的程序都將使用默認應用程式桌面
Winsta0\default。 當 lpDesktop 結構成員為 NULL 時,視窗工作站和桌面會繼承自父程序。 選取[允許服務與桌面啟動互動] 選項的 LocalSystem 帳戶下執行的所有服務都會使用Winsta0\Default。 所有這些進程都會共用與默認應用程式桌面相關聯的桌面堆積。螢幕保護裝置
螢幕保護程式桌面會在顯示螢幕保護程式時,於互動式視窗站臺中建立。
第三個 SharedSection 值是與非互動視窗工作站相關聯的每個桌面的桌面堆積大小。 如果這個值不存在,非互動式視窗月臺的桌面堆積大小會與為互動式視窗月臺指定的大小相同(也就是第二個 SharedSection 值)。
如果只有兩個 SharedSection 值存在,您可以新增第三個值來指定在非互動視窗站中建立之桌面堆積的大小。
在用戶帳戶下執行的每個服務進程,都會在服務控制管理員 (SCM) 所建立的非互動式視窗站台中接收新的桌面。 因此,在用戶帳戶下執行的每個服務都會消耗在第三個 SharedSection 值中指定的桌面堆疊的千位元組數量。 未選擇「允許服務與桌面互動」選項時,所有在 LocalSystem 帳戶下執行的服務會共用非互動式服務窗口站(Service-0x0-3e7$)中預設桌面的桌面堆積儲存。
互動式和非互動式視窗站臺中使用的桌面堆積總數必須符合緩衝區。
減少第二或第三個 SharedSection 值將會增加可在對應視窗站台中建立的桌面數目。 較小的值會限制可在桌面中建立的勾點、功能表、字串和視窗數目。 另一方面,增加第二或第三個 SharedSection 值將會減少可建立的桌面數目。 不過,這也會增加可在桌面上建立的鉤子、功能表、字串和視窗數目。
由於 SCM 會在非互動式視窗站台中為在用戶帳戶下執行的每個服務進程建立新的桌面,因此較大的第三個 SharedSection 值會減少可在系統上順利執行的使用者帳戶服務數目。 可以針對第二或第三個 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:
- 您位於終端機服務環境中。
- /3GB 設定被指定於 Boot.ini 檔案中。
適用對象
- Microsoft Windows XP Professional
- Microsoft Windows XP Home Edition
- Windows Vista Ultimate
- Windows Vista 企業版
- Windows Vista Business
- Windows Vista 家用進階版
- Windows 7 Ultimate
- Windows 7 企業版
- Windows 7 專業版
- Windows 7 家用進階版
- Windows 8 企業版
- Windows 8 專業版、Windows 8
- Windows 8.1 企業版
- Windows 8.1 專業版
- 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 企業版 x64 版本
- Microsoft Windows Server 2003 Standard Edition (32 位 x86)
- Microsoft Windows Server 2003 Standard x64 Edition
- Windows Server 2008 Datacenter
- Windows Server 2008 企業版
- 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