EtwpSetPmcProfileSource

NTSTATUS __stdcall EtwpSetPmcProfileSource(_KPROFILE_SOURCE *Source, UINT64 Count){
  NTSTATUS v2; 
  __int64 v3; 
  __int64 v5; 
  _KPROFILE *v6; 
  VOID *v8; 
  _KPROFILE_SOURCE v9; 

  v2 = 0;
  v3 = (unsigned int)Count;
  if( !(_DWORD)Count || (unsigned int)Count > EtwpMaxProfilingSources )
    return -1073741811;
  KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 2368, 0, 0, 0, 0i64);
  if( *(&ExBootDevicesRemovedEvent + 325) )
  {
    ExFreePoolWithTag(*(&ExBootDevicesRemovedEvent + 325), 0);
    *(&ExBootDevicesRemovedEvent + 325) = 0i64;
    *(&ExBootDevicesRemovedEvent + 648) = 0;
  }
  v5 = v3;
  *(&ExBootDevicesRemovedEvent + 325) = ExAllocatePoolWithTag(0x200ui64, 248 * v3, 1484223557i64);
  v6 = (_KPROFILE *)*(&ExBootDevicesRemovedEvent + 325);
  if( *(&ExBootDevicesRemovedEvent + 325) )
  {
    *(&ExBootDevicesRemovedEvent + 648) = v3;
    if( (_DWORD)v3 )
    {
      do
      {
        KeInitializeProfileCallback(
          v6,
          EtwpPmcInterrupt,
          (_KTRAP_FRAME *)*(unsigned int *)Source,
          (VOID *)*(unsigned int *)Source,
          v8,
          v9);
        v6 += 62;
        ++Source;
        --v5;
      }
      while( v5 );
    }
  }
  else
  {
    v2 = -1073741801;
  }
  KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 2368), 0);
  return v2;
}

Referenced by:

EtwSetPerformanceTraceInformation