MiGetUltraMapping
__int64 __fastcall MiGetUltraMapping(unsigned __int64 *a1, unsigned int a2, __int64 a3, char a4){
unsigned __int64 v4;
__int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
__int64 v12;
__int64 result;
UINT64 v14;
_MMPTE *PteBase;
UINT64 v16;
__int64 v17;
__int64 v18;
_MMPTE *PdpteBase;
UINT64 SetBitsAndClear;
UINT64 v21;
unsigned __int64 v22;
__int64 v23;
__int64 v24;
INT64 *v25;
__int64 v26;
unsigned __int64 v27;
__int64 v28;
UINT64 v29;
UINT64 i;
_QWORD *v31;
__int64 v32;
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT64 v34;
v4 = *a1;
v9 = MiUltraMapSizes[a2];
memset(&LockHandle, 0, sizeof(LockHandle));
if( !v4 )
goto LABEL_15;
if( a2 == 1 )
{
v10 = v9 << 9;
LABEL_5:
v11 = v10 - 1;
v12 = a3 << 12;
if( (a3 << 12) + (v4 & (v10 - 1)) > v10 )
{
v4 = ~v11 & (v10 + v4 - 1);
*a1 = v4;
}
if( (v11 & v4) != 0 && (a4 & 2) == 0 )
{
*a1 = v12 + v4;
return v4;
}
v14 = (UINT64)MmGetPdeBase() + (((v4 - 1) >> 18) & 0x3FFFFFF8);
PteBase = MmGetPteBase();
v34 = v14;
if( a2 <= 1 )
{
v28 = 2 - a2;
do
{
v14 = (UINT64)PteBase + ((v14 >> 9) & 0x7FFFFFFFF8i64);
--v28;
}
while( v28 );
v34 = v14;
}
*(_QWORD *)v34 = ZeroPte;
if( (a4 & 2) != 0 )
{
if( a2 > 1 )
*(_QWORD *)((char *)MmGetPteBase() + ((v34 >> 9) & 0x7FFFFFFFF8i64)) = ZeroPte;
}
else if( a2 != 1 )
{
v16 = v34 + 8;
if( ((v34 + 8) & 0xFFF) != 0 )
{
v17 = (_QWORD)MmGetPteBase() << 25;
v18 = (((__int64)((v16 << 25) - v17) >> 16 << 25) - v17) >> 16;
*(_QWORD *)v16 = MiMakeValidPte(v16, a1[2], 3087007748i64);
result = v18;
*a1 = v12 + v18;
return result;
}
}
goto LABEL_28;
}
if( a2 )
{
v10 = 0x200000i64;
goto LABEL_5;
}
LABEL_28:
v4 -= v9;
LABEL_15:
KeAcquireInStackQueuedSpinLock(&qword_140C4E930, &LockHandle);
PdpteBase = MmGetPdpteBase();
if( v4 )
{
v27 = (v4 - qword_140C4E938) >> 30;
*(_QWORD *)((char *)PdpteBase + ((v4 >> 27) & 0x1FFFF8)) = ZeroPte;
_bittestandset64((signed __int64 *)qword_140C4E960, v27);
}
if( (a4 & 2) != 0 )
{
*a1 = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return 0i64;
}
else
{
while( 1 )
{
SetBitsAndClear = RtlFindSetBitsAndClearEx(&qword_140C4E948, 1ui64, qword_140C4E940);
v21 = SetBitsAndClear;
if( SetBitsAndClear != -1i64 )
break;
KeFlushTb(0i64, 2u);
v29 = 0i64;
for( i = qword_140C4E948 >> 6; v29 < i; *v31 |= v32 )
{
v31 = (_QWORD *)(qword_140C4E950 + 8 * v29);
v32 = *(_QWORD *)(qword_140C4E960 + 8 * v29++);
}
memset(qword_140C4E960, 0i64);
}
qword_140C4E940 = SetBitsAndClear + 1;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v22 = qword_140C4E938 + (v21 << 30);
if( (a4 & 1) == 0 )
*a1 = v22 + (a3 << 12);
if( a2 )
{
v23 = (__int64)MmGetPdpteBase() + ((v22 >> 27) & 0x1FFFF8);
v24 = (_QWORD)MmGetPteBase() << 25;
v25 = (INT64 *)(a1 + 1);
v26 = (a2 != 1) + 1i64;
do
{
*(_QWORD *)v23 = MiMakeValidPte(v23, *v25++, 3087007748i64);
v23 = ((v23 << 25) - v24) >> 16;
--v26;
}
while( v26 );
}
return v22;
}
}Referenced by:
MiAllocateHyperSpace
MiCombineAllPhysicalMemory
MiCombinePte
MiDecrementAndInsertStandbyPages
MiDeletePteRun
MiDeleteUltraMapContext
MiGetPageChain
MiHugePageOperation
MiInitializeNewUltraHugeContext
MiMapPageInHyperSpaceWorker
MiMapPagesToZero
MiScrubNodeLargePageList
MiScrubPage
MiSharePages
MiTimeSingleLargePageZeroWorker
MiWsleFree
MiZeroLargePage
MiZeroWithUltraSpace
MmMapMdl