PsSwapImpersonationToken
NTSTATUS __stdcall PsSwapImpersonationToken(_ETHREAD *Thread, VOID *OldToken, VOID *NewToken){
NTSTATUS v3;
_ADAPTER_OBJECT *AdjustedClientToken;
_ETHREAD *CurrentThread;
_PS_CLIENT_SECURITY_CONTEXT v9;
char v10;
_ADAPTER_OBJECT *v12;
v3 = 0;
AdjustedClientToken = 0i64;
if( (Thread->CrossThreadFlags & 8) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
ObfReferenceObject(NewToken);
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&Thread->ThreadLock, 0i64);
if( (Thread->CrossThreadFlags & 8) != 0 )
{
v9.ImpersonationData = (unsigned __int64)Thread->ClientSecurity;
if( (VOID *)(v9.ImpersonationData & 0xFFFFFFFFFFFFFFF8ui64) == OldToken
&& (Thread->CrossThreadFlags & 0x100) != 0 )
{
AdjustedClientToken = (_ADAPTER_OBJECT *)Thread->AdjustedClientToken;
Thread->AdjustedClientToken = 0i64;
Thread->ClientSecurity.ImpersonationData = (unsigned __int64)NewToken | v9._bf_0 & 7;
_InterlockedAnd((volatile signed __int32 *)&Thread->1296, 0xFFFFFEFF);
}
else
{
v3 = -1073741823;
}
}
else
{
v3 = -1073741700;
}
v10 = _InterlockedExchangeAdd64(&Thread->ThreadLock._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v10 & 2) != 0 && (v10 & 4) == 0 )
ExfTryToWakePushLock(&Thread->ThreadLock);
KeAbPostRelease(&Thread->ThreadLock);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
if( v3 < 0 )
{
v12 = (_ADAPTER_OBJECT *)NewToken;
}
else
{
HalPutDmaAdapter((PADAPTER_OBJECT)OldToken);
if( !AdjustedClientToken )
return v3;
v12 = AdjustedClientToken;
}
HalPutDmaAdapter(v12);
return v3;
}
return -1073741700;
}Referenced by:
NtOpenThreadTokenEx