CreateProcess 建立程序失敗原因調查

2021-07-06 10:44:10 字數 1614 閱讀 5925

使用 createprocess 函式建立程序(呼叫外部程式)算是很常用的操作了,最近在工作中卻遇到乙個少見的怪現象,經常使用的一段**(呼叫外部程式並等待其結束,主要就使用了 createprocess 函式),在少數某些機器上會失敗(目前只在某乙個 win8.1 和某乙個 win10 機器遭遇失敗)。

經調查分析,發現正是 createprocess 呼叫失敗,getlasterror 返回 0x05 錯誤(error_access_denied),憑經驗知道這是許可權不足的問題,但具體是什麼原因?一時無解。繼續排查,發現原先有另一處呼叫外部程式的**是不存在該問題的,仔細對比兩處**,發現呼叫createprocess

時的第6個引數(dwcreationflags)不一樣!問題**中使用了create_breakaway_from_job

值(和job object有關),馬上去掉該值再測試,問題果然沒有了!

抱著「知其然,還要知其所以然。」的一慣態度,繼續尋找導致該問題的原因,歷程如下:

1. 先是深入解讀了 msdn 相關部分,了解到使用 create_breakaway_from_job 引數是需要前提條件的:需要其關聯的 job 物件具有job_object_limit_breakaway_ok屬性,否則就會失敗,但 msdn 中並未明確指出失敗碼為 0x05。

2. 網上求解過程中,意外地在 chrome issues 列表中發現同樣的問題:「winapi  createprocessasuserw() with create_breakaway_from_job flag which fails with 0x5 (access denied) error.」。

3. 翻書《windows核心程式設計》也找到了對 create_breakaway_from_job 的相關說明(如下圖):

總結一下:

我使用的這段**是從以前的工程裡拷貝來的,至於為什麼帶上了 create_breakaway_from_job 引數,屬於歷史問題就不得而知了,這個引數的目的是讓子程序脫離父程序的 job,如果本沒有這個需求的話,可以不用考慮直接去掉,如果確實需要該特性的話,那就得按官方的要求來,要確保其 job 物件具有 job_object_limit_breakaway_ok 屬性(具體怎麼實現不屬於本文的範疇了)。個別機器上可能由於系統環境的某些特殊原因,造成相關 job 物件不具有 job_object_limit_breakaway_ok 屬性,因此導致了該問題的出現,圖證如下:

所以,以後遇到 createprocess 失敗,錯誤碼為 0x05 時,去檢查一下引數裡是否有 create_breakaway_from_job 吧!

參考:《windows核心程式設計》

建立程序 CreateProcess

下面來分享一下如何用c 建立程序 開發環境建議vs2017 宇宙第一ide 以下為建立新的程序,以拉起記事本為例 include include using namespace std int main startupinfo 結構體初始化 process information pi proces...

建立程序 CreateProcess (二)

startupinfo結構中的cb欄位表示該結構的長度,表示子程序繼承父程序的startupinfo結構。如果要修改子程序的啟動資訊,就要先獲取到父程序的資訊,然後再設定startupinfo結構中的相應字段。如下隱藏啟動乙個程式 char lppath notepad.exe startupinf...

CreateProcess函式使用

startupinfo infostart process information infoprocess memset infostart,0,sizeof infostart infostart.cb sizeof startupinfo infostart.dwflags startf use...