MiFillSystemPtes
NTSTATUS __stdcall MiFillSystemPtes(UINT64 PointerPte, UINT64 NumberOfPages, INT64 a3, UINT64 a4, INT64 a5, INT64 a6){
void *BugCheckParameter4;
unsigned int v8;
int v9;
UINT64 v11;
UINT64 PteBase;
unsigned __int64 v13;
_MMPTE *PteLimit;
unsigned __int64 v15;
NTSTATUS v16;
__int64 v17;
unsigned __int64 v18;
int v19;
unsigned __int64 v20;
__int64 v21;
unsigned __int64 v22;
UINT64 v23;
unsigned __int16 v24;
unsigned __int64 v25;
__int64 v26;
unsigned __int64 v27;
unsigned __int64 v28;
__int64 v29;
UINT8 v30;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
INT64 v32;
_MMPFN *PfnDb;
unsigned __int64 v34;
int v35;
UINT64 *v36;
INT64 v37;
_UNICODE_STRING *v38;
int v39;
int v40;
int v41;
_MMPFN *v42;
int v43;
__int64 v44;
NTSTATUS v45;
unsigned __int64 v46;
unsigned __int64 v48;
char v49;
unsigned __int8 v50;
__int64 v51;
unsigned int v52;
unsigned int v53;
INT64 v54;
int v55;
INT64 v56;
_RTL_BALANCED_NODE *v57;
INT64 a3a;
_RTL_BALANCED_NODE *v59;
INT64 v60;
_RTL_BALANCED_NODE *v61;
unsigned __int64 v62;
int NewCacheAttribute;
INT64 a2;
unsigned __int16 v66;
BugCheckParameter4 = 0i64;
v61 = 0i64;
v8 = a4;
v59 = 0i64;
v9 = 1;
NewCacheAttribute = 1;
*(_DWORD *)a6 = 0;
v11 = NumberOfPages;
if( (_DWORD)a4 )
{
if( (_DWORD)a4 != 31 )
{
if( (unsigned int)a4 >> 3 == 3 )
{
if( (a4 & 7) != 0 )
NewCacheAttribute = 2;
goto LABEL_10;
}
if( (unsigned int)a4 >> 3 == 1 )
v9 = 0;
}
NewCacheAttribute = v9;
}
else
{
NewCacheAttribute = 3;
}
LABEL_10:
PteBase = (UINT64)MmGetPteBase();
v13 = MmProtectToPteMask[a4 & 0x1F] & 0xFFFF000000000E5Eui64 | 0x21;
PteLimit = MmGetPteLimit();
if( PointerPte < PteBase || PointerPte > (unsigned __int64)PteLimit )
{
v20 = MmProtectToPteMask[a4 & 0x1F] & 0xFFFF000000000E5Eui64 | 0x121;
}
else
{
v15 = (__int64)((PointerPte << 25) - (PteBase << 25)) >> 16;
if( PointerPte >= (unsigned __int64)MmGetPdeBase() && PointerPte <= (unsigned __int64)MmGetPdeLimit() )
{
if( (_MMPTE *)PointerPte == MmGetPxeSelfRef() )
{
v13 = MmProtectToPteMask[a4 & 0x1F] & 0x7FFF000000000E5Ei64 | 0x8000000000000021ui64;
}
else if( (a4 & 0x4000000) == 0 )
{
v13 = MmProtectToPteMask[a4 & 0x1F] & 0x7FFF000000000E5Ei64 | 0x21;
}
v16 = MiUserPdeOrAbove(PointerPte);
v11 = NumberOfPages;
if( v16 )
v13 |= 4ui64;
BugCheckParameter4 = 0i64;
}
v17 = v13 | 4;
if( PointerPte > PteBase + 0x3FFFFFFF78i64 )
v17 = v13;
if( (v8 & 0x4000000) != 0 )
{
LODWORD(v18) = MiGetLeafVa((__int64)((PointerPte << 25) - (PteBase << 25)) >> 16);
v15 = v18;
}
if( v15 >= 0xFFFF800000000000ui64 )
{
if( *((_BYTE *)&stru_140C4DB30 + ((v15 >> 39) & 0x1FF) + 6872) == 1 )
{
v19 = (int)BugCheckParameter4;
}
else if( v15 < PteBase || v15 > (unsigned __int64)MmGetPteLimit() )
{
if( v15 < *(&stru_140C4DB30 + 937) || (v19 = *(&stru_140C4DB30 + 537), v15 > *(&stru_140C4DB30 + 175)) )
v19 = *(&stru_140C4DB30 + 536);
}
else
{
v19 = (int)BugCheckParameter4;
}
}
else
{
v19 = *(&stru_140C4DB30 + 537);
}
v20 = v17 | 0x100;
if( !v19 )
v20 = v17;
}
v60 = (INT64)BugCheckParameter4;
v21 = v20 | 0x42;
v22 = (unsigned __int64)BugCheckParameter4;
v23 = v11;
if( (v8 & 5) != 4 )
v21 = v20;
v24 = v21 & 0xFFFB;
if( (v8 & 0x40000000) == 0 )
v24 = v21;
v25 = v21 & 0xFFFFFFFFFFFFFFFBui64;
v26 = ((unsigned __int16)(*(&stru_140C4DB30 + 536) << 8) ^ v24) & 0x100;
if( (v8 & 0x40000000) == 0 )
v25 = v21;
v27 = v25 ^ v26;
v28 = v27 & 0xFFFFFFFFFFFFFEFFui64;
if( (v8 & 0x8000000) == 0 )
v28 = v27;
v29 = v28 | 0x80;
if( (v8 & 0x4000000) == 0 )
v29 = v28;
v62 = v29 & 0xFAFFFFFFFFFFFFFFui64;
if( !v11 )
return 0;
v30 = a5;
p_u4 = &MmGetPfnDb()->u4;
v32 = a3 - 8;
PfnDb = MmGetPfnDb();
v34 = (unsigned __int64)BugCheckParameter4;
if( a3 >= 0 )
v34 = a3 - 1;
if( a3 >= 0 )
v32 = (INT64)BugCheckParameter4;
v35 = a5 & 4;
HIDWORD(a3a) = v35;
while( 1 )
{
if( v32 )
v34 = *(_QWORD *)(v32 + 8);
else
++v34;
v36 = (UINT64 *)(v32 + 8);
if( !v32 )
v36 = 0i64;
v32 = (INT64)v36;
if( v35 && v34 == *(&stru_140C4DB30 + 497) )
goto LABEL_114;
if( v34 > 0xFFFFFFFFFi64 || (((unsigned __int64)p_u4[6 * v34]._bf_0 >> 50) & 1) == 0 )
{
if( v22 || (v22 = (unsigned __int64)MiIoSpaceRunIsConstant(v34, v36, v23)) != 0 )
{
if( v22 > 1 )
{
v55 = *(_DWORD *)(v22 + 40);
LABEL_107:
v8 &= 7u;
if( v55 )
{
if( v55 == 2 )
v8 |= 0x18u;
}
else
{
v8 |= 8u;
}
v53 = v8;
goto LABEL_112;
}
}
else
{
v22 = 1i64;
}
v54 = v60;
if( v60 )
{
v57 = v61;
}
else
{
if( v32 )
{
v54 = 1i64;
}
else
{
LODWORD(v56) = MiIoPagesInRun(v34, v23);
v54 = v56;
}
v45 = MiReferenceIoPages(1u, v34, v54, NewCacheAttribute, 0i64, &v59);
if( v45 < 0 )
goto LABEL_77;
*(_DWORD *)a6 |= 1u;
v57 = v59;
}
v60 = v54 - 1;
v66 = *((_WORD *)v57[2].Children[0]->Children + (v34 & 0xFFFFFFFFFi64) - v57[1].ParentValue);
v61 = v59;
v55 = v66 >> 14;
goto LABEL_107;
}
v37 = (INT64)&PfnDb[v34];
v38 = (_UNICODE_STRING *)(v30 & 2);
if( (v30 & 2) != 0 )
{
if( (*(_BYTE *)(v37 + 34) & 7) != 5 || (LOBYTE(v39) = MiIsPfnFileOnly((INT64)&PfnDb[v34]), !v39) )
KeBugCheckEx(0x1Au, (PVOID)0x1160C, (PVOID)v34, 0i64, BugCheckParameter4);
}
if( !*(_WORD *)(v37 + 32) )
{
if( !(_DWORD)v38 || (*(_BYTE *)(v37 + 34) & 7) != 5 || (LOBYTE(v40) = MiIsPfnFileOnly(v37), !v40) )
MiShowBadMapper(v34, 5ui64);
}
LOBYTE(v41) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v37, v38, v30, (PWCHAR)p_u4);
if( v41 )
goto LABEL_89;
v44 = *(_QWORD *)(v37 + 40);
if( (v44 & 0x1000000000i64) == 0 )
break;
LODWORD(a2) = v43;
LODWORD(a3a) = v43;
if( MiGetPfnPageSizeIndexUnsynchronized(v42, &a2, &a3a) == 3 || (_DWORD)a2 != 6 )
{
v45 = -1073741800;
LABEL_77:
v46 = (unsigned __int64)MmGetPteBase();
goto LABEL_78;
}
LABEL_89:
v50 = *(_BYTE *)(v37 + 34);
if( (v50 & 0xC0) == 0xC0 )
{
MiAssignInitialPageAttribute((_MMPFN *)v37, (_MI_PFN_CACHE_ATTRIBUTE)NewCacheAttribute);
v50 = *(_BYTE *)(v37 + 34);
}
if( NewCacheAttribute != v50 >> 6 )
{
MiMakeProtectionPfnCompatible((_BYTE *)v8, (_MMPFN *)v37);
v8 = v52;
v53 = v52;
LABEL_112:
LODWORD(v51) = MiMakeValidPte((_XSTATE_CONFIGURATION *)PointerPte, v34, v53 | 0xA0000000);
goto LABEL_113;
}
v51 = v62 | ((v34 & 0xFFFFFFFFFi64 | 0xA00000000000i64) << 12);
LABEL_113:
v35 = HIDWORD(a3a);
BugCheckParameter4 = 0i64;
v30 = a5;
*(_QWORD *)PointerPte = v51;
p_u4 = &MmGetPfnDb()->u4;
PfnDb = MmGetPfnDb();
LABEL_114:
PointerPte += 8i64;
if( !--v23 )
return 0;
}
v46 = (unsigned __int64)MmGetPteBase();
v48 = (__int64)((*(_QWORD *)(v37 + 8) << 25) - (v46 << 25)) >> 16;
if( v48 < v46 )
goto LABEL_89;
if( v48 > (unsigned __int64)MmGetPteLimit() )
goto LABEL_89;
if( (v44 & 0xFFFFFFFFFi64) == 0xFFFFFFFFDi64 )
goto LABEL_89;
v49 = *(_BYTE *)(v37 + 34);
if( (v49 & 0x20) != 0 && (*(_QWORD *)(v37 + 24) & 0x3FFFFFFFFFFFFFFFi64) == 0 && *(_WORD *)(v37 + 32) )
goto LABEL_89;
if( (v49 & 8) != 0 || ((*(_QWORD *)v37 >> 13) & 0x7FFFFFFFFFF0i64 | 0xFFFF800000000000ui64) == 0xFFFF800000000030ui64 )
goto LABEL_89;
v45 = -1073741800;
LABEL_78:
if( (*(_DWORD *)a6 & 1) != 0 )
MiZeroAndFlushPtes(
(VOID *)((__int64)((PointerPte << 25) + ((v23 - NumberOfPages) << 28) - (v46 << 25)) >> 16),
NumberOfPages - v23);
return v45;
}Referenced by:
MiLockAndMapEntireDriver
MiMapContiguousMemory
MiMapHotPatchImageInSystemSpace
MmMapLockedPagesSpecifyCache
MmMapMdl