SepSetTokenCachedHandles
__int64 __fastcall SepSetTokenCachedHandles(_QWORD *a1, CHAR **a2, unsigned int a3, _XSTATE_FEATURE **a4){
_HANDLE *v4;
char v6;
VOID **PoolWithTag;
NTSTATUS CachedHandlesEntry;
_ETHREAD *CurrentThread;
__int64 v13;
bool v14;
_RTL_DYNAMIC_HASH_TABLE_ENTRY *v15;
char v16;
_HANDLE *v17;
char v18;
bool v20;
_RTL_DYNAMIC_HASH_TABLE_ENTRY *v21;
char v22;
v4 = 0i64;
v21 = 0i64;
v6 = 0;
v22 = 0;
if( !a3 )
goto LABEL_5;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 8i64 * a3, 1665688915i64);
v4 = (_HANDLE *)PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741801;
CachedHandlesEntry = SepReferenceCachedTokenHandles(a3, a4, (INT64)PoolWithTag);
if( CachedHandlesEntry >= 0 )
{
v6 = 1;
CachedHandlesEntry = SepValidateReferencedCachedHandles((INT64)a1, a2, a3, v4);
if( CachedHandlesEntry >= 0 )
{
LABEL_5:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v13 = a1[27] + 88i64;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v13, 0i64);
if( !*(_QWORD *)(v13 + 8) && !RtlCreateHashTable((_RTL_DYNAMIC_HASH_TABLE **)(v13 + 8), 0i64, 0i64) )
{
CachedHandlesEntry = -1073741670;
goto LABEL_27;
}
CachedHandlesEntry = SepGetCachedHandlesEntry(v13, (int *)a2, &v22, &v21);
if( CachedHandlesEntry )
{
LABEL_27:
v20 = (_InterlockedExchangeAdd64((volatile signed __int64 *)v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2;
goto LABEL_31;
}
v14 = 0;
if( *(_DWORD *)a2 )
{
if( *(_DWORD *)a2 != 1 )
{
LABEL_13:
v16 = 0;
if( !v14 )
v16 = v6;
v17 = 0i64;
v6 = v16;
if( !v14 )
v17 = v4;
v4 = v17;
v18 = _InterlockedExchangeAdd64((volatile signed __int64 *)v13, 0xFFFFFFFFFFFFFFFFui64);
if( (v18 & 2) == 0 )
goto LABEL_18;
v20 = (v18 & 4) == 0;
LABEL_31:
if( v20 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v13);
LABEL_18:
KeAbPostRelease((VOID *)v13);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
goto LABEL_19;
}
v14 = v22 == 0;
v15 = v21;
a1[144] = v21;
}
else
{
v15 = v21;
if( a3 )
v14 = LODWORD(v21[2].Linkage.Blink) == 0;
a1[136] = v21;
}
if( v14 )
{
LODWORD(v15[2].Linkage.Blink) = a3;
v15[2].Signature = (unsigned __int64)v4;
}
goto LABEL_13;
}
}
LABEL_19:
if( v4 )
{
if( v6 )
SepCloseCachedTokenHandles(a3, (VOID **)v4);
ExFreePoolWithTag(v4, 0);
}
return(unsigned int)CachedHandlesEntry;
}Referenced by:
NtCreateLowBoxToken
SepSetTokenBnoIsolation