SeExchangePrimaryToken
INT64 __stdcall SeExchangePrimaryToken(_EPROCESS *Process, PVOID NewAccessToken, PVOID *OldAccessToken){
bool v4;
struct _DMA_ADAPTER *v7;
unsigned int SessionId;
unsigned int v9;
_ETHREAD *CurrentThread;
unsigned int v11;
int v12;
UINT64 v13;
UINT64 v14;
_ETHREAD *v15;
INT64 result;
struct _DMA_ADAPTER *v17;
struct _DMA_ADAPTER *v18;
UINT64 v19;
VOID *v20;
signed __int32 v21[8];
char v22;
PADAPTER_OBJECT DmaAdapter;
v4 = *((_DWORD *)NewAccessToken + 48) == 1;
DmaAdapter = 0i64;
v7 = 0i64;
v22 = 0;
if( !v4 )
return 3221225640i64;
SessionId = MmGetSessionIdEx((INT64)Process);
if( SessionId != -1 && !SeTokenDoesNotTrackSessionObject )
{
LODWORD(v17) = MmGetSessionObjectById(SessionId);
v7 = v17;
}
v9 = MmGetSessionId((__int64)Process);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v11 = v9;
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(*((ERESOURCE **)NewAccessToken + 6), 1u);
_InterlockedOr(v21, 0);
if( *((_BYTE *)NewAccessToken + 204) )
{
_InterlockedOr(v21, 0);
ExReleaseResourceLite(*((PERESOURCE *)NewAccessToken + 6));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v7 )
HalPutDmaAdapter(v7);
return 3221225771i64;
}
else
{
*((_BYTE *)NewAccessToken + 204) = 1;
v12 = SepSetTrustLevelForProcessToken((__int64)NewAccessToken, (__int64)Process, &v22);
if( v12 < 0 )
{
_InterlockedOr(v21, 0);
ExReleaseResourceLite(*((PERESOURCE *)NewAccessToken + 6));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( !v7 )
return(unsigned int)v12;
v18 = v7;
LABEL_21:
HalPutDmaAdapter(v18);
return(unsigned int)v12;
}
if( (*((_DWORD *)NewAccessToken + 50) & 0x4000) != 0 )
{
v19 = *((unsigned int *)NewAccessToken + 30);
if( (_DWORD)v19 != v11 )
{
SepDereferenceLowBoxNumberEntry(v19, *((PVOID *)NewAccessToken + 135));
*((_QWORD *)NewAccessToken + 135) = 0i64;
SepSetTokenSessionById((INT64)NewAccessToken, v11, 1, (INT64)v7, &DmaAdapter);
v20 = (VOID *)*((_QWORD *)NewAccessToken + 98);
*((_DWORD *)NewAccessToken + 30) = v11;
v12 = SepSetTokenLowboxNumber((_TOKEN *)NewAccessToken, v20);
if( v12 < 0 )
{
_InterlockedOr(v21, 0);
ExReleaseResourceLite(*((PERESOURCE *)NewAccessToken + 6));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v18 = DmaAdapter;
if( !DmaAdapter )
return(unsigned int)v12;
goto LABEL_21;
}
}
}
SepSetTokenSessionById((INT64)NewAccessToken, v11, 1, (INT64)v7, &DmaAdapter);
*((_DWORD *)NewAccessToken + 30) = v11;
_InterlockedOr(v21, 0);
ExReleaseResourceLite(*((PERESOURCE *)NewAccessToken + 6));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( DmaAdapter )
HalPutDmaAdapter(DmaAdapter);
if( (unsigned __int8)SeAuditingWithTokenForSubcategory(0x85ui64, 0i64) )
SepAuditAssignPrimaryToken(Process, NewAccessToken);
ObfReferenceObject(NewAccessToken);
v14 = ObFastReplaceObject((_EX_FAST_REF *)Process + 151, NewAccessToken, v13);
if( v14 )
{
v15 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v15 + 242);
ExAcquireResourceExclusiveLite(*(ERESOURCE **)(v14 + 48), 1u);
_InterlockedOr(v21, 0);
*(_BYTE *)(v14 + 204) = 0;
_InterlockedOr(v21, 0);
ExReleaseResourceLite(*(PERESOURCE *)(v14 + 48));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
result = 0i64;
*OldAccessToken = (PVOID)v14;
}
else
{
return 3221225596i64;
}
}
return result;
}Referenced by:
PspAssignPrimaryToken