MiGetNextPageTablePte
NTSTATUS __stdcall MiGetNextPageTablePte(INT64 a1, INT64 *a2, INT64 a3){
INT64 v3;
unsigned __int64 v4;
__int64 v5;
__int16 v7;
NTSTATUS result;
_MI_TB_FLUSH_LIST *v9;
void(__fastcall *v10)(INT64);
__int64 BugCheckParameter4;
NTSTATUS v12;
void *v13;
__int64 v14;
_MMPTE *v15;
unsigned __int64 v16;
char *v17;
int v18;
__int64 v19;
_MMPTE *PteBase;
unsigned __int64 v21;
INT64 v22;
v3 = *a2;
v4 = (unsigned __int64)a2;
v5 = (int)a3;
if( (_DWORD)a3 == 3 )
MiPteInShadowRange((UINT64)a2);
v22 = v3;
if( !v3 )
{
if( !(_DWORD)v5 )
return(*(_BYTE *)a1 & 1) != 0;
return 0;
}
if( (v3 & 1) == 0 )
{
if( (int)v5 < 1 || (LOBYTE(v18) = MiIsPdeOrAboveAccessible(v4), v18) )
{
if( !(_DWORD)v5 )
return 1;
if( *(char *)a1 >= 0 )
{
v9 = *(_MI_TB_FLUSH_LIST **)(a1 + 16);
if( v9 )
MiFlushTbList(v9);
v10 = *(void(__fastcall **)(INT64))(a1 + 160);
if( v10 )
v10(a1);
if( (*(_BYTE *)(a1 + 2) & 1) == 0 )
MiReleaseWalkLocks(a1);
BugCheckParameter4 = (__int64)((v4 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
v12 = MmAccessFault(
((unsigned __int64)*(unsigned int *)(a1 + 8) << 57) | 0x100000000000002i64,
(PVOID)BugCheckParameter4,
0,
0i64);
v13 = (void *)v12;
if( v12 < 0 )
{
MiFlushAllFilesystemPages();
KeBugCheckEx(0x7Au, (PVOID)1, v13, KeGetCurrentThread()->ApcState.Process, (PVOID)BugCheckParameter4);
}
return 1;
}
return 0;
}
LABEL_33:
if( (*(_BYTE *)a1 & 0x40) == 0 )
return 1;
v19 = *(_QWORD *)(a1 + 168);
PteBase = MmGetPteBase();
for( *(_DWORD *)v19 = v5; (_DWORD)v5; LODWORD(v5) = v5 - 1 )
v4 = (__int64)((v4 << 25) - ((_QWORD)PteBase << 25)) >> 16;
if( v4 < (unsigned __int64)PteBase + ((*(_QWORD *)(a1 + 32) >> 9) & 0x7FFFFFFFF8i64) )
v4 = (unsigned __int64)PteBase + ((*(_QWORD *)(a1 + 32) >> 9) & 0x7FFFFFFFF8i64);
*(_QWORD *)(v19 + 8) = v4;
return 3;
}
if( (_MMPTE *)v4 == MmGetPxeSelfRef() )
return 0;
if( (v3 & 0x80u) != 0i64 )
goto LABEL_33;
v7 = *(_WORD *)a1;
if( (*(_WORD *)a1 & 0x200) != 0 && *(&stru_140C4DB30 + 507) != *(&stru_140C4DB30 + 508) )
{
LODWORD(v21) = MI_READ_PTE_LOCK_FREE((INT64)&v22);
if( ((v21 >> 12) & 0xFFFFFFFFFi64) == *((_QWORD *)&stru_140C4DB30 + v5 + 507) )
return 0;
}
if( (int)v5 > ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
return 2;
if( (v7 & 0x40) == 0 )
return 1;
v14 = *(_QWORD *)(a1 + 168);
v15 = MmGetPteBase();
if( (v7 & 4) != 0 )
{
MiLockPageTableInternal(*(_QWORD *)(a1 + 24), v4, 0i64);
MiUnlockPageTableInternal(*(_QWORD *)(a1 + 24), (UINT64)v15 + ((v4 >> 9) & 0x7FFFFFFFF8i64));
*(_QWORD *)(a1 + 48) = v4;
}
v16 = (__int64)((v4 << 25) - ((_QWORD)v15 << 25)) >> 16;
v17 = (char *)v15 + ((*(_QWORD *)(a1 + 32) >> 9) & 0x7FFFFFFFF8i64);
result = 3;
if( v16 >= (unsigned __int64)v17 )
v17 = (char *)v16;
*(_QWORD *)(v14 + 8) = v17;
return result;
}Referenced by:
MiWalkPageTablesRecursively