MmLinkJobProcess
VOID __stdcall MmLinkJobProcess(_EJOB *NewJob, _EPROCESS *Process){
NTSTATUS inserted;
_EJOB *v4;
_EX_PUSH_LOCK *p_SharedCommitLock;
_LIST_ENTRY *p_SharedCommitLinks;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v8;
_QWORD *Pool;
__int64 **v10;
__int64 **v11;
_LIST_ENTRY *v12;
_LIST_ENTRY *p_JobLinks;
__int64 *v14;
__int64 v15;
__int64 *v16;
_RTL_BALANCED_NODE *v17;
__int64 *v19;
__int64 v20;
_LIST_ENTRY *i;
__int64 *v22;
__int64 **v23;
_ETHREAD *CurrentThread;
inserted = 0;
v23 = &v22;
v22 = (__int64 *)&v22;
v4 = NewJob;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
p_SharedCommitLock = &Process->SharedCommitLock;
ExAcquirePushLockExclusiveEx(&Process->SharedCommitLock, 0i64);
if( (Process->Flags3 & 0x10) == 0 )
{
p_SharedCommitLinks = &Process->SharedCommitLinks;
Flink = Process->SharedCommitLinks.Flink;
if( Flink != &Process->SharedCommitLinks )
{
while( 1 )
{
v8 = Flink[1].Flink;
Pool = MiAllocatePool(256i64, 0x40ui64, 0x6E53694Dui64);
if( !Pool )
break;
Pool[7] = v8;
Pool[4] = Flink[-1].Blink;
v10 = (__int64 **)(Pool + 5);
v11 = v23;
if( *v23 != (__int64 *)&v22 )
goto LABEL_35;
v10[1] = (__int64 *)v23;
*v10 = (__int64 *)&v22;
*v11 = (__int64 *)v10;
v23 = v10;
Flink = Flink->Flink;
if( Flink == p_SharedCommitLinks )
goto LABEL_6;
}
inserted = -1073741670;
LABEL_6:
v4 = NewJob;
}
while( p_SharedCommitLinks->Flink != p_SharedCommitLinks )
MiRemoveSharedCommitNode((_CONTROL_AREA *)p_SharedCommitLinks->Flink[1].Flink, Process, 1ui64);
if( inserted < 0 )
{
while( 1 )
{
v19 = v22;
if( v22 == (__int64 *)&v22 )
break;
if( (__int64 **)v22[1] != &v22 )
goto LABEL_35;
v20 = *v22;
if( *(__int64 **)(*v22 + 8) != v22 )
goto LABEL_35;
v22 = (__int64 *)*v22;
*(_QWORD *)(v20 + 8) = &v22;
ExFreePoolWithTag(v19 - 5, 0);
}
}
else if( (Process->Flags3 & 8) == 0 )
{
_InterlockedOr((volatile signed __int32 *)&Process->2172, 8u);
}
}
v12 = (_LIST_ENTRY *)*((_QWORD *)v4 + 6);
p_JobLinks = &Process->JobLinks;
if( v12->Flink != (_LIST_ENTRY *)((char *)v4 + 40) )
LABEL_35:
__fastfail(3u);
p_JobLinks->Flink = (_LIST_ENTRY *)((char *)v4 + 40);
Process->JobLinks.Blink = v12;
v12->Flink = p_JobLinks;
*((_QWORD *)v4 + 6) = p_JobLinks;
Process->Job = v4;
while( 1 )
{
v14 = v22;
if( v22 == (__int64 *)&v22 )
break;
if( (__int64 **)v22[1] != &v22 )
goto LABEL_35;
v15 = *v22;
if( *(__int64 **)(*v22 + 8) != v22 )
goto LABEL_35;
v22 = (__int64 *)*v22;
*(_QWORD *)(v15 + 8) = &v22;
v16 = v14 - 5;
if( inserted >= 0 )
{
v17 = (_RTL_BALANCED_NODE *)v16[7];
if( v16[4] )
{
do
{
inserted = MiInsertSharedCommitNode(v17, Process, 1ui64);
if( inserted < 0 )
break;
}
while( v16[4]-- != 1 );
}
}
ExFreePoolWithTag(v16, 0);
}
if( inserted < 0 )
{
for( i = &Process->SharedCommitLinks;
i->Flink != i;
MiRemoveSharedCommitNode((_CONTROL_AREA *)i->Flink[1].Flink, Process, 1ui64) )
{
;
}
_InterlockedAnd((volatile signed __int32 *)&Process->2172, 0xFFFFFFF7);
_InterlockedOr((volatile signed __int32 *)&Process->2172, 0x10u);
}
if( (_InterlockedExchangeAdd64(&p_SharedCommitLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(p_SharedCommitLock);
KeAbPostRelease(p_SharedCommitLock);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}Referenced by:
PspEstablishJobHierarchy