SepSetTokenCachedHandles
INT64 __fastcall SepSetTokenCachedHandles(_QWORD *a1, CHAR **a2, UINT64 a3, PVOID *a4){
HANDLE *v4;
unsigned int v5;
char v6;
HANDLE *PoolWithTag;
int CachedHandlesEntry;
_ETHREAD *CurrentThread;
__int64 v13;
bool v14;
__int64 v15;
char v16;
HANDLE *v17;
char v18;
bool v20;
_QWORD a4a[7];
char a3a;
v4 = 0i64;
v5 = a3;
a4a[0] = 0i64;
v6 = 0;
a3a = 0;
if( !(_DWORD)a3 )
goto LABEL_5;
PoolWithTag = (HANDLE *)ExAllocatePoolWithTag(PagedPool, 8i64 * (unsigned int)a3, 0x63486553ui64);
v4 = PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741801;
CachedHandlesEntry = SepReferenceCachedTokenHandles(v5, a4, (INT64)PoolWithTag);
if( CachedHandlesEntry >= 0 )
{
v6 = 1;
CachedHandlesEntry = SepValidateReferencedCachedHandles((INT64)a1, a2, v5, v4);
if( CachedHandlesEntry >= 0 )
{
LABEL_5:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v13 = a1[27] + 88i64;
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(v13, 0i64);
if( !*(_QWORD *)(v13 + 8) && !RtlCreateHashTable((RTL_DYNAMIC_HASH_TABLE **)(v13 + 8), 0i64, 0i64) )
{
CachedHandlesEntry = -1073741670;
goto LABEL_27;
}
CachedHandlesEntry = SepGetCachedHandlesEntry(v13, (INT64 *)a2, &a3a, a4a);
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((volatile INT64 *)v13);
LABEL_18:
KeAbPostRelease((PVOID)v13);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
goto LABEL_19;
}
v14 = a3a == 0;
v15 = a4a[0];
a1[144] = a4a[0];
}
else
{
v15 = a4a[0];
if( v5 )
v14 = *(_DWORD *)(a4a[0] + 56i64) == 0;
a1[136] = a4a[0];
}
if( v14 )
{
*(_DWORD *)(v15 + 56) = v5;
*(_QWORD *)(v15 + 64) = v4;
}
goto LABEL_13;
}
}
LABEL_19:
if( v4 )
{
if( v6 )
SepCloseCachedTokenHandles(v5, v4);
ExFreePoolWithTag(v4, 0);
}
return(unsigned int)CachedHandlesEntry;
}Referenced by:
NtCreateLowBoxToken
SepSetTokenBnoIsolation