PspConvertSiloToServerSilo
INT64 __stdcall PspConvertSiloToServerSilo(_EJOB *Silo, INT8 PreviousMode, PVOID ServerSiloDeleteEvent){
unsigned __int8 v3;
unsigned __int8 v4;
unsigned int v8;
_ESERVERSILO_GLOBALS *PoolWithTag;
_ESERVERSILO_GLOBALS *v11;
int SiloRootDirectoryPath;
_ETHREAD *CurrentThread;
volatile INT32 *v14;
INT64 v15;
char v16;
PVOID v17;
v4 = v3;
v8 = 0;
if( PsIsCurrentThreadInServerSilo() )
return 3221225569i64;
PoolWithTag = (_ESERVERSILO_GLOBALS *)ExAllocatePoolWithTag(NonPagedPoolNxCacheAligned, 0x4A0ui64, 0x476C6953ui64);
v11 = PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
memset((INT64)PoolWithTag, 0i64);
v11->State = SERVERSILO_INITING;
v11->ExitStatus = 259;
v11->IsDownlevelContainer = v4;
if( ServerSiloDeleteEvent )
{
SiloRootDirectoryPath = ObpReferenceObjectByHandleWithTag(
(ULONG_PTR)ServerSiloDeleteEvent,
2,
(__int64)ExEventObjectType,
PreviousMode,
0x65446953u,
(__int64)&v11->DeleteEvent,
0i64,
0i64);
if( SiloRootDirectoryPath < 0 )
goto LABEL_7;
}
SiloRootDirectoryPath = ObGetSiloRootDirectoryPath(Silo, &v11->SiloRootDirectoryName);
if( SiloRootDirectoryPath < 0
|| ((CurrentThread = (_ETHREAD *)KeGetCurrentThread(),
PspLockJobExclusive((__int64)Silo, (__int64)CurrentThread),
PsIsServerSilo((INT64)Silo, v14),
!v16) ? (!PsGetParentSilo(v15) ? (!PspJobHasChildren((INT64)Silo) ? ((Silo->LimitFlags & 0x400000) != 0 ? (Silo->ServerSiloGlobals = v11, SiloRootDirectoryPath = 0) : (SiloRootDirectoryPath = -1073741811)) : (SiloRootDirectoryPath = -1073740529)) : (SiloRootDirectoryPath = -1073741791)) : (SiloRootDirectoryPath = -1073740536),
PspUnlockJob((__int64)Silo, (__int64)CurrentThread),
SiloRootDirectoryPath < 0) )
{
LABEL_7:
PspDeleteServerSiloGlobals(v11);
return(unsigned int)SiloRootDirectoryPath;
}
else
{
EtwTraceJobServerSiloStateChange((INT64)Silo, 0i64);
if( (int)PspQueueDeferredWorkAndWait(v17) < 0 )
return(unsigned int)-1073740955;
return v8;
}
}Referenced by:
NtSetInformationJobObject