ExpWnfDeleteScopeById
void __fastcall ExpWnfDeleteScopeById(_KSPIN_LOCK *a1, const VOID *a2, unsigned int a3){
__int64 v4;
_WNF_SCOPE_MAP *ScopeMap;
char *v7;
_EX_PUSH_LOCK *p_PushLock;
_BYTE *v9;
_BYTE *v10;
_WNF_SCOPE_INSTANCE *ScopeInstance;
_WNF_SCOPE_INSTANCE *v12;
_LIST_ENTRY *p_ResolverListEntry;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
v4 = (unsigned int)a1;
ScopeMap = PsGetCurrentServerSiloGlobals(a1)->WnfSiloState.ScopeMap;
if( ScopeMap )
{
v7 = (char *)ScopeMap + 24 * v4;
p_PushLock = &ScopeMap->ByDataScope[v4].MapEntryLock.PushLock;
v9 = KeAbPreAcquire(p_PushLock, 0i64, 0i64);
v10 = v9;
if( _interlockedbittestandset64((volatile signed __int32 *)p_PushLock, 0i64) )
ExfAcquirePushLockExclusiveEx(p_PushLock, v9, p_PushLock);
if( v10 )
v10[26] |= 1u;
ScopeInstance = ExpWnfFindScopeInstance((_LIST_ENTRY *)(v7 + 40), a2, a3);
v12 = ScopeInstance;
if( ScopeInstance )
{
p_ResolverListEntry = &ScopeInstance->ResolverListEntry;
Flink = ScopeInstance->ResolverListEntry.Flink;
Blink = ScopeInstance->ResolverListEntry.Blink;
if( Flink->Blink != p_ResolverListEntry || Blink->Flink != p_ResolverListEntry )
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
p_ResolverListEntry->Flink = 0i64;
}
if( (_InterlockedExchangeAdd64(&p_PushLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(p_PushLock);
KeAbPostRelease(p_PushLock);
if( v12 )
ExpWnfFreeScopeInstance(v12, 1u);
}
}Referenced by:
ExWnfExitProcess
MiDereferenceSessionFinal