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