SeSetSessionIdToken
NTSTATUS __stdcall SeSetSessionIdToken(PVOID Token, UINT64 SessionId){
NTSTATUS v2;
struct _DMA_ADAPTER *v3;
unsigned int v4;
struct _DMA_ADAPTER *v6;
_ETHREAD *CurrentThread;
bool v8;
void *v10;
signed __int32 v11[8];
PADAPTER_OBJECT DmaAdapter;
v2 = 0;
v3 = 0i64;
DmaAdapter = 0i64;
v4 = SessionId;
if( !SeTokenDoesNotTrackSessionObject )
{
LODWORD(v6) = MmGetSessionObjectById((unsigned int)SessionId);
v3 = v6;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(*((ERESOURCE **)Token + 6), 1u);
_InterlockedOr(v11, 0);
if( *((_BYTE *)Token + 204) )
{
v2 = -1073741525;
}
else
{
if( (*((_DWORD *)Token + 50) & 0x4000) != 0 )
{
v10 = (void *)*((_QWORD *)Token + 135);
if( v10 )
{
SepDereferenceLowBoxNumberEntry(*((unsigned int *)Token + 30), v10);
*((_QWORD *)Token + 135) = 0i64;
}
}
if( *((_DWORD *)Token + 30) != v4 )
{
SepSetTokenSessionById((INT64)Token, v4, 1, (INT64)v3, &DmaAdapter);
v3 = 0i64;
}
v8 = (*((_DWORD *)Token + 50) & 0x4000) == 0;
*((_DWORD *)Token + 30) = v4;
if( !v8 )
v2 = SepSetTokenLowboxNumber((_TOKEN *)Token, *((VOID **)Token + 98));
}
_InterlockedOr(v11, 0);
ExReleaseResourceLite(*((PERESOURCE *)Token + 6));
KeLeaveCriticalRegion();
if( v3 )
HalPutDmaAdapter(v3);
if( DmaAdapter )
HalPutDmaAdapter(DmaAdapter);
return v2;
}Referenced by:
NtSetInformationToken
SeSetSessionIdTokenWithLinked
SepCopyAnonymousTokenAndSetSilo
SepCopyClientTokenAndSetSilo