MiWalkVaRange
NTSTATUS __stdcall MiWalkVaRange(
VOID *StartingAddress,
VOID *EndingAddress,
_MMVAD *Vad,
_MI_PTE_WALK_TYPE OperationType,
UINT64 OperationArgument){
_MMVAD *v5;
_MMPFN *v8;
_MMPTE *PteBase;
unsigned __int64 v10;
_MMPTE *v11;
UINT64 v12;
_MMSUPPORT_INSTANCE *p_Instance;
UINT8 v14;
UINT8 v15;
_MMPTE *NextPageTable;
unsigned __int64 v17;
_MMPTE *v18;
unsigned int v19;
_MMVAD *v20;
__int64 v21;
int v22;
int v23;
UINT64 v24;
NTSTATUS v25;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v26;
__int64 v27;
NTSTATUS v28;
int v30;
int v31;
unsigned __int64 v32;
__int64 v33;
int v34;
__int64 v35;
__int64 v36;
__int64 v37;
__int64 v38;
__int64 v39;
__int64 v40;
__int64 v41;
__int64 v42;
NTSTATUS v43;
UINT64 PageTableFlags;
_MMPTE *OriginalPte;
UINT8 PageIrql;
UINT8 v47;
int ProtoLeafValid;
_MMVAD *Vada;
__int64 v50;
UINT64 v51;
UINT64 v52;
INT64 p_Vm;
_MMPTE *PointerPte;
unsigned __int64 v55;
UINT64 LargePage;
_MMPTE PteContents;
_MMPTE v58;
_EPROCESS *Process;
_MI_TB_FLUSH_LIST TbFlushList;
__int16 v61;
__int16 v62;
__int64 v63;
__int64 v64;
__int64 v65;
char v66[152];
Vada = Vad;
v5 = Vad;
PteContents.u.Long = 0i64;
LODWORD(LargePage) = 0;
v58.u.Long = 0i64;
LODWORD(v51) = OperationType;
v62 = 0;
memset(v66, 0i64, sizeof(v66));
ProtoLeafValid = 0;
v8 = 0i64;
v50 = 0i64;
PageIrql = 17;
PteBase = MmGetPteBase();
v10 = (unsigned __int64)PteBase + (((unsigned __int64)StartingAddress >> 9) & 0x7FFFFFFFF8i64);
v11 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)EndingAddress >> 9) & 0x7FFFFFFFF8i64));
v63 = 20i64;
TbFlushList = 1;
v12 = 0i64;
v61 = 0;
v64 = 0i64;
v65 = 0i64;
v55 = (unsigned __int64)v11;
v52 = 0i64;
Process = KeGetCurrentThread()->ApcState.Process;
p_Instance = &Process->Vm.Instance;
p_Vm = (INT64)&Process->Vm;
MiLockWorkingSetShared();
v47 = v14;
v15 = v14;
if( v10 > (unsigned __int64)v11 )
{
v28 = 0;
goto LABEL_35;
}
LABEL_2:
if( v12 )
{
MiUnlockPageTableInternal((INT64)p_Instance, v12);
v12 = 0i64;
v52 = 0i64;
}
LODWORD(PageTableFlags) = 0;
NextPageTable = MiGetNextPageTable(
(_MMPTE *)v10,
v11,
&TbFlushList,
v15,
PageTableFlags,
&LargePage,
(UINT64)OriginalPte);
LODWORD(PointerPte) = 1;
v17 = (unsigned __int64)NextPageTable;
v18 = MmGetPteBase();
if( NextPageTable == (_MMPTE *)v10 )
goto LABEL_5;
if( (v5->Core.u.LongFlags & 0x100000) == 0 )
{
if( v5->FirstPrototypePte )
{
MiGetProtoPteAddress();
if( v35 )
{
LODWORD(PointerPte) = 0;
goto LABEL_5;
}
}
}
v28 = -1073740748;
ProtoLeafValid = -1073740748;
if( v17 )
{
v10 = v17;
LABEL_5:
if( v17 )
v52 = (UINT64)v18 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
v19 = (unsigned int)PointerPte;
v20 = Vada;
while( 1 )
{
LODWORD(v21) = 0;
v22 = 0;
v23 = 0;
if( !v19 )
goto LABEL_61;
v24 = *(_QWORD *)v10;
MiPteInShadowRange(v10);
if( !v24 )
break;
if( (v24 & 1) != 0 || (v24 & 0x400) == 0 )
{
v20 = Vada;
goto LABEL_13;
}
v31 = v51;
if( (_DWORD)v51 == 2 && MI_PROTO_FORMAT_COMBINED((_MMPTE)v24) )
{
v36 = v24;
if( *(&stru_140C4DB30 + 42) && (v24 & 0x10) == 0 )
v36 = v24 & ~*(&stru_140C4DB30 + 42);
v21 = v36 >> 16;
LABEL_54:
v20 = Vada;
if( v21 )
{
LABEL_55:
if( ((v21 ^ v50) & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
if( v8 )
{
MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
v50 = 0i64;
}
v8 = MiLockProtoPoolPage((_MMPTE *)v21, &PageIrql);
if( !v8 )
{
MiFlushTbList(&TbFlushList);
v12 = v52;
p_Instance = (_MMSUPPORT_INSTANCE *)p_Vm;
if( v52 )
{
MiUnlockPageTableInternal(p_Vm, v52);
v12 = 0i64;
v52 = 0i64;
}
v15 = v47;
MiUnlockWorkingSetShared(p_Instance, v47);
MmAccessFault(2ui64, (PVOID)v21, 0, 0i64);
v11 = (_MMPTE *)v55;
LABEL_32:
MiLockWorkingSetShared();
v5 = Vada;
if( v10 > (unsigned __int64)v11 )
{
v28 = ProtoLeafValid;
goto LABEL_34;
}
goto LABEL_2;
}
v50 = v21;
}
}
else
{
LABEL_13:
if( v8 )
{
MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
v8 = 0i64;
v50 = 0i64;
}
}
LODWORD(PageTableFlags) = v51;
v25 = MiActOnPte(
v20,
(_MMPTE *)v19,
(_MMPTE *)v10,
(_MI_PTE_WALK_TYPE)v21,
PageTableFlags,
(_MI_PARTITION **)OperationArgument,
&v58);
if( v25 )
{
if( v25 == 274 )
{
v42 = (__int64)((v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
MiInsertTbFlushEntry(&TbFlushList, (VOID *)v42, 1ui64, 0i64);
MiFlushTbList(&TbFlushList);
v43 = MiCopyOnWrite(v42, (INT64 *)v10, 0xFFFFFFFFFFFFFFFFui64, 0i64);
v20 = Vada;
v23 = v43;
v10 -= 8i64;
v22 = 1;
}
else if( v25 == -1073741791 )
{
MiInsertTbFlushEntry(
&TbFlushList,
(VOID *)((__int64)((v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
1ui64,
0i64);
}
else
{
ProtoLeafValid = v25;
}
}
v26.Long = PteContents.u.Long;
if( PteContents.u.Long )
{
if( v8 )
{
MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
v26.Long = PteContents.u.Long;
v8 = 0i64;
v50 = 0i64;
}
MiReleasePageFileInfo((_MI_PARTITION *)v58.u.Long, (_MMPTE)v26.Long, 1ui64);
}
goto LABEL_17;
}
if( MI_PROTO_FORMAT_COMBINED((_MMPTE)v24) )
{
if( v31 == 1 )
{
v20 = Vada;
ProtoLeafValid = -1073740748;
}
else
{
if( v8 )
MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
v37 = 0i64;
if( !v8 )
v37 = v50;
v38 = v37;
v50 = v37;
MiFlushTbList(&TbFlushList);
ProtoLeafValid = (unsigned int)MiMakeProtoLeafValid(v10, 0x18ui64, v47);
if( ProtoLeafValid >= 0 )
{
v10 -= 8i64;
v50 = v38;
v20 = Vada;
v8 = 0i64;
}
else
{
v20 = Vada;
v8 = 0i64;
ProtoLeafValid = -1073740748;
}
}
goto LABEL_17;
}
v32 = ((__int64)((v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16) & 0xFFFFFFFFFFFFF000ui64;
if( (v32 == 2147352576 || v32 == *(&stru_140C4DB30 + 11) && *(&stru_140C4DB30 + 11))
&& (Process->Flags3 & 1) == 0 )
{
v20 = Vada;
ProtoLeafValid = -1073740748;
}
else
{
if( (Vada->Core.u.LongFlags & 0x100000) == 0 && Vada->FirstPrototypePte )
{
MiGetProtoPteAddress();
v21 = v33;
LOBYTE(v34) = MiIsPrototypePteVadLookup(v24);
if( v34 )
goto LABEL_54;
v39 = v24;
if( *(&stru_140C4DB30 + 42) && (v24 & 0x10) == 0 )
v39 = v24 & ~*(&stru_140C4DB30 + 42);
if( v21 == v39 >> 16 )
goto LABEL_54;
}
v40 = v24;
if( *(&stru_140C4DB30 + 42) && (v24 & 0x10) == 0 )
v40 = v24 & ~*(&stru_140C4DB30 + 42);
v21 = v40 >> 16;
if( (_DWORD)v51 == 2 )
goto LABEL_54;
v20 = Vada;
ProtoLeafValid = -1073740748;
}
LABEL_17:
v11 = (_MMPTE *)v55;
v10 += 8i64;
if( v22 == 1
|| v23 < 0
|| v10 > v55
|| (v10 & 0xFFF) == 0
|| (v10 & 0x78) == 0 && (LOBYTE(v30) = MiWorkingSetIsContended(p_Vm), v30)
|| (unsigned int)KeShouldYieldProcessor() )
{
if( v8 )
MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
v27 = 0i64;
if( !v8 )
v27 = v50;
v50 = v27;
MiFlushTbList(&TbFlushList);
p_Instance = (_MMSUPPORT_INSTANCE *)p_Vm;
if( v52 )
{
MiUnlockPageTableInternal(p_Vm, v52);
v52 = 0i64;
}
v15 = v47;
MiUnlockWorkingSetShared(p_Instance, v47);
if( v23 == -1073740748 )
MiCopyOnWriteCheckConditions((INT64)p_Instance, 3221226548i64);
v12 = v52;
v8 = 0i64;
goto LABEL_32;
}
}
v20 = Vada;
LABEL_61:
if( (v20->Core.u.LongFlags & 0x100000) != 0 || !v20->FirstPrototypePte )
goto LABEL_13;
MiGetProtoPteAddress();
v21 = v41;
if( v41 )
goto LABEL_55;
if( v19 )
goto LABEL_13;
v22 = 1;
v10 -= 8i64;
goto LABEL_17;
}
p_Instance = (_MMSUPPORT_INSTANCE *)p_Vm;
LABEL_34:
v15 = v47;
LABEL_35:
MiFlushTbList(&TbFlushList);
if( v12 )
MiUnlockPageTableInternal((INT64)p_Instance, v12);
MiUnlockWorkingSetShared(p_Instance, v15);
return v28;
}Referenced by:
MiProcessVaRangesInfoClass
MiResetVirtualMemory