MiIsCfgBitMapPageShared
INT64 __fastcall MiIsCfgBitMapPageShared(UINT64 a1, INT64 a2){
_MMPTE *PteBase;
unsigned __int64 v5;
INT64 v6;
char v7;
__int64 v8;
unsigned int v9;
UINT64 v10;
INT64 v11;
_MMPTE *ProtoPteAddress;
unsigned __int64 v13;
unsigned __int64 v14;
UNICODE_STRING *v15;
UINT8 v16;
PWCHAR v17;
int v18;
__int64 v19;
bool v20;
int a6;
INT64 v23;
_SUBSECTION *ContainingSubsection;
a6 = 0;
PteBase = MmGetPteBase();
v5 = (unsigned __int64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
v6 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
v7 = MiLockWorkingSetShared(v6);
MiGetNextPageTable(v5, v5, 0i64, v7, 0, &a6);
if( v5 != v8 )
{
v9 = 3;
goto LABEL_19;
}
v10 = (UINT64)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64);
v23 = MI_READ_PTE_LOCK_FREE(v5);
v11 = v23;
if( !v23 )
{
v9 = 2;
goto LABEL_17;
}
ProtoPteAddress = MiGetProtoPteAddress((_MMVAD *)a2, a1 >> 12, 0i64, &ContainingSubsection);
v9 = 1;
v13 = (unsigned __int64)ProtoPteAddress;
if( (v11 & 1) != 0 )
{
v14 = MI_READ_PTE_LOCK_FREE((INT64)&v23);
LOBYTE(v18) = MI_PFN_IS_PROTO((UNICODE_STRING *)MmGetPfnDb() + 3 * ((v14 >> 12) & 0xFFFFFFFFFi64), v15, v16, v17);
if( v18 )
{
v20 = (*(_QWORD *)(v19 + 8) | 0x8000000000000000ui64) == v13;
goto LABEL_15;
}
}
else if( (v11 & 0x400) != 0 )
{
if( MiIsPrototypePteVadLookup(v11) )
goto LABEL_17;
if( qword_140C4DC80 )
{
if( (v11 & 0x10) != 0 )
v11 &= ~0x10ui64;
else
v11 &= ~qword_140C4DC80;
}
v20 = v13 == v11 >> 16;
LABEL_15:
if( v20 )
goto LABEL_17;
}
v9 = 0;
LABEL_17:
if( v10 )
MiUnlockPageTableInternal(v6, v10);
LABEL_19:
MiUnlockWorkingSetShared(v6, v7);
return v9;
}Referenced by:
MiMarkSharedImageCfgBits