0

嗨,我四处寻找这个问题的答案,我想知道是否有任何有 Windows 内部经验的人知道内核是否会分配与线程 ID 相同的进程 ID。我的意思是说我已经启动了一个进程 a.exe,它有一个 id 为 123 的线程。如果启动另一个进程,例如 b.exe,进程 id 会是 123 吗?换句话说,进程和线程标识符是否曾经发生冲突?谢谢

编辑:似乎进程和线程 id 来自名为 PspCidTable 的同一个池。一位名叫 Polynomial 的黑客审查了 windows nt 源代码,他说:

内核需要能够生成一系列在整个系统中唯一的进程和线程 ID。为了有效和安全地做到这一点,内核创建了一个可用于进程和线程的 ID 池。这个池在内核中被导出为一个名为 PspCidTable 的 HANDLE_TABLE 对象。在系统 Phase0 启动过程中,会调用 PspInitPhase0 函数。此函数使用 ExCreateHandleTable 创建一个 HANDLE_TABLE 对象,它会自动用 65536 个整体填充表。每个条目都是一个 16 位无符号整数(至少在 32 位操作系统上),存储在作为双向链表一部分的列表项对象中。进程 ID 和线程 ID 都来自 PspCidTable 池。

以上来源:你(可能)不了解 Windows 的东西

PspCidTable仍然存在于 Windows XP中,Windows 7 中的经验观察使我相信上述情况仍然正确。

4

1 回答 1

3

在所有版本的 Windows AFAIK 中,线程和进程 id 都来自同一个池,但这并不意味着这将永远正确。实际上,这根本不重要,因为您应该只将您知道是线程 id 的东西传递给 OpenThread,反之亦然。

也不要假设关于这些 id 的其他事情(它们不是 16 位,它们可能看起来像在 NT 上,但可以获得 > 0xffff 的 ids(在 Win9x 上,它们与秘密异或并经常使用完整的32 位))

您应该记住的唯一奇怪的事情是,在 64 位系统上,它们在用户模式下是 32 位,在内核模式下是指针大小(使用 HandleToUlong/UlongToHandle)

于 2011-10-11T19:25:04.470 回答