MiProbeLeafPteAccess
NTSTATUS __stdcall MiProbeLeafPteAccess(INT64 a1, UINT64 rdx0){
__int64 v2;
int v3;
wchar_t *v4;
UINT64 v5;
int v6;
int v7;
NTSTATUS result;
UINT64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
_QWORD *v13;
char *v14;
int v15;
_MMPFN *v16;
__int64 v17;
int v18;
int v19;
unsigned __int64 PteBase;
unsigned __int64 v21;
char v22;
unsigned __int64 v23;
int v24;
_MMPFN *v25;
NTSTATUS CanPageMove;
int v27;
int v28;
int v29;
__int64 v30;
_MMPTE *v31;
int v32;
int v33;
void *v34;
int v35;
int v36;
char v37;
unsigned __int64 v38;
int v39;
__int64 v40;
_EPROCESS *v41;
_MMCLONE_DESCRIPTOR *CloneAddress;
_MMPTE **v43;
__int64 v44;
_EPROCESS *v45;
_MMCLONE_DESCRIPTOR *v46;
__int64 v47;
int v48;
int v49;
NTSTATUS v50;
INT64 a2;
PWCHAR UpcaseTable;
INT64 a3;
__int64 v54;
UpcaseTable = (PWCHAR)rdx0;
v2 = *(_QWORD *)(a1 + 40);
v3 = 0;
v4 = (wchar_t *)rdx0;
v5 = *(_QWORD *)a1;
v6 = *(_DWORD *)(a1 + 64) & 0xF;
v7 = *(_DWORD *)(a1 + 88);
*(_DWORD *)rdx0 = 0;
v54 = v2;
if( (v2 & 4) == 0 && v6 == 1 )
{
++*(&stru_140C4DB30 + 614);
return -1073741819;
}
if( &v54 < (__int64 *)MmGetPml4eBase() || &v54 > (__int64 *)MmGetPxeUserLimit() )
rdx0 = v2;
v10 = (rdx0 >> 12) & 0xFFFFFFFFFi64;
v11 = 48 * v10;
v12 = 0xFFFF800000000000ui64;
if( (((unsigned __int64)MmGetPfnDb()[v10].u4._bf_0 >> 50) & 1) != 0 )
{
v13 = (_QWORD *)*(&stru_140C4DB30 + 530);
v14 = (char *)MmGetPfnDb() + v11;
if( *(&stru_140C4DB30 + 530) )
{
if( ((*((_QWORD *)v14 + 5) >> 60) & 7) == 1 )
{
v10 = v11 / 0x30;
if( *(&stru_140C4DB30 + 530) )
{
do
{
v11 = v13[3];
if( v10 < v11 )
{
v13 = (_QWORD *)*v13;
}
else
{
if( v10 - v11 < v13[4] )
{
++*(&stru_140C4DB30 + 626);
return -1073741819;
}
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(a2) = 0;
LODWORD(a3) = 0;
if( MiGetPfnPageSizeIndexUnsynchronized(v16, &a2, &a3) != 3 && (_DWORD)a2 == 6 )
{
v4 = UpcaseTable;
v12 = 0xFFFF800000000000ui64;
goto LABEL_21;
}
LABEL_32:
++*(&stru_140C4DB30 + 625);
return -1073741819;
}
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)&stru_140C4DB30 + 7128;
v19 = *((unsigned __int8 *)&stru_140C4DB30 + ((v5 >> 39) & 0x1FF) + 6872);
}
else
{
v19 = 0;
}
if( v6 == 6 && v19 == 12 )
v18 = 1;
v23 = 0x8000000000000000ui64;
if( v7 == 3 )
{
if( v5 > 0x7FFFFFFEFFFFi64 )
return -1073741819;
if( (v2 & 0x8000000000000000ui64) != 0 )
{
if( (v2 & 0x800) != 0 )
return -1073741800;
goto LABEL_59;
}
}
else if( !v7 )
{
if( v18 )
{
if( !v14 )
return 0;
LOBYTE(v24) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v14, (_UNICODE_STRING *)v10, 0, v4);
if( v24 )
{
CanPageMove = MiCanPageMove(v25);
if( CanPageMove == v27 || (LOBYTE(v28) = MiIsPfnFileOnly((INT64)v14), v28 == v29) )
{
v30 = *((_QWORD *)v14 + 2);
if( (v30 & 0x400) == 0 )
goto LABEL_55;
if( *(&stru_140C4DB30 + 42) && (v30 & 0x10) == 0 )
v30 &= ~*(&stru_140C4DB30 + 42);
if( (*(_DWORD *)(*(_QWORD *)(v30 >> 16) + 56i64) & 0x20) != 0 )
{
LABEL_55:
v31 = (_MMPTE *)MiIsDriverPage(*(_QWORD *)(a1 + 16));
if( v31 )
{
MiUnlockProbePacketWorkingSet((_MI_PROBE_PACKET *)a1);
v32 = MiSplitDriverPage(v31, *(_QWORD *)(a1 + 16));
MiLockProbePacketWorkingSet((_MI_PROBE_PACKET *)a1);
if( v32 < 0 )
{
++*(&stru_140C4DB30 + 624);
return 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 0;
}
if( v14 )
{
LOBYTE(v33) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v14, (_UNICODE_STRING *)v10, 0, v4);
if( !v33 )
{
if( (MiFlags & 0x8000) != 0 && ((*((_QWORD *)v14 + 5) >> 60) & 7) == 3 )
MiClearPfnImageVerified(v34, 8ui64);
return 0;
}
}
goto LABEL_88;
}
if( (v2 & 0x42) == 0 && v6 == 1 )
{
if( (*(_DWORD *)(*(_QWORD *)(a1 + 80) + 1124i64) & 0x8000) != 0
|| (LOBYTE(v35) = MiOkToSetPteDirtyForNotValidFault(v2, v5), !v35) )
{
MiUnlockProbePacketWorkingSet((_MI_PROBE_PACKET *)a1);
v36 = MmAccessFault(2ui64, (PVOID)v5, 0, 0i64);
MiLockProbePacketWorkingSet((_MI_PROBE_PACKET *)a1);
if( v36 < 0 )
{
++*(&stru_140C4DB30 + 612);
return v36;
}
goto LABEL_108;
}
}
LABEL_75:
if( !v14 )
return 0;
v37 = v14[34];
if( (v37 & 0x20) != 0 && (v37 & 8) == 0 && (*((_QWORD *)v14 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 0 )
return 0;
v38 = *((_QWORD *)v14 + 5);
if( ((v38 >> 60) & 7) == 1 || (v38 & 0x1000000000i64) != 0 || *((__int64 *)v14 + 1) <= 0 )
{
if( v7 )
return 0;
LOBYTE(v39) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v14, (_UNICODE_STRING *)v10, v23, v4);
if( !v39 )
return 0;
v41 = *(_EPROCESS **)(a1 + 80);
if( !v41 )
return 0;
if( (*(_DWORD *)(a1 + 64) & 0x10) == 0 )
return 0;
CloneAddress = MiLocateCloneAddress(v41, (VOID *)(v40 | *((_QWORD *)v14 + 1)));
if( !CloneAddress )
return 0;
if( *(_QWORD *)(*(_QWORD *)(v44 + 1680) + 360i64) > CloneAddress->NestingLevel )
goto LABEL_95;
}
LABEL_88:
if( v7 != 3 )
goto LABEL_102;
if( (v2 & v23) != 0 )
return -1073741755;
v45 = *(_EPROCESS **)(a1 + 80);
if( !v45
|| (*(_DWORD *)(a1 + 64) & 0x10) == 0
|| (v46 = MiLocateCloneAddress(v45, (VOID *)(v23 | *((_QWORD *)v14 + 1)))) == 0i64 )
{
if( (v2 & 0x200) != 0 || (*((_QWORD *)v14 + 5) & 0x1000000000i64) == 0 && *((__int64 *)v14 + 1) > 0 )
goto LABEL_102;
LOBYTE(v48) = MiProcessCommitIntact();
if( v48 )
{
++*(_QWORD *)(a1 + 104);
v3 = v49;
goto LABEL_102;
}
return -1073741819;
}
if( *(_QWORD *)(*(_QWORD *)(v47 + 1680) + 360i64) > v46->NestingLevel )
{
LABEL_95:
MiSplitReducedCommitClonePage((_MI_PROBE_PACKET *)a1, v43);
if( result < 0 )
{
++*(&stru_140C4DB30 + 623);
return result;
}
goto LABEL_108;
}
LABEL_102:
v50 = MiCopyOnWrite(v5, *(INT64 **)(a1 + 16), 0xFFFFFFFFFFFFFFFFui64, 0i64);
if( v50 >= 0 )
{
LABEL_108:
*(_DWORD *)UpcaseTable = 1;
return 0;
}
if( v3 )
--*(_QWORD *)(a1 + 104);
if( *(_BYTE *)(a1 + 68) != 2 && (*(_DWORD *)(*(_QWORD *)(a1 + 72) + 1300i64) & 0xC) == 0 )
{
MiUnlockProbePacketWorkingSet((_MI_PROBE_PACKET *)a1);
MiCopyOnWriteCheckConditions(*(_QWORD *)(a1 + 96), (unsigned int)v50);
MiLockProbePacketWorkingSet((_MI_PROBE_PACKET *)a1);
goto LABEL_108;
}
++*(&stru_140C4DB30 + 624);
return -1073741801;
}Referenced by:
MiProbeAndLockPages
MiProbeLeafFrame