MiLinkPoolCommitChain
CHAR __stdcall MiLinkPoolCommitChain(INT64 a1, UINT64 a2){
UINT64 v2;
UINT64 v3;
UINT64 v5;
__int64 CurrentThread;
_MMPTE *i;
_MMPTE v8;
__int64 v9;
__int64 v10;
int v11;
_MMPTE *PteBase;
_MMPTE *v13;
__int64 v14;
__int64 v15;
void *v16;
char *v17;
__int64 v18;
INT64 v19;
INT64 v20;
int v21;
INT64 v22;
UINT64 BitsMustBeChanged;
v2 = a2;
v3 = (a2 & 0xFFFFFFFFFFFFF000ui64) + 4088;
if( v3 > *(_QWORD *)(a1 + 56) )
v3 = *(_QWORD *)(a1 + 56);
if( (*(_BYTE *)(a1 + 78) & 4) != 0 )
{
PteBase = MmGetPteBase();
v13 = (_MMPTE *)((char *)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64));
MI_READ_PTE_LOCK_FREE((INT64)v13);
v14 = MiSwizzleInvalidPte(768i64);
if( v15 != v14 && MiIsPoolPteInUse(v15) )
KeBugCheckEx(0x1Au, (PVOID)0x5304, (PVOID)((__int64)((v2 << 25) - ((_QWORD)PteBase << 25)) >> 16), v16, 0i64);
v17 = *(char **)(a1 + 16);
*(_QWORD *)(a1 + 24) += 512i64;
*(_QWORD *)(a1 + 16) = *(_QWORD *)v17;
LODWORD(BitsMustBeChanged) = 1;
v18 = (v17 - (char *)MmGetPfnDb()) / 48;
MiUpdateLargePageBitMap((UINT64)&Irp, v18, 0x200ui64, 1ui64, BitsMustBeChanged);
LODWORD(v19) = MiMakeValidPte(0i64, v18, (*(unsigned __int16 *)(a1 + 78) >> 3) & 0x1F | 0xA4000000);
v20 = v19;
if( v13 < MmGetPml4eBase() || v13 > MmGetPml4eLimit() )
{
LOBYTE(v21) = MiPteInShadowRange((UINT64)v13);
if( v21 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v20 & 1) != 0 )
v20 |= 0x8000000000000000ui64;
v13->u.Long = v20;
}
else
{
MiWriteTopLevelPxe((UINT64)v13, v19);
}
LODWORD(v22) = MiGetContainingPageTable((UINT64)v13);
MiLockAndIncrementShareCount(v22);
MiInitializeLargeNonPagedPoolLeafFrames((_MMPTE *)v2, v18);
}
else
{
MiFlushTbAsNeeded((_MMPTE *)a2, ((__int64)(v3 - a2) >> 3) + 1, *(_KTBFLUSH_TYPE *)(a1 + 44));
v5 = *(_QWORD *)(a1 + 32);
LOBYTE(CurrentThread) = 0;
for( i = MmGetPteBase() + 0x800000000i64; v2 <= v3; v2 += 8i64 )
{
v8.u.Long = *(_QWORD *)v2;
MiPteInShadowRange(v2);
CurrentThread = v8.u.Long & 0x3E0;
if( (v8.u.Long & 0xC01) == 0i64 && 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.u.Long & 1) == 0 )
{
LOBYTE(CurrentThread) = CurrentThread == 992;
if( (((v8.u.Long & 0xC00) == 0i64) & (unsigned __int8)CurrentThread) != 0 )
KeBugCheckEx(0x1Au, (PVOID)0x5308, (PVOID)v2, (PVOID)v8.u.Long, 0i64);
}
}
*(_QWORD *)(a1 + 32) = v5;
}
return CurrentThread;
}Referenced by:
MiCommitPoolMemory