PspCreateSilo
NTSTATUS __stdcall PspCreateSilo(_EJOB *Job){
_ETHREAD *CurrentThread;
CHAR *v2;
NTSTATUS result;
NTSTATUS v5;
__int64 v6;
CHAR *v7;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v2 = 0i64;
v7 = 0i64;
if( PsIsCurrentThreadInServerSilo() )
return -1073741727;
if( !Job->Storage )
{
result = PspAllocStorage(&v7);
if( result < 0 )
return result;
v2 = v7;
}
PspLockJobExclusive((__int64)Job, (__int64)CurrentThread);
if( PspJobHasChildren((INT64)Job) )
{
v5 = -1073740529;
}
else if( (Job->JobFlags & 0x40000000) != 0 )
{
v5 = -1073740536;
}
else if( (Job->LimitFlags & 0x402000) != 0 )
{
v6 = -(__int64)(_InterlockedCompareExchange64((volatile signed __int64 *)&Job->Storage, (signed __int64)v2, 0i64) != 0);
v7 = (CHAR *)(v6 & (unsigned __int64)v7);
_InterlockedOr((volatile signed __int32 *)&Job->1320, 0x40000000u);
v2 = v7;
v5 = 0;
}
else
{
v5 = -1073741811;
}
PspUnlockJob((__int64)Job, (__int64)CurrentThread);
if( v2 )
PspFreeStorage((INT64)v2);
return v5;
}Referenced by:
NtSetInformationJobObject