PspCreateThread

NTSTATUS __fastcall PspCreateThread(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        VOID *a4,
        _EPROCESS *a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        _QWORD *a9,
        CHAR a10,
        INT64 a11,
        INT64 a12,
        INT64 a13){
  _ETHREAD *CurrentThread; 
  char *v15; 
  char v16; 
  char *v17; 
  NTSTATUS Thread; 
  NTSTATUS v19; 
  INT64 v20; 
  __int64 v21; 
  NTSTATUS inserted; 
  struct _EX_RUNDOWN_REF *v23; 
  NTSTATUS v24; 
  int v25; 
  INT8 a3a; 
  char v27[12]; 
  int v28; 
  INT64 v29; 
  PADAPTER_OBJECT DmaAdapter; 
  PVOID Object; 
  INT64 a4a; 
  INT64 v33; 
  INT64 v34; 
  _QWORD *v35; 
  INT64 a2a; 
  __int64 v37; 
  __int64 v38; 
  INT64 v39; 
  __int128 v40; 
  INT64 result[50]; 
  *(_DWORD *)v27 = 0;
  a4a = a6;
  v37 = a7;
  v35 = a9;
  v29 = a11;
  v33 = a12;
  a2a = a3;
  v28 = a2;
  v38 = a1;
  v34 = a13;
  *(_QWORD *)&v27[4] = a8;
  memset((INT64)result, 0i64);
  v40 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v15 = (char *)*((_QWORD *)CurrentThread + 23);
  if( a8 )
    v16 = *((_BYTE *)CurrentThread + 562);
  else
    v16 = 0;
  DmaAdapter = 0i64;
  v17 = 0i64;
  a3a = v16;
  Thread = -1073741816;
  Object = 0i64;
  if( a4 )
  {
    v19 = ObpReferenceObjectByHandleWithTag(
            (ULONG_PTR)a4,
            2,
            (__int64)PsProcessType,
            v16,
            0x72437350u,
            (__int64)&Object,
            0i64,
            0i64);
    v17 = (char *)Object;
    goto LABEL_5;
  }
  if( *(_QWORD *)&v27[4] )
  {
    v19 = -1073741816;
LABEL_5:
    if( v19 < 0 )
      return v19;
    goto LABEL_6;
  }
  ObfReferenceObjectWithTag(a5, 0x72437350u);
  v17 = (char *)a5;
LABEL_6:
  if( v17 != v15 && !PspIsProcessReadyForRemoteThread((INT64)v17) )
    return -1073741823;
  v20 = v29;
  if( v29 && *(_QWORD *)&v27[4] )
  {
    v20 = v29 & -(__int64)((v17[992] & 1) != 0);
    v29 = v20;
  }
  if( !a4a
    && !v20
    && ((*((_DWORD *)v17 + 628) & 1) != 0
     || (*((_DWORD *)v15 + 628) & 1) != 0
     || (*((_DWORD *)v17 + 629) & 0x4000) != 0
     || (*((_DWORD *)v15 + 629) & 0x4000) != 0) )
  {
    return -1073741790;
  }
  if( a3a )
  {
    v25 = *((_DWORD *)v17 + 543);
    if( (v25 & 0x1000) != 0 || (v25 & 1) != 0 )
    {
LABEL_31:
      ObfDereferenceObjectWithTag(v17, 0x72437350ui64);
      return Thread;
    }
  }
  if( (*((_DWORD *)v17 + 543) & 1) != 0 && !*((_QWORD *)v17 + 280) && *(_QWORD *)&v27[4] )
  {
    Thread = -1073741790;
    goto LABEL_31;
  }
  PspMapThreadCreationFlags((unsigned int)a10, (UINT64 *)v27);
  --*((_WORD *)CurrentThread + 242);
  if( !ExAcquireRundownProtection((PEX_RUNDOWN_REF)v17 + 139) )
  {
    KeLeaveCriticalRegionThread((__int64)CurrentThread);
    Thread = -1073741558;
    goto LABEL_31;
  }
  ObfReferenceObjectWithTag(v17, 0x72437350u);
  v21 = a4a;
  v39 = (INT64)v35;
  Thread = PspAllocateThread(
             (INT64)v17,
             a2a,
             a3a,
             a4a,
             *(INT32 **)&v27[4],
             (INT64)&v39,
             v29,
             v33,
             (INT64)v27,
             (INT64)&DmaAdapter,
             v34,
             (INT64)result);
  if( Thread < 0 )
  {
    ExReleaseRundownProtection((PEX_RUNDOWN_REF)v17 + 139);
    KeLeaveCriticalRegionThread((__int64)CurrentThread);
    goto LABEL_31;
  }
  ObfDereferenceObjectWithTag(v17, 0x72437350ui64);
  inserted = PspInsertThread(DmaAdapter, (ULONG_PTR)v17, v35, v27, v28, v34, v21, v33, (PACCESS_STATE)result, v38, v37);
  v23 = (struct _EX_RUNDOWN_REF *)(v17 + 1112);
  v24 = inserted;
  ExReleaseRundownProtection(v23);
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  HalPutDmaAdapter(DmaAdapter);
  return v24;
}

Referenced by:

NtCreateThread
NtCreateThreadEx
PsCreateSystemThreadEx