SepDereferenceLowBoxNumberEntry
NTSTATUS __stdcall SepDereferenceLowBoxNumberEntry(UINT64 SessionId, PVOID P){
unsigned int v2;
NTSTATUS TokenSessionMapEntry;
_ETHREAD *v5;
__int64 v6;
_EX_PUSH_LOCK *v8;
UINT8 v9;
VOID *v10;
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *PushLock;
v2 = SessionId;
PushLock = 0i64;
TokenSessionMapEntry = 0;
if( (unsigned int)SessionId >= 5 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx(&stru_140C25D50, 0i64);
TokenSessionMapEntry = SepGetTokenSessionMapEntry(v2, 0, (_SEP_LOWBOX_NUMBER_MAPPING **)&PushLock);
if( _InterlockedCompareExchange64(&stru_140C25D50._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&stru_140C25D50);
KeAbPostRelease(&stru_140C25D50);
KeLeaveCriticalRegion();
}
else
{
PushLock = (_EX_PUSH_LOCK *)((char *)&unk_140C25C80 + 40 * (unsigned int)SessionId);
}
v5 = (_ETHREAD *)KeGetCurrentThread();
--v5->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(PushLock, 0i64);
v6 = _InterlockedDecrement64((volatile signed __int64 *)P + 3);
if( v6 <= 0 )
{
if( v6 )
__fastfail(0xEu);
v8 = PushLock;
v9 = RtlRemoveEntryHashTable((_RTL_DYNAMIC_HASH_TABLE *)PushLock[3]._bf_0, (_RTL_DYNAMIC_HASH_TABLE_ENTRY *)P, 0i64);
if( v9 )
_bittestandreset((signed __int32 *)v8[2]._bf_0, *((_DWORD *)P + 10) - 1);
else
TokenSessionMapEntry = -1073741823;
if( (_InterlockedExchangeAdd64(&v8->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(PushLock);
KeAbPostRelease(PushLock);
KeLeaveCriticalRegion();
if( v9 )
{
v10 = (VOID *)*((_QWORD *)P + 6);
if( v10 )
{
ExRemoveLowBoxAtomReferences(v10, *((unsigned int *)P + 10));
RtlDereferenceAtomTable(*((VOID **)P + 6));
ExFreePoolWithTag(P, 0);
}
}
return TokenSessionMapEntry;
}
else
{
if( (_InterlockedExchangeAdd64(&PushLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(PushLock);
KeAbPostRelease(PushLock);
KeLeaveCriticalRegion();
return 0;
}
}Referenced by:
NtSetInformationToken
SeExchangePrimaryToken
SeSetSessionIdToken
SeSubProcessToken
SepTokenDeleteMethod