系统内出现相同的PID ???
 

作者:陆麟
转载请征得作者同意.
2003.9.3


一直以来, 我一直认为OS在系统范围内部维护PID/TID的清单. PID/CID不可能出现重复, 这也是很多KERNEL MODE UTILITY赖以实现的基础. 但是, 今天, 这条金科玉律被打破了. PID是可以重复的.

错误的观点来自与错误的流程理解. PROCESS在内核是以EPROCESS识别的. 进程创建时刻, PID/TID什么的均是不存在的. 其次, 进程结束, 并不意味着EPROCESS的销毁. EPROCESS销毁的时刻为所有的PROCESS HANDLE都关闭后. PID的来源是CSRSS, CSRSS负责分配PID/TID. 这下可糟糕了. 假定有一个进程, 创建了1个子进程. 然后字进程结束, 父进程没有关闭进程句柄. 这样一个流程会导致僵尸进程的存在, 而CSRSS并不知道EPROCESS的存在与否. 因此, 仍然按照自己的算法分配PID/TID. 这样, 同样的PID就可能出现在系统范围内部.

依赖与PID运作的代码可要仔细考虑一下流程是否有可能出现问题了.

使我醒悟的只言片语, 来自NEWSGROUP, 虽然我没有参与那个THREAD, 但是人家的言语始终可能会有帮助. 发言的是Ivan Brugiolo, 来自MICROSOFT.
The NtQuerySystemInformation call for system processes is not transacted with process creation. You can have a handle for the process signaled when it's dead, but the EPROCESS object has not been yet removed from the list kept in kernel mode. It would be removed when the last reference to the handle is closed. This can cause the so called 'zombie process' to staty around with some parent-pid or the same pid that has been reused. Since CLIENT_ID are allocated by  csrss.exe, this can happen.