Example #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;
            }
        }
Example #2
0
        public long GetPhys(long Position, AMemoryPerm Perm)
        {
            if (!HasPTEntry(Position))
            {
                if (Position < 0x08000000)
                {
                    Console.WriteLine($"HACK: Ignoring bad access at {Position:x16}");

                    return(0);
                }

                throw new VmmPageFaultException(Position);
            }

            PTEntry Entry = GetPTEntry(Position);

            long AbsPos = Entry.Position + (Position & PageMask);

            if (Entry.Map == PTMap.Mirror)
            {
                return(GetPhys(AbsPos, Perm));
            }

            if (Entry.Map == PTMap.Unmapped)
            {
                throw new VmmPageFaultException(Position);
            }

            return(AbsPos);
        }
Example #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.Type == BaseEntry.Type &&
                       Entry.Map == BaseEntry.Map &&
                       Entry.Perm == BaseEntry.Perm);
            }

            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.Perm));
        }
Example #4
0
        private void SetPTEntry(long Position, long Size, PTEntry Entry)
        {
            while (Size > 0)
            {
                SetPTEntry(Position, Entry);

                Position += PageSize;
                Size     -= PageSize;
            }
        }
Example #5
0
        private void SetPTEntry(long Position, PTEntry Entry)
        {
            long L0 = (Position >> PTLvl0Bit) & PTLvl0Mask;
            long L1 = (Position >> PTLvl1Bit) & PTLvl1Mask;

            if (PageTable[L0] == null)
            {
                PageTable[L0] = new PTEntry[PTLvl1Size];
            }

            PageTable[L0][L1] = Entry;
        }
Example #6
0
        private void SetPTEntry(long Position, long Size, int Type, PTEntry Entry)
        {
            while (Size > 0)
            {
                if (GetPTEntry(Position).Type == Type)
                {
                    SetPTEntry(Position, Entry);
                }

                Position += PageSize;
                Size     -= PageSize;
            }
        }
Example #7
0
        public void SetAttrBit(long Position, long Size, int Bit)
        {
            while (Size > 0)
            {
                PTEntry Entry = GetPTEntry(Position);

                Entry.Attr |= (1 << Bit);

                SetPTEntry(Position, Entry);

                Position += PageSize;
                Size     -= PageSize;
            }
        }
Example #8
0
        private void SetPTEntry(long Position, PTEntry Entry)
        {
            if (!IsValidPosition(Position))
            {
                throw new ArgumentOutOfRangeException(nameof(Position));
            }

            long L0 = (Position >> PTLvl0Bit) & PTLvl0Mask;
            long L1 = (Position >> PTLvl1Bit) & PTLvl1Mask;

            if (PageTable[L0] == null)
            {
                PageTable[L0] = new PTEntry[PTLvl1Size];
            }

            PageTable[L0][L1] = Entry;
        }
Example #9
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;
            }
        }
Example #10
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 Entry = GetPTEntry(Src);

                Entry.Type     = Type;
                Entry.Map      = PTMap.Mirror;
                Entry.Position = Dst;

                SetPTEntry(Src, Entry);

                Src += PageSize;
                Dst += PageSize;
            }
        }