windows-kernel - 线程ID是否可以与进程ID相同?

时间:2011-10-11 19:01:01

标签: windows winapi windows-7 kernel sysinternals

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

编辑:进程和线程ID似乎来自名为PspCidTable的同一个池。一位名叫Polynomial的黑客回顾了windows nt的消息来源:

  

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

以上来源:Stuff you (probably) didn't know about Windows

PspCidTable still exists in Windows XP和Windows 7中的经验观察让我相信上述情况仍然存在。

1 个答案:

答案 0 :(得分:3)

线程和进程ID来自所有版本的Windows AFAIK中的同一个池,但这并不意味着这将永远是真的。在实践中它完全没关系,因为你只应该将你知道的线程id的东西传递给OpenThread,反之亦然。

不要假设other things关于这些ID(它们不是16位,它们可能看起来像是在NT上但是有可能获得ID> 0xffff(在Win9x上它们与xor'ed一起使用)秘密并经常使用完整的32位))

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