MiAddPhysicalMemory
NTSTATUS __stdcall MiAddPhysicalMemory(
_MI_PARTITION *TargetPartition,
_LARGE_INTEGER *StartAddress,
_LARGE_INTEGER *NumberOfBytes,
UINT64 Flags){
__int128 v5;
UINT64 v6;
unsigned __int64 v7;
__int64 v8;
_ETHREAD *CurrentThread;
int v11;
unsigned int v12;
int v13;
unsigned __int64 v14;
int v15;
unsigned __int64 v16;
unsigned __int64 *p_PageCount;
unsigned __int64 v18;
unsigned __int64 v19;
PHYSICAL_MEMORY_DESCRIPTOR *v20;
unsigned int v21;
_MI_MEMORY_NODE *v22;
__int64 v23;
int v24;
unsigned int v25;
_PHYSICAL_MEMORY_RUN *Run;
__int64 v27;
UINT64 Flagsa;
UINT64 Flagsb;
UINT64 v30;
UINT64 v31;
_QWORD ListHead[3];
PHYSICAL_MEMORY_DESCRIPTOR *NewPageRunBlock;
PHYSICAL_MEMORY_DESCRIPTOR *OutputNewPhysicalMemoryBlock;
PHYSICAL_MEMORY_DESCRIPTOR *Memory;
_ETHREAD *Thread;
__int128 MemoryNode;
__int128 MemoryNode_16;
__int64 v39;
UINT16 PartitionId;
int v42;
PartitionId = (unsigned __int16)TargetPartition;
MemoryNode = 0i64;
v39 = 0i64;
MemoryNode_16 = 0i64;
if( (StartAddress->anonymous_0.LowPart & 0xFFF) != 0 )
return -1073741585;
if( (NumberOfBytes->anonymous_0.LowPart & 0xFFF) != 0 )
return -1073741584;
*(_QWORD *)&v5 = (unsigned __int64)StartAddress->QuadPart >> 12;
*((_QWORD *)&v5 + 1) = (unsigned __int64)NumberOfBytes->QuadPart >> 12;
v6 = v5 + *((_QWORD *)&v5 + 1);
if( (unsigned __int64)v5 >= (_QWORD)v5 + *((_QWORD *)&v5 + 1) )
return -1073741585;
v7 = 0xFFFFFFFFFi64;
if( (unsigned __int64)((*(&stru_140C4DB30 + 42) >> 12) - 1i64) < 0xFFFFFFFFFi64 )
v7 = (*(&stru_140C4DB30 + 42) >> 12) - 1i64;
if( v6 - 1 > v7 )
{
if( (Flags & 2) == 0 )
{
v6 = v7 + 1;
*((_QWORD *)&v5 + 1) = v7 + 1 - v5;
goto LABEL_9;
}
return -1073741584;
}
LABEL_9:
v8 = *((_QWORD *)&v5 + 1);
if( (unsigned __int64)v5 >= v6 )
return -1073741585;
if( (_QWORD)v5 + *((_QWORD *)&v5 + 1) >= *(&stru_140C4DB30 + 374)
&& (unsigned __int64)v5 < *(&stru_140C4DB30 + 374) + 2048i64
|| (_QWORD)v5 + *((_QWORD *)&v5 + 1) >= 0xFFFFFFFFAui64 )
{
return -1073741800;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Thread = CurrentThread;
NewPageRunBlock = 0i64;
Memory = 0i64;
OutputNewPhysicalMemoryBlock = 0i64;
ListHead[2] = 0i64;
ListHead[1] = ListHead;
ListHead[0] = ListHead;
v11 = 5;
if( TargetPartition == &Irp )
v11 = 1;
v12 = Flags | v11;
if( (v12 & 0xFE) != 0 && (v12 & 0x100) != 0 )
return -1073741582;
v13 = v12 & 2;
if( (v12 & 2) != 0 )
MiDeleteExtentPfns(0i64);
else
MiLockDynamicMemoryExclusive(&Irp, CurrentThread);
if( (v12 & 2) != 0 || byte_140C4C870 )
{
LODWORD(v14) = MiIsExtentDangling(v5, *((UINT64 *)&v5 + 1), v12);
if( v14 >= (unsigned __int64)v5 && v14 < v6 )
{
LABEL_25:
v15 = -1073741800;
goto LABEL_72;
}
if( (v12 & 2) != 0 )
{
MiLockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
v16 = 0i64;
if( MmPhysicalMemoryBlock->NumberOfRuns )
{
p_PageCount = &MmPhysicalMemoryBlock->Run[0].PageCount;
do
{
v18 = *(p_PageCount - 1);
if( *p_PageCount )
{
if( (unsigned __int64)v5 >= v18 )
{
if( (unsigned __int64)v5 < *p_PageCount + v18 )
{
LABEL_32:
MiUnlockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
goto LABEL_25;
}
}
else if( v6 > v18 )
{
goto LABEL_32;
}
}
++v16;
p_PageCount += 2;
}
while( v16 < MmPhysicalMemoryBlock->NumberOfRuns );
}
byte_140C4C870 = 1;
MiUnlockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
LABEL_59:
HIDWORD(Flagsa) = v42;
MiMapNewPfns(v5, v6, PartitionId, v12);
v15 = v24;
if( v24 >= 0 )
{
NumberOfBytes->QuadPart = *((_QWORD *)&v5 + 1) << 12;
if( !v13 )
{
LODWORD(Flagsa) = v12;
MiPerformMemoryChange(v5, *((UINT64 *)&v5 + 1), &OutputNewPhysicalMemoryBlock, &NewPageRunBlock, Flagsa);
MiComputeNodeMemory(&Irp);
v25 = -1;
if( *(&stru_140C50B28 + 853) <= 0xFFFFFFFFui64 )
v25 = *(&stru_140C50B28 + 1706);
KUSER_SHARED_DATA.NumberOfPhysicalPages = v25;
if( (v12 & 0x40) == 0 )
{
LODWORD(Flagsb) = 0;
MiUpdateLargePageBitMap((UINT64)&Irp, v5, ((v6 + 511) >> 9) - ((unsigned __int64)v5 >> 9), 0i64, Flagsb);
}
if( (v12 & 4) == 0 )
MiEnableNewPfns(v5, v6);
if( (MiFlags & 0x10000000) != 0 && (MiFlags & 0x30u) >= 0x20 )
{
LODWORD(v31) = 0;
LODWORD(v30) = 0;
ZwUpdateWnfStateData(&WNF_MM_PHYSICAL_MEMORY_CHANGE, 0i64, 0i64, 0i64, 0i64, v30, v31);
}
KePulseEvent(*(&stru_140C50B28 + 28), 0, 0);
}
v15 = 0;
}
LABEL_72:
if( v13 )
goto LABEL_76;
goto LABEL_75;
}
}
v19 = *(&stru_140C50B28 + 853) + *((_QWORD *)&v5 + 1);
if( *(&stru_140C50B28 + 853) + *((_QWORD *)&v5 + 1) > *(&stru_140C4DB30 + 32) )
v6 = v5 + *(&stru_140C4DB30 + 32) - *(&stru_140C50B28 + 853);
*((_QWORD *)&v5 + 1) = *(&stru_140C4DB30 + 32) - *(&stru_140C50B28 + 853);
if( v19 <= *(&stru_140C4DB30 + 32) )
*((_QWORD *)&v5 + 1) = v8;
Memory = MiReferencePageRuns((ULONG_PTR *)&Irp.Core.PartitionId, 1ui64);
v20 = Memory;
if( (unsigned __int64)v5 < v6 )
{
if( (v12 & 0x404) == 0 )
{
v15 = KeConfigureDynamicMemory(v5, v6 - 1, 0i64);
if( v15 < 0 )
goto LABEL_75;
}
if( MiDescribePageRun((_MI_MEMORY_NODE_LISTHEAD *)ListHead, v5, *((UINT64 *)&v5 + 1)) )
{
*(_QWORD *)&MemoryNode = 0i64;
MemoryNode_16 = v5;
v15 = MiConfigureMemoryInsertion(
&OutputNewPhysicalMemoryBlock,
MmPhysicalMemoryBlock,
(_MI_MEMORY_NODE *)&MemoryNode);
if( v15 < 0 )
goto LABEL_75;
if( MiSplitPfnBitMaps((UINT64 *)&Irp.Core.PartitionId, v5, *((INT64 *)&v5 + 1)) )
{
v21 = 0;
while( MiSplitMirrorBitMap((_RTL_BITMAP_EX *)&stru_140C4DB30 + v21 + 146, v5, *((UINT64 *)&v5 + 1)) )
{
if( ++v21 >= 2 )
{
while( 1 )
{
v22 = (_MI_MEMORY_NODE *)ListHead[0];
if( (_QWORD *)ListHead[0] == ListHead )
break;
if( *(_QWORD **)(ListHead[0] + 8i64) != ListHead
|| (v23 = *(_QWORD *)ListHead[0], *(_QWORD *)(*(_QWORD *)ListHead[0] + 8i64) != ListHead[0]) )
{
LABEL_85:
__fastfail(3u);
}
ListHead[0] = *(_QWORD *)ListHead[0];
*(_QWORD *)(v23 + 8) = ListHead;
v15 = MiConfigureMemoryInsertion(&NewPageRunBlock, v20, v22);
ExFreePoolWithTag(v22, 0);
if( v20 != Memory )
ExFreePoolWithTag(v20[-1].Run, 0);
if( v15 < 0 )
{
v13 = v12 & 2;
goto LABEL_75;
}
v20 = NewPageRunBlock;
}
v13 = v12 & 2;
goto LABEL_59;
}
}
}
}
v15 = -1073741670;
goto LABEL_75;
}
v15 = -1073741585;
LABEL_75:
MiUnlockDynamicMemoryExclusive(&Irp, Thread);
LABEL_76:
if( OutputNewPhysicalMemoryBlock )
ExFreePoolWithTag(OutputNewPhysicalMemoryBlock[-1].Run, 0);
if( !NewPageRunBlock )
goto LABEL_81;
Run = NewPageRunBlock[-1].Run;
while( 1 )
{
ExFreePoolWithTag(Run, 0);
LABEL_81:
Run = (_PHYSICAL_MEMORY_RUN *)ListHead[0];
if( (_QWORD *)ListHead[0] == ListHead )
break;
if( *(_QWORD **)(ListHead[0] + 8i64) != ListHead )
goto LABEL_85;
v27 = *(_QWORD *)ListHead[0];
if( *(_QWORD *)(*(_QWORD *)ListHead[0] + 8i64) != ListHead[0] )
goto LABEL_85;
ListHead[0] = *(_QWORD *)ListHead[0];
*(_QWORD *)(v27 + 8) = ListHead;
}
if( !v13 )
{
if( Memory )
MiDereferencePageRuns(Memory);
if( v15 >= 0 )
IoUpdateDumpPhysicalRanges();
}
return v15;
}Referenced by:
MiAddPhysicalMemoryChunks
MiAllocateFileExtents