当主线程模拟客户端时,我的代码创建一个线程,并使用SetThreadToken为它分配模拟令牌。然后主线程关闭令牌。
具体来说,主线程是这样做的:
LogonUser获取主令牌。DuplicateToken从主令牌获取模拟令牌。ImpersonateLoggedOnUser。SetThreadToken。RevertToSelf。CloseHandle。此时,辅助线程仍在运行。即使令牌句柄已在主线程中关闭,模拟令牌是否仍可用于辅助线程?
发布于 2018-10-17 08:52:08
windows内核使用对对象的引用计数。TOKEN也是对象。当您将令牌分配给线程(通过SetThreadToken)时,指向TOKEN对象的指针存储在ETHREAD对象和添加到TOKEN对象的附加引用中。当然,内核不能依赖于关闭您或不依赖于TOKEN对象的原始句柄(引用)。这是一般的指针计数规则--如果A将指向B的指针存储在self中--它会添加对B的引用,因为它将在A使用B之前有效。该令牌将有效,直到您的线程不模拟另一个令牌,或结束模拟或退出。无论如何,在将令牌分配给线程之后,您可以关闭它的句柄-令牌仍然有效。
如果存在兴趣,内部SetThreadToken是如何工作的:
SetThreadToken使用ThreadImpersonationToken信息类调用NtSetInformationThread。在内核端,实现调用PsAssignImpersonationToken -这个api在ntifs.h中声明。它是实现 打电话 PsImpersonateClient和reference传递的令牌。因此,它成为分配给线程的有效的util。
当调用PsImpersonateClient时,服务器线程可能已经在模拟客户端。如果是这样的话,表示该客户端的令牌上的引用计数就会减少。
但是无论如何--我们不需要这种内部知识--需要一般的思考理解--对象引用计数。如果指向线程中保存的令牌的指针--当然,这个令牌必须有效,直到线程使用为止。因此,它引用了。当线程停止使用此令牌时(更改指针或退出)-取消引用令牌
https://stackoverflow.com/questions/52850203
复制相似问题