MiMapContiguousMemoryLarge
INT64 __stdcall MiMapContiguousMemoryLarge(PVOID BugCheckParameter2, INT64 a2){
unsigned int v2;
int v3;
_DWORD *v4;
__int64 PageTablesForLargeMap;
_QWORD *v6;
unsigned int v8;
unsigned __int64 v10;
char *v11;
__int64 v12;
__int64 v13;
char *v14;
unsigned __int64 v15;
int v16;
unsigned __int8 *v17;
ULONG_PTR v18;
unsigned __int8 CurrentIrql;
PVOID v20;
__int64 v21;
CHAR *AnyMultiplexedVm;
unsigned __int8 v24;
_DWORD *a5;
INT64 v26;
_QWORD *v27;
_RTL_BALANCED_NODE *a6;
char *v29;
int v30;
__int64 v31;
unsigned int v32;
int v33;
__int64 v34;
v33 = v3;
v32 = v2;
v4 = (_DWORD *)v34;
PageTablesForLargeMap = 0i64;
v6 = 0i64;
v31 = 0i64;
a6 = 0i64;
*(_DWORD *)v34 = 0;
v8 = 1;
v27 = 0i64;
v10 = 2i64;
if( v2 >> 3 == 1 )
{
v8 = 0;
}
else if( v2 >> 3 == 3 && (v2 & 7) != 0 )
{
v8 = 2;
}
v11 = (char *)MmGetPfnDb() + 40;
if( (unsigned __int64)BugCheckParameter2 > 0xFFFFFFFFFi64 )
{
LODWORD(v13) = 0;
}
else
{
v12 = 6i64 * (_QWORD)BugCheckParameter2;
v13 = (*(_QWORD *)&v11[8 * v12] >> 50) & 1i64;
if( ((*(_QWORD *)&v11[8 * v12] >> 50) & 1) != 0 )
{
v14 = (char *)MmGetPfnDb() + 8 * v12;
goto LABEL_6;
}
}
v14 = 0i64;
LABEL_6:
v15 = 0i64;
v29 = v14;
v16 = 3;
if( !a2 )
goto LABEL_17;
v17 = (unsigned __int8 *)(v14 + 34);
while( 1 )
{
v18 = (ULONG_PTR)BugCheckParameter2 + v15;
if( (unsigned __int64)BugCheckParameter2 + v15 > 0xFFFFFFFFFi64
|| (*((_QWORD *)MmGetPfnDb() + 6 * v18 + 5) & 0x4000000000000i64) == 0 )
{
break;
}
if( ((unsigned __int8)v3 & (unsigned __int8)v10) != 0 && ((*v17 & 7) != 5 || !MiIsPfnFileOnly((INT64)(v17 - 34))) )
KeBugCheckEx(0x1Au, 0x1160Cui64, v18, 0i64, 0i64);
if( !v14 )
goto LABEL_16;
v24 = *v17;
if( (*v17 & 0xC0) == 0xC0 )
{
MiAssignInitialPageAttribute((INT64)(v17 - 34), v8);
v24 = *v17;
v10 = 2i64;
v6 = v27;
}
if( v24 >> 6 != v8 )
goto LABEL_16;
v16 = v8;
LABEL_12:
++v15;
v17 += 48;
if( v15 >= a2 )
goto LABEL_16;
v14 = v29;
LOBYTE(v3) = v33;
}
if( v14 )
goto LABEL_16;
if( v15 )
goto LABEL_12;
CurrentIrql = KeGetCurrentIrql();
__writecr8(v10);
v6 = MiIoSpaceIsConstant((unsigned __int64)BugCheckParameter2, a2);
v27 = v6;
__writecr8(CurrentIrql);
if( !v6 )
goto LABEL_12;
v16 = *((_DWORD *)v6 + 10);
v15 = a2;
LABEL_16:
PageTablesForLargeMap = v31;
v4 = (_DWORD *)v34;
LABEL_17:
if( v15 == a2 )
{
if( (_DWORD)v13 || v6 )
{
LABEL_23:
LODWORD(v21) = MiSearchNumaNodeTable(BugCheckParameter2);
PageTablesForLargeMap = MiGetPageTablesForLargeMap(a2, 9ui64, 1i64, (unsigned int)(*(_DWORD *)(v21 + 8) + 1));
if( PageTablesForLargeMap )
{
AnyMultiplexedVm = MiGetAnyMultiplexedVm(3i64);
LODWORD(v26) = v16;
LODWORD(a5) = 1;
MiMapWithLargePages(
(INT64)AnyMultiplexedVm,
PageTablesForLargeMap,
(UINT64)BugCheckParameter2,
a2,
(INT64)a5,
v32,
v26);
if( a6 )
*v4 |= 1u;
}
else if( !(_DWORD)v13 && !v27 )
{
v20 = BugCheckParameter2;
goto LABEL_46;
}
}
else
{
v30 = 0;
if( (int)MiReferenceIoPages(1ui64, (INT64)BugCheckParameter2, a2, v8, &v30, &a6) >= 0 )
{
v20 = BugCheckParameter2;
if( ((v30 - 1) & v30) == 0 )
{
v16 = *((unsigned __int16 *)a6[2].Children[0]->Children
+ ((unsigned __int64)BugCheckParameter2 & 0xFFFFFFFFFi64)
- a6[1].ParentValue) >> 14;
LOWORD(v34) = *((_WORD *)a6[2].Children[0]->Children
+ ((unsigned __int64)BugCheckParameter2 & 0xFFFFFFFFFi64)
- a6[1].ParentValue);
goto LABEL_23;
}
LABEL_46:
MiDereferenceIoPages(1i64, v20, a2);
}
}
}
return PageTablesForLargeMap;
}Referenced by:
MiMapContiguousMemory