PspCombineSecurityDomains
NTSTATUS __stdcall PspCombineSecurityDomains(PVOID Object, PVOID a2){
__int64 v4;
__int64 v5;
NTSTATUS AccessState;
NTSTATUS v7;
signed __int64 v9;
int v10[8];
POBJECT_TYPE ObjectType;
HANDLE v12;
HANDLE Handle;
INT64 result[4];
struct _SECURITY_SUBJECT_CONTEXT SubjectContext;
__int64 v16[28];
memset((INT64)result, 0i64);
memset((INT64)v16, 0i64);
if( (*((_DWORD *)Object + 543) & 0x400000) == 0 || (*((_DWORD *)a2 + 543) & 0x400000) == 0 )
return -1073741700;
_InterlockedOr(v10, 0);
v4 = *((_QWORD *)Object + 316);
v5 = *((_QWORD *)a2 + 316);
if( v4 == v5 )
return 0;
if( !v4 || !v5 || *((int *)Object + 628) < 0 || *((int *)a2 + 628) < 0 )
return -1073740699;
Handle = 0i64;
v12 = 0i64;
LODWORD(ObjectType) = 40;
AccessState = SeCreateAccessStateEx(
0i64,
(_EPROCESS *)a2,
(_ACCESS_STATE *)result,
(_AUX_ACCESS_DATA *)v16,
(UINT64)ObjectType,
(_GENERIC_MAPPING *)((char *)PsProcessType + 76));
if( AccessState >= 0 )
{
v7 = ObOpenObjectByPointer(Object, 0x600u, (PACCESS_STATE)result, 0, (POBJECT_TYPE)PsProcessType, 0, &Handle);
AccessState = v7;
if( v7 >= 0 )
{
SepDeleteAccessState((ACCESS_STATE *)result);
SeReleaseSubjectContext(&SubjectContext);
LODWORD(ObjectType) = 40;
AccessState = SeCreateAccessStateEx(
0i64,
(_EPROCESS *)Object,
(_ACCESS_STATE *)result,
(_AUX_ACCESS_DATA *)v16,
(UINT64)ObjectType,
(_GENERIC_MAPPING *)((char *)PsProcessType + 76));
if( AccessState < 0 )
goto LABEL_14;
v7 = ObOpenObjectByPointer(a2, 0x600u, (PACCESS_STATE)result, 0, (POBJECT_TYPE)PsProcessType, 0, &v12);
AccessState = v7;
if( v7 >= 0 )
{
_InterlockedOr((volatile signed __int32 *)Object + 543, 0x200000u);
*((_QWORD *)Object + 316) = *((_QWORD *)a2 + 316);
if( (*((_DWORD *)Object + 628) | *((_DWORD *)a2 + 628)) < 0 )
{
v9 = _InterlockedIncrement64(&PsNextSecurityDomain);
AccessState = -1073740699;
*((_QWORD *)Object + 316) = v9;
*((_QWORD *)Object + 317) = v9;
}
KeSynchronizeSecurityDomain((__int64)Object);
goto LABEL_13;
}
v12 = 0i64;
}
else
{
Handle = 0i64;
}
if( v7 == -1073741790 )
AccessState = -1073740699;
LABEL_13:
SepDeleteAccessState((ACCESS_STATE *)result);
SeReleaseSubjectContext(&SubjectContext);
}
LABEL_14:
if( v12 )
ObCloseHandle(v12, 0);
if( Handle )
ObCloseHandle(Handle, 0);
return AccessState;
}Referenced by:
NtSetInformationProcess