SepSetTokenLowboxNumber
INT64 __fastcall SepSetTokenLowboxNumber(_TOKEN *Token, VOID *PackageSid){
__int64 SessionId;
VOID *v3;
char v5;
char v6;
int LowBoxNumberEntry;
__int64 *v8;
_ETHREAD *v9;
_SEP_LOWBOX_NUMBER_MAPPING *v10;
_ETHREAD *CurrentThread;
volatile signed __int64 *v13;
_ETHREAD *v14;
int TokenSessionMapEntry;
_ETHREAD *v16;
ULONG_PTR BugCheckParameter2;
VOID *v18;
_SEP_LOWBOX_NUMBER_ENTRY *MatchingEntry;
v18 = PackageSid;
SessionId = Token->SessionId;
BugCheckParameter2 = 0i64;
MatchingEntry = 0i64;
v3 = PackageSid;
v5 = 0;
v6 = 0;
LowBoxNumberEntry = 0;
if( (unsigned int)SessionId < 5 )
{
v8 = &g_SessionLowboxArray[5 * SessionId];
BugCheckParameter2 = (ULONG_PTR)v8;
LABEL_3:
if( !*((_BYTE *)v8 + 32) )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v13 = (volatile signed __int64 *)BugCheckParameter2;
ExAcquirePushLockExclusiveEx(BugCheckParameter2, 0i64);
if( !*((_BYTE *)v8 + 32) )
LowBoxNumberEntry = SepInitializeLowBoxNumberTable((INT64)v13);
if( (_InterlockedExchangeAdd64(v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)BugCheckParameter2);
KeAbPostRelease((PVOID)BugCheckParameter2);
KeLeaveCriticalRegion();
v3 = v18;
}
if( !LowBoxNumberEntry )
{
v9 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v9 + 242);
v10 = (_SEP_LOWBOX_NUMBER_MAPPING *)BugCheckParameter2;
ExAcquirePushLockExclusiveEx(BugCheckParameter2, 0i64);
LowBoxNumberEntry = SepGetLowBoxNumberEntry(v10, v3, &MatchingEntry);
if( !LowBoxNumberEntry )
Token->LowboxNumberEntry = MatchingEntry;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)BugCheckParameter2);
KeAbPostRelease((PVOID)BugCheckParameter2);
KeLeaveCriticalRegion();
}
goto LABEL_10;
}
v14 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v14 + 242);
ExAcquirePushLockSharedEx((UINT64)&LowboxSessionMapLock, 0i64);
v5 = 1;
TokenSessionMapEntry = SepGetTokenSessionMapEntry((unsigned int)SessionId, 0, (CHAR **)&BugCheckParameter2);
LowBoxNumberEntry = TokenSessionMapEntry;
if( TokenSessionMapEntry >= 0 )
goto LABEL_24;
if( TokenSessionMapEntry == -1073741275 )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)&LowboxSessionMapLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&LowboxSessionMapLock);
KeAbPostRelease(&LowboxSessionMapLock);
KeLeaveCriticalRegion();
v16 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v16 + 242);
ExAcquirePushLockExclusiveEx((UINT64)&LowboxSessionMapLock, 0i64);
v6 = 1;
v5 = 0;
LowBoxNumberEntry = SepGetTokenSessionMapEntry((unsigned int)SessionId, 1, (CHAR **)&BugCheckParameter2);
}
if( LowBoxNumberEntry >= 0 )
{
LABEL_24:
v8 = (__int64 *)BugCheckParameter2;
goto LABEL_3;
}
LABEL_10:
if( v6 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&LowboxSessionMapLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&LowboxSessionMapLock);
goto LABEL_29;
}
if( v5 )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)&LowboxSessionMapLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&LowboxSessionMapLock);
LABEL_29:
KeAbPostRelease(&LowboxSessionMapLock);
KeLeaveCriticalRegion();
}
return(unsigned int)LowBoxNumberEntry;
}Referenced by:
NtCreateLowBoxToken
SeExchangePrimaryToken
SeSetSessionIdToken
SeSubProcessToken
SepGetAnonymousToken