EtwpSetSoftRestartInformation
NTSTATUS __fastcall EtwpSetSoftRestartInformation(__int64 a1, unsigned int a2){
NTSTATUS result;
UINT64 v5;
_ETHREAD *CurrentThread;
_WMI_LOGGER_CONTEXT *v7;
_WMI_LOGGER_CONTEXT *v8;
NTSTATUS v9;
VOID **SoftRestartContext;
char v11;
_UNICODE_STRING DestinationString;
_UNICODE_STRING UserString[3];
DestinationString = 0i64;
UserString[0] = 0i64;
if( !EtwpKsrCallbackObject || PsIsCurrentThreadInServerSilo() )
return -1073741637;
if( a2 < 0x18 )
return -1073741811;
RtlInitUnicodeString(&DestinationString, 0i64);
UserString[0].Buffer = (wchar_t *)(a1 + 18);
UserString[0].Length = a2 - 18;
UserString[0].MaximumLength = a2 - 18;
if( (_WORD)a2 == 18 || (result = EtwpCaptureString(UserString, &DestinationString), result >= 0) )
{
v11 = *(_BYTE *)(a1 + 16);
v5 = (unsigned __int16)*(_QWORD *)(a1 + 8);
if( (_DWORD)v5 == 0xFFFF )
v5 = *(unsigned __int8 *)(EtwpHostSiloState + 4208);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v7 = EtwpAcquireLoggerContextByLoggerId((_ETW_SILODRIVERSTATE *)EtwpHostSiloState, v5, 1u);
v8 = v7;
if( !v7 )
{
v9 = -1073741162;
goto LABEL_32;
}
v9 = EtwpCheckLoggerControlAccess(0x80ui64, v7);
if( v9 >= 0 )
{
SoftRestartContext = (VOID **)v8->SoftRestartContext;
if( !v11 )
{
if( SoftRestartContext && *((_BYTE *)SoftRestartContext + 32) )
{
EtwpCancelMemoryPreservation(v8);
RtlFreeAnsiString((_UNICODE_STRING *)SoftRestartContext + 1);
*((_BYTE *)SoftRestartContext + 32) = 0;
v9 = 0;
}
else
{
v9 = -1073741054;
}
goto LABEL_32;
}
if( !SoftRestartContext )
{
SoftRestartContext = ExAllocatePoolWithTag(1ui64, 0x28ui64, 1266119749i64);
if( !SoftRestartContext )
{
v9 = -1073741801;
goto LABEL_32;
}
*(_OWORD *)SoftRestartContext = 0i64;
*((_OWORD *)SoftRestartContext + 1) = 0i64;
SoftRestartContext[4] = 0i64;
v8->SoftRestartContext = (struct _ETW_SOFT_RESTART_CONTEXT *)SoftRestartContext;
}
if( *((_BYTE *)SoftRestartContext + 32) )
{
v9 = -1073741053;
}
else if( DestinationString.Length )
{
if( (v8->LoggerMode & 0x400) == 0 || v8->PoolType == PagedPool || (v8->BufferSize & 0xFFF) != 0 )
{
v9 = -1073741637;
}
else
{
*((_UNICODE_STRING *)SoftRestartContext + 1) = DestinationString;
DestinationString.Buffer = 0i64;
*((_BYTE *)SoftRestartContext + 32) = 1;
v9 = 0;
if( EtwpKsrPrepared )
{
v9 = EtwpPreserveLogger(v8);
if( v9 < 0 )
{
*((_BYTE *)SoftRestartContext + 32) = 0;
RtlFreeAnsiString((_UNICODE_STRING *)SoftRestartContext + 1);
}
}
}
}
else
{
v9 = -1073741672;
}
}
LABEL_32:
if( v8 )
EtwpReleaseLoggerContext(v8, 1u);
RtlFreeAnsiString(&DestinationString);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v9;
}
return result;
}Referenced by:
EtwSetPerformanceTraceInformation