您好我已经四处寻找这个问题的答案了,我想知道是否有任何有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中的经验观察让我相信上述情况仍然存在。
答案 0 :(得分:3)
线程和进程ID来自所有版本的Windows AFAIK中的同一个池,但这并不意味着这将永远是真的。在实践中它完全没关系,因为你只应该将你知道的线程id的东西传递给OpenThread,反之亦然。
不要假设other things关于这些ID(它们不是16位,它们可能看起来像是在NT上但是有可能获得ID> 0xffff(在Win9x上它们与xor'ed一起使用)秘密并经常使用完整的32位))
你应该记住的唯一奇怪的事情是,在64位系统上,它们在用户模式下是32位,在内核模式下是指针大小(使用HandleToUlong / UlongToHandle)