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