MiUpdateLargePageBitMap
VOID __stdcall MiUpdateLargePageBitMap(
UINT64 PageFrameIndex,
UINT64 NumberOfPages,
UINT64 SettingBits,
UINT64 BitsMustBeChanged,
UINT64 BitsMustBeChangeda){
int v7;
UINT64 v8;
int v9;
__int64 v10;
int v11;
INT64 v12;
UINT64 v13;
UINT64 v14;
UINT64 v15;
UINT64 v16;
unsigned __int8 v17;
unsigned __int64 v18;
unsigned __int64 v19;
__int64 v20;
__int64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
__int64 v24;
__int64 *v25;
__int64 v26;
__int64 *v27;
bool i;
unsigned __int8 v29;
unsigned __int64 v30;
__int64 v31;
unsigned __int64 v32;
__int64 *v33;
__int64 v34;
__int64 *v35;
bool j;
__int64 v37;
__int64 *v38;
__int64 v39;
__int64 *v40;
bool v41;
__int64 v42;
__int64 *v43;
__int64 v44;
__int64 *v45;
unsigned __int8 v46;
struct _KLOCK_QUEUE_HANDLE LockHandle;
unsigned __int64 v49;
v7 = BitsMustBeChanged;
v8 = PageFrameIndex;
memset(&LockHandle, 0, sizeof(LockHandle));
if( SettingBits >= 0x200 )
{
v9 = BitsMustBeChangeda;
LODWORD(v10) = 2;
v11 = 0;
while( 1 )
{
v10 = (unsigned int)(v10 - 1);
v12 = 16i64 * (unsigned int)v10 + v8 + 5064;
if( !*(_QWORD *)v12 )
{
LABEL_29:
if( v11 == 1 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
return;
}
v49 = MiLargePageSizes[v10];
v13 = NumberOfPages / v49;
v14 = (~(v49 - 1) & (SettingBits + v49 + NumberOfPages - 1)) / v49;
v15 = v14;
v16 = v14 - NumberOfPages / v49;
if( v9 != 1 )
break;
LABEL_11:
if( !v11 )
{
v11 = 1;
KeAcquireInStackQueuedSpinLock(&qword_140C4DD80, &LockHandle);
}
if( v7 == 1 )
RtlSetBitsEx(v12, v13, v16);
else
RtlClearBitsEx(v12, v13, v16);
if( !(_DWORD)v10 )
goto LABEL_29;
v18 = MiLargePageSizes[(unsigned int)(v10 - 1)] / v49;
v19 = v18;
v20 = ~(v18 - 1);
v21 = v20 & (v18 + v15 - 1);
v22 = v20 & v13;
v23 = v21 - v22;
if( v7 != 1 )
goto LABEL_34;
if( v22 >= *(_QWORD *)v12 )
goto LABEL_28;
if( v18 <= 1 )
{
if( v18 != 1 )
goto LABEL_28;
v29 = _bittest64(*(const signed __int64 **)(v12 + 8), v22);
LABEL_27:
if( !v29 )
goto LABEL_28;
}
else
{
if( *(_QWORD *)v12 - v22 < v18 )
goto LABEL_28;
v24 = *(_QWORD *)(v12 + 8);
v25 = (__int64 *)(v24 + 8 * (v22 >> 6));
v26 = *v25;
v27 = (__int64 *)(v24 + 8 * ((v22 + v18 - 1) >> 6));
if( v25 != v27 )
{
for( i = ((-1i64 << v22) & v26) == -1i64 << v22; i; i = *v25 == -1 )
{
if( ++v25 == v27 )
{
if( ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v22 + (unsigned __int8)v18 - 1)) & *v25) == 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v22 + (unsigned __int8)v18 - 1) )
goto LABEL_39;
v29 = 0;
goto LABEL_27;
}
}
LABEL_28:
v23 -= v19;
if( !v23 )
goto LABEL_29;
v22 += v19;
goto LABEL_39;
}
if( ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v18) << v22) & v26) != 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v18) << v22 )
goto LABEL_28;
}
LABEL_39:
v30 = v21 - v19;
if( v21 - v19 < *(_QWORD *)v12 )
{
if( v19 <= 1 )
{
if( v19 == 1 )
{
v46 = _bittest64(*(const signed __int64 **)(v12 + 8), v30);
LABEL_77:
if( v46 )
goto LABEL_34;
}
}
else if( *(_QWORD *)v12 - v30 >= v19 )
{
v31 = *(_QWORD *)(v12 + 8);
v32 = v21 - 1;
v33 = (__int64 *)(v31 + 8 * (v30 >> 6));
v34 = *v33;
v35 = (__int64 *)(v31 + 8 * (v32 >> 6));
if( v33 == v35 )
{
if( ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v19) << v30) & v34) == 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v19) << v30 )
goto LABEL_34;
}
else
{
for( j = ((-1i64 << v30) & v34) == -1i64 << v30; j; j = *v33 == -1 )
{
if( ++v33 == v35 )
{
if( ((0xFFFFFFFFFFFFFFFFui64 >> ~(_BYTE)v32) & *v33) == 0xFFFFFFFFFFFFFFFFui64 >> ~(_BYTE)v32 )
goto LABEL_34;
v46 = 0;
goto LABEL_77;
}
}
}
}
}
v23 -= v19;
if( !v23 )
goto LABEL_29;
LABEL_34:
v8 = PageFrameIndex;
NumberOfPages = v49 * v22;
SettingBits = v49 * v23;
v9 = v7;
}
if( v7 == 1 )
{
if( v13 < *(_QWORD *)v12 )
{
if( v16 <= 1 )
{
if( v16 == 1 )
{
v17 = _bittest64(*(const signed __int64 **)(v12 + 8), v13);
goto LABEL_10;
}
goto LABEL_54;
}
if( *(_QWORD *)v12 - v13 >= v16 )
{
v37 = *(_QWORD *)(v12 + 8);
v38 = (__int64 *)(v37 + 8 * (v13 >> 6));
v39 = *v38;
v40 = (__int64 *)(v37 + 8 * ((v14 - 1) >> 6));
if( v38 == v40 )
{
v41 = ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v16) << v13) & v39) == 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v16) << v13;
LABEL_66:
v17 = v41;
LABEL_10:
if( v17 == 1 )
goto LABEL_29;
goto LABEL_11;
}
if( ((-1i64 << v13) & v39) == -1i64 << v13 )
{
while( ++v38 != v40 )
{
if( *v38 != -1 )
goto LABEL_54;
}
v41 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v14 - 1)) & *v38) == 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v14 - 1);
goto LABEL_66;
}
}
}
}
else if( v13 < *(_QWORD *)v12 )
{
if( v16 <= 1 )
{
if( v16 == 1 )
{
v17 = !_bittest64(*(const signed __int64 **)(v12 + 8), v13);
goto LABEL_10;
}
goto LABEL_54;
}
if( *(_QWORD *)v12 - v13 >= v16 )
{
v42 = *(_QWORD *)(v12 + 8);
v43 = (__int64 *)(v42 + 8 * (v13 >> 6));
v44 = *v43;
v45 = (__int64 *)(v42 + 8 * ((v14 - 1) >> 6));
if( v43 == v45 )
{
v41 = (v44 & (0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v16) << v13)) == 0;
goto LABEL_66;
}
if( (v44 & (-1i64 << v13)) == 0 )
{
while( ++v43 != v45 )
{
if( *v43 )
goto LABEL_54;
}
v41 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v14 - 1)) & *v43) == 0;
goto LABEL_66;
}
}
}
LABEL_54:
v17 = 0;
goto LABEL_10;
}
}Referenced by:
MiActOnPartitionNodePages
MiAddPhysicalMemory
MiAssembleLargePagePfnList
MiCreateBootSlabEntries
MiCreateEnclaveRegions
MiDeleteSubsectionLargePages
MiDemotePfnListChain
MiDemoteValidLargePageOneLevel
MiFindContiguousPages
MiFindLargeNodePage
MiFreeLargePageMemory
MiFreeLargeZeroPages
MiFreeMdlPageRun
MiFreeSmallPageFromMdl
MiGetFastLargePages
MiInitializeDynamicPfns
MiLinkPoolCommitChain
MiMarkLargePagePte
MiMarkLargePageRanges
MiRebuildLargePage