MiReferenceIoPages
INT64 __fastcall MiReferenceIoPages(UINT64 a1, INT64 a2, INT64 a3, INT64 a4, _DWORD *a5, _RTL_BALANCED_NODE **a6){
__int64 v8;
unsigned __int64 v9;
RTL_BALANCED_NODE **v10;
INT64 *v11;
unsigned __int64 v12;
__int64 v13;
char *v14;
unsigned __int8 CurrentIrql;
_QWORD *v16;
INT64 v17;
bool v18;
RTL_BALANCED_NODE *v19;
RTL_BALANCED_NODE *v20;
INT64 v21;
unsigned __int64 v22;
_RTL_BALANCED_NODE *v23;
unsigned __int16 *v24;
__int64 v25;
unsigned __int64 v26;
_DWORD *v27;
int v28;
unsigned __int16 v29;
int v30;
unsigned __int64 ParentValue;
RTL_BALANCED_NODE *v33;
int v34;
int v35;
_RTL_BALANCED_NODE *v36;
_RTL_BALANCED_NODE *v37;
signed __int64 v38;
int v39;
int v40;
unsigned int v41;
unsigned int v42;
INT64 v43;
unsigned __int64 v44;
unsigned __int64 *v45;
RTL_BALANCED_NODE **v46;
unsigned __int8 v47;
INT64 result[6];
char v49;
v8 = (int)a1;
v43 = a3;
v41 = a1;
v40 = a4;
memset((INT64)result, 0i64);
if( a5 )
*a5 = 0;
if( a6 )
*a6 = 0i64;
v42 = 0;
v39 = 0;
v9 = a2 & 0xFFFFFFFFFi64;
v44 = v9;
v45 = (unsigned __int64 *)&xmmword_140C4E988 + v8;
v10 = &qword_140C4E998;
v11 = 0i64;
v12 = v9;
if( (_DWORD)v8 != 1 )
v10 = 0i64;
v13 = -1i64;
v46 = v10;
v14 = 0i64;
CurrentIrql = KeGetCurrentIrql();
v47 = CurrentIrql;
__writecr8(2ui64);
if( v41 == 1 )
{
v16 = MiIoSpaceIsConstant(v9, a3);
if( v16 )
v40 = *((_DWORD *)v16 + 10);
}
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&dword_140C4E980);
v17 = a3;
if( a3 )
{
while( 1 )
{
v18 = 0;
v19 = (RTL_BALANCED_NODE *)*v45;
if( *v45 )
{
while( 1 )
{
ParentValue = v19[1].ParentValue;
if( v9 < ParentValue )
{
v33 = v19->Children[0];
if( !v19->Children[0] )
break;
}
else
{
if( v9 < ParentValue + 512 )
{
v20 = v19;
goto LABEL_18;
}
v33 = v19->Children[1];
if( !v33 )
{
v18 = 1;
break;
}
}
v19 = v33;
}
}
if( !v46 || (v20 = MiRemoveUnmappedIoNode(v46, v9)) == 0i64 )
{
LODWORD(v21) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v20 = (RTL_BALANCED_NODE *)v21;
if( !v21 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4E980);
__writecr8(CurrentIrql);
MiDereferenceIoPages(v41, v44, v9 - v44);
return 3221225626i64;
}
*(_QWORD *)(v21 + 40) = v9 & 0xFFFFFFFFFFFFFE00ui64;
*(_QWORD *)(v21 + 48) = v21 + 64;
MiInitializeIoPageNodeArray(v21);
}
RtlAvlInsertNodeEx(v45, (__int64)v19, v18, v20);
v17 = v43;
LABEL_18:
if( a6 && !*a6 )
*a6 = v20;
v22 = v20[1].ParentValue;
v23 = v20[2].Children[0];
v24 = (unsigned __int16 *)((char *)v23 + 2 * (v9 - v22));
if( v22 == -512i64 || v17 + v9 <= v22 + 512 )
v25 = 2 * (v17 + v9 - v22);
else
v25 = 1024i64;
v26 = (unsigned __int64)v23 + v25;
if( v24 < (unsigned __int16 *)((char *)v23 + v25) )
break;
LABEL_33:
if( v39 )
{
v36 = v20[2].Children[0];
v37 = (_RTL_BALANCED_NODE *)((char *)v36 + 1024);
if( v36 < (_RTL_BALANCED_NODE *)&v36[42].16 )
{
do
{
if( ((__int64)v36->Children[0] & 0x3FFF) == 0 )
LOWORD(v36->Children[0]) |= 0xC000u;
v36 = (_RTL_BALANCED_NODE *)((char *)v36 + 2);
}
while( v36 < v37 );
CurrentIrql = v47;
v17 = v43;
}
}
if( !v17 )
{
v12 = v44;
goto LABEL_36;
}
}
v27 = a5;
v28 = v39;
while( 1 )
{
v29 = *v24;
if( (*v24 & 0x3FFF) == 0x3FFF )
break;
v30 = *v24 >> 14;
if( (v29 & 0x3FFF) != 0 )
{
if( v30 == v40 )
++dword_140C4E9C0;
else
++dword_140C4E9C4;
}
else
{
++v20[2].Children[1];
if( v30 == v40 )
{
++dword_140C4E9CC;
}
else
{
if( v46 && (v29 & 0xC000) == 0x4000 && !v28 )
{
++dword_140C4E9D0;
if( !v11 )
{
v11 = result;
v14 = &v49;
}
*(_QWORD *)v14 = v9;
v14 += 8;
if( v14 == (char *)(v11 + 22) )
{
++dword_140C4E9C8;
*v11 = 0i64;
*((_DWORD *)v11 + 2) = 131248;
v11[4] = 0i64;
v11[5] = 0x10000i64;
v34 = MiFlushCacheMdl();
v35 = v39;
v17 = v43;
v11 = 0i64;
if( v34 )
v35 = 1;
v39 = v35;
v28 = v35;
}
}
v27 = a5;
v29 = (_WORD)v40 << 14;
}
}
if( v27 )
*v27 |= 1 << (v29 >> 14);
--v17;
++v9;
v43 = v17;
*v24++ = (v29 ^ (v29 + 1)) & 0x3FFF ^ v29;
if( (unsigned __int64)v24 >= v26 )
goto LABEL_33;
}
v12 = v44;
v42 = -1073741670;
if( v9 != v44 )
v13 = v9;
LABEL_36:
if( v11 )
{
++dword_140C4E9C8;
v38 = v14 - (char *)v11;
*v11 = 0i64;
v11[4] = 0i64;
*((_DWORD *)v11 + 11) = 0;
*((_WORD *)v11 + 5) = 2;
*((_DWORD *)v11 + 10) = (unsigned int)((v38 - 48) >> 3) << 12;
*((_WORD *)v11 + 4) = 8 * (((v38 - 48) >> 3) + 6);
MiFlushCacheMdl();
}
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4E980);
__writecr8(CurrentIrql);
if( v13 != -1 )
MiDereferenceIoPages(v41, v12, v13 - v12);
return v42;
}Referenced by:
MiAddLoaderHalIoPte
MiFillSystemPtes
MiMapContiguousMemoryLarge
MiMapLockedPagesInUserSpace
MiMapViewOfPhysicalSection
MiProbeLockFrame
MmRotatePhysicalView