EtwpCoverageEnsureUserModeView

INT64 __fastcall EtwpCoverageEnsureUserModeView(INT64 a1){
  UINT64 v1; 
  __int64 v2; 
  _ETHREAD *CurrentThread; 
  __int64 v4; 
  __int64 *v5; 
  char v6; 
  int v8; 
  v1 = *((_QWORD *)KeGetCurrentThread() + 23);
  v2 = *(_QWORD *)(v1 + 1360);
  if( *(_QWORD *)(v2 + 1952) )
  {
    v8 = 0;
  }
  else
  {
    v8 = MmMapViewOfSection(*(_LOADER_PARAMETER_BLOCK **)(a1 + 8), v1);
    if( v8 >= 0 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockExclusiveEx((UINT64)&EtwpCoverageLock, 0i64);
      EtwpCoverageLockOwner = (__int64)KeGetCurrentThread();
      if( !*(_QWORD *)(v2 + 1952) )
        *(_QWORD *)(v2 + 1952) = 0i64;
      v4 = 0i64;
      v5 = *(__int64 **)(v1 + 1408);
      if( v5 )
        v4 = *v5;
      if( v4 )
        *(_DWORD *)(v4 + 1116) = *(_DWORD *)(v2 + 1952);
      v8 = 0;
    }
  }
  if( (struct _KTHREAD *)EtwpCoverageLockOwner == KeGetCurrentThread() )
  {
    EtwpCoverageLockOwner = 0i64;
    v6 = _InterlockedExchangeAdd64((volatile signed __int64 *)&EtwpCoverageLock, 0xFFFFFFFFFFFFFFFFui64);
    if( (v6 & 2) != 0 && (v6 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)&EtwpCoverageLock);
    KeAbPostRelease(&EtwpCoverageLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  return(unsigned int)v8;
}

Referenced by:

EtwSetProcessTelemetryCoverage