NtCreateThreadEx
NTSTATUS __stdcall NtCreateThreadEx(
VOID **ThreadHandle,
UINT64 DesiredAccess,
_OBJECT_ATTRIBUTES *ObjectAttributes,
VOID *ProcessHandle,
VOID *StartRoutine,
VOID *Argument,
UINT64 CreateFlags,
UINT64 ZeroBits,
UINT64 StackSize,
UINT64 MaximumStackSize,
PS_ATTRIBUTE_LIST *AttributeList){
NTSTATUS result;
unsigned __int64 v14;
unsigned int v15;
unsigned __int64 v16;
void *v17;
INT64 v18;
NTSTATUS Thread;
__int64 v20;
UINT64 Tag;
size_t v22;
int v23;
PVOID Object;
__int64 v25;
INT64 v26;
_OBJECT_ATTRIBUTES *v27;
_PSP_STACK_ALLOCATION_STATE v28[5];
_PSP_CREATE_PROCESS_CONTEXT CreateContext[132];
_ETHREAD *v30[4];
v27 = ObjectAttributes;
v23 = DesiredAccess;
v26 = (INT64)Argument;
memset(v28, 0i64, 0x48u);
Object = 0i64;
*(_DWORD *)((char *)v30 + 1) = 0;
*(_WORD *)((char *)v30 + 5) = 0;
HIBYTE(v30[0]) = 0;
v25 = 0i64;
v22 = 0;
if( (CreateFlags & 0xFFFFFF80) != 0 )
return -1073741579;
if( KeGetCurrentThread()->PreviousMode )
{
v20 = (__int64)ThreadHandle;
if( (unsigned __int64)ThreadHandle >= 0x7FFFFFFF0000i64 )
v20 = 0x7FFFFFFF0000i64;
*(_QWORD *)v20 = *(_QWORD *)v20;
}
LOBYTE(v30[0]) = 0;
v30[2] = (_ETHREAD *)StackSize;
v30[3] = (_ETHREAD *)MaximumStackSize;
v30[1] = (_ETHREAD *)ZeroBits;
memset(CreateContext, 0i64, 0x208u);
if( !AttributeList
|| (result = PspBuildCreateProcessContext(AttributeList, KeGetCurrentThread()->PreviousMode, 1ui64, CreateContext),
result >= 0) )
{
LODWORD(Tag) = 1917023056;
result = ObpReferenceObjectByHandleWithTag(
ProcessHandle,
2ui64,
(_OBJECT_TYPE *)PsProcessType,
KeGetCurrentThread()->PreviousMode,
Tag,
&Object,
0i64,
0i64);
if( result >= 0 )
{
v14 = (*((_DWORD *)Object + 629) & 0x4000) != 0 ? 0x800 : 0;
v15 = (*((_DWORD *)Object + 629) & 0x4000) != 0 ? 1048651 : 1048587;
ObfDereferenceObjectWithTag(Object, 0x72437350ui64);
RtlGetExtendedContextLength2(v15, &v22, (unsigned int)v14);
v16 = v22 + 15i64;
if( v16 <= v22 )
v16 = 0xFFFFFFFFFFFFFF0i64;
v17 = alloca(v16 & 0xFFFFFFFFFFFFFFF0ui64);
memset(&v22, 0i64, v22);
RtlInitializeExtendedContext2((__int64)&v22, v15, &v25, v14);
PspCreateUserContext((INT64)&v22, 1, PspUserThreadStart, (INT64)StartRoutine, v26);
Thread = PspCreateThread(
(__int64)ThreadHandle,
v23,
v27,
ProcessHandle,
0i64,
CreateContext,
*(__int64 *)&CreateContext[4],
(_CONTEXT *)&v22,
v28,
CreateFlags,
StartRoutine,
v18,
v30);
PspDeleteCreateProcessContext(CreateContext);
return Thread;
}
}
return result;
}Referenced by:
No references.