EtwInitializeSiloState
NTSTATUS __stdcall EtwInitializeSiloState(_EJOB *ServerSilo){
VOID *PoolWithTag;
NTSTATUS v3;
INT64 v4;
INT64 v5;
WCHAR v6;
unsigned int MaximumProcessorCount;
VOID *v8;
__int64 v9;
unsigned __int64 v10;
__int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
_WORD *v14;
_QWORD *v15;
__int64 v16;
_QWORD *v17;
__int64 v18;
__int64 v19;
char *v20;
__int64 v21;
_EJOB *v22;
UINT8 IsHostSilo;
_EJOB *v24;
_ETHREAD *CurrentThread;
INT64 v26;
unsigned int i;
__int64 v29;
void *v30;
void *v31;
void *v32;
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNxCacheAligned, 0x1220ui64, 0x61777445ui64);
v3 = 0;
v4 = (INT64)PoolWithTag;
if( !PoolWithTag )
return -1073741801;
memset((INT64)PoolWithTag + 8, 0i64);
*(_QWORD *)v4 = ServerSilo;
*(_QWORD *)(v4 + 8) = PsGetServerSiloGlobals((__int64)ServerSilo);
EtwpReadPerSiloConfigParameters(v4, v5, v6);
MaximumProcessorCount = KeQueryMaximumProcessorCountEx(0xFFFFu);
v8 = ExAllocatePoolWithTag(
NonPagedPoolNxCacheAligned,
MaximumProcessorCount * (24 * *(_DWORD *)(v4 + 16) + 64),
0x61777445ui64);
*(_QWORD *)(v4 + 4136) = v8;
if( !v8 )
goto LABEL_29;
memset((INT64)v8, 0i64);
v9 = MaximumProcessorCount;
v10 = *(_QWORD *)(v4 + 4136) + ((unsigned __int64)MaximumProcessorCount << 6);
if( MaximumProcessorCount )
{
v11 = 0i64;
do
{
*(_QWORD *)(v11 + *(_QWORD *)(v4 + 4136)) = v10;
v11 += 64i64;
v12 = v10 + 8i64 * *(unsigned int *)(v4 + 16);
*(_QWORD *)(v11 + *(_QWORD *)(v4 + 4136) - 56) = v12;
v13 = v12 + 8i64 * *(unsigned int *)(v4 + 16);
*(_QWORD *)(v11 + *(_QWORD *)(v4 + 4136) - 48) = v13;
v10 = v13 + 8i64 * *(unsigned int *)(v4 + 16);
--v9;
}
while( v9 );
}
v14 = (_WORD *)(v4 + 4048);
*(_WORD *)(v4 + 4048) = 3;
v15 = (_QWORD *)(v4 + 464);
v16 = 64i64;
do
{
v15[6] = 0i64;
v17 = v15;
v18 = 3i64;
do
{
v17[1] = v17;
*v17 = v17;
v17 += 2;
--v18;
}
while( v18 );
v15 += 7;
--v16;
}
while( v16 );
v19 = (unsigned int)(8 * *(_DWORD *)(v4 + 16));
v20 = (char *)ExAllocatePoolWithTag(
NonPagedPoolNxCacheAligned,
(unsigned int)(16 * *(_DWORD *)(v4 + 16)),
0x61777445ui64);
*(_QWORD *)(v4 + 448) = v20;
if( !v20 )
{
LABEL_29:
v30 = *(void **)(v4 + 4136);
if( v30 )
ExFreePoolWithTag(v30, 0x61777445u);
v31 = *(void **)(v4 + 448);
if( v31 )
ExFreePoolWithTag(v31, 0x61777445u);
v32 = *(void **)(v4 + 4192);
if( v32 )
ExFreePoolWithTag(v32, 0x61777445u);
ExFreePoolWithTag((PVOID)v4, 0x61777445u);
return -1073741801;
}
*(_QWORD *)(v4 + 456) = &v20[v19];
memset((INT64)v20, 0i64);
v21 = 0i64;
if( *(_DWORD *)(v4 + 16) )
{
while( 1 )
{
*(_QWORD *)(*(_QWORD *)(v4 + 456) + 8 * v21) = 1i64;
*(_QWORD *)(*(_QWORD *)(v4 + 448) + 8 * v21) = ExAllocateCacheAwareRundownProtection(NonPagedPoolNx, 0x63777445u);
if( !*(_QWORD *)(*(_QWORD *)(v4 + 448) + 8 * v21) )
break;
v21 = (unsigned int)(v21 + 1);
if( (unsigned int)v21 >= *(_DWORD *)(v4 + 16) )
goto LABEL_14;
}
if( (_DWORD)v21 )
{
v29 = 0i64;
do
{
ExFreeCacheAwareRundownProtection(*(PEX_RUNDOWN_REF_CACHE_AWARE *)(*(_QWORD *)(v4 + 448) + v29));
v29 += 8i64;
--v21;
}
while( v21 );
}
goto LABEL_29;
}
LABEL_14:
*(_QWORD *)(v4 + 416) = v4;
*(_QWORD *)(v4 + 432) = 0i64;
*(_OWORD *)(v4 + 64) = SecurityProviderGuid;
KeInitializeMutex((_KMUTANT *)(v4 + 4584), 0i64);
PsGetServerSiloGlobals((__int64)ServerSilo)[108] = v4;
IsHostSilo = PsIsHostSilo(v22);
if( IsHostSilo )
{
qword_140C10DC8 = *(_QWORD *)(v4 + 456);
EtwpHostSiloState = v4;
qword_140C10DD0 = v4;
ExSubscribeWnfStateChange(
(struct _EX_RUNDOWN_REF **)(v4 + 4144),
(INT64 *)&WNF_CONT_RESTORE_FROM_SNAPSHOT_COMPLETE,
1i64,
0i64,
(INT64)EtwpContainerResumeWnfCallback,
0i64);
}
v24 = PsAttachSiloToCurrentThread(ServerSilo);
EtwpQueryPartitionRegistryInformation(
(_GUID *)(v4 + 4152),
(PVOID *)(v4 + 4192),
(_WORD *)(v4 + 4200),
(_DWORD *)(v4 + 4204),
v4 + 4184,
v4 + 4168);
if( IsHostSilo )
qword_140D577C8 = KeQueryPerformanceCounter(0i64).QuadPart;
EtwpInitializeAutoLoggers();
if( IsHostSilo )
qword_140D577D0 = KeQueryPerformanceCounter(0i64).QuadPart;
PsDetachSiloFromCurrentThread(v24);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(v4 + 432, 0i64);
v26 = v4 + 156;
*(_QWORD *)(v4 + 440) = KeGetCurrentThread();
for( i = 0; i < 8; ++i )
{
if( *v14 )
{
*(_WORD *)(v26 + 2) = *v14;
*(_DWORD *)(v26 - 4) = 1;
*(_BYTE *)v26 = -1;
*(_QWORD *)(v26 + 12) = -1i64;
*(_QWORD *)(v26 + 20) = 0i64;
*(_DWORD *)(v26 + 4) = 64;
*(_BYTE *)(v4 + 4064) |= 1 << i;
}
++v14;
v26 += 32i64;
}
*(_QWORD *)(v4 + 440) = 0i64;
ExReleasePushLockEx(v4 + 432, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
*(_QWORD *)(v4 + 4096) = 0i64;
*(_QWORD *)(v4 + 4080) = 0i64;
*(_QWORD *)(v4 + 4088) = 0i64;
return v3;
}Referenced by:
EtwpInitialize
PspInitializeServerSiloDeferred