MiInsertSharedCommitNode
__int64 __fastcall MiInsertSharedCommitNode(_QWORD *a1, unsigned __int64 a2, int a3){
__int64 *v6;
int inserted;
unsigned __int64 v8;
__int64 v9;
_ETHREAD *CurrentThread;
_QWORD **v11;
_QWORD *v12;
bool v13;
int v14;
_QWORD *PoolMm;
unsigned __int64 CommittedPages;
_QWORD *v17;
_QWORD *v18;
_QWORD *v19;
volatile signed __int64 *v20;
_QWORD *v22;
UINT64 v23;
unsigned __int64 v24;
__int64 v25;
unsigned __int64 *v26;
if( !(unsigned int)MiIncludeSharedCommit((_CONTROL_AREA *)a1) || (v6[7] & 0x20) != 0 )
return 0i64;
inserted = 0;
if( (a2 & 1) == 0 )
{
v8 = a2;
if( (*(_DWORD *)(a2 + 2172) & 0x10) == 0 )
{
v24 = 0i64;
v23 = 64i64;
goto LABEL_6;
}
return 0i64;
}
v23 = 40i64;
v8 = 0i64;
v24 = a2 & 0xFFFFFFFFFFFFFFFEui64;
LABEL_6:
v9 = *v6;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v11 = (_QWORD **)(v9 + 72);
v26 = (unsigned __int64 *)(v9 + 72);
v25 = v9;
if( (a3 & 1) == 0 )
{
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx(v8 + 2352, 0i64);
v9 = v25;
}
if( (a3 & 2) == 0 )
{
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx(v9 + 40, 0i64);
}
v12 = *v11;
v13 = 0;
if( !v12 )
goto LABEL_11;
while( a2 <= v12[3] )
{
if( a2 >= v12[3] )
{
++v12[4];
goto LABEL_21;
}
v22 = (_QWORD *)*v12;
if( !*v12 )
goto LABEL_11;
LABEL_32:
v12 = v22;
}
v22 = (_QWORD *)v12[1];
if( v22 )
goto LABEL_32;
v13 = 1;
LABEL_11:
LOWORD(v14) = MmGetCurrentProcessorColor();
PoolMm = ExAllocatePoolMm(256i64, v23, 0x6E53694Dui64, v14 | 0x80000000);
if( PoolMm )
{
PoolMm[4] = 1i64;
PoolMm[3] = a2;
CommittedPages = MiGetCommittedPages(a1);
if( v8 )
{
v17[7] = a1;
v18 = *(_QWORD **)(v8 + 2368);
v19 = v17 + 5;
if( *v18 != v8 + 2360 )
__fastfail(3u);
*v19 = v8 + 2360;
v17[6] = v18;
*v18 = v19;
*(_QWORD *)(v8 + 2368) = v19;
v20 = (volatile signed __int64 *)(v8 + 2344);
}
else
{
v20 = (volatile signed __int64 *)(v24 + 1336);
}
_InterlockedExchangeAdd64(v20, CommittedPages);
RtlAvlInsertNodeEx(v26, (__int64)v12, v13, v17);
if( v8 )
{
if( (*(_DWORD *)(v8 + 2172) & 8) != 0 )
{
inserted = MiInsertSharedCommitNode(a1, *(_QWORD *)(v8 + 1296) | 1i64, 3);
if( inserted < 0 )
MiRemoveSharedCommitNode(a1, v8, a3 | 7u);
}
}
}
else
{
inserted = -1073741670;
}
LABEL_21:
if( (a3 & 2) == 0 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v25 + 40), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v25 + 40));
KeAbPostRelease((PVOID)(v25 + 40));
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
if( (a3 & 1) == 0 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v8 + 2352), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v8 + 2352));
KeAbPostRelease((PVOID)(v8 + 2352));
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
return(unsigned int)inserted;
}Referenced by:
MiAllocateChildVads
MiDeletePartialVad
MiInsertSharedCommitNode
MiMapViewOfDataSection
MiMapViewOfImageSection
MiSectionOpen
MmLinkJobProcess