SeRmReferenceFindCapName
NTSTATUS __stdcall SeRmReferenceFindCapName(PVOID CapID, UINT64 *CapeCount, UNICODE_STRING **CapeNames){
int v3;
RTL_DYNAMIC_HASH_TABLE_ENTRY *v5;
unsigned int v6;
UNICODE_STRING *PoolWithTag;
NTSTATUS v9;
NTSTATUS Cap;
__int64 Blink_high;
unsigned __int64 *p_Signature;
__int64 v13;
unsigned __int16 *v14;
unsigned int v15;
unsigned int v16;
UINT8 *i;
__int64 v18;
unsigned __int16 v19;
NTSTATUS result;
PVOID v21;
RTL_DYNAMIC_HASH_TABLE_ENTRY *v22;
UNICODE_STRING **v23;
v23 = CapeNames;
v21 = CapID;
v3 = 0;
v22 = 0i64;
v5 = 0i64;
v6 = 0;
PoolWithTag = 0i64;
v9 = (unsigned int)SepValidateCAPIDs((INT64)CapID, (INT64)&v21);
if( v9 >= 0 )
{
Cap = SepRmReferenceFindCap(CapID, &v22);
v5 = v22;
v9 = Cap;
if( Cap >= 0 )
{
Blink_high = HIDWORD(v22[2].Linkage.Blink);
if( (_DWORD)Blink_high )
{
p_Signature = &v22[2].Signature;
v13 = (unsigned int)Blink_high;
do
{
v14 = (unsigned __int16 *)*p_Signature++;
v15 = *v14;
if( v15 <= 2 )
v15 = 0;
v6 += v15;
--v13;
}
while( v13 );
}
PoolWithTag = (UNICODE_STRING *)ExAllocatePoolWithTag(PagedPool, v6 + 16 * Blink_high, 0x70536553ui64);
if( PoolWithTag )
{
v16 = 0;
for( i = (UINT8 *)&PoolWithTag[HIDWORD(v5[2].Linkage.Blink)];
v16 < HIDWORD(v5[2].Linkage.Blink);
i += 2 * ((unsigned __int64)PoolWithTag[v18].Length >> 1) )
{
v18 = v16;
PoolWithTag[v16].Buffer = (wchar_t *)i;
v19 = **((_WORD **)&v5[2].Signature + v16);
if( v19 <= 2u )
v19 = 0;
PoolWithTag[v16].MaximumLength = v19;
PoolWithTag[v16].Length = v19;
memmove(i, *(UINT8 **)(*(&v5[2].Signature + v16++) + 8), v19);
}
}
else
{
v9 = -1073741801;
}
}
}
*v23 = PoolWithTag;
if( v5 )
v3 = HIDWORD(v5[2].Linkage.Blink);
result = v9;
*(_DWORD *)CapeCount = v3;
return result;
}Referenced by:
AdtpBuildContextFromSecurityDescriptor