EtwpUpdatePerProcessTracing

LONG __fastcall EtwpUpdatePerProcessTracing(__int64 a1, __int64 a2, char a3, unsigned int a4){
  __int64 v4; 
  unsigned __int16 *FlagExtension; 
  unsigned int *v9; 
  unsigned __int16 v10; 
  unsigned int v11; 
  __int64 v12; 
  _EPROCESS *Process; 
  __int64 Context; 
  __int16 v16; 
  v4 = a4;
  Context = 0i64;
  Process = 0i64;
  v16 = 0;
  KeWaitForSingleObject(&EtwpGlobalMutex, Executive, 0, 0, 0i64);
  FlagExtension = EtwpGetFlagExtension(a1, 2);
  if( FlagExtension )
  {
    v9 = (unsigned int *)(FlagExtension + 2);
    LODWORD(Context) = v4;
    v10 = 4 * *FlagExtension - 4;
    BYTE4(Context) = 1;
    v11 = v10 >> 2;
    if( v11 )
    {
      v12 = v11;
      do
      {
        if( PsLookupProcessByProcessId((HANDLE)*v9, (PEPROCESS *)&Process) >= 0 )
        {
          EtwpUpdateProcessTracingCallback(Process, &Context);
          ObfDereferenceObjectWithTag(Process, 0x746C6644ui64);
        }
        ++v9;
        --v12;
      }
      while( v12 );
    }
  }
  LOBYTE(v16) = a3;
  if( a2 == EtwpHostSiloState )
    *(_WORD *)(2 * v4 - 0x87FFFFFFC80i64) = v16;
  else
    *(_WORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 8) + 1128i64) + 2 * v4 + 550) = v16;
  return KeReleaseMutex(&EtwpGlobalMutex, 0);
}

Referenced by:

EtwpStartLogger
EtwpUpdateTrace