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.