ExpWnfDeleteScopeInstances

VOID __stdcall ExpWnfDeleteScopeInstances(_WNF_SCOPE_MAP *ScopeMap, _WNF_DATA_SCOPE DataScope){
  _WNF_SCOPE_MAP_ENTRY *v4; 
  _LIST_ENTRY *p_MapEntryHead; 
  _BYTE *v6; 
  _BYTE *v7; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v9; 

  v4 = &ScopeMap->ByDataScope[DataScope];
  p_MapEntryHead = &ScopeMap->ByDataScope[DataScope].MapEntryHead;
  v6 = KeAbPreAcquire(v4, 0i64, 0i64);
  v7 = v6;
  if( _interlockedbittestandset64((volatile signed __int32 *)v4, 0i64) )
    ExfAcquirePushLockExclusiveEx(&v4->MapEntryLock.PushLock, v6, v4);
  if( v7 )
    v7[26] |= 1u;
  while( 1 )
  {
    Flink = p_MapEntryHead->Flink;
    if( p_MapEntryHead->Flink->Blink != p_MapEntryHead || (v9 = Flink->Flink, Flink->Flink->Blink != Flink) )
      __fastfail(3u);
    p_MapEntryHead->Flink = v9;
    v9->Blink = p_MapEntryHead;
    if( Flink == p_MapEntryHead )
      break;
    Flink->Flink = 0i64;
    if( DataScope == WnfDataScopeSystem )
      ScopeMap->SystemScopeInstance = 0i64;
    ExpWnfFreeScopeInstance((_WNF_SCOPE_INSTANCE *)&Flink[-2], 1u);
  }
  if( (_InterlockedExchangeAdd64(&v4->MapEntryLock.PushLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&v4->MapEntryLock.PushLock);
  KeAbPostRelease(v4);
}

Referenced by:

ExWnfCleanupServerSiloState