MiQueryAddressSpan
VOID *__stdcall MiQueryAddressSpan(_MEMORY_BASIC_INFORMATION *Info, VOID *Va, _MMVAD_SHORT *Vad){
__int64 v3;
int v4;
_EPROCESS *v6;
unsigned __int64 v7;
_MMVAD_SHORT *v8;
unsigned __int64 v9;
_MMSUPPORT_FULL *p_Vm;
unsigned __int8 v12;
unsigned __int8 v13;
ULONG v14;
ULONG v15;
_MMVAD_SHORT *v16;
int v18;
UINT64 v19;
VOID *Vaa;
VOID *NextVaToQuery;
VOID *v22;
VOID *VaWithProto;
UINT64 ReturnedProtect;
v4 = 0;
v6 = (_EPROCESS *)v3;
v7 = *(unsigned int *)(v3 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v3 + 33) << 32);
LODWORD(VaWithProto) = 0;
v8 = Vad;
v19 = 0i64;
v9 = ((v7 << 12) | 0xFFF) + 1;
Vaa = 0i64;
LODWORD(ReturnedProtect) = 0;
LOWORD(NextVaToQuery) = 0;
LOWORD(v22) = 0;
if( (unsigned __int64)Vad > v9 || !Vad )
v8 = (_MMVAD_SHORT *)v9;
p_Vm = &KeGetCurrentThread()->ApcState.Process->Vm;
MiLockWorkingSetShared();
v13 = v12;
Info->Type = MiQueryAddressState(
Va,
(_BYTE)v8 - 1,
(_MMVAD_SHORT *)v12,
v6,
0i64,
&VaWithProto,
&ReturnedProtect,
&NextVaToQuery);
if( (_DWORD)VaWithProto )
{
v14 = MmProtectToValue[(unsigned int)VaWithProto];
*(&Info->Type + 1) = v14;
v15 = ReturnedProtect | v14;
}
else
{
v15 = 0;
}
*(&Info->Type + 1) = v15;
v16 = (_MMVAD_SHORT *)Vaa;
LOWORD(Info->RegionSize) = (_WORD)NextVaToQuery;
while( v16 < v8 )
{
if( MiQueryAddressState(
v16,
(_BYTE)v8 - 1,
(_MMVAD_SHORT *)v13,
v6,
(UINT64)Info,
(VOID **)&v19,
(UINT64 *)((char *)&v19 + 4),
&v22) != Info->Type
|| (_DWORD)v19 != (_DWORD)VaWithProto
|| (_WORD)v22 != (_WORD)NextVaToQuery
|| HIDWORD(v19) != (_DWORD)ReturnedProtect )
{
break;
}
v16 = (_MMVAD_SHORT *)Vaa;
if( (++v4 & 0x1F) == 0 && (LOBYTE(v18) = MiWorkingSetIsContended((INT64)p_Vm), v18)
|| (unsigned int)KeShouldYieldProcessor() )
{
MiUnlockWorkingSetShared(&p_Vm->Instance, v13);
MiLockWorkingSetShared();
}
}
MiUnlockWorkingSetShared(&p_Vm->Instance, v13);
return v16;
}Referenced by:
MmQueryVirtualMemory