WdipSemDisableScenario
NTSTATUS __stdcall WdipSemDisableScenario(const _GUID *ProviderGuid, UINT16 Eid, const _GUID *ScenarioInstanceId){
_ETHREAD *CurrentThread;
_WDIP_SEM_SCENARIO_INSTANCE_INFO *v4;
char v5;
int a5;
_WDIP_SEM_SCENARIO_INSTANCE_INFO *v10;
_ETHREAD *v12;
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 )
{
v5 = 1;
goto LABEL_8;
}
v10 = WdipSemMarkInstanceForDeletion((_GUID *)ScenarioInstanceId);
v4 = v10;
if( !v10 )
{
LABEL_14:
a5 = -1073741823;
goto LABEL_15;
}
a5 = WdipSemValidateEndEvent((_GUID *)ProviderGuid, Eid, *((_WDIP_SEM_SCENARIO_INFO **)v10 + 4));
if( a5 < 0 )
goto LABEL_15;
WdipSemDisableContextProviders(v4, 0);
LABEL_8:
if( a5 >= 0 )
{
if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 560), &WDI_SEM_EVENT_SCENARIO_END) )
WdipSemWriteSemActionsEvent((_GUID *)&WDI_SEM_EVENT_SCENARIO_END, (INT64)v4);
WdipSemDeleteTransitionalInstance(v4);
goto LABEL_12;
}
LABEL_15:
if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 560), &WDI_SEM_EVENT_SCENARIO_END_FAILED) )
WdipSemWriteSemFailureEvent(
(const in6_addr *)&WDI_SEM_EVENT_SCENARIO_END_FAILED,
(INT64)ProviderGuid,
Eid,
(INT64)ScenarioInstanceId,
a5);
if( v4 )
WdipSemActivateInstance(v4);
LABEL_12:
ExReleasePushLockEx((ULONG_PTR)&ExBootDevicesRemovedEvent + 4472, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v5 )
{
v12 = (_ETHREAD *)KeGetCurrentThread();
--v12->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