ExpWnfEnumerateScopeInstances

_WNF_SCOPE_INSTANCE *__stdcall ExpWnfEnumerateScopeInstances(
        _WNF_DATA_SCOPE DataScope,
        _WNF_SCOPE_INSTANCE *ScopeInstance){
  PKINTERRUPT_ROUTINE *v2; 
  __int64 v3; 
  _WNF_SCOPE_INSTANCE *v5; 
  _ESERVERSILO_GLOBALS *ServerSiloGlobals; 
  _WNF_SCOPE_MAP *ScopeMap; 
  _EX_PUSH_LOCK *p_PushLock; 
  _LIST_ENTRY **p_Flink; 
  _BYTE *v10; 
  _LIST_ENTRY *Flink; 
  _EJOB *v13; 

  v3 = (unsigned int)DataScope;
  v5 = 0i64;
  if( (unsigned int)(DataScope - 4) <= 1 )
  {
    LODWORD(v13) = HalSystemVectorDispatchEntry(DataScope, (PKINTERRUPT_ROUTINE **)ScopeInstance, v2);
    ServerSiloGlobals = PsGetServerSiloGlobals(v13);
  }
  else
  {
    ServerSiloGlobals = PsGetCurrentServerSiloGlobals(*(_KSPIN_LOCK **)&DataScope);
  }
  ScopeMap = ServerSiloGlobals->WnfSiloState.ScopeMap;
  if( !ScopeMap )
    return 0i64;
  p_PushLock = &ScopeMap->ByDataScope[v3].MapEntryLock.PushLock;
  p_Flink = &ScopeMap->ByDataScope[v3].MapEntryHead.Flink;
  v10 = KeAbPreAcquire(p_PushLock, 0i64, 0i64);
  if( _InterlockedCompareExchange64(&p_PushLock->_bf_0, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx(p_PushLock, v10, p_PushLock);
  if( v10 )
    v10[26] |= 1u;
  if( ScopeInstance )
    Flink = ScopeInstance->ResolverListEntry.Flink;
  else
    Flink = 0i64;
  if( !Flink )
    Flink = *p_Flink;
  while( Flink != (_LIST_ENTRY *)p_Flink )
  {
    v5 = (_WNF_SCOPE_INSTANCE *)&Flink[-2];
    if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&Flink[-2].Blink) )
      break;
    Flink = Flink->Flink;
    v5 = 0i64;
  }
  if( _InterlockedCompareExchange64(&p_PushLock->_bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(p_PushLock);
  KeAbPostRelease(p_PushLock);
  if( ScopeInstance )
    ExReleaseRundownProtection(&ScopeInstance->RunRef);
  return v5;
}

Referenced by:

NtDeleteWnfStateName