PsOpenThread

INT64 __fastcall PsOpenThread(
        VOID **ThreadHandle,
        INT64 DesiredAccess,
        OBJECT_ATTRIBUTES *ObjectAttributes,
        CLIENT_ID *ClientId,
        INT64 ProbeMode,
        INT64 AccessMode,
        INT64 a7,
        INT64 a8){
  unsigned int v10; 
  int v12; 
  __int64 v13; 
  bool v14; 
  unsigned int v15; 
  char v16; 
  KPROCESSOR_MODE v17; 
  int AccessState; 
  INT8 v19; 
  char v21; 
  KPROCESSOR_MODE v22; 
  HANDLE *Thread; 
  HANDLE ThreadId[2]; 
  ULONG HandleAttributes; 
  unsigned int v26; 
  int v27; 
  unsigned int v28; 
  unsigned int v29; 
  int v30; 
  int v31; 
  unsigned int v32; 
  int v33; 
  void *Handle; 
  VOID **v35; 
  __int64 v36; 
  INT64 result[2]; 
  int v38; 
  int v39; 
  struct _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  __int64 v41[28]; 
  struct _EVENT_DATA_DESCRIPTOR UserData; 
  int *v43; 
  __int64 v44; 
  int *v45; 
  __int64 v46; 
  int *v47; 
  __int64 v48; 
  struct _EVENT_DATA_DESCRIPTOR v49; 
  unsigned int *v50; 
  __int64 v51; 
  int *v52; 
  __int64 v53; 
  int *v54; 
  __int64 v55; 
  int *v56; 
  __int64 v57; 
  char *v58; 
  __int64 v59; 
  char *v60; 
  __int64 v61; 
  __int64 *v62; 
  __int64 v63; 
  v10 = DesiredAccess;
  v35 = ThreadHandle;
  Handle = 0i64;
  Thread = 0i64;
  *(_OWORD *)ThreadId = 0i64;
  memset((INT64)result, 0i64);
  memset((INT64)v41, 0i64);
  v12 = 0;
  if( (_BYTE)ProbeMode )
  {
    v13 = (__int64)ThreadHandle;
    if( (unsigned __int64)ThreadHandle >= 0x7FFFFFFF0000i64 )
      v13 = 0x7FFFFFFF0000i64;
    *(_QWORD *)v13 = *(_QWORD *)v13;
    if( ((unsigned __int8)ObjectAttributes & 3) == 0 )
    {
      v14 = ObjectAttributes->ObjectName != 0i64;
      v15 = ObjectAttributes->Attributes & 0x1DF2;
      HandleAttributes = v15;
      if( !ClientId )
      {
        v16 = 0;
        goto LABEL_8;
      }
      if( ((unsigned __int8)ClientId & 3) == 0 )
      {
        *(CLIENT_ID *)ThreadId = *ClientId;
        v16 = 1;
        v15 = HandleAttributes;
LABEL_8:
        v17 = AccessMode;
        goto LABEL_11;
      }
    }
    ExRaiseDatatypeMisalignment();
  }
  v14 = ObjectAttributes->ObjectName != 0i64;
  v17 = AccessMode;
  v15 = ObjectAttributes->Attributes & ((_BYTE)AccessMode != 0 ? 7666 : 73714);
  if( ClientId )
  {
    *(CLIENT_ID *)ThreadId = *ClientId;
    v16 = 1;
  }
  else
  {
    v16 = 0;
  }
LABEL_11:
  if( v14 || !v16 )
  {
    AccessState = -1073741776;
  }
  else
  {
    while( 1 )
    {
      AccessState = SeCreateAccessState(
                      (_ACCESS_STATE *)result,
                      (_AUX_ACCESS_DATA *)v41,
                      v10,
                      (_GENERIC_MAPPING *)((char *)PsThreadType + 76));
      if( AccessState < 0 )
        break;
      if( (v15 & 0x400) == 0 || (v19 = 1, v12) )
        v19 = v17;
      if( SeSinglePrivilegeCheck(*(_QWORD *)&SeDebugPrivilege, v19) )
      {
        if( (v38 & 0x2000000) != 0 )
          v39 |= 0x1FFFFFu;
        else
          v39 |= v38;
        v38 = 0;
      }
      if( ThreadId[0] )
      {
        AccessState = PsLookupProcessThreadByCid((__int64)ThreadId, 0i64, (PADAPTER_OBJECT *)&Thread);
        if( AccessState < 0 )
        {
LABEL_27:
          SepDeleteAccessState((ACCESS_STATE *)result);
          SeReleaseSubjectContext(&SubjectContext);
          break;
        }
      }
      else
      {
        AccessState = PsLookupThreadByThreadId(ThreadId[1], (PETHREAD *)&Thread);
        if( AccessState < 0 )
          goto LABEL_27;
        ThreadId[0] = Thread[143];
      }
      AccessState = ObOpenObjectByPointer(
                      Thread,
                      v15,
                      (PACCESS_STATE)result,
                      0,
                      (POBJECT_TYPE)PsThreadType,
                      v17,
                      &Handle);
      SepDeleteAccessState((ACCESS_STATE *)result);
      SeReleaseSubjectContext(&SubjectContext);
      HalPutDmaAdapter((PADAPTER_OBJECT)Thread);
      if( AccessState >= 0 )
      {
        *v35 = Handle;
        if( v12 && (unsigned int)dword_140C01AB0 > 5 && tlgKeywordOn((__int64)&dword_140C01AB0, 0x400000000000i64) )
        {
          v26 = (unsigned int)PsGetThreadId((PETHREAD)Thread);
          v50 = &v26;
          v51 = 4i64;
          v27 = (int)ThreadId[0];
          v52 = &v27;
          v53 = 4i64;
          v28 = v10;
          v54 = (int *)&v28;
          v55 = 4i64;
          v29 = v15;
          v56 = (int *)&v29;
          v57 = 4i64;
          v21 = ProbeMode;
          v58 = &v21;
          v59 = 1i64;
          v22 = v17;
          v60 = &v22;
          v61 = 1i64;
          v36 = 0x1000000i64;
          v62 = &v36;
          v63 = 8i64;
          tlgWriteTransfer_EtwWriteTransfer(
            (__int64)&dword_140C01AB0,
            (unsigned __int8 *)byte_14002B200,
            0i64,
            0i64,
            9u,
            &v49);
        }
        break;
      }
      if( (v15 & 0x400) == 0 || AccessState != -1073741790 || v12 )
        break;
      v12 = 1;
    }
  }
  v33 = AccessState;
  v32 = v10;
  v31 = (int)ThreadId[1];
  v30 = (int)ThreadId[0];
  UserData.Ptr = (unsigned __int64)&v30;
  *(_QWORD *)&UserData.Size = 4i64;
  v43 = &v31;
  v44 = 4i64;
  v45 = (int *)&v32;
  v46 = 4i64;
  v47 = &v33;
  v48 = 4i64;
  EtwWrite(EtwApiCallsProvRegHandle, (EVENT_DESCRIPTOR *)&KERNEL_AUDIT_API_OPENTHREAD, 0i64, 4ui64, &UserData);
  return(unsigned int)AccessState;
}

Referenced by:

NtAlpcOpenSenderThread