ExpWnfDeliverThreadNotifications

INT64 __fastcall ExpWnfDeliverThreadNotifications(
        _WNF_PROCESS_CONTEXT *ProcessContext,
        _WNF_DELIVERY_DESCRIPTOR *NewDeliveryDescriptor,
        UINT64 DescriptorSize){
  _WNF_PROCESS_CONTEXT *v3; 
  unsigned int v4; 
  INT64 *p_ProcessSubscriptionListLock; 
  _BYTE *v6; 
  _BYTE *v7; 
  volatile INT64 *p_DeliveryPendingListLock; 
  _BYTE *v9; 
  _BYTE *v10; 
  __int64 p_DeliveryPendingListHead; 
  __int64 Flink; 
  signed __int64 v13; 
  int *v14; 
  unsigned int v15; 
  _WNF_DELIVERY_DESCRIPTOR *v16; 
  _WNF_TYPE_ID *v17; 
  __int64 **v19; 
  __int64 v20; 
  __int64 *v21; 
  int v22; 
  _WNF_LOCK *v23; 
  _WNF_LOCK *v24; 
  int v25; 
  UINT64 DataSize; 
  _LIST_ENTRY *v27; 
  __int64 v28; 
  int *v29; 
  _DWORD *v30; 
  PVOID Lock; 
  PVOID v32; 
  __int64 *v33; 
  int v36; 
  UINT64 ChangeStamp; 
  v3 = ProcessContext;
  LODWORD(DataSize) = 0;
  v4 = -2147483622;
  v36 = -2147483622;
  v25 = 0;
  LODWORD(ChangeStamp) = 0;
  HIDWORD(DataSize) = DescriptorSize - 48;
LABEL_2:
  p_ProcessSubscriptionListLock = (INT64 *)&v3->ProcessSubscriptionListLock;
  v32 = &v3->ProcessSubscriptionListLock;
  LODWORD(v6) = KeAbPreAcquire(&v3->ProcessSubscriptionListLock, 0i64, 0i64);
  v7 = v6;
  if( _InterlockedCompareExchange64((volatile signed __int64 *)&v3->ProcessSubscriptionListLock, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx((UINT64 *)&v3->ProcessSubscriptionListLock, v6, &v3->ProcessSubscriptionListLock);
  if( v7 )
    v7[26] |= 1u;
  p_DeliveryPendingListLock = (volatile INT64 *)&v3->DeliveryPendingListLock;
  Lock = &v3->DeliveryPendingListLock;
  LODWORD(v9) = KeAbPreAcquire(&v3->DeliveryPendingListLock, 0i64, 0i64);
  v10 = v9;
  if( _interlockedbittestandset64((volatile signed __int32 *)&v3->DeliveryPendingListLock, 0i64) )
    ExfAcquirePushLockExclusiveEx((UINT64 *)&v3->DeliveryPendingListLock, v9, &v3->DeliveryPendingListLock);
  if( v10 )
    v10[26] |= 1u;
  p_DeliveryPendingListHead = (__int64)&v3->DeliveryPendingListHead;
  v27 = &v3->DeliveryPendingListHead;
  Flink = (__int64)v3->DeliveryPendingListHead.Flink;
  while( 1 )
  {
    v33 = (__int64 *)Flink;
    if( Flink == p_DeliveryPendingListHead )
      break;
    v30 = (_DWORD *)(Flink + 16);
    if( *(_DWORD *)(Flink + 16) != 1 )
      goto LABEL_36;
    v13 = *(_QWORD *)(Flink - 56);
    v28 = v13;
    if( v13 )
    {
      v13 &= -(__int64)ExAcquireRundownProtection((PEX_RUNDOWN_REF)(v13 + 8));
      v28 = v13;
    }
    v14 = (int *)(Flink + 20);
    v29 = (int *)(Flink + 20);
    v15 = *(_DWORD *)(Flink + 20) & *(_DWORD *)(Flink - 4) & 0xFFFFFFFE;
    if( v13 )
      v15 = *(_DWORD *)(Flink + 20) & *(_DWORD *)(Flink - 4);
    if( !v15 )
      goto LABEL_40;
    v16 = NewDeliveryDescriptor;
    *(_OWORD *)&NewDeliveryDescriptor->SubscriptionId = 0i64;
    *(_OWORD *)&NewDeliveryDescriptor->ChangeStamp = 0i64;
    *(_OWORD *)&NewDeliveryDescriptor->TypeId.TypeId.Data2 = 0i64;
    NewDeliveryDescriptor->StateName = (_WNF_STATE_NAME)(*(_QWORD *)(Flink - 48) ^ 0x41C64E6DA3BC0074i64);
    NewDeliveryDescriptor->SubscriptionId = *(_QWORD *)(Flink - 88);
    if( (v15 & 1) != 0 )
    {
      v17 = *(_WNF_TYPE_ID **)(v13 + 64);
      if( v17 )
        NewDeliveryDescriptor->TypeId = *v17;
      v25 = ExpWnfReadStateData(
              (_WNF_NAME_INSTANCE *)v13,
              &ChangeStamp,
              &NewDeliveryDescriptor[1],
              HIDWORD(DataSize),
              &DataSize);
      if( v25 < 0 )
        goto LABEL_24;
      v16 = NewDeliveryDescriptor;
      NewDeliveryDescriptor->ChangeStamp = ChangeStamp;
      NewDeliveryDescriptor->StateDataSize = DataSize;
    }
    v16->StateDataOffset = 48;
    v16->EventMask = v15;
LABEL_24:
    if( v13 )
    {
      ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v13 + 8));
      v13 = 0i64;
    }
    if( v25 < 0 )
    {
      v4 = v36;
      if( v36 == -2147483622 )
      {
        v4 = v25;
        v36 = v25;
      }
      goto LABEL_36;
    }
    if( !(_DWORD)ChangeStamp )
      v15 &= ~1u;
    if( v15 )
    {
      *(_DWORD *)(Flink + 24) = v15;
      *v29 = 0;
      *v30 = 2;
      v4 = 0;
      break;
    }
    v14 = v29;
LABEL_40:
    v19 = *(__int64 ***)(Flink + 8);
    Flink = (__int64)v19;
    v20 = (__int64)v33;
    v21 = (__int64 *)*v33;
    if( *(__int64 **)(*v33 + 8) != v33 || *v19 != v33 )
      __fastfail(3u);
    *v19 = v21;
    v21[1] = (__int64)v19;
    *v30 = 0;
    v22 = *v14;
    *v14 = 0;
    *(_DWORD *)(v20 + 24) = 0;
    if( v13 )
    {
      if( (v22 & 1) != 0 && _InterlockedExchangeAdd((volatile signed __int32 *)(v13 + 164), 0xFFFFFFFF) == 1 )
      {
        v23 = &ProcessContext->DeliveryPendingListLock;
        if( (_InterlockedExchangeAdd64(
                (volatile signed __int64 *)&ProcessContext->DeliveryPendingListLock,
                0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock((volatile INT64 *)v23);
        KeAbPostRelease(v23);
        v24 = &ProcessContext->ProcessSubscriptionListLock;
        if( _InterlockedCompareExchange64(
               (volatile signed __int64 *)&ProcessContext->ProcessSubscriptionListLock,
               0i64,
               17i64) != 17 )
          ExfReleasePushLockShared((INT64 *)v24);
        KeAbPostRelease(v24);
        ExpWnfNotifyNameSubscribers(v13, 8ui64, 1i64, 1ui64);
        ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v13 + 8));
        v4 = v36;
        v3 = ProcessContext;
        goto LABEL_2;
      }
      ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v13 + 8));
    }
    v4 = v36;
LABEL_36:
    Flink = *(_QWORD *)Flink;
    p_DeliveryPendingListHead = (__int64)v27;
  }
  if( (_InterlockedExchangeAdd64(p_DeliveryPendingListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(p_DeliveryPendingListLock);
  KeAbPostRelease((PVOID)p_DeliveryPendingListLock);
  if( _InterlockedCompareExchange64(p_ProcessSubscriptionListLock, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(p_ProcessSubscriptionListLock);
  KeAbPostRelease(p_ProcessSubscriptionListLock);
  return v4;
}

Referenced by:

NtGetCompleteWnfStateSubscription