ExpCreateWorkerThread
NTSTATUS __stdcall ExpCreateWorkerThread(_ENODE *Node, _EX_WORK_QUEUE *Queue){
INT64 v2;
signed __int32 PreferredMask;
INT64 v5;
signed __int32 v6;
int SystemThread;
signed __int32 v9;
signed __int32 v10;
PVOID *Object;
PVOID v12;
INT64 v13;
v13 = 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,
(_KNODE *)Node[1].Ncb.HeteroSets[2].AvailableMask,
v5,
v2,
(INT64)Object,
(INT64)ExpWorkerThread,
(INT64)Node,
(INT64)Queue,
(INT64)&v13);
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((VOID *)v13, 0x20ui64, (_OBJECT_TYPE *)PsThreadType, 0, &v12, 0i64) >= 0 )
{
KeBoostPriorityThread((_KTHREAD *)v12, 8i64);
HalPutDmaAdapter((PADAPTER_OBJECT)v12);
}
ZwClose(v13);
}
return SystemThread;
}Referenced by:
ExpWorkQueueInitializeWithMinimumThreads
ExpWorkQueueManagerThread