WdipSemUpdateProviderTableWithEvent

NTSTATUS __fastcall WdipSemUpdateProviderTableWithEvent(_GUID *ProviderGuid){
  NTSTATUS v1; 
  __int64 ProviderTable; 
  _GUID *v5; 
  _GUID *v6; 

  v1 = 0;
  if( !ProviderGuid )
    return -1073741811;
  ProviderTable = WdipSemQueryProviderTable(ProviderGuid);
  if( ProviderTable )
  {
    *(_QWORD *)ProviderGuid[2].Data4 = ProviderTable;
  }
  else if( (unsigned int)OldNumProviders >= 0x400 )
  {
    if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 560), &WDI_SEM_EVENT_INIT_PROVIDER_MAX) )
      WdipSemWriteProviderLimitExceededEvent(ProviderGuid);
    return -1073741823;
  }
  else
  {
    v5 = (_GUID *)WdipSemFastAllocate(WDI_SEM_ALLOC_PROVIDER, 0x50ui64);
    v6 = v5;
    if( v5 )
    {
      memset(v5, 0i64, 0x50u);
      *v6 = *ProviderGuid;
      *((_QWORD *)&ExBootDevicesRemovedEvent + (unsigned int)OldNumProviders + 568) = v6;
      LODWORD(OldNumProviders) = OldNumProviders + 1;
      *(_QWORD *)ProviderGuid[2].Data4 = v6;
    }
    else
    {
      return -1073741670;
    }
  }
  return v1;
}

Referenced by:

WdipSemUpdateProviderTableWithScenario