ExpWnfCompleteThreadSubscriptions
INT64 __fastcall ExpWnfCompleteThreadSubscriptions(volatile INT32 *a1, INT64 *a2, INT64 a3, INT64 a4, INT64 a5){
_WNF_NAME_INSTANCE *v7;
int v8;
UINT64 v9;
_BYTE *v10;
_BYTE *v11;
_BYTE *v12;
_BYTE *v13;
__int64 *v14;
int v15;
int v16;
__int64 *v17;
__int64 **v18;
int v19;
__int64 v20;
__int64 v22;
_WNF_STATE_NAME_STRUCT InternalStateName;
_WNF_NAME_INSTANCE *NameInstance;
_WNF_SCOPE_INSTANCE *ScopeInstance;
InternalStateName = 0i64;
v7 = 0i64;
v8 = a4;
if( (int)ExpCaptureWnfStateName((const _WNF_STATE_NAME *)a2, &InternalStateName, 0) < 0 )
return 3221225485i64;
LODWORD(v10) = KeAbPreAcquire((PVOID)(a1 + 20), 0i64, v9);
v11 = v10;
if( _InterlockedCompareExchange64((volatile signed __int64 *)a1 + 10, 17i64, 0i64) )
ExfAcquirePushLockSharedEx((UINT64 *)a1 + 10, v10, (VOID *)(a1 + 20));
if( v11 )
v11[26] |= 1u;
LODWORD(v12) = KeAbPreAcquire((PVOID)(a1 + 26), 0i64, 0i64);
v13 = v12;
if( _interlockedbittestandset64(a1 + 26, 0i64) )
ExfAcquirePushLockExclusiveEx((UINT64 *)a1 + 13, v12, (VOID *)(a1 + 26));
if( v13 )
v13[26] |= 1u;
v14 = (__int64 *)*((_QWORD *)a1 + 14);
if( v14 == (__int64 *)(a1 + 28) )
{
LABEL_36:
v15 = 0;
}
else
{
while( *(v14 - 11) != a3 || InternalStateName != *(v14 - 6) )
{
v14 = (__int64 *)*v14;
if( v14 == (__int64 *)(a1 + 28) )
goto LABEL_36;
}
v15 = 1;
if( v8 != *((_DWORD *)v14 + 6) || *((int *)v14 + 4) <= 1 )
goto LABEL_27;
v16 = *((_DWORD *)v14 + 5);
if( v16 )
{
*((_DWORD *)v14 + 4) = 1;
if( (_DWORD)a5 == -1073741267 && (v16 & 1) == 0 )
*((_DWORD *)v14 + 5) = v16 | 1;
}
else
{
if( (_DWORD)a5 )
{
*((_DWORD *)v14 + 4) = 3;
v19 = 3;
}
else
{
*((_DWORD *)v14 + 4) = 0;
v17 = (__int64 *)*v14;
if( *(__int64 **)(*v14 + 8) != v14 || (v18 = (__int64 **)v14[1], *v18 != v14) )
__fastfail(3u);
*v18 = v17;
v17[1] = (__int64)v18;
v19 = *((_DWORD *)v14 + 4);
}
if( v19 == 3 )
goto LABEL_27;
}
if( (*((_BYTE *)v14 + 20) & 1) == 0 && (v14[3] & 1) != 0 )
{
v20 = *(v14 - 7);
if( v20 )
{
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v20 + 164), 0xFFFFFFFF) == 1
&& ExAcquireRundownProtection((PEX_RUNDOWN_REF)(*(v14 - 7) + 8)) )
{
v7 = (_WNF_NAME_INSTANCE *)*(v14 - 7);
}
}
}
*((_DWORD *)v14 + 6) = 0;
}
LABEL_27:
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)a1 + 13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)a1 + 13);
KeAbPostRelease((PVOID)(a1 + 26));
if( _InterlockedCompareExchange64((volatile signed __int64 *)a1 + 10, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)a1 + 10);
KeAbPostRelease((PVOID)(a1 + 20));
if( !v15 && (v8 & 1) != 0 )
{
v22 = *((_QWORD *)a1 + 1);
NameInstance = 0i64;
ScopeInstance = 0i64;
ExpWnfResolveScopeInstance(
(struct _EX_RUNDOWN_REF **)&ScopeInstance,
v22,
0i64,
(*(unsigned __int64 *)&InternalStateName >> 6) & 0xF,
0i64);
if( (int)ExpWnfLookupNameInstance(ScopeInstance, InternalStateName, &NameInstance) >= 0 )
{
if( _InterlockedExchangeAdd(&NameInstance->CurrentDeliveryCount, 0xFFFFFFFF) == 1 )
v7 = NameInstance;
else
ExReleaseRundownProtection(&NameInstance->RunRef);
}
ExReleaseRundownProtection(&ScopeInstance->RunRef);
}
if( v7 )
{
ExpWnfNotifyNameSubscribers((INT64)v7, 8ui64, 1i64, 1ui64);
ExReleaseRundownProtection(&v7->RunRef);
}
return 0i64;
}Referenced by:
NtGetCompleteWnfStateSubscription