SepDereferenceLowBoxNumberEntry
NTSTATUS __stdcall SepDereferenceLowBoxNumberEntry(UINT64 SessionId, PVOID P){
unsigned int v2;
NTSTATUS TokenSessionMapEntry;
_ETHREAD *v5;
__int64 v6;
ULONG_PTR v8;
UINT8 v9;
void *v10;
_ETHREAD *CurrentThread;
ULONG_PTR BugCheckParameter2;
v2 = SessionId;
BugCheckParameter2 = 0i64;
TokenSessionMapEntry = 0;
if( (unsigned int)SessionId >= 5 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&LowboxSessionMapLock, 0i64);
TokenSessionMapEntry = SepGetTokenSessionMapEntry(v2, 0, (CHAR **)&BugCheckParameter2);
if( _InterlockedCompareExchange64((volatile signed __int64 *)&LowboxSessionMapLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&LowboxSessionMapLock);
KeAbPostRelease(&LowboxSessionMapLock);
KeLeaveCriticalRegion();
}
else
{
BugCheckParameter2 = (ULONG_PTR)&g_SessionLowboxArray[5 * (unsigned int)SessionId];
}
v5 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v5 + 242);
ExAcquirePushLockExclusiveEx(BugCheckParameter2, 0i64);
v6 = _InterlockedDecrement64((volatile signed __int64 *)P + 3);
if( v6 <= 0 )
{
if( v6 )
__fastfail(0xEu);
v8 = BugCheckParameter2;
v9 = RtlRemoveEntryHashTable(
*(RTL_DYNAMIC_HASH_TABLE **)(BugCheckParameter2 + 24),
(RTL_DYNAMIC_HASH_TABLE_ENTRY *)P,
0i64);
if( v9 )
_bittestandreset(*(signed __int32 **)(v8 + 16), *((_DWORD *)P + 10) - 1);
else
TokenSessionMapEntry = -1073741823;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)BugCheckParameter2);
KeAbPostRelease((PVOID)BugCheckParameter2);
KeLeaveCriticalRegion();
if( v9 )
{
v10 = (void *)*((_QWORD *)P + 6);
if( v10 )
{
ExRemoveLowBoxAtomReferences(v10, *((unsigned int *)P + 10));
RtlDereferenceAtomTable(*((PVOID *)P + 6));
ExFreePoolWithTag(P, 0);
}
}
return TokenSessionMapEntry;
}
else
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)BugCheckParameter2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)BugCheckParameter2);
KeAbPostRelease((PVOID)BugCheckParameter2);
KeLeaveCriticalRegion();
return 0;
}
}Referenced by:
NtSetInformationToken
SeExchangePrimaryToken
SeSetSessionIdToken
SeSubProcessToken
SepTokenDeleteMethod