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