2012-11-16 58 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,它可能是一个有用的选择。 –