MiDbgReleaseAddress
VOID __stdcall MiDbgReleaseAddress(VOID *VirtualAddress, _HARDWARE_PTE *Opaque, UINT64 Flags){
__int64 bf_0;
char v4;
unsigned __int64 v6;
_MMPTE *PdeBase;
__int64 *v8;
int v9;
UINT64 v10;
NTSTATUS v11;
bf_0 = Opaque->_bf_0;
v4 = Flags;
if( Opaque->_bf_0 )
{
if( MI_IS_PHYSICAL_ADDRESS(VirtualAddress) )
{
v6 = ((unsigned __int64)VirtualAddress >> 18) & 0x3FFFFFF8;
PdeBase = MmGetPdeBase();
}
else
{
v6 = ((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64;
PdeBase = MmGetPteBase();
}
v8 = (__int64 *)((char *)PdeBase + v6);
_InterlockedIncrement((_DWORD *)&stru_140C4DB30 + 681);
LOBYTE(v9) = MiPteInShadowRange((UINT64)v8);
if( v9 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (bf_0 & 1) != 0 )
bf_0 |= 0x8000000000000000ui64;
*v8 = bf_0;
_InterlockedDecrement((_DWORD *)&stru_140C4DB30 + 681);
LODWORD(v10) = MiGetLeafVa((UINT64)VirtualAddress);
v11 = MiRealVaToFlushType(v10);
if( (v4 & 4) != 0 )
KeFlushSingleCurrentTb(VirtualAddress);
else
KeFlushSingleTb((UINT64)VirtualAddress, (_KTBFLUSH_TYPE)v11, 2i64);
}
}Referenced by:
No references.