PsOpenProcess
__int64 __fastcall PsOpenProcess(VOID **a1, unsigned int a2, __int64 a3, _OWORD *a4, char a5, CHAR a6){
int v10;
__int64 v11;
bool v12;
char v13;
CHAR v14;
int v15;
NTSTATUS v16;
int v17;
_GENERIC_MAPPING *GenericMapping;
_EPROCESS *v19;
int v20;
INT8 v21;
_LUID v22;
INT8 v23;
INT8 v24;
NTSTATUS v25;
_GENERIC_MAPPING *v26;
int v27;
int v28;
_KPROCESSOR_MODE AccessMode;
char v31;
CHAR v32;
UINT64 DesiredAccess;
int v34;
_EPROCESS *Process;
unsigned int v36;
int UniqueProcessId;
unsigned int v38;
UINT64 v39;
int v40;
int v41;
NTSTATUS v42;
PADAPTER_OBJECT DmaAdapter;
VOID *Handle;
VOID *ProcessId[2];
__int64 v46;
VOID **v47;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
_SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
PRIVILEGE_SET RequiredPrivileges;
int v51[40];
_AUX_ACCESS_DATA AuxData;
_EVENT_DATA_DESCRIPTOR UserData;
int *v54;
__int64 v55;
int *v56;
__int64 v57;
_EVENT_DATA_DESCRIPTOR v58;
unsigned int *v59;
__int64 v60;
UINT64 *v61;
__int64 v62;
__int64 v63;
__int64 v64;
char *v65;
__int64 v66;
char *v67;
__int64 v68;
__int64 *v69;
__int64 v70;
LODWORD(DesiredAccess) = a2;
v47 = a1;
v36 = a2;
memset(v51, 0i64, sizeof(v51));
memset(&AuxData, 0i64, sizeof(AuxData));
*(_OWORD *)ProcessId = 0i64;
Handle = 0i64;
DmaAdapter = 0i64;
v10 = 0;
v34 = 0;
Process = 0i64;
UniqueProcessId = -1;
if( a5 )
{
v11 = (__int64)a1;
if( (unsigned __int64)a1 >= 0x7FFFFFFF0000i64 )
v11 = 0x7FFFFFFF0000i64;
*(_QWORD *)v11 = *(_QWORD *)v11;
if( (a3 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v12 = *(_QWORD *)(a3 + 16) != 0i64;
HIDWORD(DesiredAccess) = *(_DWORD *)(a3 + 24) & 0x1DF2;
if( a4 )
{
if( ((unsigned __int8)a4 & 3) != 0 )
ExRaiseDatatypeMisalignment();
*(_OWORD *)ProcessId = *a4;
v13 = 1;
}
else
{
v13 = 0;
}
v14 = a6;
}
else
{
v12 = *(_QWORD *)(a3 + 16) != 0i64;
v15 = 73714;
v14 = a6;
if( a6 )
v15 = 7666;
HIDWORD(DesiredAccess) = *(_DWORD *)(a3 + 24) & v15;
if( a4 )
{
*(_OWORD *)ProcessId = *a4;
v13 = 1;
}
else
{
v13 = 0;
}
}
if( v12 || !v13 )
{
v16 = -1073741776;
goto LABEL_45;
}
if( ProcessId[1] )
{
v16 = PsLookupProcessThreadByCid((__int64)ProcessId, (_MDL **)&Process, &DmaAdapter);
if( v16 >= 0 )
{
HalPutDmaAdapter(DmaAdapter);
goto LABEL_21;
}
LABEL_45:
v28 = DesiredAccess;
goto LABEL_46;
}
v16 = PsLookupProcessByProcessId(ProcessId[0], &Process);
if( v16 < 0 )
goto LABEL_45;
LABEL_21:
UniqueProcessId = (int)Process->UniqueProcessId;
v17 = 0;
GenericMapping = (_GENERIC_MAPPING *)((char *)PsProcessType + 76);
v19 = KeGetCurrentThread()->ApcState.Process;
memset(&SubjectContext, 0, sizeof(SubjectContext));
SeCaptureSubjectContextEx((PETHREAD)KeGetCurrentThread(), v19, &SubjectContext);
SepCreateAccessStateFromSubjectContext(&SubjectContext, (_ACCESS_STATE *)v51, &AuxData, a2, GenericMapping);
v16 = v20;
if( v20 < 0 )
{
LABEL_38:
v10 = 0;
goto LABEL_45;
}
v10 = 1;
v34 = 1;
while( 1 )
{
if( (DesiredAccess & 0x40000000000i64) == 0 || (v21 = 1, v17) )
v21 = v14;
v22 = SeDebugPrivilege;
memset(&SubjectSecurityContext, 0, sizeof(SubjectSecurityContext));
SeCaptureSubjectContextEx(
(PETHREAD)KeGetCurrentThread(),
KeGetCurrentThread()->ApcState.Process,
&SubjectSecurityContext);
RequiredPrivileges.PrivilegeCount = 1;
RequiredPrivileges.Control = 1;
RequiredPrivileges.Privilege[0].Luid = v22;
RequiredPrivileges.Privilege[0].Attributes = 0;
v23 = SePrivilegeCheck((UINT64 *)&RequiredPrivileges.PrivilegeCount, (INT64)&SubjectSecurityContext, v21);
v24 = v23;
if( v21 )
SePrivilegedServiceAuditAlarm(0i64, &SubjectSecurityContext, &RequiredPrivileges, v23);
SeReleaseSubjectContext(&SubjectSecurityContext);
if( v24 )
{
if( (v51[4] & 0x2000000) != 0 )
v51[5] |= 0x1FFFFFu;
else
v51[5] |= v51[4];
v51[4] = 0;
}
LOBYTE(AccessMode) = v14;
v25 = ObOpenObjectByPointer(
Process,
HIDWORD(DesiredAccess),
(PACCESS_STATE)v51,
0,
(POBJECT_TYPE)PsProcessType,
AccessMode,
&Handle);
v16 = v25;
if( v25 >= 0 )
break;
if( (DesiredAccess & 0x40000000000i64) == 0 || v25 != -1073741790 || v17 )
goto LABEL_45;
v17 = 1;
SeDeleteAccessState((_ACCESS_STATE *)v51);
v26 = (_GENERIC_MAPPING *)((char *)PsProcessType + 76);
memset(&SubjectContext, 0, sizeof(SubjectContext));
SeCaptureSubjectContextEx((PETHREAD)KeGetCurrentThread(), KeGetCurrentThread()->ApcState.Process, &SubjectContext);
SepCreateAccessStateFromSubjectContext(
&SubjectContext,
(_ACCESS_STATE *)v51,
&AuxData,
(unsigned int)DesiredAccess,
v26);
v16 = v27;
if( v27 < 0 )
goto LABEL_38;
}
if( v17 && *(&stru_140C00F40 + 732) > 5u && tlgKeywordOn((__int64)&stru_140C00F40 + 2928, 0x400000000000i64) )
{
v38 = (unsigned int)PsGetProcessId(Process);
v59 = &v38;
v60 = 4i64;
v39 = DesiredAccess;
v61 = &v39;
v62 = 4i64;
v63 = (__int64)&v39 + 4;
v64 = 4i64;
v31 = a5;
v65 = &v31;
v66 = 1i64;
v32 = v14;
v67 = &v32;
v68 = 1i64;
v46 = 0x1000000i64;
v69 = &v46;
v70 = 8i64;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&stru_140C00F40 + 2928,
(unsigned __int8 *)&word_14002B29E,
0i64,
0i64,
8u,
&v58);
}
*v47 = Handle;
v28 = DesiredAccess;
LABEL_46:
v42 = v16;
v41 = v28;
v40 = UniqueProcessId;
UserData.Ptr = (unsigned __int64)&v40;
*(_QWORD *)&UserData.Size = 4i64;
v54 = &v41;
v55 = 4i64;
v56 = &v42;
v57 = 4i64;
EtwWrite(*(&ExBootDevicesRemovedEvent + 379), &KERNEL_AUDIT_API_OPENPROCESS, 0, 3u, &UserData);
if( v10 )
SeDeleteAccessState((_ACCESS_STATE *)v51);
if( Process )
HalPutDmaAdapter((PADAPTER_OBJECT)Process);
return(unsigned int)v16;
}Referenced by:
NtAlpcOpenSenderProcess
NtOpenProcess