MiProbeLeafPteAccess
INT64 __fastcall MiProbeLeafPteAccess(INT64 a1, UINT64 a2){
__int64 v2;
int v3;
WCHAR *v4;
UINT64 v5;
int v6;
int v7;
INT64 result;
UINT64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
_QWORD *v13;
char *v14;
int v15;
INT64 v16;
__int64 v17;
int v18;
int v19;
unsigned __int64 PteBase;
unsigned __int64 v21;
char v22;
unsigned __int64 v23;
int v24;
INT64 v25;
int CanPageMove;
int v27;
int IsPfnFileOnly;
int v29;
__int64 v30;
MMPTE *v31;
int v32;
INT64 *v33;
INT64 **v34;
int v35;
UINT64 v36;
NTSTATUS v37;
INT64 *v38;
INT64 **v39;
char v40;
unsigned __int64 v41;
int v42;
__int64 v43;
__int64 v44;
_QWORD *CloneAddress;
__int64 v46;
__int64 v47;
_QWORD *v48;
__int64 v49;
int v50;
int v51;
INT64 *v52;
INT64 **v53;
INT64 v54;
PWCHAR UpcaseTable;
INT64 v56;
__int64 v57;
UpcaseTable = (PWCHAR)a2;
v2 = *(_QWORD *)(a1 + 40);
v3 = 0;
v4 = (WCHAR *)a2;
v5 = *(_QWORD *)a1;
v6 = *(_DWORD *)(a1 + 64) & 0xF;
v7 = *(_DWORD *)(a1 + 88);
*(_DWORD *)a2 = 0;
v57 = v2;
if( (v2 & 4) == 0 && v6 == 1 )
{
++dword_140C4E4C8;
return 3221225477i64;
}
if( &v57 < (__int64 *)MmGetPml4eBase() || &v57 > (__int64 *)MmGetPxeUserLimit() )
a2 = v2;
v10 = (a2 >> 12) & 0xFFFFFFFFFi64;
v11 = 48 * v10;
v12 = 0xFFFF800000000000ui64;
if( ((*((_QWORD *)MmGetPfnDb() + 6 * v10 + 5) >> 50) & 1) != 0 )
{
v13 = (_QWORD *)qword_140C4EBC0;
v14 = (char *)MmGetPfnDb() + v11;
if( qword_140C4EBC0 )
{
if( ((*((_QWORD *)v14 + 5) >> 60) & 7) == 1 )
{
v10 = v11 / 0x30;
if( qword_140C4EBC0 )
{
do
{
v11 = v13[3];
if( v10 < v11 )
{
v13 = (_QWORD *)*v13;
}
else
{
if( v10 - v11 < v13[4] )
{
++dword_140C4E4F8;
return 3221225477i64;
}
v13 = (_QWORD *)v13[1];
}
}
while( v13 );
}
}
}
LOBYTE(v15) = MI_PFN_IS_PROTO((UNICODE_STRING *)v14, (UNICODE_STRING *)v10, v11, v4);
if( !v15 )
{
v10 = *((_QWORD *)v14 + 5);
if( (v10 & 0x1000000000i64) != 0 )
{
LODWORD(v54) = 0;
LODWORD(v56) = 0;
if( (unsigned int)MiGetPfnPageSizeIndexUnsynchronized(v16, &v54, &v56) != 3 && (_DWORD)v54 == 6 )
{
v4 = UpcaseTable;
v12 = 0xFFFF800000000000ui64;
goto LABEL_21;
}
LABEL_32:
++dword_140C4E4F4;
return 3221225477i64;
}
PteBase = (unsigned __int64)MmGetPteBase();
v21 = (__int64)((*((_QWORD *)v14 + 1) << 25) - (PteBase << 25)) >> 16;
if( v21 >= PteBase && v21 <= (unsigned __int64)MmGetPteLimit() )
{
v10 &= v17;
if( v10 != 0xFFFFFFFFDi64 )
{
v22 = v14[34];
if( (v22 & 0x20) == 0
|| (v10 = 0x3FFFFFFFFFFFFFFFi64, (*((_QWORD *)v14 + 3) & 0x3FFFFFFFFFFFFFFFi64) != 0)
|| !*((_WORD *)v14 + 16) )
{
if( (v22 & 8) == 0 && (v12 | (*(_QWORD *)v14 >> 13) & 0xFFFFFFFFFFFFFFF0ui64) != 0xFFFF800000000030ui64 )
goto LABEL_32;
}
}
}
}
}
else
{
v14 = 0i64;
}
LABEL_21:
v18 = 0;
if( v5 >= v12 )
{
v10 = (UINT64)&antNameB;
v19 = *((unsigned __int8 *)&antNameB + ((v5 >> 39) & 0x1FF) - 256);
}
else
{
v19 = 0;
}
if( v6 == 6 && v19 == 12 )
v18 = 1;
v23 = 0x8000000000000000ui64;
if( v7 == 3 )
{
if( v5 > 0x7FFFFFFEFFFFi64 )
return 3221225477i64;
if( (v2 & 0x8000000000000000ui64) != 0 )
{
if( (v2 & 0x800) != 0 )
return 3221225496i64;
goto LABEL_59;
}
}
else if( !v7 )
{
if( v18 )
{
if( !v14 )
return 0i64;
LOBYTE(v24) = MI_PFN_IS_PROTO((UNICODE_STRING *)v14, (UNICODE_STRING *)v10, 0, v4);
if( v24 )
{
CanPageMove = MiCanPageMove(v25);
if( CanPageMove == v27 || (IsPfnFileOnly = MiIsPfnFileOnly((INT64)v14), IsPfnFileOnly == v29) )
{
v30 = *((_QWORD *)v14 + 2);
if( (v30 & 0x400) == 0 )
goto LABEL_55;
if( qword_140C4DC80 && (v30 & 0x10) == 0 )
v30 &= ~qword_140C4DC80;
if( (*(_DWORD *)(*(_QWORD *)(v30 >> 16) + 56i64) & 0x20) != 0 )
{
LABEL_55:
v31 = (MMPTE *)MiIsDriverPage(*(_QWORD *)(a1 + 16));
if( v31 )
{
MiUnlockProbePacketWorkingSet(a1);
v32 = MiSplitDriverPage(v31, *(_QWORD *)(a1 + 16));
MiLockProbePacketWorkingSet(a1, v33, v34);
if( v32 < 0 )
{
++dword_140C4E4F0;
return(unsigned int)v32;
}
goto LABEL_108;
}
v23 = 0x8000000000000000ui64;
}
}
}
}
goto LABEL_75;
}
if( (v2 & 0x800) == 0 )
{
LABEL_59:
if( v7 != 3 && (v6 != 6 || !v18) )
{
*(_DWORD *)v4 = 2;
return 0i64;
}
if( v14 )
{
LOBYTE(v35) = MI_PFN_IS_PROTO((UNICODE_STRING *)v14, (UNICODE_STRING *)v10, 0, v4);
if( !v35 )
{
if( (MiFlags & 0x8000) != 0 && ((*((_QWORD *)v14 + 5) >> 60) & 7) == 3 )
MiClearPfnImageVerified(v36, 8);
return 0i64;
}
}
goto LABEL_88;
}
if( (v2 & 0x42) == 0
&& v6 == 1
&& ((*(_DWORD *)(*(_QWORD *)(a1 + 80) + 1124i64) & 0x8000) != 0 || !MiOkToSetPteDirtyForNotValidFault(v2, v5)) )
{
MiUnlockProbePacketWorkingSet(a1);
v37 = MmAccessFault(2ui64, (PVOID)v5, 0, 0i64);
MiLockProbePacketWorkingSet(a1, v38, v39);
if( v37 < 0 )
{
++dword_140C4E4C0;
return(unsigned int)v37;
}
goto LABEL_108;
}
LABEL_75:
if( !v14 )
return 0i64;
v40 = v14[34];
if( (v40 & 0x20) != 0 && (v40 & 8) == 0 && (*((_QWORD *)v14 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 0 )
return 0i64;
v41 = *((_QWORD *)v14 + 5);
if( ((v41 >> 60) & 7) == 1 || (v41 & 0x1000000000i64) != 0 || *((__int64 *)v14 + 1) <= 0 )
{
if( v7 )
return 0i64;
LOBYTE(v42) = MI_PFN_IS_PROTO((UNICODE_STRING *)v14, (UNICODE_STRING *)v10, v23, v4);
if( !v42 )
return 0i64;
v44 = *(_QWORD *)(a1 + 80);
if( !v44 )
return 0i64;
if( (*(_DWORD *)(a1 + 64) & 0x10) == 0 )
return 0i64;
CloneAddress = MiLocateCloneAddress(v44, v43 | *((_QWORD *)v14 + 1));
if( !CloneAddress )
return 0i64;
if( *(_QWORD *)(*(_QWORD *)(v46 + 1680) + 360i64) > CloneAddress[12] )
goto LABEL_95;
}
LABEL_88:
if( v7 != 3 )
goto LABEL_102;
if( (v2 & v23) != 0 )
return 3221225541i64;
v47 = *(_QWORD *)(a1 + 80);
if( !v47
|| (*(_DWORD *)(a1 + 64) & 0x10) == 0
|| (v48 = MiLocateCloneAddress(v47, v23 | *((_QWORD *)v14 + 1))) == 0i64 )
{
if( (v2 & 0x200) != 0 || (*((_QWORD *)v14 + 5) & 0x1000000000i64) == 0 && *((__int64 *)v14 + 1) > 0 )
goto LABEL_102;
if( MiProcessCommitIntact() )
{
++*(_QWORD *)(a1 + 104);
v3 = v50;
goto LABEL_102;
}
return 3221225477i64;
}
if( *(_QWORD *)(*(_QWORD *)(v49 + 1680) + 360i64) > v48[12] )
{
LABEL_95:
result = MiSplitReducedCommitClonePage((unsigned __int64 *)a1);
if( (int)result < 0 )
{
++dword_140C4E4EC;
return result;
}
goto LABEL_108;
}
LABEL_102:
v51 = MiCopyOnWrite(v5, *(UINT64 **)(a1 + 16), -1i64, 0i64);
if( v51 >= 0 )
{
LABEL_108:
*(_DWORD *)UpcaseTable = 1;
return 0i64;
}
if( v3 )
--*(_QWORD *)(a1 + 104);
if( *(_BYTE *)(a1 + 68) != 2 && (*(_DWORD *)(*(_QWORD *)(a1 + 72) + 1300i64) & 0xC) == 0 )
{
MiUnlockProbePacketWorkingSet(a1);
MiCopyOnWriteCheckConditions(*(_QWORD *)(a1 + 96), (unsigned int)v51);
MiLockProbePacketWorkingSet(a1, v52, v53);
goto LABEL_108;
}
++dword_140C4E4F0;
return 3221225495i64;
}Referenced by:
MiProbeAndLockPages
MiProbeLeafFrame