MiLinkPoolCommitChain
CHAR __fastcall MiLinkPoolCommitChain(INT64 a1, UINT64 a2){
UINT64 v2;
UINT64 v3;
UINT64 v5;
INT64 CurrentThread;
char *i;
ULONG_PTR v8;
__int64 v9;
__int64 v10;
int v11;
_MMPTE *PteBase;
INT64 *v13;
INT64 v14;
__int64 v15;
ULONG_PTR v16;
char *v17;
__int64 v18;
INT64 ValidPte;
INT64 ContainingPageTable;
ULONG_PTR BugCheckParameter4;
v2 = a2;
v3 = (a2 & 0xFFFFFFFFFFFFF000ui64) + 4088;
if( v3 > *(_QWORD *)(a1 + 56) )
v3 = *(_QWORD *)(a1 + 56);
if( (*(_BYTE *)(a1 + 78) & 4) != 0 )
{
PteBase = MmGetPteBase();
v13 = (INT64 *)((char *)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64));
MI_READ_PTE_LOCK_FREE((INT64)v13);
v14 = MiSwizzleInvalidPte(768i64);
if( v15 != v14 && (unsigned int)MiIsPoolPteInUse(v15) )
KeBugCheckEx(0x1Au, 0x5304ui64, (__int64)((v2 << 25) - ((_QWORD)PteBase << 25)) >> 16, v16, 0i64);
v17 = *(char **)(a1 + 16);
*(_QWORD *)(a1 + 24) += 512i64;
*(_QWORD *)(a1 + 16) = *(_QWORD *)v17;
LODWORD(BugCheckParameter4) = 1;
v18 = (v17 - (char *)MmGetPfnDb()) / 48;
MiUpdateLargePageBitMap((UINT64)&MiSystemPartition, v18, 0x200ui64, 1ui64, BugCheckParameter4);
ValidPte = MiMakeValidPte(0i64, v18, (*(unsigned __int16 *)(a1 + 78) >> 3) & 0x1F | 0xA4000000);
if( v13 < (INT64 *)MmGetPml4eBase() || v13 > (INT64 *)MmGetPml4eLimit() )
*v13 = ValidPte;
else
MiWriteTopLevelPxe(v13, ValidPte);
ContainingPageTable = MiGetContainingPageTable((UINT64)v13);
MiLockAndIncrementShareCount(ContainingPageTable);
MiInitializeLargeNonPagedPoolLeafFrames((_MMPTE *)v2, v18);
}
else
{
MiFlushTbAsNeeded(a2, ((__int64)(v3 - a2) >> 3) + 1, *(_DWORD *)(a1 + 44), 1);
v5 = *(_QWORD *)(a1 + 32);
LOBYTE(CurrentThread) = 0;
for( i = (char *)MmGetPteBase() + 0x4000000000i64; v2 <= v3; v2 += 8i64 )
{
v8 = *(_QWORD *)v2;
MiPteInShadowRange(v2);
CurrentThread = v8 & 0x3E0;
if( (v8 & 0xC01) == 0 && CurrentThread == 0 )
{
if( v5 )
v9 = (__int64)(v5 - (_QWORD)i) >> 3;
else
v9 = 0xFFFFFFFFFi64;
CurrentThread = MiSwizzleInvalidPte(v9 << 28);
v10 = CurrentThread | 0x3E0;
if( v11 )
{
CurrentThread = (INT64)KeGetCurrentThread();
if( (*(_DWORD *)(*(_QWORD *)(CurrentThread + 184) + 2172i64) & 0x1000) != 0 && (v10 & 1) != 0 )
v10 |= 0x8000000000000000ui64;
}
*(_QWORD *)v2 = v10;
v5 = v2;
}
else if( (v8 & 1) == 0 )
{
LOBYTE(CurrentThread) = CurrentThread == 992;
if( (((v8 & 0xC00) == 0) & (unsigned __int8)CurrentThread) != 0 )
KeBugCheckEx(0x1Au, 0x5308ui64, v2, v8, 0i64);
}
}
*(_QWORD *)(a1 + 32) = v5;
}
return CurrentThread;
}Referenced by:
MiCommitPoolMemory