WdipSemEnableScenario

NTSTATUS __stdcall WdipSemEnableScenario(const _GUID *ProviderGuid, UINT16 Eid, const _GUID *ScenarioInstanceId){
  _ETHREAD *CurrentThread; 
  _WDIP_SEM_SCENARIO_INSTANCE_INFO *v4; 
  char v5; 
  int a5; 
  _WDIP_SEM_SCENARIO_INFO *ScenarioTable; 
  _WDIP_SEM_SCENARIO_INSTANCE_INFO *v11; 
  _ETHREAD *v13; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0i64;
  v5 = 0;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&ExBootDevicesRemovedEvent + 559, 0i64);
  if( !ProviderGuid || !ScenarioInstanceId )
  {
    a5 = -1073741811;
    goto LABEL_15;
  }
  if( !*(&ExBootDevicesRemovedEvent + 4464) )
    goto LABEL_14;
  a5 = WdipSemGetLoggerIds();
  if( a5 >= 0 )
  {
    ScenarioTable = WdipSemQueryScenarioTable((_GUID *)ProviderGuid, Eid);
    if( ScenarioTable )
    {
      v11 = WdipSemReserveInstanceTableEntry(ScenarioTable, (_GUID *)ScenarioInstanceId);
      v4 = v11;
      if( v11 )
      {
        WdipSemEnableContextProviders(v11);
        goto LABEL_8;
      }
    }
LABEL_14:
    a5 = -1073741823;
    goto LABEL_15;
  }
  v5 = 1;
LABEL_8:
  if( a5 >= 0 )
  {
    if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 560), &WDI_SEM_EVENT_SCENARIO_START) )
      WdipSemWriteSemActionsEvent((_GUID *)&WDI_SEM_EVENT_SCENARIO_START, (INT64)v4);
    WdipSemActivateInstance(v4);
    goto LABEL_12;
  }
LABEL_15:
  if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 560), &WDI_SEM_EVENT_SCENARIO_START_FAILED) )
    WdipSemWriteSemFailureEvent(
      (const in6_addr *)&WDI_SEM_EVENT_SCENARIO_START_FAILED,
      (INT64)ProviderGuid,
      Eid,
      (INT64)ScenarioInstanceId,
      a5);
  if( v4 )
    WdipSemDeleteTransitionalInstance(v4);
LABEL_12:
  ExReleasePushLockEx((ULONG_PTR)&ExBootDevicesRemovedEvent + 4472, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( v5 )
  {
    v13 = (_ETHREAD *)KeGetCurrentThread();
    --v13->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&ExBootDevicesRemovedEvent + 559, 0i64);
    if( *(&ExBootDevicesRemovedEvent + 4464) )
      WdipSemShutdown();
    ExReleasePushLockEx((ULONG_PTR)&ExBootDevicesRemovedEvent + 4472, 0);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  return a5;
}

Referenced by:

WdipStartEndScenario