ExpWnfDeleteScopeById

VOID __stdcall ExpWnfDeleteScopeById(_WNF_DATA_SCOPE DataScope, PVOID InstanceId, UINT64 InstanceIdSize){
  unsigned int v3; 
  __int64 v4; 
  __int64 v6; 
  __int64 v7; 
  void *v8; 
  _BYTE *v9; 
  _BYTE *v10; 
  _WNF_SCOPE_INSTANCE *ScopeInstance; 
  _WNF_SCOPE_INSTANCE *v12; 
  _LIST_ENTRY *p_ResolverListEntry; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  v3 = InstanceIdSize;
  v4 = (unsigned int)DataScope;
  v6 = PsGetCurrentServerSiloGlobals()[114];
  if( v6 )
  {
    v7 = v6 + 24 * v4;
    v8 = (void *)(v6 + 8 * (3 * v4 + 4));
    LODWORD(v9) = KeAbPreAcquire(v8, 0i64, 0i64);
    v10 = v9;
    if( _interlockedbittestandset64((volatile signed __int32 *)v8, 0i64) )
      ExfAcquirePushLockExclusiveEx((UINT64 *)v8, v9, v8);
    if( v10 )
      v10[26] |= 1u;
    ScopeInstance = ExpWnfFindScopeInstance((_LIST_ENTRY *)(v7 + 40), InstanceId, v3);
    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((volatile signed __int64 *)v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)v8);
    KeAbPostRelease(v8);
    if( v12 )
      ExpWnfFreeScopeInstance(v12, 1u);
  }
}

Referenced by:

ExWnfExitProcess
MiDereferenceSessionFinal