在Windows内核模式下,如何生成PID (进程标识符)?

10

我想知道在Windows下如何生成进程标识符(即PID)。它在不同的机器上是唯一的吗?例如,考虑当前分配给我的Firefox程序的5856 ID。在另一台机器上,对于相同的可执行文件镜像,它是否相同?

4个回答

6

PIDs生成通常是微软不会正式记录的机密 - 因为一旦他们记录了,就必须坚持这种实现方式。但是,它总是4的倍数 - 但这不是您应该依赖的行为。它们并不唯一,也可以被重复使用。

Raymond Chen在他的 博客 中提到了这一点。


它们只是4的倍数,这是一个副作用;这不是设计上的,理论上可以改变。 - Joe
是的 - 这正是 Raymond 在他的博客中指出的。我会更新我的答案以澄清。 - vcsjones

3

进程标识符在不同的机器上并不唯一。它们可以在同一台机器上被重复使用,通常在同一可执行文件的两次调用之间也不会相同。

您不需要关心如何生成它 - 您唯一可以确定的是进程标识符唯一地标识单个正在运行的进程,即任何时候都只有一个具有该标识符的进程。


2
你知道它是基于什么生成的吗? - J. Rattz
2
不,这并没有记录下来,并且可能会因为Windows版本、服务包、更新或者时间、月相的变化而发生改变。 :) - villintehaspam
1
这真是非常有启发性的,特别是“月相”部分 :) - J. Rattz
不客气! :) 好的,更认真地说,我只是想指出你不能仅仅依赖于任何特定的行为。你可以尝试发布另一个问题,说明你想要完成什么 - 可能会有一些帮助来实现它。 - villintehaspam

2

进程、线程和内核句柄 ID 来自一个公共例程。技术上,这是一个 DWORD,但我不记得上次看到它们超过 65,536。它们可以被重复使用,并且只是计数器机制。


我曾经在Windows 10上看到过这样的进程,带有一些6位数字的PID。但这很少见。 - Paul Stelian

2

进程在内核中作为对象进行维护,因此可以通过句柄(HANDLE)与系统中的其他对象(如事件、互斥量、信号量、计时器等)一样导出到用户模式。

因此,进程ID实际上只是指向进程对象的句柄,这些句柄存储于全局句柄表中(PspCidTable,作为实现细节)。有趣的是,线程也被视为对象并插入到该表中。因此,线程ID实际上只是指向线程对象的句柄。

-scott


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接