MiPerformMemoryChange
VOID __stdcall MiPerformMemoryChange(
UINT64 StartPage,
UINT64 NumberOfPages,
PHYSICAL_MEMORY_DESCRIPTOR **NewPhysicalMemoryBlock,
PHYSICAL_MEMORY_DESCRIPTOR **NewPageRunBlock,
UINT64 Flags){
unsigned __int8 v9;
PHYSICAL_MEMORY_DESCRIPTOR *v10;
unsigned __int64 v11;
bool v12;
PHYSICAL_MEMORY_DESCRIPTOR *v13;
__int64 v14;
PHYSICAL_MEMORY_DESCRIPTOR *v15;
PHYSICAL_MEMORY_DESCRIPTOR *v16;
UINT64 v17;
v9 = ExAcquireSpinLockExclusive((INT64 *)&stru_140C50B28 + 12);
v10 = *NewPhysicalMemoryBlock;
v11 = v9;
v12 = MmPhysicalMemoryBlock[-1].Run[0].PageCount-- == 1;
v13 = 0i64;
v14 = *(_QWORD *)&qword_140C50AE0;
if( v12 )
v13 = MmPhysicalMemoryBlock;
MmPhysicalMemoryBlock = v10;
*NewPhysicalMemoryBlock = v13;
v12 = (*(_QWORD *)(v14 - 8))-- == 1i64;
v15 = 0i64;
v16 = *NewPageRunBlock;
if( v12 )
v15 = *(PHYSICAL_MEMORY_DESCRIPTOR **)&qword_140C50AE0;
v17 = StartPage + NumberOfPages - 1;
*NewPageRunBlock = v15;
*(_QWORD *)&qword_140C50AE0 = v16;
if( (Flags & 1) == 0 )
{
if( v17 == *(&stru_140C50B28 + 852) )
*(&stru_140C50B28 + 852) = StartPage - 1;
*(&stru_140C50B28 + 853) -= NumberOfPages;
goto LABEL_13;
}
if( v17 > *(&stru_140C50B28 + 852) )
*(&stru_140C50B28 + 852) = StartPage + NumberOfPages - 1;
if( (Flags & 4) == 0 )
{
*(&stru_140C50B28 + 853) += NumberOfPages;
LABEL_13:
byte_140C50ACC = 1;
}
MiInitializeNonPagedPoolThresholds((UINT8)v15);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&stru_140C50B28 + 12);
__writecr8(v11);
}Referenced by:
MiAddPhysicalMemory
MiRemovePhysicalMemory