PsCreateSystemThreadEx
NTSTATUS __stdcall PsCreateSystemThreadEx(
PVOID *ThreadHandle,
UINT64 DesiredAccess,
OBJECT_ATTRIBUTES *ObjectAttributes,
PVOID ProcessHandle,
CLIENT_ID *ClientId,
PKSTART_ROUTINE StartRoutine,
PVOID StartContext,
GROUP_AFFINITY *GroupAffinity,
UINT64 *IdealProcessor){
__int128 *v10;
char v13;
__int64 v14;
_DWORD *v15;
NTSTATUS Thread;
__int128 v18;
__int128 v19;
unsigned int v20;
__int128 v21;
int v22;
__int64 a6;
INT64 a2;
INT64 a3[2];
__m128i v26;
__int128 v27;
INT64 a12;
INT64 a11;
INT64 a7;
__int128 v31;
_DWORD result[63];
int v33;
__int128 v34;
v10 = (__int128 *)GroupAffinity;
a7 = (INT64)ClientId;
a11 = (INT64)StartRoutine;
LODWORD(a2) = DesiredAccess;
a12 = (INT64)StartContext;
memset((INT64)result, 0i64);
*(_OWORD *)a3 = 0i64;
a6 = 0i64;
v26 = 0i64;
v27 = 0i64;
v31 = 0i64;
if( KeGetCurrentIrql() > 1u )
KeBugCheckEx(0xC8u, ((unsigned __int64)KeGetCurrentIrql() << 16) | 4, 0i64, 0i64, 0i64);
v13 = 0;
if( ProcessHandle )
{
Thread = ObpReferenceObjectByHandleWithTag(
(ULONG_PTR)ProcessHandle,
2,
(__int64)PsProcessType,
0,
0x72437350u,
(__int64)&a6,
0i64,
0i64);
if( Thread < 0 )
return Thread;
v14 = a6;
v13 = 1;
}
else
{
v14 = *((_QWORD *)PspSystemPartition + 13);
a6 = v14;
}
v15 = (_DWORD *)(v14 + 2172);
if( (*(_DWORD *)(v14 + 2172) & 0x1000) != 0 )
{
if( GroupAffinity )
goto LABEL_17;
if( !IdealProcessor )
{
v20 = (unsigned __int16)(_InterlockedExchangeAdd(&PspSystemThreadAssignment, 1u) + 1);
v10 = &v31;
WORD4(v31) = v20 % KeQueryActiveGroupCount();
v14 = a6;
*(_QWORD *)&v31 = KeActiveProcessors.Bitmap[WORD4(v31)];
}
if( v10 )
{
LABEL_17:
v21 = *v10;
v22 = 4096;
result[1] = 4096;
v34 = v21;
}
else
{
v22 = result[1];
}
if( IdealProcessor )
{
result[1] = v22 | 0x4000;
v33 = *(_DWORD *)IdealProcessor;
}
}
if( ObjectAttributes )
{
v18 = *(_OWORD *)&ObjectAttributes->Length;
v26 = *(__m128i *)&ObjectAttributes->ObjectName;
*(_OWORD *)a3 = v18;
v19 = *(_OWORD *)&ObjectAttributes->SecurityDescriptor;
v26.m128i_i32[2] = _mm_cvtsi128_si32(_mm_srli_si128(v26, 8)) | 0x200;
v27 = v19;
}
else
{
LODWORD(a3[0]) = 48;
v27 = 0i64;
a3[1] = 0i64;
v26.m128i_i32[2] = 512;
v26.m128i_i64[0] = 0i64;
}
Thread = PspCreateThread(
(INT64)ThreadHandle,
(unsigned int)a2,
(INT64)a3,
0i64,
(_EPROCESS *)v14,
(unsigned __int64)result & -(__int64)((*v15 & 0x1000) != 0),
a7,
0i64,
0i64,
0,
a11,
a12,
0i64);
if( v13 )
ObfDereferenceObjectWithTag((PVOID)v14, 0x72437350ui64);
return Thread;
}Referenced by:
CmpCreateRegistryThread
EtwpCovSampCaptureContextStart
ExpNodeCreateSystemThread
ExpWatchLicenseInfoWork
ExpWatchProductTypeWork
IoCreateSystemThread
IopCreatePassiveInterruptRealtimeThreads
IopStartApcHardError
KiStartDpcThread
MiEnablePartitionMappedWrites
MiInitializePartitionThreads
MiInsertPageFileInList
MiZeroBootLargePages
MiZeroNodePages
MmStoreRegister
NtGetMUIRegistryInfo
NtMapCMFModule
PfTStart
PopFxCreateEmergencyWorkerThread
PopInitSystemSleeperThread
PsCreateSystemThread