EtwInitializeSiloState
NTSTATUS __stdcall EtwInitializeSiloState(_EJOB *ServerSilo){
VOID **PoolWithTag;
NTSTATUS v3;
__int64 v4;
__int64 v5;
WCHAR v6;
unsigned int v7;
unsigned int v8;
size_t v9;
VOID **v10;
__int64 v11;
unsigned __int64 v12;
__int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
_WORD *v16;
_QWORD *v17;
__int64 v18;
_QWORD *v19;
__int64 v20;
__int64 v21;
size_t v22;
VOID **v23;
__int64 v24;
_EJOB *v25;
UINT8 IsHostSilo;
_EJOB *v27;
_EJOB *v28;
_ETHREAD *CurrentThread;
__int64 v30;
unsigned int i;
__int64 v33;
void *v34;
void *v35;
void *v36;
PoolWithTag = ExAllocatePoolWithTag(0x204ui64, 0x1220ui64, 1635218501i64);
v3 = 0;
v4 = (__int64)PoolWithTag;
if( !PoolWithTag )
return -1073741801;
memset(PoolWithTag + 1, 0i64, 0x1218u);
*(_QWORD *)v4 = ServerSilo;
*(_QWORD *)(v4 + 8) = PsGetServerSiloGlobals(ServerSilo);
EtwpReadPerSiloConfigParameters(v4, v5, v6);
KeQueryMaximumProcessorCountEx(0xFFFFu);
v8 = v7;
v9 = v7 * (24 * *(_DWORD *)(v4 + 16) + 64);
v10 = ExAllocatePoolWithTag(0x204ui64, v9, 1635218501i64);
*(_QWORD *)(v4 + 4136) = v10;
if( !v10 )
goto LABEL_29;
memset(v10, 0i64, v9);
v11 = v8;
v12 = *(_QWORD *)(v4 + 4136) + ((unsigned __int64)v8 << 6);
if( v8 )
{
v13 = 0i64;
do
{
*(_QWORD *)(v13 + *(_QWORD *)(v4 + 4136)) = v12;
v13 += 64i64;
v14 = v12 + 8i64 * *(unsigned int *)(v4 + 16);
*(_QWORD *)(v13 + *(_QWORD *)(v4 + 4136) - 56) = v14;
v15 = v14 + 8i64 * *(unsigned int *)(v4 + 16);
*(_QWORD *)(v13 + *(_QWORD *)(v4 + 4136) - 48) = v15;
v12 = v15 + 8i64 * *(unsigned int *)(v4 + 16);
--v11;
}
while( v11 );
}
v16 = (_WORD *)(v4 + 4048);
*(_WORD *)(v4 + 4048) = 3;
v17 = (_QWORD *)(v4 + 464);
v18 = 64i64;
do
{
v17[6] = 0i64;
v19 = v17;
v20 = 3i64;
do
{
v19[1] = v19;
*v19 = v19;
v19 += 2;
--v20;
}
while( v20 );
v17 += 7;
--v18;
}
while( v18 );
v21 = (unsigned int)(8 * *(_DWORD *)(v4 + 16));
v22 = 16 * *(_DWORD *)(v4 + 16);
v23 = ExAllocatePoolWithTag(0x204ui64, v22, 1635218501i64);
*(_QWORD *)(v4 + 448) = v23;
if( !v23 )
{
LABEL_29:
v34 = *(void **)(v4 + 4136);
if( v34 )
ExFreePoolWithTag(v34, 0x61777445u);
v35 = *(void **)(v4 + 448);
if( v35 )
ExFreePoolWithTag(v35, 0x61777445u);
v36 = *(void **)(v4 + 4192);
if( v36 )
ExFreePoolWithTag(v36, 0x61777445u);
ExFreePoolWithTag((PVOID)v4, 0x61777445u);
return -1073741801;
}
*(_QWORD *)(v4 + 456) = (char *)v23 + v21;
memset(v23, 0i64, v22);
v24 = 0i64;
if( *(_DWORD *)(v4 + 16) )
{
while( 1 )
{
*(_QWORD *)(*(_QWORD *)(v4 + 456) + 8 * v24) = 1i64;
*(_QWORD *)(*(_QWORD *)(v4 + 448) + 8 * v24) = ExAllocateCacheAwareRundownProtection(
NonPagedPoolNx,
0x63777445ui64);
if( !*(_QWORD *)(*(_QWORD *)(v4 + 448) + 8 * v24) )
break;
v24 = (unsigned int)(v24 + 1);
if( (unsigned int)v24 >= *(_DWORD *)(v4 + 16) )
goto LABEL_14;
}
if( (_DWORD)v24 )
{
v33 = 0i64;
do
{
ExFreeCacheAwareRundownProtection(*(_QWORD *)(*(_QWORD *)(v4 + 448) + v33));
v33 += 8i64;
--v24;
}
while( v24 );
}
goto LABEL_29;
}
LABEL_14:
*(_QWORD *)(v4 + 416) = v4;
*(_QWORD *)(v4 + 432) = 0i64;
*(_OWORD *)(v4 + 64) = SecurityProviderGuid;
KeInitializeMutex((PRKMUTEX)(v4 + 4584), 0);
PsGetServerSiloGlobals(ServerSilo)->EtwSiloState = (_ETW_SILODRIVERSTATE *)v4;
IsHostSilo = PsIsHostSilo(v25);
if( IsHostSilo )
{
qword_140C10DC8 = *(_QWORD *)(v4 + 456);
EtwpHostSiloState = v4;
qword_140C10DD0 = v4;
ExSubscribeWnfStateChange(
(INT8 **)(v4 + 4144),
(INT64 *)&WNF_CONT_RESTORE_FROM_SNAPSHOT_COMPLETE,
1i64,
0i64,
(INT64)EtwpContainerResumeWnfCallback,
0i64);
}
LODWORD(v27) = PsAttachSiloToCurrentThread((INT64)ServerSilo);
v28 = v27;
EtwpQueryPartitionRegistryInformation(
(GUID *)(v4 + 4152),
(PVOID *)(v4 + 4192),
(_WORD *)(v4 + 4200),
(_DWORD *)(v4 + 4204),
v4 + 4184,
v4 + 4168);
if( IsHostSilo )
qword_140D577C8 = KeQueryPerformanceCounter(0i64);
EtwpInitializeAutoLoggers();
if( IsHostSilo )
qword_140D577D0 = KeQueryPerformanceCounter(0i64);
PsDetachSiloFromCurrentThread(v28);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(v4 + 432), 0i64);
v30 = v4 + 156;
*(_QWORD *)(v4 + 440) = KeGetCurrentThread();
for( i = 0; i < 8; ++i )
{
if( *v16 )
{
*(_WORD *)(v30 + 2) = *v16;
*(_DWORD *)(v30 - 4) = 1;
*(_BYTE *)v30 = -1;
*(_QWORD *)(v30 + 12) = -1i64;
*(_QWORD *)(v30 + 20) = 0i64;
*(_DWORD *)(v30 + 4) = 64;
*(_BYTE *)(v4 + 4064) |= 1 << i;
}
++v16;
v30 += 32i64;
}
*(_QWORD *)(v4 + 440) = 0i64;
ExReleasePushLockEx(v4 + 432, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
*(_QWORD *)(v4 + 4096) = 0i64;
*(_QWORD *)(v4 + 4080) = 0i64;
*(_QWORD *)(v4 + 4088) = 0i64;
return v3;
}Referenced by:
EtwpInitialize
PspInitializeServerSiloDeferred