2012-11-16 57 views
0

有沒有辦法獲得子進程的PID?我的意思是,如果我使用CreateProcess打開一個cmd提示符,我知道它的PID,因爲我可以從返回的ProcessInformation結構中獲取它。但是,是否有可能獲得進程的PID,這些進程是從此命令提示符處打開的?如何獲取子進程的PID?

謝謝!

+0

所以你實際上並不想要孩子的PID,而是來自** grand ** - 孩子的PID。 – alk

+0

@alk:是的,確切的說就是我想要的。 – kampi

回答

1

可以使用CreateToolhelp32Snapshot函數傳遞TH32CS_SNAPPROCESS值,然後調用Process32First方法,最後你必須遍歷返回的集合和比較th32ParentProcessID字段的值對CMD.EXE的PID。另一種選擇是使用Win32_Process WMI類使用ParentProcessId屬性來過濾結果。

+0

這個appraoch確實適用於統計目的。使用爲任何種類的IPC返回的PID都是不安全的,因爲PID來來去去,可能已被重用。 – alk

0

使用CreateJobObject創建作業並使用SetInformationJobObject將作業與I/O完成端口相關聯;有關更多詳情,請參閱JOBOBJECT_ASSOCIATE_COMPLETION_PORT。使用CREATE_SUSPENDED創建流程並使用AssignProcessToJobObject將新流程作爲工作的一部分。

請記住,有時新的孫子進程在你看到進程ID時已經退出,並且該進程可以被重用。如果您使用OpenProcess獲取孫級進程的句柄,請確保正確處理錯誤,並且如果成功打開句柄,請確保您致電IsProcessInJob以驗證句柄是否確實指向其中一個孫級進程。

由於進程無法在Windows 8/2012之前嵌套,所以在創建子進程時可能需要使用CREATE_BREAKAWAY_FROM_JOB標誌。

+0

另一種方法是使用PsSetCreateProcessNotifyRoutine編寫一些內核模式代碼來實時監控所有進程創建。這在Vista和更高版本中因爲驅動程序簽名要求更麻煩,但對於XP,它可能是一個有用的選擇。 –