NtCreateThread

VOID __stdcall NtCreateThread(){
  unsigned int v0; 
  _QWORD *v1; 
  INT64 v2; 
  VOID *v3; 
  VOID *v4; 
  INT64 v5; 
  unsigned int v6; 
  _QWORD *v7; 
  char *v8; 
  INT8 v9; 
  __int64 v10; 
  __int64 v11; 
  char *v12; 
  __int64 v13; 
  __int128 v14; 
  __int64 v15; 
  __int16 v16; 
  char *a8; 
  INT64 result[2]; 
  __int128 v19; 
  PVOID AllocatedStackBase; 
  __int128 v21; 
  PVOID v22; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v24; 
  INT64 a13[2]; 
  __int128 v26; 
  char v27[152]; 
  unsigned __int64 v28; 
  unsigned __int64 ClientId; 
  char *ThreadContext; 
  PINITIAL_TEB UserStack; 
  BOOLEAN CreateSuspended; 
  v4 = v3;
  v5 = v2;
  v6 = v0;
  v7 = v1;
  v8 = ThreadContext;
  memset((INT64)result, 0i64);
  *(_OWORD *)a13 = 0i64;
  v26 = 0i64;
  if( !ThreadContext )
    return;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v9 = *((_BYTE *)CurrentThread + 562);
  if( !v9 )
  {
    a8 = ThreadContext;
    goto LABEL_17;
  }
  v10 = (__int64)v7;
  if( (unsigned __int64)v7 >= 0x7FFFFFFF0000i64 )
    v10 = 0x7FFFFFFF0000i64;
  *(_QWORD *)v10 = *(_QWORD *)v10;
  if( ClientId )
  {
    if( (ClientId & 3) != 0 )
      goto LABEL_15;
    v11 = ClientId;
    if( ClientId >= 0x7FFFFFFF0000i64 )
      v11 = 0x7FFFFFFF0000i64;
    *(_BYTE *)v11 = *(_BYTE *)v11;
    *(_BYTE *)(v11 + 15) = *(_BYTE *)(v11 + 15);
  }
  if( ((unsigned __int8)ThreadContext & 0xF) != 0 )
    goto LABEL_15;
  v12 = v27;
  v13 = 9i64;
  do
  {
    *(_OWORD *)v12 = *(_OWORD *)v8;
    *((_OWORD *)v12 + 1) = *((_OWORD *)v8 + 1);
    *((_OWORD *)v12 + 2) = *((_OWORD *)v8 + 2);
    *((_OWORD *)v12 + 3) = *((_OWORD *)v8 + 3);
    *((_OWORD *)v12 + 4) = *((_OWORD *)v8 + 4);
    *((_OWORD *)v12 + 5) = *((_OWORD *)v8 + 5);
    *((_OWORD *)v12 + 6) = *((_OWORD *)v8 + 6);
    v12 += 128;
    *((_OWORD *)v12 - 1) = *((_OWORD *)v8 + 7);
    v8 += 128;
    --v13;
  }
  while( v13 );
  *(_OWORD *)v12 = *(_OWORD *)v8;
  *((_OWORD *)v12 + 1) = *((_OWORD *)v8 + 1);
  *((_OWORD *)v12 + 2) = *((_OWORD *)v8 + 2);
  *((_OWORD *)v12 + 3) = *((_OWORD *)v8 + 3);
  *((_OWORD *)v12 + 4) = *((_OWORD *)v8 + 4);
  a8 = v27;
  v28 = (v28 & 0xFFFFFFFFFFFFFFF0ui64) - 40;
  if( ((unsigned __int8)UserStack & 3) != 0 )
LABEL_15:
    ExRaiseDatatypeMisalignment();
  v8 = v27;
LABEL_17:
  if( RtlpSanitizeContextFlags((UINT64 *)v8 + 6, v9) >= 0 )
  {
    *((_DWORD *)v8 + 12) &= 0x10001Fu;
    *v7 = 0i64;
    v14 = *(_OWORD *)&UserStack->PreviousStackBase;
    *(_OWORD *)result = v14;
    if( !(_QWORD)v14 && !result[1] )
    {
      *(_OWORD *)result = v14;
      v19 = *(_OWORD *)&UserStack->StackBase;
      AllocatedStackBase = UserStack->AllocatedStackBase;
      if( AllocatedStackBase )
      {
        v24 = (_ETHREAD *)KeGetCurrentThread();
        v15 = *(_QWORD *)(*((_QWORD *)v24 + 23) + 1408i64);
        if( v15 )
        {
          v16 = *(_WORD *)(v15 + 8);
          if( v16 == 332 || v16 == 452 )
          {
            v22 = AllocatedStackBase;
            v21 = v19;
            AllocatedStackBase = 0i64;
            v19 = 0i64;
          }
        }
        LOBYTE(a13[0]) = 1;
        PspCreateThread(
          (INT64)v7,
          v6,
          v5,
          v4,
          0i64,
          0i64,
          ClientId,
          (INT64)a8,
          result,
          CreateSuspended == 1,
          0i64,
          0i64,
          (INT64)a13);
      }
    }
  }
}

Referenced by:

No references.