SepDeReferenceSharedSidEntries
VOID __stdcall SepDeReferenceSharedSidEntries(_SID_AND_ATTRIBUTES *InputSids, UINT64 SidArrayCount){
_ETHREAD *CurrentThread;
unsigned int v3;
__int64 v5;
_RTL_DYNAMIC_HASH_TABLE_ENTRY *SharedSidEntry;
_RTL_DYNAMIC_HASH_TABLE_ENTRY *v7;
__int64 v8;
_EX_PUSH_LOCK *v9;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = SidArrayCount;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(g_SepSidMapping, 0i64);
if( v3 )
{
v5 = v3;
do
{
SharedSidEntry = SepFindSharedSidEntry(InputSids->Sid);
v7 = SharedSidEntry;
v8 = _InterlockedDecrement64((volatile signed __int64 *)&SharedSidEntry[1]);
if( v8 <= 0 )
{
if( v8 )
__fastfail(0xEu);
if( RtlRemoveEntryHashTable((_RTL_DYNAMIC_HASH_TABLE *)g_SepSidMapping[1]._bf_0, SharedSidEntry, 0i64) )
ExFreePoolWithTag(v7, 0);
}
++InputSids;
--v5;
}
while( v5 );
}
v9 = g_SepSidMapping;
if( (_InterlockedExchangeAdd64(&g_SepSidMapping->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v9);
KeAbPostRelease(v9);
KeLeaveCriticalRegion();
}Referenced by:
SepFreeTokenCapabilities