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