PsDisableImpersonation
BOOLEAN __stdcall PsDisableImpersonation(_ETHREAD *Thread, PSE_IMPERSONATION_STATE ImpersonationState){
char v2;
_ETHREAD *CurrentThread;
void *v6;
char v7;
BOOLEAN result;
struct _DMA_ADAPTER *v9;
v2 = 0;
if( (*((_DWORD *)Thread + 324) & 8) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)Thread + 1280, 0i64);
if( _interlockedbittestandreset((volatile signed __int32 *)Thread + 324, 3u) )
{
v2 = 1;
ImpersonationState->Level = *((_DWORD *)Thread + 298) & 3;
ImpersonationState->EffectiveOnly = (*((_BYTE *)Thread + 1192) & 4) != 0;
ImpersonationState->CopyOnOpen = BYTE1(*((_DWORD *)Thread + 324)) & 1;
v6 = (void *)*((_QWORD *)Thread + 183);
if( v6 )
{
ImpersonationState->Token = v6;
v9 = (struct _DMA_ADAPTER *)(*((_QWORD *)Thread + 149) & 0xFFFFFFFFFFFFFFF8ui64);
*((_QWORD *)Thread + 183) = 0i64;
HalPutDmaAdapter(v9);
}
else
{
ImpersonationState->Token = (PACCESS_TOKEN)(*((_QWORD *)Thread + 149) & 0xFFFFFFFFFFFFFFF8ui64);
}
}
v7 = _InterlockedExchangeAdd64((volatile signed __int64 *)Thread + 160, 0xFFFFFFFFFFFFFFFFui64);
if( (v7 & 2) != 0 && (v7 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)Thread + 160);
KeAbPostRelease((char *)Thread + 1280);
KeLeaveCriticalRegionThread((__int64)CurrentThread);
if( v2 )
return 1;
}
ImpersonationState->Level = SecurityAnonymous;
result = 0;
*(_WORD *)&ImpersonationState->CopyOnOpen = 0;
ImpersonationState->Token = 0i64;
return result;
}Referenced by:
CmpAddRemoveContainerToCLFSLog
CmpStartCLFSLog
NtOpenThreadTokenEx