ExpWnfAcquireSubscriptionByName
INT64 __fastcall ExpWnfAcquireSubscriptionByName(
_WNF_STATE_NAME_STRUCT StateName,
_WNF_PROCESS_CONTEXT *ProcessContext,
_WNF_SUBSCRIPTION **Subscription){
_WNF_LOCK *p_ProcessSubscriptionListLock;
_BYTE *v7;
_BYTE *v8;
_WNF_PROCESS_CONTEXT *i;
_WNF_SUBSCRIPTION *p_DeliveryPendingListHead;
INT64 result;
p_ProcessSubscriptionListLock = &ProcessContext->ProcessSubscriptionListLock;
LODWORD(v7) = KeAbPreAcquire(&ProcessContext->ProcessSubscriptionListLock, 0i64, 0i64);
v8 = v7;
if( _InterlockedCompareExchange64((volatile signed __int64 *)p_ProcessSubscriptionListLock, 17i64, 0i64) )
ExfAcquirePushLockSharedEx((UINT64 *)p_ProcessSubscriptionListLock, v7, p_ProcessSubscriptionListLock);
if( v8 )
v8[26] |= 1u;
for( i = (_WNF_PROCESS_CONTEXT *)ProcessContext->ProcessSubscriptionListHead.Flink;
i != (_WNF_PROCESS_CONTEXT *)&ProcessContext->ProcessSubscriptionListHead;
i = *(_WNF_PROCESS_CONTEXT **)&i->Header.NodeTypeCode )
{
p_DeliveryPendingListHead = (_WNF_SUBSCRIPTION *)&i[-1].DeliveryPendingListHead;
if( i->ImplicitScopeInstances[0] == *(void **)&StateName )
{
ExAcquireRundownProtection(&p_DeliveryPendingListHead->RunRef);
if( _InterlockedCompareExchange64((volatile signed __int64 *)p_ProcessSubscriptionListLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)p_ProcessSubscriptionListLock);
KeAbPostRelease(p_ProcessSubscriptionListLock);
result = 0i64;
*Subscription = p_DeliveryPendingListHead;
return result;
}
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)p_ProcessSubscriptionListLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)p_ProcessSubscriptionListLock);
KeAbPostRelease(p_ProcessSubscriptionListLock);
return 3221225524i64;
}Referenced by:
NtUnsubscribeWnfStateChange