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.