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