PsCreateSystemThreadEx
__int64 __fastcall PsCreateSystemThreadEx(
__int64 a1,
int a2,
__int128 *a3,
VOID *a4,
__int64 a5,
VOID *a6,
INT64 a7,
__int128 *a8,
_DWORD *a9){
__int128 *v10;
char v13;
_EPROCESS *v14;
$65F3D318EB14490C2A61100CD615354D *v15;
NTSTATUS v16;
__int128 v18;
__int128 v19;
unsigned int v20;
__int128 v21;
int v22;
UINT64 Tag;
VOID *Object;
int v25;
_OBJECT_ATTRIBUTES v26;
INT64 v27;
VOID *v28;
__int64 v29;
__int128 v30;
__int128 v31[33];
v10 = a8;
v29 = a5;
v28 = a6;
v25 = a2;
v27 = a7;
memset(v31, 0i64, 0x208u);
memset(&v26, 0, sizeof(v26));
Object = 0i64;
v30 = 0i64;
if( KeGetCurrentIrql() > 1u )
KeBugCheckEx(0xC8u, (PVOID)(((unsigned __int64)KeGetCurrentIrql() << 16) | 4), 0i64, 0i64, 0i64);
v13 = 0;
if( a4 )
{
LODWORD(Tag) = 1917023056;
v16 = ObpReferenceObjectByHandleWithTag(a4, 2ui64, (_OBJECT_TYPE *)PsProcessType, 0, Tag, &Object, 0i64, 0i64);
if( v16 < 0 )
return(unsigned int)v16;
v14 = (_EPROCESS *)Object;
v13 = 1;
}
else
{
v14 = *(_EPROCESS **)(PspSystemPartition + 104);
Object = v14;
}
v15 = &v14->2172;
if( (v14->Flags3 & 0x1000) != 0 )
{
if( a8 )
goto LABEL_17;
if( !a9 )
{
v20 = (unsigned __int16)(_InterlockedExchangeAdd(&PspSystemThreadAssignment, 1u) + 1);
v10 = &v30;
WORD4(v30) = v20 % KeQueryActiveGroupCount();
v14 = (_EPROCESS *)Object;
*(_QWORD *)&v30 = KeActiveProcessors.Bitmap[WORD4(v30)];
}
if( v10 )
{
LABEL_17:
v21 = *v10;
v22 = 4096;
DWORD1(v31[0]) = 4096;
v31[20] = v21;
}
else
{
v22 = DWORD1(v31[0]);
}
if( a9 )
{
DWORD1(v31[0]) = v22 | 0x4000;
HIDWORD(v31[15]) = *a9;
}
}
if( a3 )
{
v18 = *a3;
*(_OWORD *)&v26.ObjectName = a3[1];
*(_OWORD *)&v26.Length = v18;
v19 = a3[2];
v26.Attributes = _mm_cvtsi128_si32(_mm_srli_si128(*(__m128i *)&v26.ObjectName, 8)) | 0x200;
*(_OWORD *)&v26.SecurityDescriptor = v19;
}
else
{
v26.Length = 48;
*(_OWORD *)&v26.SecurityDescriptor = 0i64;
v26.RootDirectory = 0i64;
v26.Attributes = 512;
v26.ObjectName = 0i64;
}
v16 = PspCreateThread(
a1,
v25,
&v26,
0i64,
v14,
(PSP_CREATE_PROCESS_CONTEXT *)((unsigned __int64)v31 & -(__int64)((v15->Flags3 & 0x1000) != 0)),
v29,
0i64,
0i64,
0,
v28,
v27,
0i64);
if( v13 )
ObfDereferenceObjectWithTag(v14, 0x72437350ui64);
return(unsigned int)v16;
}Referenced by:
CmpCreateRegistryThread
EtwpCovSampCaptureContextStart
ExpNodeCreateSystemThread
ExpWatchLicenseInfoWork
ExpWatchProductTypeWork
IoCreateSystemThread
IopCreatePassiveInterruptRealtimeThreads
IopStartApcHardError
KiStartDpcThread
MiEnablePartitionMappedWrites
MiInitializePartitionThreads
MiInsertPageFileInList
MiZeroBootLargePages
MiZeroNodePages
MmStoreRegister
NtGetMUIRegistryInfo
NtMapCMFModule
PfTStart
PopFxCreateEmergencyWorkerThread
PopInitSystemSleeperThread
PsCreateSystemThread