예제 #1
0
        public void MapMirror(long Src, long Dst, long Size, int Type)
        {
            Src = AMemoryHelper.PageRoundDown(Src);
            Dst = AMemoryHelper.PageRoundDown(Dst);

            Size = AMemoryHelper.PageRoundUp(Size);

            long PagesCount = Size / PageSize;

            while (PagesCount-- > 0)
            {
                PTEntry SrcEntry = GetPTEntry(Src);
                PTEntry DstEntry = GetPTEntry(Dst);

                DstEntry.Map  = PTMap.Mapped;
                DstEntry.Type = Type;
                DstEntry.Perm = SrcEntry.Perm;

                SrcEntry.Perm = AMemoryPerm.None;

                SrcEntry.Attr |= 1;

                SetPTEntry(Src, SrcEntry);
                SetPTEntry(Dst, DstEntry);

                Src += PageSize;
                Dst += PageSize;
            }
        }
예제 #2
0
        public void Reprotect(long Position, long Size, AMemoryPerm Perm)
        {
            Position = AMemoryHelper.PageRoundDown(Position);

            Size = AMemoryHelper.PageRoundUp(Size);

            long PagesCount = Size / PageSize;

            while (PagesCount-- > 0)
            {
                PTEntry Entry = GetPTEntry(Position);

                Entry.Perm = Perm;

                SetPTEntry(Position, Entry);

                Position += PageSize;
            }
        }
예제 #3
0
        public AMemoryMapInfo GetMapInfo(long Position)
        {
            Position = AMemoryHelper.PageRoundDown(Position);

            PTEntry BaseEntry = GetPTEntry(Position);

            bool IsSameSegment(long Pos)
            {
                PTEntry Entry = GetPTEntry(Pos);

                return(Entry.Map == BaseEntry.Map &&
                       Entry.Perm == BaseEntry.Perm &&
                       Entry.Type == BaseEntry.Type &&
                       Entry.Attr == BaseEntry.Attr);
            }

            long Start = Position;
            long End   = Position + PageSize;

            while (Start > 0 && IsSameSegment(Start - PageSize))
            {
                Start -= PageSize;
            }

            while (End < AddrSize && IsSameSegment(End))
            {
                End += PageSize;
            }

            long Size = End - Start;

            return(new AMemoryMapInfo(
                       Start,
                       Size,
                       BaseEntry.Type,
                       BaseEntry.Attr,
                       BaseEntry.Perm));
        }