ExpCreateWorkerThread
INT64 __fastcall ExpCreateWorkerThread(_ENODE *Node, _EX_WORK_QUEUE *Queue){
__int64 v2;
signed __int32 PreferredMask;
__int64 v5;
signed __int32 v6;
NTSTATUS SystemThread;
signed __int32 v9;
signed __int32 v10;
int Object;
PVOID v12;
HANDLE Handle;
Handle = 0i64;
_m_prefetchw(&Node[1].Ncb.HeteroSets[3].PreferredMask);
PreferredMask = Node[1].Ncb.HeteroSets[3].PreferredMask;
do
{
v5 = (unsigned int)(PreferredMask + 1);
LODWORD(v5) = v5 | 0x4000;
v6 = PreferredMask;
PreferredMask = _InterlockedCompareExchange(
(volatile signed __int32 *)&Node[1].Ncb.HeteroSets[3].PreferredMask,
v5,
PreferredMask);
}
while( v6 != PreferredMask );
SystemThread = ExpPartitionCreateSystemThread(
Node[1].Ncb.HeteroSets[2].PreferredMask,
Node[1].Ncb.HeteroSets[2].AvailableMask,
v5,
v2,
Object,
(__int64)ExpWorkerThread,
(__int64)Node,
(unsigned __int16 *)Queue,
(__int64)&Handle);
if( SystemThread < 0 )
{
_m_prefetchw(&Node[1].Ncb.HeteroSets[3].PreferredMask);
v9 = Node[1].Ncb.HeteroSets[3].PreferredMask;
do
{
v10 = v9;
v9 = _InterlockedCompareExchange(
(volatile signed __int32 *)&Node[1].Ncb.HeteroSets[3].PreferredMask,
(v9 & 0x3FFF) - 1,
v9);
}
while( v10 != v9 );
}
else
{
v12 = 0i64;
if( ObReferenceObjectByHandle(Handle, 0x20u, (POBJECT_TYPE)PsThreadType, 0, &v12, 0i64) >= 0 )
{
KeBoostPriorityThread((__int64)v12, 8);
HalPutDmaAdapter((PADAPTER_OBJECT)v12);
}
ZwClose(Handle);
}
return(unsigned int)SystemThread;
}Referenced by:
ExpWorkQueueInitializeWithMinimumThreads
ExpWorkQueueManagerThread