MiReferenceIoPages
__int64 __fastcall MiReferenceIoPages(
unsigned int a1,
__int64 a2,
INT64 a3,
int a4,
_DWORD *a5,
_RTL_BALANCED_NODE **a6){
__int64 v8;
unsigned __int64 v9;
_RTL_BALANCED_NODE **v10;
char *v11;
unsigned __int64 v12;
__int64 v13;
char *v14;
unsigned __int8 CurrentIrql;
_RTL_BALANCED_NODE *v16;
INT64 v17;
BOOL v18;
_RTL_BALANCED_NODE *v19;
_RTL_BALANCED_NODE *v20;
_RTL_BALANCED_NODE *Pool;
unsigned __int64 v22;
UINT64 v23;
_RTL_BALANCED_NODE *v24;
unsigned __int16 *v25;
__int64 v26;
UINT64 v27;
int v28;
unsigned __int16 v29;
signed int v30;
unsigned __int64 ParentValue;
_RTL_BALANCED_NODE *v33;
NTSTATUS v34;
int v35;
_RTL_BALANCED_NODE *v36;
signed __int64 v37;
_MDL *v38;
int v39;
unsigned int v42;
INT64 v43;
unsigned __int64 v44;
_RTL_BALANCED_NODE **Tree;
_RTL_BALANCED_NODE **v46;
unsigned __int8 v47;
char v48[176];
v8 = (int)a1;
v43 = a3;
memset(v48, 0i64, sizeof(v48));
if( a5 )
*a5 = 0;
if( a6 )
*a6 = 0i64;
v42 = 0;
v39 = 0;
v9 = a2 & 0xFFFFFFFFFi64;
v44 = v9;
Tree = (_RTL_BALANCED_NODE **)((char *)&stru_140C4DB30 + 8 * v8 + 3672);
v10 = (_RTL_BALANCED_NODE **)((char *)&stru_140C4DB30 + 3688);
v11 = 0i64;
v12 = v9;
if( (_DWORD)v8 != 1 )
v10 = 0i64;
v13 = -1i64;
v46 = v10;
v14 = 0i64;
CurrentIrql = KeGetCurrentIrql();
v47 = CurrentIrql;
__writecr8(2ui64);
if( a1 == 1 )
{
v16 = MiIoSpaceIsConstant(v9, a3);
if( v16 )
a4 = *(_DWORD *)&v16[1]._bf_0;
}
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&stru_140C4DB30 + 458);
v17 = a3;
if( a3 )
{
while( 1 )
{
v18 = 0;
v19 = *Tree;
if( *Tree )
{
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 )
{
Pool = (_RTL_BALANCED_NODE *)MiAllocatePool(64i64, 0x440ui64, 0x6F49694Dui64);
v20 = Pool;
if( !Pool )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&stru_140C4DB30 + 458);
__writecr8(CurrentIrql);
MiDereferenceIoPages(a1, v44, v9 - v44);
return 3221225626i64;
}
Pool[1].ParentValue = v9 & 0xFFFFFFFFFFFFFE00ui64;
Pool[2].Children[0] = (_RTL_BALANCED_NODE *)((char *)Pool + 64);
MiInitializeIoPageNodeArray((_MI_IO_PFN_NODE *)Pool);
}
RtlAvlInsertNodeEx(Tree, (UINT64)v19, v18, v20);
v17 = v43;
LABEL_18:
if( a6 && !*a6 )
*a6 = v20;
v22 = v20[1].ParentValue;
v23 = (UINT64)v20[2].Children[0];
v24 = (_RTL_BALANCED_NODE *)(v22 + 512);
v25 = (unsigned __int16 *)(v23 + 2 * (v9 - v22));
if( v22 == -512i64 || v17 + v9 <= (unsigned __int64)v24 )
v26 = 2 * (v17 + v9 - v22);
else
v26 = 1024i64;
v27 = v26 + v23;
if( (unsigned __int64)v25 < v26 + v23 )
break;
LABEL_33:
if( v39 )
{
v36 = v20[2].Children[0];
v24 = (_RTL_BALANCED_NODE *)((char *)v36 + 1024);
if( v36 < (_RTL_BALANCED_NODE *)&v36[42].16 )
{
v23 = 0x3FFFi64;
do
{
if( ((__int64)v36->Children[0] & 0x3FFF) == 0 )
LOWORD(v36->Children[0]) |= 0xC000u;
v36 = (_RTL_BALANCED_NODE *)((char *)v36 + 2);
}
while( v36 < v24 );
CurrentIrql = v47;
v17 = v43;
}
}
if( !v17 )
{
v12 = v44;
goto LABEL_36;
}
}
v23 = (UINT64)a5;
v28 = v39;
while( 1 )
{
v29 = *v25;
LODWORD(v24) = *v25;
if( (*v25 & 0x3FFF) == 0x3FFF )
break;
v30 = (unsigned int)v24 >> 14;
if( (v29 & 0x3FFF) != 0 )
{
if( v30 == a4 )
++*(&stru_140C4DB30 + 932);
else
++*(&stru_140C4DB30 + 933);
}
else
{
++v20[2].Children[1];
if( v30 == a4 )
{
++*(&stru_140C4DB30 + 935);
}
else
{
if( v46 && (v29 & 0xC000) == 0x4000 && !v28 )
{
++*(&stru_140C4DB30 + 936);
if( !v11 )
{
v11 = v48;
v14 = &v48[48];
}
*(_QWORD *)v14 = v9;
v14 += 8;
if( v14 == v11 + 176 )
{
++*(&stru_140C4DB30 + 934);
*(_QWORD *)v11 = 0i64;
*((_DWORD *)v11 + 2) = 131248;
*((_QWORD *)v11 + 4) = 0i64;
*((_QWORD *)v11 + 5) = 0x10000i64;
v34 = MiFlushCacheMdl((_MDL *)1, (_MI_PFN_CACHE_ATTRIBUTE)v30, v23);
v35 = v39;
v17 = v43;
v11 = 0i64;
if( v34 )
v35 = 1;
v39 = v35;
v28 = v35;
}
}
v23 = (UINT64)a5;
v29 = (_WORD)a4 << 14;
}
}
if( v23 )
*(_DWORD *)v23 |= 1 << (v29 >> 14);
LODWORD(v24) = 1;
--v17;
++v9;
v43 = v17;
*v25++ = (v29 ^ (v29 + 1)) & 0x3FFF ^ v29;
if( (unsigned __int64)v25 >= v27 )
goto LABEL_33;
}
v12 = v44;
v42 = -1073741670;
if( v9 != v44 )
v13 = v9;
LABEL_36:
if( v11 )
{
++*(&stru_140C4DB30 + 934);
v37 = v14 - v11;
*(_QWORD *)v11 = 0i64;
*((_QWORD *)v11 + 4) = 0i64;
*((_DWORD *)v11 + 11) = 0;
*((_WORD *)v11 + 5) = 2;
v38 = (_MDL *)((unsigned __int64)(unsigned int)((v37 - 48) >> 3) << 12);
*((_DWORD *)v11 + 10) = (_DWORD)v38;
*((_WORD *)v11 + 4) = 8 * (((v37 - 48) >> 3) + 6);
MiFlushCacheMdl(v38, (_MI_PFN_CACHE_ATTRIBUTE)v24, v23);
}
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&stru_140C4DB30 + 458);
__writecr8(CurrentIrql);
if( v13 != -1 )
MiDereferenceIoPages(a1, v12, v13 - v12);
return v42;
}Referenced by:
MiAddLoaderHalIoPte
MiFillSystemPtes
MiMapContiguousMemoryLarge
MiMapLockedPagesInUserSpace
MiMapViewOfPhysicalSection
MiProbeLockFrame
MmRotatePhysicalView