MiQueryLeafPte
__int64 __fastcall MiQueryLeafPte(__int64 a1, __int64 a2, int a3){
__int64 v3;
int v4;
__int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
UNICODE_STRING *v8;
UINT8 v9;
WCHAR *v10;
UNICODE_STRING *v11;
unsigned __int64 v12;
__int64 v13;
__int64 v14;
UNICODE_STRING *v15;
UINT8 v16;
PWCHAR v17;
__int16 v18;
UNICODE_STRING *v19;
UNICODE_STRING *v20;
PWCHAR v21;
int v22;
__int64 v23;
__int64 v24;
unsigned __int64 v25;
__int64 v26;
unsigned __int64 v27;
unsigned __int64 v28;
int v29;
unsigned __int64 v30;
__int64 v32;
INT64 v33;
v3 = *(_QWORD *)(a1 + 168);
v4 = a3;
v5 = a2;
v6 = ((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( (v6 < qword_140C4E0A0 || v6 >= qword_140C4E0A0 + MiHyperSpaceSize()) && v4 < 1 )
{
v33 = MI_READ_PTE_LOCK_FREE(v5);
if( (v33 & 1) != 0 )
{
v7 = MI_READ_PTE_LOCK_FREE((INT64)&v33);
v11 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 48 * ((v7 >> 12) & 0xFFFFFFFFFi64));
if( (*(_DWORD *)v3 & 1) != 0 )
{
v12 = *(_QWORD *)(v3 + 16) + 1i64;
*(_QWORD *)(v3 + 16) = v12;
if( v12 < *(_QWORD *)(v3 + 24) )
{
v13 = *(_QWORD *)(v3 + 8);
*(_QWORD *)(v13 + 8 * v12 - 8) = v6 ^ ((unsigned __int16)v6 ^ (unsigned __int16)*(_QWORD *)(v13 + 8 * v12 - 8)) & 0xFFF;
LODWORD(v14) = MiSearchNumaNodeTable((PVOID)((__int64)(48 * ((v7 >> 12) & 0xFFFFFFFFFi64)) / 48));
v15 = (UNICODE_STRING *)(*(_QWORD *)(v13 + 8 * v12 - 8) ^ (*(_DWORD *)(v13 + 8 * v12 - 8) ^ (*(_DWORD *)(v14 + 8) << 9)) & 0xE00);
*(_QWORD *)(v13 + 8 * v12 - 8) = v15;
LOBYTE(v18) = MI_PFN_IS_PROTO(v11, v15, v16, v17);
*(_QWORD *)(v13 + 8 * v12 - 8) = (unsigned __int64)v19 ^ ((unsigned __int16)v19 ^ (unsigned __int16)(v18 << 8)) & 0x100;
LOBYTE(v22) = MI_PFN_IS_PROTO(v20, v19, (UINT8)v19, v21);
if( v22 )
{
if( (*(_DWORD *)v3 & 2) != 0 )
{
v25 = v24 & 0xFFFFFFFFFFFFF11Fui64 | 0xE0;
}
else
{
LOBYTE(v26) = 7;
if( ((unsigned __int64)v11[1].Buffer & 0x3FFFFFFFFFFFFFFFi64) < 7 )
v26 = (__int64)v11[1].Buffer & 0x3FFFFFFFFFFFFFFFi64;
v23 = (unsigned __int8)(v24 ^ (32 * v26)) & 0xE0;
v25 = v23 ^ v24;
}
*(_QWORD *)(v13 + 8 * v12 - 8) = v25;
v27 = *(_QWORD *)(v13 + 8 * v12 - 8) ^ (*(_DWORD *)(v13 + 8 * v12 - 8) ^ (unsigned int)MiGetPfnProtection(
v23,
v6,
(__int64)v11)) & 0x1F;
}
else
{
v28 = v24 & 0xFFFFFFFFFFFFFF1Fui64;
*(_QWORD *)(v13 + 8 * v12 - 8) = v28;
v27 = v28 ^ ((unsigned __int8)v28 ^ (unsigned __int8)((unsigned __int64)*(unsigned int *)&v11[1].Length >> 5)) & 0x1F;
}
*(_QWORD *)(v13 + 8 * v12 - 8) = v27;
return 0i64;
}
return 4i64;
}
LOBYTE(v29) = MI_PFN_IS_PROTO(v11, v8, v9, v10);
if( v29 )
{
v30 = *(_QWORD *)(v3 + 16) + 1i64;
*(_QWORD *)(v3 + 16) = v30;
if( v30 >= *(_QWORD *)(v3 + 24) )
return 4i64;
v32 = 32 * v30 + *(_QWORD *)(v3 + 8);
MiIdentifyPfnWrapper((_MMPFN *)v11, (_MMPFN_IDENTITY *)(v32 - 32));
*(_QWORD *)(v32 - 8) = v6;
}
}
}
return 0i64;
}Referenced by:
No references.