NtCreateThread

int __fastcall NtCreateThread(
        _QWORD *a1,
        int a2,
        _OBJECT_ATTRIBUTES *a3,
        VOID *a4,
        unsigned __int64 a5,
        char *a6,
        __int64 a7,
        char a8){
  char *v12; 
  int result; 
  INT8 PreviousMode; 
  __int64 v15; 
  unsigned __int64 v16; 
  char *v17; 
  __int64 v18; 
  _PSP_STACK_ALLOCATION_STATE v19; 
  _EWOW64PROCESS *WoW64Process; 
  unsigned __int16 Machine; 
  char *v22; 
  _PSP_STACK_ALLOCATION_STATE v23[5]; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v25; 
  __int128 v26[2]; 
  char v27[152]; 
  unsigned __int64 v28; 

  v12 = a6;
  memset(v23, 0i64, 0x48u);
  memset(v26, 0, sizeof(v26));
  if( !a6 )
    return -1073741811;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  PreviousMode = CurrentThread->Tcb.PreviousMode;
  if( PreviousMode )
  {
    v15 = (__int64)a1;
    if( (unsigned __int64)a1 >= 0x7FFFFFFF0000i64 )
      v15 = 0x7FFFFFFF0000i64;
    *(_QWORD *)v15 = *(_QWORD *)v15;
    if( a5 )
    {
      if( (a5 & 3) != 0 )
        goto LABEL_16;
      v16 = a5;
      if( a5 >= 0x7FFFFFFF0000i64 )
        v16 = 0x7FFFFFFF0000i64;
      *(_BYTE *)v16 = *(_BYTE *)v16;
      *(_BYTE *)(v16 + 15) = *(_BYTE *)(v16 + 15);
    }
    if( ((unsigned __int8)a6 & 0xF) == 0 )
    {
      v17 = v27;
      v18 = 9i64;
      do
      {
        *(_OWORD *)v17 = *(_OWORD *)v12;
        *((_OWORD *)v17 + 1) = *((_OWORD *)v12 + 1);
        *((_OWORD *)v17 + 2) = *((_OWORD *)v12 + 2);
        *((_OWORD *)v17 + 3) = *((_OWORD *)v12 + 3);
        *((_OWORD *)v17 + 4) = *((_OWORD *)v12 + 4);
        *((_OWORD *)v17 + 5) = *((_OWORD *)v12 + 5);
        *((_OWORD *)v17 + 6) = *((_OWORD *)v12 + 6);
        v17 += 128;
        *((_OWORD *)v17 - 1) = *((_OWORD *)v12 + 7);
        v12 += 128;
        --v18;
      }
      while( v18 );
      *(_OWORD *)v17 = *(_OWORD *)v12;
      *((_OWORD *)v17 + 1) = *((_OWORD *)v12 + 1);
      *((_OWORD *)v17 + 2) = *((_OWORD *)v12 + 2);
      *((_OWORD *)v17 + 3) = *((_OWORD *)v12 + 3);
      *((_OWORD *)v17 + 4) = *((_OWORD *)v12 + 4);
      v22 = v27;
      v28 = (v28 & 0xFFFFFFFFFFFFFFF0ui64) - 40;
      if( (a7 & 3) == 0 )
      {
        v12 = v27;
        goto LABEL_18;
      }
    }
LABEL_16:
    ExRaiseDatatypeMisalignment();
  }
  v22 = a6;
LABEL_18:
  result = RtlpSanitizeContextFlags((UINT64 *)v12 + 6, PreviousMode);
  if( result >= 0 )
  {
    *((_DWORD *)v12 + 12) &= 0x10001Fu;
    *a1 = 0i64;
    v19 = *(_PSP_STACK_ALLOCATION_STATE *)a7;
    v23[0] = *(_PSP_STACK_ALLOCATION_STATE *)a7;
    if( *(_OWORD *)v23 == 0i64 )
    {
      v23[0] = v19;
      v23[1] = *(_PSP_STACK_ALLOCATION_STATE *)(a7 + 16);
      *(_QWORD *)&v23[2].StackAllocationFlags = *(_QWORD *)(a7 + 32);
      if( *(_QWORD *)&v23[2].StackAllocationFlags )
      {
        v25 = (_ETHREAD *)KeGetCurrentThread();
        WoW64Process = v25->Tcb.ApcState.Process->WoW64Process;
        if( WoW64Process )
        {
          Machine = WoW64Process->Machine;
          if( Machine == 332 || Machine == 452 )
          {
            *(_QWORD *)&v23[3].StackSize = *(_QWORD *)&v23[2].StackAllocationFlags;
            *(_PSP_STACK_ALLOCATION_STATE *)&v23[2].StackSize = v23[1];
            memset(&v23[1], 0, 24);
          }
        }
        LOBYTE(v26[0]) = 1;
        return PspCreateThread(
                 (__int64)a1,
                 a2,
                 a3,
                 a4,
                 0i64,
                 0i64,
                 a5,
                 (_CONTEXT *)v22,
                 v23,
                 a8 == 1,
                 0i64,
                 0i64,
                 (_ETHREAD **)v26);
      }
      else
      {
        return -1073741811;
      }
    }
    else
    {
      return -1073741637;
    }
  }
  return result;
}

Referenced by:

No references.