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

Kernel 如何在Windows下以内核模式生成PID(进程标识符)?,kernel,pid,Kernel,Pid,我想知道进程标识符(也称为PID)是如何在Windows下生成的。它在不同的机器上是唯一的吗?例如,考虑当前分配给我的Firefox程序的5856 ID。另一台机器下的同一可执行映像是否相同?进程标识符在不同的机器上不是唯一的。它们可以在同一台机器上为以后的进程重用,并且在同一可执行文件的两次调用之间通常不相同 您不必关心它是如何生成的-您唯一可以确定的是,流程标识符唯一标识一个正在运行的流程,也就是说,在任何时候都只有一个进程具有该标识符。生成PIDs通常是一个秘密,Microsoft不会正式

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

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


您不必关心它是如何生成的-您唯一可以确定的是,流程标识符唯一标识一个正在运行的流程,也就是说,在任何时候都只有一个进程具有该标识符。

生成PIDs通常是一个秘密,Microsoft不会正式记录它,因为一旦记录了它,他们就必须坚持该实现。然而,它总是4的倍数-但这不是一个你应该依赖的行为。它们不是唯一的,可以重复使用


Raymond Chen在他的文章中提到了这一点。

进程、线程和内核句柄ID来自一个公共例程。从技术上讲,这是一个DWORD,虽然我不记得上一次在65536以上看到它们是什么时候了。它们可以重用,这只是一种基于计数器的机制。

进程作为内核中的对象进行维护,因此,通过句柄以与系统中其他所有对象(即事件、互斥体、信号量、计时器等)相同的方式导出到用户模式

因此,流程ID实际上只是流程对象的句柄,它们保存在全局句柄表(作为实现细节,PspCidTable)中。有趣的是,线程也作为对象进行维护,并插入到这个表中。线程ID实际上只是线程对象的句柄


-scott

嗯,你知道它是根据什么生成的吗?不,这没有文档记录,可能会在Windows版本、service Pack或更新之间发生变化,或者取决于一天中的时间或月亮的相位。:)这篇文章内容丰富,特别是“月相”部分:)欢迎您!:)好吧,更严肃地说,我只是想指出,你根本不能依赖任何特定的行为。你可以试着发布另一个问题,说明你正在努力完成的目标-可能会有一些帮助,但由于副作用,它们只是4的倍数;这不是故意的,理论上可能会改变。是的,这正是雷蒙德在他的博客中指出的。我将更新我的答案以澄清问题。我曾经在Windows10上看到过这样的进程,有一些6位数的PID。但这是罕见的。