EtwpTrackGuidEntryRegistrations

INT64 __fastcall EtwpTrackGuidEntryRegistrations(_DWORD *a1, INT64 a2, CHAR a3){
  _ETHREAD *CurrentThread; 
  UINT64 v7; 
  INT64 v8; 
  unsigned int v9; 
  _ETW_REG_ENTRY *i; 
  _ETHREAD *v11; 
  _ETW_REG_ENTRY *v12; 
  __int64 Process; 
  _EJOB *ProcessServerSilo; 
  _EJOB *v15; 
  _KAPC_STATE ApcState; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v7 = a2 + 408;
  ExAcquirePushLockExclusiveEx(a2 + 408, 0i64);
  v8 = a2 + 128;
  *(_QWORD *)(a2 + 416) = KeGetCurrentThread();
  v9 = 0;
  while( !*(_DWORD *)v8 || *(unsigned __int16 *)(v8 + 6) != *a1 )
  {
    ++v9;
    v8 += 32i64;
    if( v9 >= 8 )
      goto LABEL_18;
  }
  for( i = *(_ETW_REG_ENTRY **)(a2 + 56); i != (_ETW_REG_ENTRY *)(a2 + 56); i = (_ETW_REG_ENTRY *)i->RegList.Flink )
  {
    if( a3 == 2 )
    {
      v11 = (_ETHREAD *)KeGetCurrentThread();
      v12 = (_ETW_REG_ENTRY *)((char *)i - 16);
      --*((_WORD *)v11 + 242);
      ExAcquirePushLockExclusiveEx((UINT64)&i->GroupRegList.Flink[25].Blink, 0i64);
      i->GroupRegList.Flink[26].Flink = (_LIST_ENTRY *)KeGetCurrentThread();
    }
    else
    {
      v12 = i;
    }
    if( (v12->Flags & 1) != 0 )
    {
      EtwpProviderArrivalCallback((_WMI_LOGGER_CONTEXT *)a1, 0, v12);
    }
    else if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)v12->Process + 139) )
    {
      Process = (__int64)v12->Process;
      memset(&ApcState, 0, sizeof(ApcState));
      ProcessServerSilo = (_EJOB *)PsGetProcessServerSilo(Process);
      v15 = PsAttachSiloToCurrentThread(ProcessServerSilo);
      KiStackAttachProcess((_KPROCESS *)v12->Process, 0i64, &ApcState);
      EtwpProviderArrivalCallback((_WMI_LOGGER_CONTEXT *)a1, 1, v12);
      KiUnstackDetachProcess(&ApcState, 0i64);
      PsDetachSiloFromCurrentThread(v15);
      ExReleaseRundownProtection((PEX_RUNDOWN_REF)v12->Process + 139);
    }
    if( a3 == 2 )
    {
      v12->GuidEntry->LockOwner = 0i64;
      ExReleasePushLockEx((UINT64)&v12->GuidEntry->Lock, 0i64);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    }
  }
LABEL_18:
  *(_QWORD *)(a2 + 416) = 0i64;
  ExReleasePushLockEx(v7, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return 0i64;
}

Referenced by:

EtwpSetProviderBinaryTracking