ядро Windows использует подсчет ссылок на объекты.TOKEN
тоже объект.когда вы назначаете токен потоку (через SetThreadToken
), указатель на объект TOKEN
сохраняется в объекте ETHREAD
и дополнительная ссылка добавляется к объекту TOKEN
.Конечно, ядро не может полагаться на то, что вы закрываете или не используете оригинальный дескриптор (ссылку) на объект TOKEN
.это общее правило подсчета указателей - если A
хранит указатель на B
в себе - оно добавляет ссылку на B
, поскольку оно будет действительным до A
использования B
.токен будет действителен до тех пор, пока ваш поток не выдаст себя за другого токена, не прекратит олицетворение или не завершит работу.в любом случае, после того, как вы назначите токен потоку, вы можете закрыть его дескриптор - токен останется действительным
, если существует интерес, как внутреннее SetThreadToken
работает:
SetThreadToken
вызов NtSetInformationThread
с ThreadImpersonationToken
информационным классом.со стороны ядра реализация называется PsAssignImpersonationToken
- этот API объявлен в ntifs.h .это реализация вызов PsImpersonateClient
который и ссылка переданный токен.в результате он становится действительным и используется назначенным потоку
Серверный поток уже может выдавать себя за клиента, когда вызывается PsImpersonateClient.Если это так, то счетчик ссылок на токене, представляющем этого клиента, уменьшается.
, но в любом случае - нам не нужны эти внутренние знания - нужны общие мысли - понимают - объект подсчет ссылок .если указатель на токен сохранен в потоке - этот токен должен быть действительным до тех пор, пока не будет использован потоком.в результате он ссылался.когда поток перестает использовать этот токен (изменить указатель или выйти) - разыменованный токен