WdipSemEnableScenario

INT64 __fastcall WdipSemEnableScenario(const _GUID *ProviderGuid, UINT16 Eid, const _GUID *ScenarioInstanceId){
  _ETHREAD *CurrentThread; 
  struct SLIST_ENTRY *v4; 
  char v5; 
  EVENT_DESCRIPTOR *v9; 
  int LoggerIds; 
  unsigned __int64 ScenarioTable; 
  struct SLIST_ENTRY *v12; 
  _ETHREAD *v14; 
  INT64 NtStatus; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0i64;
  v5 = 0;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockSharedEx((UINT64)&WdipSemPushLock, 0i64);
  if( !ProviderGuid || !ScenarioInstanceId )
  {
    LoggerIds = -1073741811;
    goto LABEL_15;
  }
  if( !WdipSemEnabled )
    goto LABEL_14;
  LoggerIds = WdipSemGetLoggerIds();
  if( LoggerIds >= 0 )
  {
    ScenarioTable = WdipSemQueryScenarioTable(ProviderGuid, Eid);
    if( ScenarioTable )
    {
      v12 = (struct SLIST_ENTRY *)WdipSemReserveInstanceTableEntry(ScenarioTable, (GUID *)ScenarioInstanceId);
      v4 = v12;
      if( v12 )
      {
        WdipSemEnableContextProviders((INT64)v12);
        goto LABEL_8;
      }
    }
LABEL_14:
    LoggerIds = -1073741823;
    goto LABEL_15;
  }
  v5 = 1;
LABEL_8:
  if( LoggerIds >= 0 )
  {
    if( EtwEventEnabled(WdipSemRegHandle, (EVENT_DESCRIPTOR *)&WDI_SEM_EVENT_SCENARIO_START, v9) )
      WdipSemWriteSemActionsEvent((GUID *)&WDI_SEM_EVENT_SCENARIO_START, (INT64)v4);
    WdipSemActivateInstance((__int64)v4);
    goto LABEL_12;
  }
LABEL_15:
  if( EtwEventEnabled(WdipSemRegHandle, (EVENT_DESCRIPTOR *)&WDI_SEM_EVENT_SCENARIO_START_FAILED, v9) )
  {
    LODWORD(NtStatus) = LoggerIds;
    WdipSemWriteSemFailureEvent(&WDI_SEM_EVENT_SCENARIO_START_FAILED, ProviderGuid, Eid, ScenarioInstanceId, NtStatus);
  }
  if( v4 )
    WdipSemDeleteTransitionalInstance(v4);
LABEL_12:
  ExReleasePushLockEx((UINT64)&WdipSemPushLock, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( v5 )
  {
    v14 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v14 + 242);
    ExAcquirePushLockExclusiveEx((UINT64)&WdipSemPushLock, 0i64);
    if( WdipSemEnabled )
      WdipSemShutdown();
    ExReleasePushLockEx((UINT64)&WdipSemPushLock, 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  return(unsigned int)LoggerIds;
}

Referenced by:

WdipStartEndScenario