PsOpenThread
__int64 __fastcall PsOpenThread(VOID **a1, unsigned int a2, __int64 a3, _OWORD *a4, char a5, CHAR PreviousMode){
int v10;
__int64 v11;
bool v12;
unsigned int v13;
char v14;
CHAR v15;
NTSTATUS v16;
INT8 v17;
_KPROCESSOR_MODE AccessMode;
char v20;
CHAR v21;
PETHREAD Thread;
_HANDLE ThreadId[4];
unsigned int HandleAttributes;
unsigned int HandleAttributes_4;
_HANDLE v26;
unsigned int v27;
unsigned int v28;
_HANDLE v29;
_HANDLE v30;
unsigned int v31;
NTSTATUS v32;
VOID *Handle;
VOID **v34;
__int64 v35;
_SECURITY_SUBJECT_CONTEXT v36[5];
_AUX_ACCESS_DATA AuxData;
_EVENT_DATA_DESCRIPTOR UserData;
_HANDLE *v39;
__int64 v40;
unsigned int *v41;
__int64 v42;
int *v43;
__int64 v44;
_EVENT_DATA_DESCRIPTOR v45;
unsigned int *p_HandleAttributes_4;
__int64 v47;
_HANDLE *v48;
__int64 v49;
unsigned int *v50;
__int64 v51;
int *v52;
__int64 v53;
char *v54;
__int64 v55;
char *v56;
__int64 v57;
__int64 *v58;
__int64 v59;
v34 = a1;
Handle = 0i64;
Thread = 0i64;
*(_OWORD *)ThreadId = 0i64;
memset(v36, 0i64, sizeof(v36));
memset(&AuxData, 0i64, sizeof(AuxData));
v10 = 0;
if( a5 )
{
v11 = (__int64)a1;
if( (unsigned __int64)a1 >= 0x7FFFFFFF0000i64 )
v11 = 0x7FFFFFFF0000i64;
*(_QWORD *)v11 = *(_QWORD *)v11;
if( (a3 & 3) == 0 )
{
v12 = *(_QWORD *)(a3 + 16) != 0i64;
v13 = *(_DWORD *)(a3 + 24) & 0x1DF2;
HandleAttributes = v13;
if( !a4 )
{
v14 = 0;
goto LABEL_8;
}
if( ((unsigned __int8)a4 & 3) == 0 )
{
*(_OWORD *)ThreadId = *a4;
v14 = 1;
v13 = HandleAttributes;
LABEL_8:
v15 = PreviousMode;
goto LABEL_11;
}
}
ExRaiseDatatypeMisalignment();
}
v12 = *(_QWORD *)(a3 + 16) != 0i64;
v15 = PreviousMode;
v13 = *(_DWORD *)(a3 + 24) & (PreviousMode != 0 ? 7666 : 73714);
if( a4 )
{
*(_OWORD *)ThreadId = *a4;
v14 = 1;
}
else
{
v14 = 0;
}
LABEL_11:
if( v12 || !v14 )
{
v16 = -1073741776;
}
else
{
while( 1 )
{
v16 = SeCreateAccessState((_ACCESS_STATE *)v36, &AuxData, a2, (_GENERIC_MAPPING *)((char *)PsThreadType + 76));
if( v16 < 0 )
break;
if( (v13 & 0x400) == 0 || (v17 = 1, v10) )
v17 = v15;
if( SeSinglePrivilegeCheck(*(_QWORD *)&SeDebugPrivilege, v17) )
{
if( ((__int64)v36[0].PrimaryToken & 0x2000000) != 0 )
HIDWORD(v36[0].PrimaryToken) |= 0x1FFFFFu;
else
HIDWORD(v36[0].PrimaryToken) |= LODWORD(v36[0].PrimaryToken);
LODWORD(v36[0].PrimaryToken) = 0;
}
if( *(_QWORD *)ThreadId )
{
v16 = PsLookupProcessThreadByCid((__int64)ThreadId, 0i64, (PADAPTER_OBJECT *)&Thread);
if( v16 < 0 )
{
LABEL_27:
SepDeleteAccessState((_ACCESS_STATE *)v36);
SeReleaseSubjectContext(&v36[1]);
break;
}
}
else
{
v16 = PsLookupThreadByThreadId(*(VOID **)&ThreadId[2], &Thread);
if( v16 < 0 )
goto LABEL_27;
*(_QWORD *)ThreadId = Thread->Cid.UniqueProcess;
}
LOBYTE(AccessMode) = v15;
v16 = ObOpenObjectByPointer(Thread, v13, (PACCESS_STATE)v36, 0, (POBJECT_TYPE)PsThreadType, AccessMode, &Handle);
SepDeleteAccessState((_ACCESS_STATE *)v36);
SeReleaseSubjectContext(&v36[1]);
HalPutDmaAdapter((PADAPTER_OBJECT)Thread);
if( v16 >= 0 )
{
*v34 = Handle;
if( v10 && *(&stru_140C00F40 + 732) > 5u && tlgKeywordOn((__int64)&stru_140C00F40 + 2928, 0x400000000000i64) )
{
HandleAttributes_4 = (unsigned int)PsGetThreadId(Thread);
p_HandleAttributes_4 = &HandleAttributes_4;
v47 = 4i64;
v26 = ThreadId[0];
v48 = &v26;
v49 = 4i64;
v27 = a2;
v50 = &v27;
v51 = 4i64;
v28 = v13;
v52 = (int *)&v28;
v53 = 4i64;
v20 = a5;
v54 = &v20;
v55 = 1i64;
v21 = v15;
v56 = &v21;
v57 = 1i64;
v35 = 0x1000000i64;
v58 = &v35;
v59 = 8i64;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&stru_140C00F40 + 2928,
(unsigned __int8 *)byte_14002B200,
0i64,
0i64,
9u,
&v45);
}
break;
}
if( (v13 & 0x400) == 0 || v16 != -1073741790 || v10 )
break;
v10 = 1;
}
}
v32 = v16;
v31 = a2;
v30 = ThreadId[2];
v29 = ThreadId[0];
UserData.Ptr = (unsigned __int64)&v29;
*(_QWORD *)&UserData.Size = 4i64;
v39 = &v30;
v40 = 4i64;
v41 = &v31;
v42 = 4i64;
v43 = &v32;
v44 = 4i64;
EtwWrite(*(&ExBootDevicesRemovedEvent + 379), &KERNEL_AUDIT_API_OPENTHREAD, 0, 4u, &UserData);
return(unsigned int)v16;
}Referenced by:
NtAlpcOpenSenderThread
NtOpenThread