EtwpCovSampProcessAddModule

INT64 __fastcall EtwpCovSampProcessAddModule(INT64 a1, PVOID *a2, INT64 a3, UINT64 a4){
  _ETHREAD *CurrentThread; 
  void *PoolWithTag; 
  volatile INT64 *v10; 
  int v11; 
  unsigned int v12; 
  unsigned int v13; 
  __int64 v14; 
  unsigned int v15; 
  unsigned int v16; 
  _ETHREAD *v17; 
  void *v18; 
  unsigned int v19; 
  __int64 v20; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  PoolWithTag = 0i64;
  --*((_WORD *)CurrentThread + 242);
  v10 = (volatile INT64 *)(a1 + 8);
  ExAcquirePushLockExclusiveEx(a1 + 8, 0i64);
  *(_QWORD *)(a1 + 16) = KeGetCurrentThread();
  if( !*(_QWORD *)a1 )
  {
    ObfReferenceObject(*a2);
    *(_QWORD *)a1 = a2;
  }
  if( (*(_DWORD *)(a3 + 120) & 0x110000) != 0 )
  {
    v11 = 0;
    while( 1 )
    {
      v12 = EtwpCovSampProcessRemoveModule(a1, a4, *(_QWORD *)(a3 + 40));
      v13 = *(_DWORD *)(a1 + 36);
      v14 = v12;
      v15 = *(_DWORD *)(a1 + 32);
      if( v15 < v13 )
        break;
      v16 = 2 * v13;
      if( !v13 )
        v16 = 16;
      *(_QWORD *)(a1 + 16) = 0i64;
      if( (_InterlockedExchangeAdd64(v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v10);
      KeAbPostRelease((PVOID)v10);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      if( PoolWithTag )
        ExFreePoolWithTag(PoolWithTag, 0x56777445u);
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, 16i64 * v16, 0x56777445ui64);
      if( !PoolWithTag )
      {
        v19 = -1073741670;
        goto LABEL_25;
      }
      v17 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v17 + 242);
      ExAcquirePushLockExclusiveEx((UINT64)v10, 0i64);
      *(_QWORD *)(a1 + 16) = KeGetCurrentThread();
      if( v16 > *(_DWORD *)(a1 + 36) )
      {
        v18 = *(void **)(a1 + 24);
        if( v18 )
        {
          memmove((UINT8 *)PoolWithTag, *(UINT8 **)(a1 + 24), 16i64 * *(unsigned int *)(a1 + 32));
          v18 = *(void **)(a1 + 24);
        }
        *(_QWORD *)(a1 + 24) = PoolWithTag;
        PoolWithTag = v18;
        *(_DWORD *)(a1 + 36) = v16;
      }
      if( (unsigned int)++v11 >= 0x14 )
      {
        v19 = -1073741823;
        goto LABEL_25;
      }
    }
    v20 = *(_QWORD *)(a1 + 24) + 16 * v14;
    if( v15 > (unsigned int)v14 )
    {
      memmove((UINT8 *)(v20 + 16), (UINT8 *)(*(_QWORD *)(a1 + 24) + 16 * v14), 16i64 * (v15 - (unsigned int)v14));
      v15 = *(_DWORD *)(a1 + 32);
    }
    *(_DWORD *)(a1 + 32) = v15 + 1;
    *(_QWORD *)v20 = a4 + *(_QWORD *)(a3 + 40);
    EtwpCovSampModuleReference(*(_QWORD *)a1, a3);
    *(_QWORD *)(v20 + 8) = a3;
  }
  else
  {
    EtwpCovSampProcessRemoveModule(a1, a4, *(_QWORD *)(a3 + 40));
  }
  v19 = 0;
LABEL_25:
  if( *(struct _KTHREAD **)(a1 + 16) == KeGetCurrentThread() )
  {
    *(_QWORD *)(a1 + 16) = 0i64;
    if( (_InterlockedExchangeAdd64(v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(v10);
    KeAbPostRelease((PVOID)v10);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x56777445u);
  return v19;
}

Referenced by:

EtwpCovSampImageNotify