SepSetTokenLowboxNumber
NTSTATUS __stdcall SepSetTokenLowboxNumber(_TOKEN *Token, VOID *PackageSid){
__int64 SessionId;
VOID *v3;
char v5;
char v6;
int LowBoxNumberEntry;
_EX_PUSH_LOCK *v8;
_ETHREAD *v9;
_SEP_LOWBOX_NUMBER_MAPPING *v10;
_ETHREAD *CurrentThread;
_SEP_LOWBOX_NUMBER_MAPPING *v13;
_ETHREAD *v14;
NTSTATUS TokenSessionMapEntry;
_ETHREAD *v16;
_EX_PUSH_LOCK *PushLock;
VOID *v18;
_SEP_LOWBOX_NUMBER_ENTRY *MatchingEntry;
v18 = PackageSid;
SessionId = Token->SessionId;
PushLock = 0i64;
MatchingEntry = 0i64;
v3 = PackageSid;
v5 = 0;
v6 = 0;
LowBoxNumberEntry = 0;
if( (unsigned int)SessionId < 5 )
{
v8 = (_EX_PUSH_LOCK *)((char *)&unk_140C25C80 + 40 * SessionId);
PushLock = v8;
LABEL_3:
if( !LOBYTE(v8[4]._bf_0) )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v13 = (_SEP_LOWBOX_NUMBER_MAPPING *)PushLock;
ExAcquirePushLockExclusiveEx(PushLock, 0i64);
if( !LOBYTE(v8[4]._bf_0) )
LowBoxNumberEntry = SepInitializeLowBoxNumberTable(v13);
if( (_InterlockedExchangeAdd64(&v13->Lock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(PushLock);
KeAbPostRelease(PushLock);
KeLeaveCriticalRegion();
v3 = v18;
}
if( !LowBoxNumberEntry )
{
v9 = (_ETHREAD *)KeGetCurrentThread();
--v9->Tcb.KernelApcDisable;
v10 = (_SEP_LOWBOX_NUMBER_MAPPING *)PushLock;
ExAcquirePushLockExclusiveEx(PushLock, 0i64);
LowBoxNumberEntry = SepGetLowBoxNumberEntry(v10, v3, &MatchingEntry);
if( !LowBoxNumberEntry )
Token->LowboxNumberEntry = MatchingEntry;
if( (_InterlockedExchangeAdd64(&v10->Lock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(PushLock);
KeAbPostRelease(PushLock);
KeLeaveCriticalRegion();
}
goto LABEL_10;
}
v14 = (_ETHREAD *)KeGetCurrentThread();
--v14->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx(&stru_140C25D50, 0i64);
v5 = 1;
TokenSessionMapEntry = SepGetTokenSessionMapEntry(
(unsigned int)SessionId,
0,
(_SEP_LOWBOX_NUMBER_MAPPING **)&PushLock);
LowBoxNumberEntry = TokenSessionMapEntry;
if( TokenSessionMapEntry >= 0 )
goto LABEL_24;
if( TokenSessionMapEntry == -1073741275 )
{
if( _InterlockedCompareExchange64(&stru_140C25D50._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&stru_140C25D50);
KeAbPostRelease(&stru_140C25D50);
KeLeaveCriticalRegion();
v16 = (_ETHREAD *)KeGetCurrentThread();
--v16->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&stru_140C25D50, 0i64);
v6 = 1;
v5 = 0;
LowBoxNumberEntry = SepGetTokenSessionMapEntry(
(unsigned int)SessionId,
1u,
(_SEP_LOWBOX_NUMBER_MAPPING **)&PushLock);
}
if( LowBoxNumberEntry >= 0 )
{
LABEL_24:
v8 = PushLock;
goto LABEL_3;
}
LABEL_10:
if( v6 )
{
if( (_InterlockedExchangeAdd64(&stru_140C25D50._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C25D50);
goto LABEL_29;
}
if( v5 )
{
if( _InterlockedCompareExchange64(&stru_140C25D50._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&stru_140C25D50);
LABEL_29:
KeAbPostRelease(&stru_140C25D50);
KeLeaveCriticalRegion();
}
return LowBoxNumberEntry;
}Referenced by:
NtCreateLowBoxToken
SeExchangePrimaryToken
SeSetSessionIdToken
SeSubProcessToken
SepGetAnonymousToken