EtwpRegisterProvider

NTSTATUS __stdcall EtwpRegisterProvider(
        _ETW_SILODRIVERSTATE *SiloState,
        _GUID *ProviderId,
        UINT64 Type,
        VOID *Callback,
        VOID *CallbackContext,
        VOID *Caller,
        UINT64 *RegHandle){
  bool v10; 
  __int64 v11; 
  _ETW_GUID_ENTRY *GuidEntryByGuid; 
  _ETHREAD *v13; 
  ULONG_PTR v14; 
  NTSTATUS v15; 
  _ETW_REG_ENTRY *v16; 
  _ETW_GUID_ENTRY *HostEntry; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  _ETW_GUID_ENTRY *v21; 
  VOID **PoolWithTag; 
  unsigned int SchematizedFilterSize; 
  __int64 v25; 
  unsigned int v26; 
  _ETHREAD *CurrentThread; 
  unsigned __int8 EnableMask; 
  __int64 p_EnableMask; 
  _ETW_REG_ENTRY *RegEntry; 
  VOID *v31; 
  _TRACE_ENABLE_INFO EnableInfo; 
  unsigned __int16 LoggerId; 
  unsigned __int8 Level; 
  char v35; 
  ULONG LowPart; 
  LONG HighPart; 
  int v38; 
  __int128 v39; 

  RegEntry = 0i64;
  v31 = CallbackContext;
  *RegHandle = 0i64;
  v11 = *(_QWORD *)&ProviderId->Data1 - SecurityProviderGuid;
  v10 = *(_QWORD *)&ProviderId->Data1 == (_QWORD)SecurityProviderGuid;
  memset(&EnableInfo, 0, sizeof(EnableInfo));
  if( v10 )
    v11 = *(_QWORD *)ProviderId->Data4 - *((_QWORD *)&SecurityProviderGuid + 1);
  if( !v11 )
    return -1073741790;
  if( !Callback && CallbackContext || (_DWORD)Type != 3 && ((_DWORD)Type != 2 || !Callback) )
    return -1073741811;
  GuidEntryByGuid = EtwpFindGuidEntryByGuid(SiloState, ProviderId, EtwTraceGuidType);
  if( !GuidEntryByGuid )
  {
    GuidEntryByGuid = EtwpAddGuidEntry(SiloState, ProviderId, EtwTraceGuidType);
    if( !GuidEntryByGuid )
      return -1073741801;
  }
  if( GuidEntryByGuid->HostEntry )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx(&GuidEntryByGuid->HostEntry->Lock, 0i64);
    GuidEntryByGuid->HostEntry->LockOwner = (_ETHREAD *)KeGetCurrentThread();
  }
  v13 = (_ETHREAD *)KeGetCurrentThread();
  --v13->Tcb.KernelApcDisable;
  v14 = (_DWORD)GuidEntryByGuid + 408;
  ExAcquirePushLockExclusiveEx(&GuidEntryByGuid->Lock, 0i64);
  GuidEntryByGuid->LockOwner = (_ETHREAD *)KeGetCurrentThread();
  v15 = EtwpAddKmRegEntry(GuidEntryByGuid, (__int64)&RegEntry);
  if( v15 >= 0 )
  {
    v16 = RegEntry;
    RegEntry->ReplyQueue = (_ETW_REPLY_QUEUE *)Caller;
    *RegHandle = (UINT64)v16;
    if( GuidEntryByGuid->ProviderEnableInfo.IsEnabled )
    {
      p_EnableMask = (__int64)&v16->EnableMask;
      EtwpUpdateEnableMask(GuidEntryByGuid, (v16->Flags & 8) != 0, 0, 0i64);
    }
    HostEntry = GuidEntryByGuid->HostEntry;
    if( HostEntry && HostEntry->ProviderEnableInfo.IsEnabled )
    {
      p_EnableMask = (__int64)&v16->HostEnableMask;
      EtwpUpdateEnableMask(HostEntry, (v16->Flags & 8) != 0, 1, 0i64);
    }
    EtwpComputeRegEntryEnableInfo(v16, &EnableInfo);
    EtwpTrackProviderRegistration(v16);
    if( Callback )
    {
      if( (v16->Flags & 8) != 0 )
      {
        if( (GuidEntryByGuid->LastEnable._bf_b & 1) != 0 )
        {
          LoggerId = GuidEntryByGuid->LastEnable.LoggerId;
          LOBYTE(v18) = 1;
          Level = GuidEntryByGuid->LastEnable.Level;
          LowPart = GuidEntryByGuid->LastEnable.EnableFlags.anonymous_0.LowPart;
          HighPart = GuidEntryByGuid->LastEnable.EnableFlags.anonymous_0.HighPart;
          v35 = 0;
          v38 = 0;
          ((void(__fastcall *)(_GUID *, __int64, unsigned __int16 *, VOID *, __int64))Callback)(
            &GuidEntryByGuid->Guid,
            v18,
            &LoggerId,
            v31,
            p_EnableMask);
        }
      }
      else if( EnableInfo.IsEnabled )
      {
        RegEntry = 0i64;
        v39 = 0i64;
        PoolWithTag = 0i64;
        SchematizedFilterSize = EtwpGetSchematizedFilterSize(GuidEntryByGuid, v16->EnableMask);
        v26 = SchematizedFilterSize;
        if( SchematizedFilterSize )
        {
          PoolWithTag = ExAllocatePoolWithTag(1ui64, SchematizedFilterSize, 1182233669i64);
          if( PoolWithTag )
          {
            *(_QWORD *)&v39 = PoolWithTag;
            *((_QWORD *)&v39 + 1) = v26 | 0x8000000000000000ui64;
            EnableMask = v16->EnableMask;
            RegEntry = (_ETW_REG_ENTRY *)&v39;
            EtwpCopySchematizedFilters(PoolWithTag, (__int64)GuidEntryByGuid, EnableMask);
          }
        }
        LOBYTE(v25) = EnableInfo.Level;
        ((void(__fastcall *)(GUID *, __int64, __int64, unsigned __int64, unsigned __int64, _ETW_REG_ENTRY *, VOID *))Callback)(
          &NullGuid,
          1i64,
          v25,
          EnableInfo.MatchAnyKeyword,
          EnableInfo.MatchAllKeyword,
          RegEntry,
          v31);
        if( PoolWithTag )
          ExFreePoolWithTag(PoolWithTag, 0);
        v14 = (_DWORD)GuidEntryByGuid + 408;
      }
    }
    if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 241), &ETW_EVENT_PROVIDER_REGISTER) )
      EtwpEventWriteTemplateSessAndProv(v19, &ETW_EVENT_PROVIDER_REGISTER, v20, 1, 0i64, (unsigned __int64)ProviderId);
  }
  GuidEntryByGuid->LockOwner = 0i64;
  ExReleasePushLockEx(v14, 0);
  KeLeaveCriticalRegion();
  v21 = GuidEntryByGuid->HostEntry;
  if( v21 )
  {
    v21->LockOwner = 0i64;
    ExReleasePushLockEx((ULONG_PTR)&GuidEntryByGuid->HostEntry->Lock, 0);
    KeLeaveCriticalRegion();
  }
  EtwpUnreferenceGuidEntry(GuidEntryByGuid);
  return v15;
}

Referenced by:

EtwRegister
EtwRegisterClassicProvider