SepRmReferenceFindCap

NTSTATUS __stdcall SepRmReferenceFindCap(VOID *CapSid, _SEP_CENTRALIZED_ACCESS_POLICY **ReturnCap){
  _ETHREAD *CurrentThread; 
  NTSTATUS v5; 
  _RTL_DYNAMIC_HASH_TABLE *v6; 
  UINT64 v7; 
  _RTL_DYNAMIC_HASH_TABLE_ENTRY *NextEntryHashTable; 
  _RTL_DYNAMIC_HASH_TABLE_CONTEXT Context; 

  *ReturnCap = 0i64;
  memset(&Context, 0, sizeof(Context));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = -1073741275;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx(&SepRmCapTableLock, 0i64);
  v6 = SepRmCapTable;
  if( SepRmCapTable && _InterlockedIncrement64((volatile signed __int64 *)&SepRmCapTable[1]) <= 1 )
    __fastfail(0xEu);
  if( _InterlockedCompareExchange64(&SepRmCapTableLock._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&SepRmCapTableLock);
  KeAbPostRelease(&SepRmCapTableLock);
  KeLeaveCriticalRegion();
  if( v6 )
  {
    if( !SepRmEnforceCap )
      goto LABEL_13;
    v7 = SepComputeSidSignature(CapSid);
    NextEntryHashTable = (_RTL_DYNAMIC_HASH_TABLE_ENTRY *)RtlLookupEntryHashTable(v6, v7, &Context);
    if( !NextEntryHashTable )
      goto LABEL_13;
    do
    {
      if( RtlEqualSid(CapSid, NextEntryHashTable[1].Linkage.Flink) == 1 )
        break;
      NextEntryHashTable = RtlGetNextEntryHashTable(v6, &Context);
    }
    while( NextEntryHashTable );
    if( NextEntryHashTable )
    {
      *ReturnCap = (_SEP_CENTRALIZED_ACCESS_POLICY *)NextEntryHashTable;
      return 0;
    }
    else
    {
LABEL_13:
      SepRmDereferenceCapTable((_SEP_CENTRALIZED_ACCESS_POLICIES_TABLE *)v6);
    }
  }
  return v5;
}

Referenced by:

SeAccessCheckByTypeWithAdminlessChecks
SeAccessCheckWithHintWithAdminlessChecks
SeComputeCreatorDeniedRights
SeRmReferenceFindCapName
SepAccessCheckAndAuditAlarmWithAdminlessChecks
SepCommonAccessCheckExWithAdminlessChecks