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