ExpWnfNotifyNameSubscribers

VOID __fastcall ExpWnfNotifyNameSubscribers(INT64 a1, UINT64 a2, INT64 a3, UINT64 a4){
  UINT64 *v4; 
  int v5; 
  unsigned int v6; 
  int v8; 
  unsigned int v9; 
  int v10; 
  _BYTE *v11; 
  _BYTE *v12; 
  _QWORD *v13; 
  _QWORD *v14; 
  int inserted; 
  __int64 v16; 
  unsigned int v17; 
  struct _KEVENT *v18; 
  int v20; 
  unsigned int Synchronous; 
  Synchronous = a4;
  v20 = a3;
  v4 = (UINT64 *)(a1 + 112);
  v5 = a3;
  v6 = a2;
  v8 = 0;
  v9 = 1;
  v10 = 1;
  LODWORD(v11) = KeAbPreAcquire((PVOID)(a1 + 112), 0i64, 0i64);
  v12 = v11;
  if( _InterlockedCompareExchange64((volatile signed __int64 *)v4, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx(v4, v11, v4);
  if( v12 )
    v12[26] |= 1u;
  v13 = (_QWORD *)(a1 + 120);
  v14 = (_QWORD *)*v13;
  if( (_QWORD *)*v13 != v13 )
  {
    do
    {
      if( v10 && (*((_BYTE *)v14 + 36) & 1) != 0 )
        v10 = 0;
      inserted = ExpWnfInsertSubscriptionInPendingQueue(v14 - 8, v6, 0i64);
      v16 = *(v14 - 3);
      if( inserted )
      {
        if( (PEPROCESS)v16 == PsInitialSystemProcess )
        {
          v8 = 1;
        }
        else
        {
          v18 = *(struct _KEVENT **)(*(_QWORD *)(v16 + 2152) + 128i64);
          if( v18 )
            KeSetEvent(v18, 1);
        }
      }
      v14 = (_QWORD *)*v14;
    }
    while( v14 != v13 );
    v5 = v20;
  }
  if( _InterlockedCompareExchange64((volatile signed __int64 *)v4, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)v4);
  KeAbPostRelease(v4);
  if( v10 && (v6 & 1) != 0 )
  {
    if( v8 || !v5 )
      v9 = 0;
    v17 = Synchronous;
    ExpWnfNotifyNameSubscribers(a1, 8ui64, v9, Synchronous);
  }
  else
  {
    v17 = Synchronous;
  }
  if( v8 )
  {
    if( v5 )
      ExpWnfStartKernelDispatcher(v17);
  }
}

Referenced by:

ExpNtUpdateWnfStateData
ExpWnfCompleteThreadSubscriptions
ExpWnfDeleteProcessContext
ExpWnfDeleteSubscription
ExpWnfDeliverThreadNotifications
ExpWnfDispatchKernelSubscription
ExpWnfNotifyNameSubscribers
ExpWnfSubscribeNameInstance
NtDeleteWnfStateName