PsSwapImpersonationToken
__int64 __fastcall PsSwapImpersonationToken(__int64 a1, struct _DMA_ADAPTER *a2, struct _DMA_ADAPTER *a3){
int v3;
struct _DMA_ADAPTER *v7;
_ETHREAD *CurrentThread;
__int64 v9;
char v10;
struct _DMA_ADAPTER *v12;
v3 = 0;
v7 = 0i64;
if( (*(_DWORD *)(a1 + 1296) & 8) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
ObfReferenceObject(a3);
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(a1 + 1280, 0i64);
if( (*(_DWORD *)(a1 + 1296) & 8) != 0 )
{
v9 = *(_QWORD *)(a1 + 1192);
if( (struct _DMA_ADAPTER *)(v9 & 0xFFFFFFFFFFFFFFF8ui64) == a2 && (*(_DWORD *)(a1 + 1296) & 0x100) != 0 )
{
v7 = *(struct _DMA_ADAPTER **)(a1 + 1464);
*(_QWORD *)(a1 + 1464) = 0i64;
*(_QWORD *)(a1 + 1192) = (unsigned __int64)a3 | v9 & 7;
_InterlockedAnd((volatile signed __int32 *)(a1 + 1296), 0xFFFFFEFF);
}
else
{
v3 = -1073741823;
}
}
else
{
v3 = -1073741700;
}
v10 = _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 1280), 0xFFFFFFFFFFFFFFFFui64);
if( (v10 & 2) != 0 && (v10 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 1280));
KeAbPostRelease((PVOID)(a1 + 1280));
KeLeaveCriticalRegionThread((__int64)CurrentThread);
if( v3 < 0 )
{
v12 = a3;
}
else
{
HalPutDmaAdapter(a2);
if( !v7 )
return(unsigned int)v3;
v12 = v7;
}
HalPutDmaAdapter(v12);
return(unsigned int)v3;
}
return 3221225596i64;
}Referenced by:
NtOpenThreadTokenEx