MiCombineWorkingSet
NTSTATUS __stdcall MiCombineWorkingSet(_MI_COMBINE_CONTROL_BLOCK *CombineControlBlock){
_MMSUPPORT_INSTANCE *v2;
NTSTATUS v3;
_MI_COMBINE_CONTROL_BLOCK v4;
void *v5;
_EPROCESS *v6;
NTSTATUS v7;
UINT64 v8;
char v9;
unsigned __int64 WorkingSetPrivateSize;
unsigned __int64 v11;
VOID *Pool;
__int128 v14;
__int128 v15;
VOID *v16;
INT64 v17[22];
v16 = 0i64;
v14 = 0i64;
v15 = 0i64;
memset(v17, 0i64, sizeof(v17));
v2 = (_MMSUPPORT_INSTANCE *)*((_QWORD *)CombineControlBlock + 4);
v3 = 0;
v4 = CombineControlBlock[15];
v5 = 0i64;
v6 = (_EPROCESS *)&v2[-9].AgeDistribution[3];
v7 = 3;
if( (v2->Flags._bf_0 & 7) != 0 )
v6 = 0i64;
MiLockWorkingSetShared();
BYTE6(v17[0]) = v9;
if( !v6 || (v6->Flags & 0xC00) >= 0xC00 && !v2->ExitOutswapGate && !MiIsStoreProcess(v6) )
{
WorkingSetPrivateSize = v2->WorkingSetPrivateSize;
if( WorkingSetPrivateSize )
{
v11 = (40 * WorkingSetPrivateSize + 4095) & 0xFFFFFFFFFFFFF000ui64;
while( 1 )
{
Pool = MiAllocatePool(64i64, v11, 0x6D75534Dui64);
v5 = Pool;
if( Pool )
break;
v11 >>= 1;
if( v11 < 0x10000 )
goto LABEL_13;
}
v17[5] = -1i64;
*((_QWORD *)&v15 + 1) = CombineControlBlock;
v16 = Pool;
v17[21] = (INT64)&v14;
v17[19] = (INT64)MiCombinePte;
v17[20] = (INT64)MiCombineWorkingSetTail;
*(_QWORD *)&v15 = v11 / 0x28;
LODWORD(v14) = v4;
v17[3] = (INT64)v2;
LOWORD(v17[0]) = 6;
BYTE5(v17[0]) = 7;
v7 = MiWalkPageTables((INT64)v17);
}
}
LABEL_13:
LOBYTE(v8) = BYTE6(v17[0]);
MiUnlockWorkingSetShared(v2, v8);
MiFreeCombineMdls((INT64)CombineControlBlock);
if( v5 )
ExFreePoolWithTag(v5, 0);
if( v7 == 4 )
return -1073741248;
return v3;
}Referenced by:
MiCombineIdenticalPages