EtwpQueueNotification

INT64 __fastcall EtwpQueueNotification(
        _EPROCESS *Process,
        _ETWP_NOTIFICATION_HEADER *DataBlock,
        _ETW_REG_ENTRY *RegEntry){
  int v3; 
  __int64 v5; 
  char v8; 
  CHAR *v9; 
  _OWORD *PoolWithTag; 
  CHAR **v11; 
  _ETHREAD *CurrentThread; 
  CHAR *v13; 
  CHAR *v14; 
  CHAR **v15; 
  struct _KEVENT *v16; 
  void *ReplyObject; 
  unsigned int v19; 
  bool v20; 
  v3 = 0;
  v5 = RegEntry->Flags & 0x100;
  v8 = 1;
  v20 = (RegEntry->Flags & 0x100) != 0;
  v9 = EtwpAddDataSource((INT64)Process);
  if( v9
    && (PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x38ui64, 0x72777445ui64),
        (v11 = (CHAR **)PoolWithTag) != 0i64) )
  {
    *PoolWithTag = 0i64;
    PoolWithTag[1] = 0i64;
    PoolWithTag[2] = 0i64;
    *((_QWORD *)PoolWithTag + 6) = 0i64;
    *((_QWORD *)PoolWithTag + 2) = DataBlock;
    *((_QWORD *)PoolWithTag + 3) = RegEntry;
    *((_WORD *)PoolWithTag + 24) = RegEntry->Index;
    *((_DWORD *)PoolWithTag + 13) = 1;
    if( !DataBlock->ReplyRequested )
      goto LABEL_4;
    ReplyObject = DataBlock->ReplyObject;
    *((_DWORD *)PoolWithTag + 13) |= 2u;
    ObfReferenceObject(ReplyObject);
    v11[4] = (CHAR *)ReplyObject;
    v11[5] = (CHAR *)PsChargeProcessWakeCounter((INT64)Process, 1i64, 3i64, (INT64)RegEntry);
    v19 = 0;
    v3 = -1073741823;
    while( _InterlockedCompareExchange64(
              (volatile signed __int64 *)&RegEntry->ReplyQueue + v19,
              (signed __int64)v11,
              0i64) )
    {
      if( ++v19 >= 4 )
        goto LABEL_18;
    }
    *((_WORD *)v11 + 25) = v19;
    v3 = 0;
LABEL_18:
    if( v3 < 0 )
    {
      EtwpReleaseQueueEntry(v11, 3);
    }
    else
    {
LABEL_4:
      _InterlockedIncrement(&DataBlock->RefCount);
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockExclusiveEx((UINT64)(v9 + 16), 0i64);
      v13 = v9 + 24;
      v14 = (CHAR *)*((_QWORD *)v9 + 3);
      if( v14 != v9 + 24 )
      {
        while( v20 != (*(_BYTE *)(*((_QWORD *)v14 + 3) + 99i64) & 1) )
        {
          v14 = *(CHAR **)v14;
          if( v14 == v13 )
            goto LABEL_5;
        }
        v8 = 0;
      }
LABEL_5:
      v15 = (CHAR **)*((_QWORD *)v9 + 4);
      if( *v15 != v13 )
        __fastfail(3u);
      *v11 = v13;
      v11[1] = (CHAR *)v15;
      *v15 = (CHAR *)v11;
      *((_QWORD *)v9 + 4) = v11;
      if( v8 )
      {
        if( (_WORD)v5 )
          v16 = (struct _KEVENT *)*((_QWORD *)v9 + 1);
        else
          v16 = *(struct _KEVENT **)v9;
        if( v16 )
          KeSetEvent(v16, 1);
      }
      ExReleasePushLockEx((UINT64)(v9 + 16), 0i64);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    }
  }
  else
  {
    return(unsigned int)-1073741801;
  }
  return(unsigned int)v3;
}

Referenced by:

EtwpSendDataBlock