ExpWnfAcquireSubscriptionByName

NTSTATUS __stdcall ExpWnfAcquireSubscriptionByName(
        _WNF_STATE_NAME_STRUCT StateName,
        _WNF_PROCESS_CONTEXT *ProcessContext,
        _WNF_SUBSCRIPTION **Subscription){
  _WNF_LOCK *p_ProcessSubscriptionListLock; 
  _BYTE *v7; 
  _WNF_PROCESS_CONTEXT *i; 
  _WNF_SUBSCRIPTION *p_DeliveryPendingListHead; 
  NTSTATUS result; 

  p_ProcessSubscriptionListLock = &ProcessContext->ProcessSubscriptionListLock;
  v7 = KeAbPreAcquire(&ProcessContext->ProcessSubscriptionListLock, 0i64, 0i64);
  if( _InterlockedCompareExchange64(&p_ProcessSubscriptionListLock->PushLock._bf_0, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx(&p_ProcessSubscriptionListLock->PushLock, v7, p_ProcessSubscriptionListLock);
  if( v7 )
    v7[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._bf_0 )
    {
      ExAcquireRundownProtection(&p_DeliveryPendingListHead->RunRef);
      if( _InterlockedCompareExchange64(&p_ProcessSubscriptionListLock->PushLock._bf_0, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(&p_ProcessSubscriptionListLock->PushLock);
      KeAbPostRelease(p_ProcessSubscriptionListLock);
      result = 0;
      *Subscription = p_DeliveryPendingListHead;
      return result;
    }
  }
  if( _InterlockedCompareExchange64(&p_ProcessSubscriptionListLock->PushLock._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&p_ProcessSubscriptionListLock->PushLock);
  KeAbPostRelease(p_ProcessSubscriptionListLock);
  return -1073741772;
}

Referenced by:

NtUnsubscribeWnfStateChange