SeRmReferenceFindCapName
NTSTATUS __stdcall SeRmReferenceFindCapName(VOID *CapID, UINT64 *CapeCount, _UNICODE_STRING **CapeNames, INT64 a4){
int v4;
_RTL_DYNAMIC_HASH_TABLE_ENTRY *v6;
unsigned int v7;
VOID **PoolWithTag;
int v10;
NTSTATUS Cap;
__int64 Blink_high;
unsigned __int64 *p_Signature;
__int64 v14;
unsigned __int16 *v15;
unsigned int v16;
unsigned int v17;
VOID **i;
__int64 v19;
unsigned __int16 v20;
NTSTATUS result;
VOID *v22;
_RTL_DYNAMIC_HASH_TABLE_ENTRY *a2;
_UNICODE_STRING **v24;
v24 = CapeNames;
v22 = CapID;
v4 = 0;
a2 = 0i64;
v6 = 0i64;
v7 = 0;
PoolWithTag = 0i64;
v10 = SepValidateCAPIDs((INT64)CapID, &v22);
if( v10 >= 0 )
{
Cap = SepRmReferenceFindCap(CapID, (_SEP_CENTRALIZED_ACCESS_POLICY **)&a2);
v6 = a2;
v10 = Cap;
if( Cap >= 0 )
{
Blink_high = HIDWORD(a2[2].Linkage.Blink);
if( (_DWORD)Blink_high )
{
p_Signature = &a2[2].Signature;
v14 = (unsigned int)Blink_high;
do
{
v15 = (unsigned __int16 *)*p_Signature++;
v16 = *v15;
if( v16 <= 2 )
v16 = 0;
v7 += v16;
--v14;
}
while( v14 );
}
PoolWithTag = ExAllocatePoolWithTag(1ui64, v7 + 16 * Blink_high, 1884513619i64);
if( PoolWithTag )
{
v17 = 0;
for( i = &PoolWithTag[2 * HIDWORD(v6[2].Linkage.Blink)];
v17 < HIDWORD(v6[2].Linkage.Blink);
i = (VOID **)((char *)i + 2 * ((unsigned __int64)LOWORD(PoolWithTag[v19]) >> 1)) )
{
v19 = 2i64 * v17;
PoolWithTag[2 * v17 + 1] = i;
v20 = **((_WORD **)&v6[2].Signature + v17);
if( v20 <= 2u )
v20 = 0;
WORD1(PoolWithTag[2 * v17]) = v20;
LOWORD(PoolWithTag[2 * v17]) = v20;
memmove(i, *(const VOID **)(*(&v6[2].Signature + v17++) + 8), v20);
}
}
else
{
v10 = -1073741801;
}
}
}
*v24 = (_UNICODE_STRING *)PoolWithTag;
if( v6 )
v4 = HIDWORD(v6[2].Linkage.Blink);
result = v10;
*(_DWORD *)CapeCount = v4;
return result;
}Referenced by:
AdtpBuildContextFromSecurityDescriptor