NtCreateThreadEx

NTSTATUS __fastcall NtCreateThreadEx(
        UINT64 a1,
        INT64 a2,
        INT64 a3,
        VOID *a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        INT64 a9,
        INT64 a10,
        UINT64 *a11){
  NTSTATUS ProcessContext; 
  UINT64 v14; 
  unsigned int v15; 
  unsigned __int64 v16; 
  void *v17; 
  INT64 a12; 
  NTSTATUS Thread; 
  UINT64 v20; 
  unsigned int a2a; 
  unsigned int a2_4; 
  PVOID Object; 
  __int64 v24; 
  INT64 v25; 
  INT64 a3a; 
  __int64 result[10]; 
  INT64 v28[66]; 
  char a13; 
  int v30; 
  __int16 v31; 
  char v32; 
  INT64 v33; 
  INT64 v34; 
  INT64 v35; 
  a3a = a3;
  a2_4 = a2;
  v25 = a6;
  memset((INT64)result, 0i64);
  Object = 0i64;
  v30 = 0;
  v31 = 0;
  v32 = 0;
  v24 = 0i64;
  a2a = 0;
  if( (a7 & 0xFFFFFF80) != 0 )
    return -1073741579;
  if( *((_BYTE *)KeGetCurrentThread() + 562) )
  {
    v20 = a1;
    if( a1 >= 0x7FFFFFFF0000i64 )
      v20 = 0x7FFFFFFF0000i64;
    *(_QWORD *)v20 = *(_QWORD *)v20;
  }
  a13 = 0;
  v34 = a9;
  v35 = a10;
  v33 = a8;
  memset((INT64)v28, 0i64);
  if( !a11
    || (ProcessContext = PspBuildCreateProcessContext(a11, *((_BYTE *)KeGetCurrentThread() + 562), 1i64, (INT64)v28),
        ProcessContext >= 0) )
  {
    ProcessContext = ObpReferenceObjectByHandleWithTag(
                       (ULONG_PTR)a4,
                       2,
                       (__int64)PsProcessType,
                       *((_BYTE *)KeGetCurrentThread() + 562),
                       0x72437350u,
                       (__int64)&Object,
                       0i64,
                       0i64);
    if( ProcessContext >= 0 )
    {
      v14 = (*((_DWORD *)Object + 629) & 0x4000) != 0 ? 0x800 : 0;
      v15 = (*((_DWORD *)Object + 629) & 0x4000) != 0 ? 1048651 : 1048587;
      ObfDereferenceObjectWithTag(Object, 0x72437350ui64);
      RtlGetExtendedContextLength2(v15, &a2a, (unsigned int)v14);
      v16 = a2a + 15i64;
      if( v16 <= a2a )
        v16 = 0xFFFFFFFFFFFFFF0i64;
      v17 = alloca(v16 & 0xFFFFFFFFFFFFFFF0ui64);
      memset((INT64)&a2a, 0i64);
      RtlInitializeExtendedContext2((INT64)&a2a, v15, &v24, v14);
      PspCreateUserContext((INT64)&a2a, 1, PspUserThreadStart, a5, v25);
      Thread = PspCreateThread(
                 a1,
                 a2_4,
                 a3a,
                 a4,
                 0i64,
                 (INT64)v28,
                 v28[2],
                 (INT64)&a2a,
                 result,
                 a7,
                 a5,
                 a12,
                 (INT64)&a13);
      PspDeleteCreateProcessContext((INT64)v28);
      return Thread;
    }
  }
  return ProcessContext;
}

Referenced by:

No references.