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